[Mesa-dev] [PATCH 4/8] vbo: use software primitive restart in the VBO module

Jordan Justen jljusten at gmail.com
Fri May 11 10:13:22 PDT 2012


On Fri, May 11, 2012 at 9:48 AM, Marek Olšák <maraeo at gmail.com> wrote:
> On Fri, May 11, 2012 at 5:15 PM, Jordan Justen
> <jordan.l.justen at intel.com> wrote:
>> When PrimitiveRestartInSoftware is set, the VBO module will handle
>> primitive restart scenarios before calling the vbo_draw_func
>> drawing function.
>>
>> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
>> ---
>>  src/mesa/vbo/vbo_exec_array.c |   50 ++++++++++++++++++++++++++++++-----------
>>  1 file changed, 37 insertions(+), 13 deletions(-)
>>
>> diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c
>> index cc94e76..e584cef 100644
>> --- a/src/mesa/vbo/vbo_exec_array.c
>> +++ b/src/mesa/vbo/vbo_exec_array.c
>> @@ -542,6 +542,30 @@ vbo_bind_arrays(struct gl_context *ctx)
>>  }
>>
>>
>> +static void vbo_exec_array_draw_prims(struct gl_context *ctx,
>> +                                      const struct _mesa_prim *prim,
>> +                                      GLuint nr_prims,
>> +                                      const struct _mesa_index_buffer *ib,
>> +                                      GLboolean index_bounds_valid,
>> +                                      GLuint min_index,
>> +                                      GLuint max_index,
>> +                                      struct gl_transform_feedback_object *tfb_vertcount)
>> +{
>> +   struct vbo_context *vbo = vbo_context(ctx);
>> +
>> +   if ((ib != NULL) &&
>> +       ctx->Const.PrimitiveRestartInSoftware &&
>> +       ctx->Array.PrimitiveRestart) {
>> +      /* Handle primitive restart in software */
>> +      vbo_sw_primitive_restart(ctx, prim, nr_prims, ib, tfb_vertcount);
>> +   } else {
>> +      /* Call driver directly for draw_prims */
>> +      vbo->draw_prims(ctx, prim, nr_prims, ib,
>> +                      index_bounds_valid, min_index, max_index, tfb_vertcount);
>> +   }
>> +}
>> +
>> +
>>  /**
>>  * Helper function called by the other DrawArrays() functions below.
>>  * This is where we handle primitive restart for drawing non-indexed
>> @@ -600,8 +624,8 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
>>       if (primCount > 0) {
>>          /* draw one or two prims */
>>          check_buffers_are_unmapped(exec->array.inputs);
>> -         vbo->draw_prims(ctx, prim, primCount, NULL,
>> -                         GL_TRUE, start, start + count - 1, NULL);
>> +         vbo_exec_array_draw_prims(ctx, prim, primCount, NULL,
>> +                                   GL_TRUE, start, start + count - 1, NULL);
>>       }
>>    }
>>    else {
>
> The hunk above can be discarded (and I would prefer if it were), because the
> draw call is non-indexed.
>
>> @@ -610,9 +634,9 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
>>       prim[0].count = count;
>>
>>       check_buffers_are_unmapped(exec->array.inputs);
>> -      vbo->draw_prims(ctx, prim, 1, NULL,
>> -                      GL_TRUE, start, start + count - 1,
>> -                      NULL);
>> +      vbo_exec_array_draw_prims(ctx, prim, 1, NULL,
>> +                                GL_TRUE, start, start + count - 1,
>> +                                NULL);
>>    }
>>  }
>>
>
> Same as above.
>
>> @@ -801,8 +825,8 @@ vbo_validated_drawrangeelements(struct gl_context *ctx, GLenum mode,
>>     */
>>
>>    check_buffers_are_unmapped(exec->array.inputs);
>> -   vbo->draw_prims( ctx, prim, 1, &ib,
>> -                   index_bounds_valid, start, end, NULL );
>> +   vbo_exec_array_draw_prims(ctx, prim, 1, &ib,
>> +                             index_bounds_valid, start, end, NULL );
>>  }
>>
>>
>> @@ -1096,8 +1120,8 @@ vbo_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
>>       }
>>
>>       check_buffers_are_unmapped(exec->array.inputs);
>> -      vbo->draw_prims(ctx, prim, primcount, &ib,
>> -                     GL_FALSE, ~0, ~0, NULL);
>> +      vbo_exec_array_draw_prims(ctx, prim, primcount, &ib,
>> +                                GL_FALSE, ~0, ~0, NULL);
>>    } else {
>>       /* render one prim at a time */
>>       for (i = 0; i < primcount; i++) {
>> @@ -1121,8 +1145,8 @@ vbo_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
>>            prim[0].basevertex = 0;
>>
>>          check_buffers_are_unmapped(exec->array.inputs);
>> -         vbo->draw_prims(ctx, prim, 1, &ib,
>> -                         GL_FALSE, ~0, ~0, NULL);
>> +         vbo_exec_array_draw_prims(ctx, prim, 1, &ib,
>> +                                   GL_FALSE, ~0, ~0, NULL);
>>       }
>>    }
>>
>> @@ -1199,8 +1223,8 @@ vbo_draw_transform_feedback(struct gl_context *ctx, GLenum mode,
>>     * will be rendered. */
>>
>>    check_buffers_are_unmapped(exec->array.inputs);
>> -   vbo->draw_prims(ctx, prim, 1, NULL,
>> -                   GL_TRUE, 0, 0, obj);
>> +   vbo_exec_array_draw_prims(ctx, prim, 1, NULL,
>> +                             GL_TRUE, 0, 0, obj);
>>  }
>
> glDrawTransformFeedback is non-indexed too and obviously you can't do
> any primitive splitting in it anyway, because the vertex count is
> inaccessible to a CPU (and _mesa_prim::count is always 0).

Ok, I'll exclude these these cases, and rename
vbo_exec_array_draw_prims to something like
vbo_handle_primitive_restart.

-Jordan


More information about the mesa-dev mailing list