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

Jim Graham james.graham at oracle.com
Thu Nov 20 04:01:59 UTC 2014


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