[Mesa-dev] [PATCH] tnl: Merge _tnl_vbo_draw_prims() into _tnl_draw_prims().
Iago Toral Quiroga
itoral at igalia.com
Tue Apr 8 04:01:20 PDT 2014
This should help prevent situations where we render without proper index
bounds. For example: https://bugs.freedesktop.org/show_bug.cgi?id=59455
---
src/mesa/drivers/dri/i965/brw_draw.c | 24 ++++++++++----------
src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c | 6 ++---
src/mesa/tnl/t_context.c | 2 +-
src/mesa/tnl/t_draw.c | 34 +++++++++-------------------
src/mesa/tnl/tnl.h | 9 --------
5 files changed, 27 insertions(+), 48 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
index ef0f273..0c131be 100644
--- a/src/mesa/drivers/dri/i965/brw_draw.c
+++ b/src/mesa/drivers/dri/i965/brw_draw.c
@@ -550,17 +550,6 @@ void brw_draw_prims( struct gl_context *ctx,
return;
}
- /* If we're going to have to upload any of the user's vertex arrays, then
- * get the minimum and maximum of their index buffer so we know what range
- * to upload.
- */
- if (!index_bounds_valid &&
- (ctx->RenderMode != GL_RENDER || !vbo_all_varyings_in_vbos(arrays))) {
- perf_debug("Scanning index buffer to compute index buffer bounds. "
- "Use glDrawRangeElements() to avoid this.\n");
- vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index, nr_prims);
- }
-
/* Do GL_SELECT and GL_FEEDBACK rendering using swrast, even though it
* won't support all the extensions we support.
*/
@@ -569,10 +558,21 @@ void brw_draw_prims( struct gl_context *ctx,
_mesa_lookup_enum_by_nr(ctx->RenderMode));
_swsetup_Wakeup(ctx);
_tnl_wakeup(ctx);
- _tnl_draw_prims(ctx, arrays, prims, nr_prims, ib, min_index, max_index);
+ _tnl_draw_prims(ctx, prims, nr_prims, ib,
+ index_bounds_valid, min_index, max_index, NULL, NULL);
return;
}
+ /* If we're going to have to upload any of the user's vertex arrays, then
+ * get the minimum and maximum of their index buffer so we know what range
+ * to upload.
+ */
+ if (!index_bounds_valid && !vbo_all_varyings_in_vbos(arrays)) {
+ perf_debug("Scanning index buffer to compute index buffer bounds. "
+ "Use glDrawRangeElements() to avoid this.\n");
+ vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index, nr_prims);
+ }
+
/* Try drawing with the hardware, but don't do anything else if we can't
* manage it. swrast doesn't support our featureset, so we can't fall back
* to it.
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c
index dff947a..c85acec 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c
+++ b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c
@@ -504,9 +504,9 @@ TAG(vbo_check_render_prims)(struct gl_context *ctx,
tfb_vertcount, indirect);
if (nctx->fallback == SWTNL)
- _tnl_vbo_draw_prims(ctx, prims, nr_prims, ib,
- index_bounds_valid, min_index, max_index,
- tfb_vertcount, indirect);
+ _tnl_draw_prims(ctx, prims, nr_prims, ib,
+ index_bounds_valid, min_index, max_index,
+ tfb_vertcount, indirect);
}
void
diff --git a/src/mesa/tnl/t_context.c b/src/mesa/tnl/t_context.c
index 134f699..eb5bae4 100644
--- a/src/mesa/tnl/t_context.c
+++ b/src/mesa/tnl/t_context.c
@@ -93,7 +93,7 @@ _tnl_CreateContext( struct gl_context *ctx )
}
/* plug in the VBO drawing function */
- vbo_set_draw_func(ctx, _tnl_vbo_draw_prims);
+ vbo_set_draw_func(ctx, _tnl_draw_prims);
_math_init_transformation();
_math_init_translate();
diff --git a/src/mesa/tnl/t_draw.c b/src/mesa/tnl/t_draw.c
index 2755ae6..be3f059 100644
--- a/src/mesa/tnl/t_draw.c
+++ b/src/mesa/tnl/t_draw.c
@@ -411,7 +411,11 @@ static void unmap_vbos( struct gl_context *ctx,
}
-void _tnl_vbo_draw_prims(struct gl_context *ctx,
+/* This is the main entrypoint into the slimmed-down software tnl
+ * module. In a regular swtnl driver, this can be plugged straight
+ * into the vbo->Driver.DrawPrims() callback.
+ */
+void _tnl_draw_prims(struct gl_context *ctx,
const struct _mesa_prim *prim,
GLuint nr_prims,
const struct _mesa_index_buffer *ib,
@@ -421,32 +425,16 @@ void _tnl_vbo_draw_prims(struct gl_context *ctx,
struct gl_transform_feedback_object *tfb_vertcount,
struct gl_buffer_object *indirect)
{
- const struct gl_client_array **arrays = ctx->Array._DrawArrays;
-
- if (!index_bounds_valid)
- vbo_get_minmax_indices(ctx, prim, ib, &min_index, &max_index, nr_prims);
-
- _tnl_draw_prims(ctx, arrays, prim, nr_prims, ib, min_index, max_index);
-}
-
-/* This is the main entrypoint into the slimmed-down software tnl
- * module. In a regular swtnl driver, this can be plugged straight
- * into the vbo->Driver.DrawPrims() callback.
- */
-void _tnl_draw_prims( struct gl_context *ctx,
- const struct gl_client_array *arrays[],
- const struct _mesa_prim *prim,
- GLuint nr_prims,
- const struct _mesa_index_buffer *ib,
- GLuint min_index,
- GLuint max_index)
-{
TNLcontext *tnl = TNL_CONTEXT(ctx);
+ const struct gl_client_array **arrays = ctx->Array._DrawArrays;
const GLuint TEST_SPLIT = 0;
const GLint max = TEST_SPLIT ? 8 : tnl->vb.Size - MAX_CLIPPED_VERTICES;
GLint max_basevertex = prim->basevertex;
GLuint i;
+ if (!index_bounds_valid)
+ vbo_get_minmax_indices(ctx, prim, ib, &min_index, &max_index, nr_prims);
+
/* Mesa core state should have been validated already */
assert(ctx->NewState == 0x0);
@@ -471,7 +459,7 @@ void _tnl_draw_prims( struct gl_context *ctx,
*/
vbo_rebase_prims( ctx, arrays, prim, nr_prims, ib,
min_index, max_index,
- _tnl_vbo_draw_prims );
+ _tnl_draw_prims );
return;
}
else if ((GLint)max_index + max_basevertex > max) {
@@ -489,7 +477,7 @@ void _tnl_draw_prims( struct gl_context *ctx,
*/
vbo_split_prims( ctx, arrays, prim, nr_prims, ib,
0, max_index + prim->basevertex,
- _tnl_vbo_draw_prims,
+ _tnl_draw_prims,
&limits );
}
else {
diff --git a/src/mesa/tnl/tnl.h b/src/mesa/tnl/tnl.h
index 59a0ac3..8c59ff9 100644
--- a/src/mesa/tnl/tnl.h
+++ b/src/mesa/tnl/tnl.h
@@ -77,15 +77,6 @@ struct _mesa_index_buffer;
void
_tnl_draw_prims( struct gl_context *ctx,
- const struct gl_client_array *arrays[],
- const struct _mesa_prim *prim,
- GLuint nr_prims,
- const struct _mesa_index_buffer *ib,
- GLuint min_index,
- GLuint max_index);
-
-void
-_tnl_vbo_draw_prims( struct gl_context *ctx,
const struct _mesa_prim *prim,
GLuint nr_prims,
const struct _mesa_index_buffer *ib,
--
1.8.3.2
More information about the mesa-dev
mailing list