<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Updated webrev here<br>
    <br>
    <a class="moz-txt-link-freetext" href="http://cr.openjdk.java.net/~prr/8240654.1/index.html">http://cr.openjdk.java.net/~prr/8240654.1/index.html</a><br>
    <br>
    The only changes are to the tests - to add -Dsun.java2d.uiScale=1 to
    the onscreen test<br>
    and to add printer to the keys for the printing test.<br>
    <br>
    It was pointed out by Stefan from the ZGC team that the changes in
    awt_TrayIcon.cpp and awt_Cursor.cpp<br>
    should not be needed because the GDI code in Create_BMP that
    ultimately consumes the data<br>
    has processed and copied it into memory allocated by
    CreateDIBSection before passing it to<br>
    CreateBitmap. I considered reverting those two files but decided to
    keep them because I<br>
    think I would like this fix anyway. We really don't need to lock
    down the VM in these cases.<br>
    <br>
    -phil.<br>
    <br>
    <br>
    On 6/11/20, 9:55 AM, Philip Race wrote:
    <blockquote
      cite="mid:9d9d3d82-49f5-df89-7e92-7b432cec05bd@oracle.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      I have confirmed hit a different code path. It goes through
      generic 2D s/w loops in this case.<br>
      ie we don't use GDIBlitLoops at all. The code in
      sun/java2d/pipe/DrawImage.java ends up in<br>
      scaleSurfaceData which uses the loops in ScaledBlit.c.<br>
      <br>
      It is a bit surprising to me since I'd expect us to be able to
      blit directly at device resolution.<br>
      Could we also be taking a performance hit here ? The D3D case
      doesn't not go through this loop.<br>
      <br>
      However all that is outside the scope of this fix ... I think
      setting uiScale=1 in the test is all that needs to be done.<br>
      <br>
      -phil.<br>
      <br>
      <div class="moz-cite-prefix">On 6/11/2020 7:51 AM, Philip Race
        wrote:<br>
      </div>
      <blockquote type="cite" cite="mid:5EE244F1.1090102@oracle.com">
        <meta content="text/html; charset=UTF-8"
          http-equiv="Content-Type">
        Or, maybe we hit a different code path. I'll check that.<br>
        uiScale=1 is the way to ensure we hit this code path.<br>
        <br>
        -phil.<br>
        <br>
        On 6/11/20, 7:44 AM, Philip Race wrote:
        <blockquote cite="mid:5EE24369.5000804@oracle.com" type="cite">
          <meta content="text/html; charset=UTF-8"
            http-equiv="Content-Type">
          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>
        </blockquote>
      </blockquote>
      <br>
    </blockquote>
  </body>
</html>