[OpenJDK 2D-Dev] [9] Review Request: 8059942 Default implementation of DrawImage.renderImageXform() should be improved for d3d/ogl
Sergey Bylokhov
Sergey.Bylokhov at oracle.com
Fri Nov 21 07:11:17 UTC 2014
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
>>
>>
--
Best regards, Sergey.
More information about the 2d-dev
mailing list