mesa: add ARB_draw_indirect support to compat profile

v2: add missing ARB_base_instance support

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Timothy Arceri
2018-06-23 17:09:13 +10:00
parent 9b32c80357
commit 5f90fb4007
3 changed files with 72 additions and 4 deletions
+1 -2
View File
@@ -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;
}
+1 -1
View File
@@ -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)
+70 -1
View File
@@ -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);
}