On 6/11/20, 1:57 AM, Jayathirth D v wrote:
Hi Phil,
I tried tested the fix in my Windows 10 machine with Intel integrated
UHD Graphics 620.
LargeWindowPaintTest.java passes with/without fix in my machine.
AlphaPrintTest.java without fix just opens up blank frame without any
instructions and with fix it shows instructions for the test.
Is this expected behaviour?
I guess this is a conseqeuence of the on-screen bug ! Which in contrast
to the LargeWindowPaintTest affects you.
Without the fix the window is too big and you have an intel chip so you
are going through the GDI path.
AlphaPrintTest.java with fix when it shows instructions if I click on
Pass(Since I don’t have printer right now) it doesn’t pass/close the
window. Only after I click on Print button and then close print dialog
it allows me to click on Pass button.
Well .. perhaps I should add an @requires printer on this test ?
But can't you print to file using Windows built in print to pdf ?
Also how does these tests behave in our internal CI machines?
The printing one is manual so it is never going to pass there.
-phil
Thanks,
Jay
On 11-Jun-2020, at 2:18 AM, Philip Race <philip.r...@oracle.com
<mailto:philip.r...@oracle.com>> wrote:
Bug: https://bugs.openjdk.java.net/browse/JDK-8240654
Webrev: http://cr.openjdk.java.net/~prr/8240654/index.html
This is for JDK 15 so review ASAP please since RDP 1 and the test
cycle are looming.
This is not a fix for a JDK bug. It is a bunch of workarounds for a
Microsoft Windows bug affecting
GDI in the context of ZGC (http://openjdk.java.net/jeps/333).
Some extra details about the Windows bug at the end, but first the
technical details of the fix.
With ZGC's memory allocation requirement of reserving memory in 2Mb
chunks some Windows GDI
functions, mostly involving some bitmaps APIs may return a failure
code (ie fail!)
This typically occurs when Java heap memory is used for a Java image
and then in a JNI
call we use GetPrimitiveArrayCritical so that Java heap allocated
memory is passed to a GDI
function AND the Java heap memory spans one of the 2Mb boundaries.
This is very easy to trigger in almost any Java UI app if the window
is of a large enough (ie typical) size.
NB: if you have an Nvidia or ATI card, then you won't see it, because
the D3D pipeline doesn't
call the affected method but if you have an Intel chip as do 90% (?)
of laptops you will see it.
There are also several other places we found that are affected.
Printing is the other one
somewhat easy to trigger. The others : custom cursors and tray icons
are less common.
The painful thing here is that there is no definitive list (a list of
the known ones is below) of
affected Windows GDI APIs and we are just hunting around our code
trying to see where it
might be side-swiped by this bug.
The basic approach in these workarounds is that for cases where
performance does not matter we now copy
and for cases where performance does matter or larger amounts of
memory is involved we check if
the return value of the GDI function indicates failure and then
re-try with a copy of the heap memory.
Unless GDI was randomly failing already (unlikely) this should be a
no-risk solution in the high profile cases.
We have done performance measurements on the important screen case
and the failures
happen fast so the penalty is then in the re-try which is only if ZGC
is enabled.
Always copying the memory is slower (and memcpy is the slow
operation) than an alternative approach
that "knows" about the memory allocation of ZGC but this coupling and
the complexity seem like they aren't
worth it since I haven't seen any visible performance consequence.
That can be revisited
some day if need be, but for now we have correctness which is the key
as well as sufficient performance.
I've created an automated test for the most important on-screen case.
Also a manual printing test case which invokes ZGC is provided since
there we also only
conditionally copy. In the other cases we now always copy so existing
test cases should over those.
There is some clean up in this fix - one completely unused (provably
so because it was #if'd out)
JNI method in awt_PrintJob.cpp is removed since it had code that
looked like it needed a workaround,
which would be somewhat of a waste of effort.
the doPrintBand code and its callee bitsToDevice has code I think we
can remove too since
I don't see how it ever gets executed (the top down case for
browserPrint == true) but
I think I'll save that for a P4 follow-on since it does nothing that
would be affected by this
Windows bug.
One oddity is the in the printing case I observed that some times the
rendering is performed
even if an error code is returned. I don't know why, but in code we
can't tell that it was actually
rendered and in any case there is no harm in repeating the call with
copied memory.
We are right before the JDK15 stabilisation fork and this fix needs
to go there and will
but the webrev is against jdk/client simply because jdk15 does not
exist yet !
Please test and review ASAP.
About the bug:
Microsoft has acknowleged the bug and will publish a knowledge base
article about it
but a fix may show up only in a future version of Windows. Not, it
seems, any time soon.
Below is a list of potentially affected GDI APIs. Per microsoft
whether it actually manifests in
any specific case depends on "branching"
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wcs/checkbitmapbits
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wcs/createcolortransform
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-setdibitstodevice
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-stretchdibits
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-getbitmapbits
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createdibitmap
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createdibsection
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-polydraw
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-drawescape
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createbitmap
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-setbitmapbits
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-getdibits
-phil.