[Mesa-dev] [PATCH] i965: Be more careful with the interleaved user array upload optimization
Eric Anholt
eric at anholt.net
Tue Jun 25 12:49:37 PDT 2013
Ian Romanick <idr at freedesktop.org> writes:
> On 06/25/2013 11:57 AM, Eric Anholt wrote:
>> Ian Romanick <idr at freedesktop.org> writes:
>>
>>> From: Ian Romanick <ian.d.romanick at intel.com>
>>>
>>> The checks to determine when the data can be uploaded in an interleaved
>>> fashion can be tricked by certain data layouts. For example,
>>>
>>> float data[...];
>>>
>>> glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 16, &data[0]);
>>> glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 16, &data[4]);
>>> glDrawArrays(GL_POINTS, 0, 1);
>>>
>>> will hit the interleaved path with an incorrect size (16 bytes instead
>>> of 32 bytes). As a result, the data for attribute 1 never gets
>>> uploaded. The single element draw case is the only sensible case I can
>>> think of for non-interleaved-that-looks-like-interleaved data, but there
>>> may be others as well.
>>>
>>> To fix this, make sure that the end of the element in the array being
>>> checked is within the stride "window." Previously the code would check
>>> that the begining of the element was within the window.
>>>
>>> NOTE: This is a candidate for stable branches.
>>>
>>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>>> Cc: Kenneth Graunke <kenneth at whitecape.org>
>>> Cc: Eric Anholt <eric at anholt.net>
>>> ---
>>> src/mesa/drivers/dri/i965/brw_draw_upload.c | 16 +++++++++++++++-
>>> 1 file changed, 15 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c
>>> index 2ded14b..d19250b 100644
>>> --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c
>>> +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c
>>> @@ -506,8 +506,22 @@ static void brw_prepare_vertices(struct brw_context *brw)
>>> ptr = glarray->Ptr;
>>> }
>>> else if (interleaved != glarray->StrideB ||
>>> - (uintptr_t)(glarray->Ptr - ptr) > interleaved)
>>> + (uintptr_t)(glarray->Ptr - ptr) + glarray->_ElementSize > interleaved)
>>
>> I think we should retain the previous check, too, to make sure that we
>> don't do it if people have overlapping elements where attribute 1 starts
>> just before and extending into the start of attribute 0. It sounds
>> crazy, but it'll be hell to debug if anyone ever does. (I'm imagining a
>> single-element attribute like the original bug report, where someone
>> stacked up a vec2 before a vec4, but accidentally specified "16" as the
>> stride on the vec2 because it shouldn't matter)
>>
>
> git n00b failure. :( I have an uncommitted change in my tree that makes
> the check actually work.
>
> + glarray->Ptr < ptr ||
>
> Without this, piles of piglit tests fail because the data is interleaved
> in the opposite order from what the fast path can handle... basically
> making more instances of the original bug.
>
> I also think this addition covers the case you're concerned about. Yeah?
Yeah, that works.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130625/e1bce1ac/attachment.pgp>
More information about the mesa-dev
mailing list