summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2020-02-14 14:29:32 -0500
committerMarek Olšák <[email protected]>2020-03-04 19:54:43 -0500
commitd740e3d6ee226c20870711c8df663b3aa97c8486 (patch)
tree608d481f514f6fc9ef7630a2604f6537af178a8b /src
parent7700ac3d80ae70d00e3cca52b6ea3d00122c7893 (diff)
mesa: deduplicate draw indirect functions
Reviewed-by: Ian Romanick <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4052>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/main/draw.c157
1 files changed, 36 insertions, 121 deletions
diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c
index 99a5afebd27..c77bbade008 100644
--- a/src/mesa/main/draw.c
+++ b/src/mesa/main/draw.c
@@ -1467,54 +1467,19 @@ _mesa_exec_DrawTransformFeedbackStreamInstanced(GLenum mode, GLuint name,
static void
-_mesa_validated_drawarraysindirect(struct gl_context *ctx,
- GLenum mode, const GLvoid *indirect)
-{
- ctx->Driver.DrawIndirect(ctx, mode,
- ctx->DrawIndirectBuffer, (GLsizeiptr) indirect,
- 1 /* draw_count */ , 16 /* stride */ ,
- NULL, 0, NULL);
-
- if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
- _mesa_flush(ctx);
-}
-
-
-static void
-_mesa_validated_multidrawarraysindirect(struct gl_context *ctx,
- GLenum mode,
- const GLvoid *indirect,
- GLsizei primcount, GLsizei stride)
+_mesa_validated_multidrawarraysindirect(struct gl_context *ctx, GLenum mode,
+ GLintptr indirect,
+ GLintptr drawcount_offset,
+ GLsizei drawcount, GLsizei stride,
+ struct gl_buffer_object *drawcount_buffer)
{
- GLsizeiptr offset = (GLsizeiptr) indirect;
-
- if (primcount == 0)
+ /* If drawcount_buffer is set, drawcount is the maximum draw count.*/
+ if (drawcount == 0)
return;
- ctx->Driver.DrawIndirect(ctx, mode, ctx->DrawIndirectBuffer, offset,
- primcount, stride, NULL, 0, NULL);
-
- if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
- _mesa_flush(ctx);
-}
-
-
-static void
-_mesa_validated_drawelementsindirect(struct gl_context *ctx,
- GLenum mode, GLenum type,
- const GLvoid *indirect)
-{
- struct _mesa_index_buffer ib;
-
- ib.count = 0; /* unknown */
- ib.obj = ctx->Array.VAO->IndexBufferObj;
- ib.ptr = NULL;
- get_index_size(type, &ib);
-
- ctx->Driver.DrawIndirect(ctx, mode,
- ctx->DrawIndirectBuffer, (GLsizeiptr) indirect,
- 1 /* draw_count */ , 20 /* stride */ ,
- NULL, 0, &ib);
+ ctx->Driver.DrawIndirect(ctx, mode, ctx->DrawIndirectBuffer, indirect,
+ drawcount, stride, drawcount_buffer,
+ drawcount_offset, NULL);
if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
_mesa_flush(ctx);
@@ -1524,25 +1489,25 @@ _mesa_validated_drawelementsindirect(struct gl_context *ctx,
static void
_mesa_validated_multidrawelementsindirect(struct gl_context *ctx,
GLenum mode, GLenum type,
- const GLvoid *indirect,
- GLsizei primcount, GLsizei stride)
+ GLintptr indirect,
+ GLintptr drawcount_offset,
+ GLsizei drawcount, GLsizei stride,
+ struct gl_buffer_object *drawcount_buffer)
{
- struct _mesa_index_buffer ib;
- GLsizeiptr offset = (GLsizeiptr) indirect;
-
- if (primcount == 0)
+ /* If drawcount_buffer is set, drawcount is the maximum draw count.*/
+ if (drawcount == 0)
return;
/* NOTE: IndexBufferObj is guaranteed to be a VBO. */
-
+ struct _mesa_index_buffer ib;
ib.count = 0; /* unknown */
ib.obj = ctx->Array.VAO->IndexBufferObj;
ib.ptr = NULL;
get_index_size(type, &ib);
- ctx->Driver.DrawIndirect(ctx, mode,
- ctx->DrawIndirectBuffer, offset,
- primcount, stride, NULL, 0, &ib);
+ ctx->Driver.DrawIndirect(ctx, mode, ctx->DrawIndirectBuffer, indirect,
+ drawcount, stride, drawcount_buffer,
+ drawcount_offset, &ib);
if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
_mesa_flush(ctx);
@@ -1594,7 +1559,8 @@ _mesa_exec_DrawArraysIndirect(GLenum mode, const GLvoid *indirect)
if (skip_validated_draw(ctx))
return;
- _mesa_validated_drawarraysindirect(ctx, mode, indirect);
+ _mesa_validated_multidrawarraysindirect(ctx, mode, (GLintptr)indirect,
+ 0, 1, 16, NULL);
}
@@ -1660,7 +1626,9 @@ _mesa_exec_DrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect
if (skip_validated_draw(ctx))
return;
- _mesa_validated_drawelementsindirect(ctx, mode, type, indirect);
+ _mesa_validated_multidrawelementsindirect(ctx, mode, type,
+ (GLintptr)indirect, 0,
+ 1, 20, NULL);
}
@@ -1725,8 +1693,8 @@ _mesa_exec_MultiDrawArraysIndirect(GLenum mode, const GLvoid *indirect,
if (skip_validated_draw(ctx))
return;
- _mesa_validated_multidrawarraysindirect(ctx, mode, indirect,
- primcount, stride);
+ _mesa_validated_multidrawarraysindirect(ctx, mode, (GLintptr)indirect, 0,
+ primcount, stride, NULL);
}
@@ -1804,62 +1772,9 @@ _mesa_exec_MultiDrawElementsIndirect(GLenum mode, GLenum type,
if (skip_validated_draw(ctx))
return;
- _mesa_validated_multidrawelementsindirect(ctx, mode, type, indirect,
- primcount, stride);
-}
-
-
-static void
-_mesa_validated_multidrawarraysindirectcount(struct gl_context *ctx,
- GLenum mode,
- GLintptr indirect,
- GLintptr drawcount_offset,
- GLsizei maxdrawcount,
- GLsizei stride)
-{
- GLsizeiptr offset = indirect;
-
- if (maxdrawcount == 0)
- return;
-
- ctx->Driver.DrawIndirect(ctx, mode,
- ctx->DrawIndirectBuffer, offset,
- maxdrawcount, stride,
- ctx->ParameterBuffer, drawcount_offset, NULL);
-
- if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
- _mesa_flush(ctx);
-}
-
-
-static void
-_mesa_validated_multidrawelementsindirectcount(struct gl_context *ctx,
- GLenum mode, GLenum type,
- GLintptr indirect,
- GLintptr drawcount_offset,
- GLsizei maxdrawcount,
- GLsizei stride)
-{
- struct _mesa_index_buffer ib;
- GLsizeiptr offset = (GLsizeiptr) indirect;
-
- if (maxdrawcount == 0)
- return;
-
- /* NOTE: IndexBufferObj is guaranteed to be a VBO. */
-
- ib.count = 0; /* unknown */
- ib.obj = ctx->Array.VAO->IndexBufferObj;
- ib.ptr = NULL;
- get_index_size(type, &ib);
-
- ctx->Driver.DrawIndirect(ctx, mode,
- ctx->DrawIndirectBuffer, offset,
- maxdrawcount, stride,
- ctx->ParameterBuffer, drawcount_offset, &ib);
-
- if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
- _mesa_flush(ctx);
+ _mesa_validated_multidrawelementsindirect(ctx, mode, type,
+ (GLintptr)indirect, 0, primcount,
+ stride, NULL);
}
@@ -1899,9 +1814,9 @@ _mesa_exec_MultiDrawArraysIndirectCount(GLenum mode, GLintptr indirect,
if (skip_validated_draw(ctx))
return;
- _mesa_validated_multidrawarraysindirectcount(ctx, mode, indirect,
- drawcount_offset,
- maxdrawcount, stride);
+ _mesa_validated_multidrawarraysindirect(ctx, mode, indirect,
+ drawcount_offset, maxdrawcount,
+ stride, ctx->ParameterBuffer);
}
@@ -1942,9 +1857,9 @@ _mesa_exec_MultiDrawElementsIndirectCount(GLenum mode, GLenum type,
if (skip_validated_draw(ctx))
return;
- _mesa_validated_multidrawelementsindirectcount(ctx, mode, type, indirect,
- drawcount_offset, maxdrawcount,
- stride);
+ _mesa_validated_multidrawelementsindirect(ctx, mode, type, indirect,
+ drawcount_offset, maxdrawcount,
+ stride, ctx->ParameterBuffer);
}