<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 11-Jun-2020, at 8:58 PM, Kevin Rushforth <<a 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="">
    <br class="">
    > Also - for both of you - with the fix and without forcing
    uiScale=1 does the test pass ?<br class="">
    <br class="">
    Yes the test passes with the fix and also passes without the fix if
    I don't force uiScale=1.<br class=""></div></div></blockquote>Same behaviour in my machine for LargeWindowPaintTest. AlphaPrintTest behaves in different way for me as mentioned previously.<br class=""><blockquote type="cite" class=""><div class=""><div class="">
    <br class="">
    -- Kein<br class="">
    <br class="">
    <br class="">
    <div class="moz-cite-prefix">On 6/11/2020 7:44 AM, Philip Race
      wrote:<br class="">
    </div>
    <blockquote type="cite" cite="mid:5EE24369.5000804@oracle.com" class="">
      <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" class="">
      Can I get clarification here. <br class="">
      <br class="">
      > 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="">
        So you both mean a JDK 15 promoted build without this fix and
        without this property passes because you have<br class="">
        a hidpi setup. And to see the failure without the fix you needed
        the above property.<br class="">
        If so we could just be looking at a similar anomaly as I saw
        with printing which uses a very large<br class="">
        image - it reported failure but actually worked !</font><br class="">
      <br class="">
      Also - for both of you - with the fix and without forcing
      uiScale=1 does the test pass ?<br class="">
      <br class="">
      -phil.<br class="">
      <br class="">
      On 6/11/20, 7:10 AM, Jayathirth D v wrote:
      <blockquote cite="mid:2D493453-9DEA-474E-8BFF-79EAD55BBECC@ORACLE.COM" type="cite" class="">
        <meta http-equiv="Content-Type" content="text/html;
          charset=UTF-8" class="">
        <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="" class="">LargeWindowPaintTest
            fails without patch and passes with patch.</span></div>
        <div class=""><font class="">AlphaPrintTest
            shows <span style="caret-color: rgb(0, 0, 0);" class="">instructions
              without patch also.</span></font></div>
        <div class=""><font class=""><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 class="">
            <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>
    </blockquote>
    <br class="">
  </div>

</div></blockquote></div><br class=""></body></html>