Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Fri, Jun 29, 2018 at 5:22 AM, Timothy Arceri <tarc...@itsqueeze.com> wrote: > v2: add missing ARB_base_instance support > --- > src/mesa/main/bufferobj.c | 3 +- > src/mesa/main/extensions_table.h | 2 +- > src/mesa/vbo/vbo_exec_array.c | 71 +++++++++++++++++++++++++++++++- > 3 files changed, 72 insertions(+), 4 deletions(-) > > diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c > index 67f9cd0a902..1d1e51bc015 100644 > --- a/src/mesa/main/bufferobj.c > +++ b/src/mesa/main/bufferobj.c > @@ -129,8 +129,7 @@ get_buffer_target(struct gl_context *ctx, GLenum target) > return &ctx->QueryBuffer; > break; > case GL_DRAW_INDIRECT_BUFFER: > - if ((ctx->API == API_OPENGL_CORE && > - ctx->Extensions.ARB_draw_indirect) || > + if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_draw_indirect) || > _mesa_is_gles31(ctx)) { > return &ctx->DrawIndirectBuffer; > } > diff --git a/src/mesa/main/extensions_table.h > b/src/mesa/main/extensions_table.h > index f79a52cee8c..1446a4bd421 100644 > --- a/src/mesa/main/extensions_table.h > +++ b/src/mesa/main/extensions_table.h > @@ -58,7 +58,7 @@ EXT(ARB_direct_state_access , dummy_true > EXT(ARB_draw_buffers , dummy_true > , GLL, GLC, x , x , 2002) > EXT(ARB_draw_buffers_blend , ARB_draw_buffers_blend > , GLL, GLC, x , x , 2009) > EXT(ARB_draw_elements_base_vertex , ARB_draw_elements_base_vertex > , GLL, GLC, x , x , 2009) > -EXT(ARB_draw_indirect , ARB_draw_indirect > , x , GLC, x , x , 2010) > +EXT(ARB_draw_indirect , ARB_draw_indirect > , GLL, GLC, x , x , 2010) > EXT(ARB_draw_instanced , ARB_draw_instanced > , GLL, GLC, x , x , 2008) > EXT(ARB_enhanced_layouts , ARB_enhanced_layouts > , GLL, GLC, x , x , 2013) > EXT(ARB_explicit_attrib_location , ARB_explicit_attrib_location > , GLL, GLC, x , x , 2009) > diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c > index 792907ac044..dbb2590f0c9 100644 > --- a/src/mesa/vbo/vbo_exec_array.c > +++ b/src/mesa/vbo/vbo_exec_array.c > @@ -39,6 +39,21 @@ > #include "main/macros.h" > #include "main/transformfeedback.h" > > +typedef struct { > + GLuint count; > + GLuint primCount; > + GLuint first; > + GLuint baseInstance; > +} DrawArraysIndirectCommand; > + > +typedef struct { > + GLuint count; > + GLuint primCount; > + GLuint firstIndex; > + GLint baseVertex; > + GLuint baseInstance; > +} DrawElementsIndirectCommand; > + > > /** > * Check that element 'j' of the array has reasonable data. > @@ -1616,6 +1631,23 @@ vbo_exec_DrawArraysIndirect(GLenum mode, const GLvoid > *indirect) > _mesa_debug(ctx, "glDrawArraysIndirect(%s, %p)\n", > _mesa_enum_to_string(mode), indirect); > > + /* From the ARB_draw_indirect spec: > + * > + * "Initially zero is bound to DRAW_INDIRECT_BUFFER. In the > + * compatibility profile, this indicates that DrawArraysIndirect and > + * DrawElementsIndirect are to source their arguments directly from the > + * pointer passed as their <indirect> parameters." > + */ > + if (ctx->API == API_OPENGL_COMPAT && > + !_mesa_is_bufferobj(ctx->DrawIndirectBuffer)) { > + DrawArraysIndirectCommand *cmd = (DrawArraysIndirectCommand *) > indirect; > + > + vbo_exec_DrawArraysInstancedBaseInstance(mode, cmd->first, cmd->count, > + cmd->primCount, > + cmd->baseInstance); > + return; > + } > + > FLUSH_FOR_DRAW(ctx); > > if (_mesa_is_no_error_enabled(ctx)) { > @@ -1647,6 +1679,43 @@ vbo_exec_DrawElementsIndirect(GLenum mode, GLenum > type, const GLvoid *indirect) > _mesa_enum_to_string(mode), > _mesa_enum_to_string(type), indirect); > > + /* From the ARB_draw_indirect spec: > + * > + * "Initially zero is bound to DRAW_INDIRECT_BUFFER. In the > + * compatibility profile, this indicates that DrawArraysIndirect and > + * DrawElementsIndirect are to source their arguments directly from the > + * pointer passed as their <indirect> parameters." > + */ > + if (ctx->API == API_OPENGL_COMPAT && > + !_mesa_is_bufferobj(ctx->DrawIndirectBuffer)) { > + /* > + * Unlike regular DrawElementsInstancedBaseVertex commands, the indices > + * may not come from a client array and must come from an index buffer. > + * If no element array buffer is bound, an INVALID_OPERATION error is > + * generated. > + */ > + if (!_mesa_is_bufferobj(ctx->Array.VAO->IndexBufferObj)) { > + _mesa_error(ctx, GL_INVALID_OPERATION, > + "glDrawElementsIndirect(no buffer bound " > + "to GL_ELEMENT_ARRAY_BUFFER)"); > + } else { > + DrawElementsIndirectCommand *cmd = > + (DrawElementsIndirectCommand *) indirect; > + > + /* Convert offset to pointer */ > + void *offset = (void *) > + ((cmd->firstIndex * _mesa_sizeof_type(type)) & 0xffffffffUL); > + > + vbo_exec_DrawElementsInstancedBaseVertexBaseInstance(mode, > cmd->count, > + type, offset, > + cmd->primCount, > + > cmd->baseVertex, > + > cmd->baseInstance); > + } > + > + return; > + } > + > FLUSH_FOR_DRAW(ctx); > > if (_mesa_is_no_error_enabled(ctx)) { > @@ -1933,7 +2002,7 @@ vbo_initialize_exec_dispatch(const struct gl_context > *ctx, > > vbo_exec_DrawElementsInstancedBaseVertexBaseInstance); > } > > - if (ctx->API == API_OPENGL_CORE || _mesa_is_gles31(ctx)) { > + if (_mesa_is_desktop_gl(ctx) || _mesa_is_gles31(ctx)) { > SET_DrawArraysIndirect(exec, vbo_exec_DrawArraysIndirect); > SET_DrawElementsIndirect(exec, vbo_exec_DrawElementsIndirect); > } > -- > 2.17.1 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev