<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Can I get clarification here. <br>
    <br>
    > I do, and had to run with "-Dsun.java2d.uiScale=1" in order to
    see the failure with <font class="">LargeWindowPaintTest.<br>
      <br>
      So you both mean a JDK 15 promoted build without this fix and
      without this property passes because you have<br>
      a hidpi setup. And to see the failure without the fix you needed
      the above property.<br>
      If so we could just be looking at a similar anomaly as I saw with
      printing which uses a very large<br>
      image - it reported failure but actually worked !</font><br>
    <br>
    Also - for both of you - with the fix and without forcing uiScale=1
    does the test pass ?<br>
    <br>
    -phil.<br>
    <br>
    On 6/11/20, 7:10 AM, Jayathirth D v wrote:
    <blockquote
      cite="mid:2D493453-9DEA-474E-8BFF-79EAD55BBECC@ORACLE.COM"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <div class="">Yes my machine was at 150% scaling.</div>
      <div class=""><br class="">
      </div>
      <div class="">If I force uiScale = 1, I see that:</div>
      <div class=""><span style="color: rgb(0, 0, 0);" class="">LargeWindowPaintTest
          fails without patch and passes with patch.</span></div>
      <div class=""><font class="" color="#000000">AlphaPrintTest shows <span
            style="caret-color: rgb(0, 0, 0);" class="">instructions
            without patch also.</span></font></div>
      <div class=""><font class="" color="#000000"><span
            style="caret-color: rgb(0, 0, 0);" class=""><br class="">
          </span></font></div>
      <div class="">@Phil : I think its better if we test at
        uiScale=1(larger memory footprint). Please clarify.</div>
      <div class=""><br class="">
      </div>
      <div class="">Thanks,</div>
      <div class="">Jay</div>
      <div class=""><br class="">
        <div>
          <blockquote type="cite" class="">
            <div class="">On 11-Jun-2020, at 5:53 PM, Kevin Rushforth
              <<a moz-do-not-send="true"
                href="mailto:kevin.rushforth@oracle.com" class="">kevin.rushforth@oracle.com</a>>
              wrote:</div>
            <br class="Apple-interchange-newline">
            <div class="">
              <meta http-equiv="Content-Type" content="text/html;
                charset=UTF-8" class="">
              <div class=""> Do you have a Hi-DPI machine? I do, and had
                to run with "-Dsun.java2d.uiScale=1" in order to see the
                failure with <font class="">LargeWindowPaintTest.<br
                    class="">
                  <br class="">
                  For AlphaPrintTest, the test deliberately ensures that
                  you print before saying whether it passes or not.
                  FWIW, I verified that the printing test on my system
                  was hitting the fallback code with the patch, but it
                  seemed to print correctly even without the patch.<br
                    class="">
                  <br class="">
                  -- Kevin<br class="">
                </font><br class="">
                <br class="">
                <div class="moz-cite-prefix">On 6/11/2020 1:58 AM,
                  Jayathirth D v wrote:<br class="">
                </div>
                <blockquote type="cite"
                  cite="mid:40C65E05-2AA8-4C4B-98B1-6A7F58BFFD22@ORACLE.COM"
                  class="">
                  <meta http-equiv="Content-Type" content="text/html;
                    charset=UTF-8" class="">
                  Typo : I tried tested -><span style="caret-color:
                    rgb(0, 0, 0);" class=""> I tried </span>testing<br
                    class="">
                  <div class=""><br class="">
                    <blockquote type="cite" class="">
                      <div class="">On 11-Jun-2020, at 2:27 PM,
                        Jayathirth D v <<a
                          href="mailto:JAYATHIRTH.D.V@ORACLE.COM"
                          class="" moz-do-not-send="true">JAYATHIRTH.D.V@ORACLE.COM</a>>

                        wrote:</div>
                      <br class="Apple-interchange-newline">
                      <div class="">
                        <meta http-equiv="Content-Type"
                          content="text/html; charset=UTF-8" class="">
                        <div style="word-wrap: break-word;
                          -webkit-nbsp-mode: space; line-break:
                          after-white-space;" class="">Hi Phil,
                          <div class=""><br class="">
                          </div>
                          <div class="">I tried tested the fix in my
                            Windows 10 machine with Intel integrated UHD
                            Graphics 620.</div>
                          <div class=""><br class="">
                          </div>
                          <div class=""><font class="">LargeWindowPaintTest.java

                              passes with/without fix in my machine.</font></div>
                          <div class=""><font class="">AlphaPrintTest.java
                              without fix just opens up blank frame
                              without any instructions and with fix it
                              shows instructions for the test.</font></div>
                          <div class=""><span style="caret-color: rgb(0,
                              0, 0);" class="">Is this expected
                              behaviour?</span></div>
                          <div class=""><span style="caret-color: rgb(0,
                              0, 0);" class=""><br class="">
                            </span></div>
                          <div class=""><span style="caret-color: rgb(0,
                              0, 0);" class="">AlphaPrintTest.java w</span><font
                              class="">ith 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.</font></div>
                          <div class=""><font class=""><span
                                style="caret-color: rgb(0, 0, 0);"
                                class=""><br class="">
                              </span></font></div>
                          <div class=""><font class=""><span
                                style="caret-color: rgb(0, 0, 0);"
                                class="">Also how does these tests
                                behave in our internal CI machines?</span></font></div>
                          <div class=""><br class="">
                            <div class="">Thanks,</div>
                            <div class="">Jay</div>
                            <div class=""><br class="">
                              <blockquote type="cite" class="">
                                <div class="">On 11-Jun-2020, at 2:18
                                  AM, Philip Race <<a
                                    href="mailto:philip.race@oracle.com"
                                    class="" moz-do-not-send="true">philip.race@oracle.com</a>>

                                  wrote:</div>
                                <br class="Apple-interchange-newline">
                                <div class="">
                                  <meta http-equiv="content-type"
                                    content="text/html; charset=UTF-8"
                                    class="">
                                  <div class=""> Bug: <a
                                      class="moz-txt-link-freetext"
                                      href="https://bugs.openjdk.java.net/browse/JDK-8240654"
                                      moz-do-not-send="true">https://bugs.openjdk.java.net/browse/JDK-8240654</a><br
                                      class="">
                                    Webrev: <a
                                      class="moz-txt-link-freetext"
                                      href="http://cr.openjdk.java.net/%7Eprr/8240654/index.html"
                                      moz-do-not-send="true">http://cr.openjdk.java.net/~prr/8240654/index.html</a><br
                                      class="">
                                    <br class="">
                                    This is for JDK 15 so review ASAP
                                    please since RDP 1 and the test
                                    cycle are looming.<br class="">
                                    <br class="">
                                    This is not a fix for a JDK bug. It
                                    is a bunch of workarounds for a
                                    Microsoft Windows bug affecting<br
                                      class="">
                                    GDI in the context of ZGC (<a
                                      class="moz-txt-link-freetext"
                                      href="http://openjdk.java.net/jeps/333"
                                      moz-do-not-send="true">http://openjdk.java.net/jeps/333</a>).<br
                                      class="">
                                    Some extra details about the Windows
                                    bug at the end, but first the
                                    technical details of the fix.<br
                                      class="">
                                    <br class="">
                                    With ZGC's memory allocation
                                    requirement of reserving memory in
                                    2Mb chunks  some Windows GDI<br
                                      class="">
                                    functions, mostly involving some
                                    bitmaps APIs may return a failure
                                    code (ie fail!)<br class="">
                                    This typically occurs when Java heap
                                    memory is used for a Java image and
                                    then in a JNI<br class="">
                                    call we use
                                    GetPrimitiveArrayCritical so that
                                    Java heap allocated memory is passed
                                    to a GDI<br class="">
                                    function AND the Java heap memory
                                    spans one of the 2Mb boundaries. <br
                                      class="">
                                    This is very easy to trigger in
                                    almost any Java UI app if the window
                                    is of a large enough (ie typical)
                                    size.<br class="">
                                    NB: if you have an Nvidia or ATI
                                    card, then you won't see it, because
                                    the D3D pipeline doesn't<br class="">
                                    call the affected method but if you
                                    have an Intel chip as do 90% (?) of
                                    laptops you will see it.<br class="">
                                    There are also several other places
                                    we found that are affected. Printing
                                    is the other one<br class="">
                                    somewhat easy to trigger. The others
                                    : custom cursors and tray icons are
                                    less common.<br class="">
                                    The painful thing here is that there
                                    is no definitive list (a list of the
                                    known ones is below) of<br class="">
                                    affected Windows GDI APIs and we are
                                    just hunting around our code trying
                                    to see where it<br class="">
                                    might be side-swiped by this bug.<br
                                      class="">
                                    <br class="">
                                    The basic approach in these
                                    workarounds is that for cases where
                                    performance does not matter we now
                                    copy <br class="">
                                    and for cases where performance does
                                    matter or larger amounts of memory
                                    is involved we check if<br class="">
                                    the return value of the GDI function
                                    indicates failure and then re-try
                                    with a copy of the heap memory. <br
                                      class="">
                                    Unless GDI was randomly failing
                                    already (unlikely) this should be a
                                    no-risk solution in the high profile
                                    cases. <br class="">
                                    We have done performance
                                    measurements on the important screen
                                    case and the failures<br class="">
                                    happen fast so the penalty is then
                                    in the re-try which is only if ZGC
                                    is enabled.<br class="">
                                    Always copying the memory is slower
                                    (and memcpy is the slow operation)
                                    than an alternative approach<br
                                      class="">
                                    that "knows" about the memory
                                    allocation of ZGC but this coupling
                                    and the complexity seem like they
                                    aren't<br class="">
                                    worth it since I haven't seen any
                                    visible performance consequence.
                                    That can be revisited<br class="">
                                    some day if need be, but for now we
                                    have correctness which is the key as
                                    well as sufficient performance.<br
                                      class="">
                                    <br class="">
                                    I've created an automated test for
                                    the most important on-screen case. <br
                                      class="">
                                    Also a manual printing test case
                                    which invokes ZGC is provided since
                                    there we also only<br class="">
                                    conditionally copy. In the other
                                    cases we now always copy so existing
                                    test cases should over those.<br
                                      class="">
                                    <br class="">
                                    There is some clean up in this fix -
                                    one completely unused  (provably so
                                    because it was #if'd out)<br
                                      class="">
                                    JNI method in awt_PrintJob.cpp is
                                    removed since it had code that
                                    looked like it needed a workaround,<br
                                      class="">
                                    which would be somewhat of a waste
                                    of effort.<br class="">
                                    <br class="">
                                    the doPrintBand code and its callee
                                    bitsToDevice has code I think we can
                                    remove too since<br class="">
                                    I don't see how it ever gets
                                    executed (the top down case for
                                    browserPrint == true) but<br
                                      class="">
                                    I think I'll save that for a P4
                                    follow-on since it does nothing that
                                    would be affected by this<br
                                      class="">
                                    Windows bug.<br class="">
                                    <br class="">
                                    One oddity is the in the printing
                                    case I observed that some times the
                                    rendering is performed<br class="">
                                    even if an error code is returned. I
                                    don't know why, but in code we can't
                                    tell that it was actually<br
                                      class="">
                                    rendered and in any case there is no
                                    harm in repeating the call with
                                    copied memory.<br class="">
                                    <br class="">
                                    We are right before the JDK15
                                    stabilisation fork and this fix
                                    needs to go there and will<br
                                      class="">
                                    but the webrev is against jdk/client
                                    simply because jdk15 does not exist
                                    yet !<br class="">
                                    <br class="">
                                    Please test and review ASAP.<br
                                      class="">
                                    <br class="">
                                    About the bug:<br class="">
                                    Microsoft has acknowleged the bug
                                    and will publish a knowledge base
                                    article about it<br class="">
                                    but a fix may show up only in a
                                    future version of Windows. Not, it
                                    seems, any time soon.<br class="">
                                    Below is a list of potentially
                                    affected GDI APIs. Per microsoft
                                    whether it actually manifests in<br
                                      class="">
                                    any specific case depends on
                                    "branching"<br class="">
                                    <span
                                      style="font-family:"Courier
                                      New",serif;color:#1F4E79"
                                      class=""></span>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><a
href="https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wcs/checkbitmapbits"
                                          class=""
                                          moz-do-not-send="true">https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wcs/checkbitmapbits</a></span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><a
href="https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wcs/createcolortransform"
                                          class=""
                                          moz-do-not-send="true">https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wcs/createcolortransform</a></span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><a
href="https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-setdibitstodevice"
                                          class=""
                                          moz-do-not-send="true">https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-setdibitstodevice</a></span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><a
href="https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-stretchdibits"
                                          class=""
                                          moz-do-not-send="true">https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-stretchdibits</a></span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><a
href="https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-getbitmapbits"
                                          class=""
                                          moz-do-not-send="true">https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-getbitmapbits</a></span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><a
href="https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createdibitmap"
                                          class=""
                                          moz-do-not-send="true">https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createdibitmap</a></span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><a
href="https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createdibsection"
                                          class=""
                                          moz-do-not-send="true">https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createdibsection</a></span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><a
href="https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-polydraw"
                                          class=""
                                          moz-do-not-send="true">https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-polydraw</a></span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><a
href="https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-drawescape"
                                          class=""
                                          moz-do-not-send="true">https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-drawescape</a></span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><a
href="https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createbitmap"
                                          class=""
                                          moz-do-not-send="true">https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createbitmap</a></span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><a
href="https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-setbitmapbits"
                                          class=""
                                          moz-do-not-send="true">https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-setbitmapbits</a></span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><a
href="https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-getdibits"
                                          class=""
                                          moz-do-not-send="true">https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-getdibits</a></span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class=""><br
                                          class="">
                                      </span></p>
                                    <p class="MsoNormal"><span
                                        style="font-family:"Courier
                                        New",serif" class="">-phil.<br
                                          class="">
                                      </span></p>
                                  </div>
                                </div>
                              </blockquote>
                            </div>
                            <br class="">
                          </div>
                        </div>
                      </div>
                    </blockquote>
                  </div>
                  <br class="">
                </blockquote>
                <br class="">
              </div>
            </div>
          </blockquote>
        </div>
        <br class="">
      </div>
    </blockquote>
  </body>
</html>