Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Fri, Apr 7, 2017 at 6:30 PM, Nicolai Hähnle <nhaeh...@gmail.com> wrote: > From: Nicolai Hähnle <nicolai.haeh...@amd.com> > > Fixes a bug in > KHR-GL45.shader_draw_parameters_tests.ShaderMultiDrawArraysParameters. > --- > src/mesa/vbo/vbo_exec_array.c | 21 +++++++++++++++------ > 1 file changed, 15 insertions(+), 6 deletions(-) > > diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c > index bc4a18f..85d9b4b 100644 > --- a/src/mesa/vbo/vbo_exec_array.c > +++ b/src/mesa/vbo/vbo_exec_array.c > @@ -397,36 +397,38 @@ vbo_bind_arrays(struct gl_context *ctx) > > > /** > * Helper function called by the other DrawArrays() functions below. > * This is where we handle primitive restart for drawing non-indexed > * arrays. If primitive restart is enabled, it typically means > * splitting one DrawArrays() into two. > */ > static void > vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start, > - GLsizei count, GLuint numInstances, GLuint baseInstance) > + GLsizei count, GLuint numInstances, GLuint baseInstance, > + GLuint drawID) > { > struct vbo_context *vbo = vbo_context(ctx); > struct _mesa_prim prim[2]; > > vbo_bind_arrays(ctx); > > /* OpenGL 4.5 says that primitive restart is ignored with non-indexed > * draws. > */ > memset(prim, 0, sizeof(prim)); > prim[0].begin = 1; > prim[0].end = 1; > prim[0].mode = mode; > prim[0].num_instances = numInstances; > prim[0].base_instance = baseInstance; > + prim[0].draw_id = drawID; > prim[0].is_indirect = 0; > prim[0].start = start; > prim[0].count = count; > > vbo->draw_prims(ctx, prim, 1, NULL, > GL_TRUE, start, start + count - 1, NULL, 0, NULL); > > if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) { > _mesa_flush(ctx); > } > @@ -565,21 +567,21 @@ vbo_exec_DrawArrays(GLenum mode, GLint start, GLsizei > count) > if (MESA_VERBOSE & VERBOSE_DRAW) > _mesa_debug(ctx, "glDrawArrays(%s, %d, %d)\n", > _mesa_enum_to_string(mode), start, count); > > if (!_mesa_validate_DrawArrays(ctx, mode, count)) > return; > > if (0) > check_draw_arrays_data(ctx, start, count); > > - vbo_draw_arrays(ctx, mode, start, count, 1, 0); > + vbo_draw_arrays(ctx, mode, start, count, 1, 0, 0); > > if (0) > print_draw_arrays(ctx, mode, start, count); > } > > > /** > * Called from glDrawArraysInstanced when in immediate mode (not > * display list mode). > */ > @@ -593,21 +595,21 @@ vbo_exec_DrawArraysInstanced(GLenum mode, GLint start, > GLsizei count, > _mesa_debug(ctx, "glDrawArraysInstanced(%s, %d, %d, %d)\n", > _mesa_enum_to_string(mode), start, count, numInstances); > > if (!_mesa_validate_DrawArraysInstanced(ctx, mode, start, count, > numInstances)) > return; > > if (0) > check_draw_arrays_data(ctx, start, count); > > - vbo_draw_arrays(ctx, mode, start, count, numInstances, 0); > + vbo_draw_arrays(ctx, mode, start, count, numInstances, 0, 0); > > if (0) > print_draw_arrays(ctx, mode, start, count); > } > > > /** > * Called from glDrawArraysInstancedBaseInstance when in immediate mode. > */ > static void GLAPIENTRY > @@ -623,21 +625,21 @@ vbo_exec_DrawArraysInstancedBaseInstance(GLenum mode, > GLint first, > _mesa_enum_to_string(mode), first, count, > numInstances, baseInstance); > > if (!_mesa_validate_DrawArraysInstanced(ctx, mode, first, count, > numInstances)) > return; > > if (0) > check_draw_arrays_data(ctx, first, count); > > - vbo_draw_arrays(ctx, mode, first, count, numInstances, baseInstance); > + vbo_draw_arrays(ctx, mode, first, count, numInstances, baseInstance, 0); > > if (0) > print_draw_arrays(ctx, mode, first, count); > } > > > /** > * Called from glMultiDrawArrays when in immediate mode. > */ > static void GLAPIENTRY > @@ -653,21 +655,28 @@ vbo_exec_MultiDrawArrays(GLenum mode, const GLint > *first, > _mesa_enum_to_string(mode), first, count, primcount); > > if (!_mesa_validate_MultiDrawArrays(ctx, mode, count, primcount)) > return; > > for (i = 0; i < primcount; i++) { > if (count[i] > 0) { > if (0) > check_draw_arrays_data(ctx, first[i], count[i]); > > - vbo_draw_arrays(ctx, mode, first[i], count[i], 1, 0); > + /* The GL_ARB_shader_draw_parameters spec adds the following after > the > + * pseudo-code describing glMultiDrawArrays: > + * > + * "The index of the draw (<i> in the above pseudo-code) may be > + * read by a vertex shader as <gl_DrawIDARB>, as described in > + * Section 11.1.3.9." > + */ > + vbo_draw_arrays(ctx, mode, first[i], count[i], 1, 0, i); > > if (0) > print_draw_arrays(ctx, mode, first[i], count[i]); > } > } > } > > > > /** > @@ -1255,21 +1264,21 @@ vbo_draw_transform_feedback(struct gl_context *ctx, > GLenum mode, > if (!_mesa_validate_DrawTransformFeedback(ctx, mode, obj, stream, > numInstances)) { > return; > } > > if (ctx->Driver.GetTransformFeedbackVertexCount && > (ctx->Const.AlwaysUseGetTransformFeedbackVertexCount || > !_mesa_all_varyings_in_vbos(ctx->Array.VAO))) { > GLsizei n = > ctx->Driver.GetTransformFeedbackVertexCount(ctx, obj, stream); > - vbo_draw_arrays(ctx, mode, 0, n, numInstances, 0); > + vbo_draw_arrays(ctx, mode, 0, n, numInstances, 0, 0); > return; > } > > vbo_bind_arrays(ctx); > > /* init most fields to zero */ > memset(prim, 0, sizeof(prim)); > prim[0].begin = 1; > prim[0].end = 1; > prim[0].mode = mode; > -- > 2.9.3 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev