<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    This is clearly too late for JDK 20 and JDK 21 will be just 6 months
    later so it is a better time for that.<br>
    FWIW we have just had at a report of a performance drop in JDK 20
    from a b07 change to show how it takes<br>
    time for these things to be discovered.<br>
    Also I had a bug / rfe for this a while back :
    <a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-8233037">https://bugs.openjdk.org/browse/JDK-8233037</a><br>
    I closed it as WNF because I wasn't able to see a performance boost.<br>
    <br>
    So the right way to do this is  to provide some solid evidence of
    what gets faster and what gets<br>
    slower with a range of different values (not just the JBR one) and
    re-open that bug and resolve early in 21.<br>
    <br>
    -phil.<br>
    <br>
    <br>
    <div class="moz-cite-prefix">On 12/7/22 7:36 AM, Alexey Ushakov
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:7C1FA120-8A68-4805-A507-7D7ADF6BDBB1@jetbrains.com">
      
      Yes, I confirm that we’ve been using such enlarged buffer for a
      long time in production. It helped us with scrolling performance
      on 4K monitors. The suggested property could help to adjust the
      buffer for the needs of particular application.
      <div class=""><br class="">
      </div>
      <div class="">Best Regards,</div>
      <div class="">Alexey<br class="">
        <div><br class="">
          <blockquote type="cite" class="">
            <div class="">On 7 Dec 2022, at 11:37, Laurent Bourgès <<a href="mailto:bourges.laurent@gmail.com" class="moz-txt-link-freetext" moz-do-not-send="true">bourges.laurent@gmail.com</a>>
              wrote:</div>
            <br class="Apple-interchange-newline">
            <div class="">
              <div dir="auto" class="">Hi,
                <div dir="auto" class=""><br class="">
                  <div dir="auto" class="">For years, JetBrains Runtime
                    uses a larger render queue buffer size (32kb to
                    6,400,000 bytes) in production, as it boosted many
                    accelerated pipelines: d3d, ogl, metal :</div>
                  <div dir="auto" class="">~ 10 to 20% on large fills...</div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">JBR RenderQueue:</div>
                  <div dir="auto" class=""><a href="https://github.com/JetBrains/JetBrainsRuntime/blob/02bc54f8644c6c6467aa952d0a8a104355acc273/src/java.desktop/share/classes/sun/java2d/pipe/RenderQueue.java#L75" class="moz-txt-link-freetext" moz-do-not-send="true">https://github.com/JetBrains/JetBrainsRuntime/blob/02bc54f8644c6c6467aa952d0a8a104355acc273/src/java.desktop/share/classes/sun/java2d/pipe/RenderQueue.java#L75</a><br class="">
                  </div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">JDK RenderQueue:</div>
                  <div dir="auto" class=""><a href="https://github.com/bourgesl/jdk-official/blob/5e196b4b8e623107424e2fb54672790fd925fe73/src/java.desktop/share/classes/sun/java2d/pipe/RenderQueue.java#L75" class="moz-txt-link-freetext" moz-do-not-send="true">https://github.com/bourgesl/jdk-official/blob/5e196b4b8e623107424e2fb54672790fd925fe73/src/java.desktop/share/classes/sun/java2d/pipe/RenderQueue.java#L75</a><br class="">
                  </div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">I want to propose such quick
                    fix in openjdk20 today, as a 1-line fix.</div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class="">
                            <br>
                          </td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class=""> /** The size of the underlying
                            buffer, in bytes. */</td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class=""> private static final int
                            BUFFER_SIZE = 6400000;</td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                  </div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">To ensure a smooth
                    transition, I prefer introducing a new
                    sun.java2d.render.queue system property to increase
                    the default (32kb) buffer capacity:</div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">See in marlin:</div>
                  <div dir="auto" class=""><a href="https://github.com/bourgesl/marlin-renderer/blob/323f1fb1c72704f5e86c8a13393e30df00888821/src/main/java/sun/java2d/pipe/RenderQueue.java#L78" class="moz-txt-link-freetext" moz-do-not-send="true">https://github.com/bourgesl/marlin-renderer/blob/323f1fb1c72704f5e86c8a13393e30df00888821/src/main/java/sun/java2d/pipe/RenderQueue.java#L78</a><br class="">
                  </div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">So here is my current
                    proposal:</div>
                  <div dir="auto" class="">[[[</div>
                  <div dir="auto" class="">
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class="">
                            <br>
                          </td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class=""> /** The size of the underlying
                            buffer, in bytes. */</td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class=""> private static final int
                            BUFFER_SIZE;</td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class="">
                            <br>
                          </td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class=""> static {</td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class=""> // Default 32K is too small for
                            high-end GPU:</td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class=""> BUFFER_SIZE =
                            align(getInteger("sun.java2d.render.bufferSize",
                            32 * 1024, 32 * 1024, 16 * 1024 * 1024),
                            1024);</td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class="">
                            <br>
                          </td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class="">//
                            System.out.println("RenderQueue:
                            sun.java2d.render.bufferSize = " +
                            BUFFER_SIZE);</td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                    <table class="">
                      <tbody class="">
                        <tr class="">
                          <td class=""> }</td>
                        </tr>
                        <tr class="">
                        </tr>
                      </tbody>
                    </table>
                  </div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">    // system property
                    utilities</div>
                  <div dir="auto" class="">    public static int
                    getInteger(final String key, final int def,</div>
                  <div dir="auto" class="">                             
                       final int min, final int max)</div>
                  <div dir="auto" class="">    {</div>
                  <div dir="auto" class="">        final String property
                    = AccessController.doPrivileged(</div>
                  <div dir="auto" class="">                             
                          new GetPropertyAction(key));</div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">        int value = def;</div>
                  <div dir="auto" class="">        if (property != null)
                    {</div>
                  <div dir="auto" class="">            try {</div>
                  <div dir="auto" class="">                value =
                    Integer.decode(property);</div>
                  <div dir="auto" class="">            } catch
                    (NumberFormatException e) {</div>
                  <div dir="auto" class="">               
                    System.out.println("Invalid integer value for " +
                    key + " = " + property);</div>
                  <div dir="auto" class="">            }</div>
                  <div dir="auto" class="">        }</div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">        // check for invalid
                    values</div>
                  <div dir="auto" class="">        if ((value < min)
                    || (value > max)) {</div>
                  <div dir="auto" class="">           
                    System.out.println("Invalid value for " + key + " =
                    " + value</div>
                  <div dir="auto" class="">                    + ";
                    expected value in range[" + min + ", " + max + "]
                    !");</div>
                  <div dir="auto" class="">            value = def;</div>
                  <div dir="auto" class="">        }</div>
                  <div dir="auto" class="">        return value;</div>
                  <div dir="auto" class="">    }</div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">    protected static int
                    align(final int val, final int norm) {</div>
                  <div dir="auto" class="">        final int ceil =
                    (int)Math.ceil( ((float) val) / norm);</div>
                  <div dir="auto" class="">        return ceil * norm;</div>
                  <div dir="auto" class="">    }</div>
                  <div dir="auto" class="">]]]</div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">Would you accept such late
                    change for openjdk20 ?</div>
                  <div dir="auto" class=""><br class="">
                  </div>
                  <div dir="auto" class="">Cheers,</div>
                  <div dir="auto" class="">Laurent Bourgès </div>
                </div>
              </div>
            </div>
          </blockquote>
        </div>
        <br class="">
      </div>
    </blockquote>
    <br>
  </body>
</html>