[OpenJDK 2D-Dev] [9] Review Request: 8059942 Default implementation of DrawImage.renderImageXform() should be improved for d3d/ogl

Phil Race philip.race at oracle.com
Wed Nov 26 18:37:04 UTC 2014


Looks good : +1

-phil.

On 11/20/2014 11:11 PM, Sergey Bylokhov wrote:
> Thanks, Jim!
> Can anybody make the second review of this fix?
>
> Also I need a review of this change as well:
> http://mail.openjdk.java.net/pipermail/2d-dev/2014-November/004937.html
>
> On 20.11.2014 7:01, Jim Graham wrote:
>> Looks good...
>>
>>             ...jim
>>
>> On 11/19/14 11:44 AM, Sergey Bylokhov wrote:
>>> Hi, Jim.
>>> Please review an updated version of the fix:
>>> http://cr.openjdk.java.net/~serb/8059942/webrev.18
>>> I hope that all possible overflows/correctness/validity problems are
>>> checked now.
>>>
>>> On 15.11.2014 1:50, Jim Graham wrote:
>>>> Hi Sergey,
>>>>
>>>> On 11/14/14 6:40 AM, Sergey Bylokhov wrote:
>>>>> Hi, Jim.
>>>>> Please review an updated version of the fix:
>>>>> http://cr.openjdk.java.net/~serb/8059942/webrev.17
>>>>> Two notes:
>>>>>   - one additional byte still is added to the bands, since I am still
>>>>> checking the code where we use endIndex-1/endIndex+1/endIndex++ or
>>>>> swap it with curYrow, etc. This isn't urgent.
>>>>
>>>> Since you no longer call appendSpan(), you no longer need the
>>>> additional byte in this new method.
>>>>
>>>>>   - "end < bands.length" was added to the loop for the reason of
>>>>> overall loop performance(+15%).
>>>>
>>>> That's odd that it helps since you then consume 5 entries after that
>>>> check, but I guess Hotspot works in mysterious ways.  I wonder if
>>>> "end+4" works as well or better since that would be a more accurate
>>>> test of what is happening.  Also, even for 15% performance difference
>>>> of this one method, it might be better to take the AAIOBE as a double
>>>> check against the caller feeding us bad data, such as edges[0,1] that
>>>> end up overflowing?  In either case, we generate valid data even in
>>>> the face of such anomalies.
>>>>
>>>> I'd still prefer to have the code confirm the ranges.  It would still
>>>> be much simpler than the old code that called appendSpan/endRow a lot
>>>> with just a few checks, like this:
>>>>
>>>>     static Region getInstance(final int lox, final int loy, final int
>>>> hix,
>>>>                               final int hiy, final int edges[]) {
>>>> // maybe?:        if (hiy <= loy || hix <= lox) return EMPTY_REGION;
>>>>         final int y1 = loy + edges[0];
>>>>         final int y2 = loy + edges[1];
>>>>         // rowsNum * (3 + 1 * 2)
>>>>         final int[] bands = new int[(y2 - y1) * 5];
>>>>         int end = 0;
>>>>         int index = 2;
>>>> // Note to Sergey: Does end+4 also generate faster code?
>>>>         for (int y = y1; end+4 < bands.length && y < y2; ++y) {
>>>>             final int x1 = lox + edges[index++];
>>>>             final int x2 = lox + edges[index++];
>>>> // Is the following comment too obvious?
>>>>             // Note: always consume both indices before rejecting span
>>>>             if (y < loy || y >= hiy) continue;
>>>>             if (x1 < lox) x1 = lox;
>>>>             if (x2 > hix) x2 = hix;
>>>>             if (x1 < x2) {
>>>>                 bands[end++] = y;     // spanloy
>>>>                 bands[end++] = y + 1; // spanhiy
>>>>                 bands[end++] = 1;     // 1 span per row
>>>>                 bands[end++] = x1;    // spanlox
>>>>                 bands[end++] = x2;    // spanhix
>>>>             }
>>>>         }
>>>>         return end != 0 ? new Region(lox, loy, hix, hiy, bands, end)
>>>>                         : EMPTY_REGION;
>>>>     }
>>>>
>>>> This code should ensure correctness/validity of the Region data
>>>> structure without much performance impact, hopefully?
>>>>
>>>>             ...jim
>>>
>>>
>
>




More information about the 2d-dev mailing list