[Mesa-dev] [PATCH] i965: Implement bounds checking for transform feedback output.

Paul Berry stereotype441 at gmail.com
Fri Dec 16 13:11:49 PST 2011


On 16 December 2011 11:09, Ian Romanick <idr at freedesktop.org> wrote:

> On 12/16/2011 10:44 AM, Paul Berry wrote:
>
>> On 16 December 2011 10:04, Paul Berry <stereotype441 at gmail.com
>> <mailto:stereotype441 at gmail.**com <stereotype441 at gmail.com>>> wrote:
>>
>>    On 15 December 2011 15:20, Kenneth Graunke <kenneth at whitecape.org
>>    <mailto:kenneth at whitecape.org>**> wrote:
>>
>>        Signed-off-by: Kenneth Graunke <kenneth at whitecape.org
>>        <mailto:kenneth at whitecape.org>**>
>>
>>        ---
>>          src/mesa/drivers/dri/i965/brw_**context.c |    1 +
>>          src/mesa/drivers/dri/i965/brw_**context.h |    3 ++
>>          src/mesa/drivers/dri/i965/brw_**gs_emit.c |   10 ++++++++
>>          src/mesa/drivers/dri/i965/**gen6_sol.c    |   38
>>        ++++++++++++++++++++++++++++++**+
>>          4 files changed, 52 insertions(+), 0 deletions(-)
>>
>>        diff --git a/src/mesa/drivers/dri/i965/**brw_context.c
>>        b/src/mesa/drivers/dri/i965/**brw_context.c
>>        index 7d360b0..fd60853 100644
>>        --- a/src/mesa/drivers/dri/i965/**brw_context.c
>>        +++ b/src/mesa/drivers/dri/i965/**brw_context.c
>>        @@ -117,6 +117,7 @@ static void brwInitDriverFunctions( struct
>>        dd_function_table *functions )
>>            brw_init_queryobj_functions(**functions);
>>
>>            functions->PrepareExecBegin = brwPrepareExecBegin;
>>        +   functions->**BeginTransformFeedback =
>>        brw_begin_transform_feedback;
>>            functions->**EndTransformFeedback =
>> brw_end_transform_feedback;
>>          }
>>
>>        diff --git a/src/mesa/drivers/dri/i965/**brw_context.h
>>        b/src/mesa/drivers/dri/i965/**brw_context.h
>>        index 8e52488..20623d4 100644
>>        --- a/src/mesa/drivers/dri/i965/**brw_context.h
>>        +++ b/src/mesa/drivers/dri/i965/**brw_context.h
>>        @@ -1073,6 +1073,9 @@ brw_fprog_uses_noperspective(**const struct
>>        gl_fragment_program *fprog);
>>
>>          /* gen6_sol.c */
>>          void
>>        +brw_begin_transform_feedback(**struct gl_context *ctx,
>>        +                            struct gl_transform_feedback_object
>>        *obj);
>>        +void
>>          brw_end_transform_feedback(**struct gl_context *ctx,
>>                                    struct gl_transform_feedback_object
>>        *obj);
>>
>>        diff --git a/src/mesa/drivers/dri/i965/**brw_gs_emit.c
>>        b/src/mesa/drivers/dri/i965/**brw_gs_emit.c
>>        index 72d4eca..5dd3734 100644
>>        --- a/src/mesa/drivers/dri/i965/**brw_gs_emit.c
>>        +++ b/src/mesa/drivers/dri/i965/**brw_gs_emit.c
>>        @@ -352,6 +352,15 @@ gen6_sol_program(struct brw_gs_compile *c,
>>        struct brw_gs_prog_key *key,
>>                */
>>               brw_MOV(p, get_element_ud(c->reg.header, 5),
>>                       get_element_ud(c->reg.SVBI, 0));
>>        +
>>        +      /* Make sure that the buffers have enough room for all
>>        the vertices. */
>>        +      brw_ADD(p, get_element_ud(c->reg.temp, 0),
>>        +                get_element_ud(c->reg.SVBI, 0),
>>        brw_imm_ud(num_verts));
>>        +      brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_L,
>>        +                get_element_ud(c->reg.temp, 0),
>>        +                get_element_ud(c->reg.SVBI, 4));
>>        +      brw_IF(p, BRW_EXECUTE_1);
>>        +
>>
>>
>> Whoops, one other correction.  There's an off-by-one error--this should
>> be BRW_CONDITIONAL_LE.
>>
>> For example, let's say we're outputting triangles, the transform
>> feedback buffer is large enough to hold 6 vertices, and we've output 3
>> vertices already.  In that case num_verts is 3, SVBI.0 is 3, and SVBI.4
>> is 6.  The above logic compares SVBI.0 + num_verts < SVBI.4 (6 < 6), so
>> it concludes that there isn't room for the second triangle.  It should
>> be computing SVBI.0 + num_verts <= SVBI.4 (6 <= 6), because there is
>> just barely room for the second triangle.
>>
>
> Do we have piglit test cases for these edge conditions?  If we don't, we
> need them. :)
>

This one was caught by piglit tests that I'm hoping to send to the list
today.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20111216/b78d07a5/attachment.htm>


More information about the mesa-dev mailing list