diff options
-rw-r--r-- | src/mesa/drivers/common/driverfuncs.c | 4 | ||||
-rw-r--r-- | src/mesa/main/draw.c | 74 | ||||
-rw-r--r-- | src/mesa/main/draw.h | 11 | ||||
-rw-r--r-- | src/mesa/vbo/vbo.h | 10 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_context.c | 74 |
5 files changed, 87 insertions, 86 deletions
diff --git a/src/mesa/drivers/common/driverfuncs.c b/src/mesa/drivers/common/driverfuncs.c index e783262773e..bdfac61f344 100644 --- a/src/mesa/drivers/common/driverfuncs.c +++ b/src/mesa/drivers/common/driverfuncs.c @@ -28,6 +28,7 @@ #include "main/accum.h" #include "main/arrayobj.h" #include "main/context.h" +#include "main/draw.h" #include "main/formatquery.h" #include "main/framebuffer.h" #include "main/mipmap.h" @@ -55,7 +56,6 @@ #include "tnl/tnl.h" #include "swrast/swrast.h" #include "swrast/s_renderbuffer.h" -#include "vbo/vbo.h" #include "driverfuncs.h" #include "meta.h" @@ -122,7 +122,7 @@ _mesa_init_driver_functions(struct dd_function_table *driver) /* Draw functions */ driver->Draw = NULL; - driver->DrawIndirect = _vbo_draw_indirect; + driver->DrawIndirect = _mesa_draw_indirect; /* simple state commands */ driver->AlphaFunc = NULL; diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c index 7729a860d02..85a9eedbc32 100644 --- a/src/mesa/main/draw.c +++ b/src/mesa/main/draw.c @@ -29,6 +29,7 @@ #include <stdio.h> #include "arrayobj.h" #include "glheader.h" +#include "c99_alloca.h" #include "context.h" #include "state.h" #include "draw.h" @@ -2143,3 +2144,76 @@ _mesa_DrawTransformFeedback(GLenum mode, GLuint name) { _mesa_exec_DrawTransformFeedback(mode, name); } + + +/* + * Helper function for _mesa_draw_indirect below that additionally takes a zero + * initialized array of _mesa_prim scratch space memory as the last argument. + */ +static void +draw_indirect(struct gl_context *ctx, GLuint mode, + struct gl_buffer_object *indirect_data, + GLsizeiptr indirect_offset, unsigned draw_count, + unsigned stride, + struct gl_buffer_object *indirect_draw_count_buffer, + GLsizeiptr indirect_draw_count_offset, + const struct _mesa_index_buffer *ib, + struct _mesa_prim *prim) +{ + prim[0].begin = 1; + prim[draw_count - 1].end = 1; + for (unsigned i = 0; i < draw_count; ++i, indirect_offset += stride) { + prim[i].mode = mode; + prim[i].indexed = !!ib; + prim[i].indirect_offset = indirect_offset; + prim[i].is_indirect = 1; + prim[i].draw_id = i; + } + + /* This should always be true at this time */ + assert(indirect_data == ctx->DrawIndirectBuffer); + + ctx->Driver.Draw(ctx, prim, draw_count, ib, false, 0u, ~0u, + NULL, 0, indirect_data); +} + + +/* + * Function to be put into dd_function_table::DrawIndirect as fallback. + * Calls into dd_function_table::Draw past adapting call arguments. + * See dd_function_table::DrawIndirect for call argument documentation. + */ +void +_mesa_draw_indirect(struct gl_context *ctx, GLuint mode, + struct gl_buffer_object *indirect_data, + GLsizeiptr indirect_offset, unsigned draw_count, + unsigned stride, + struct gl_buffer_object *indirect_draw_count_buffer, + GLsizeiptr indirect_draw_count_offset, + const struct _mesa_index_buffer *ib) +{ + /* Use alloca for the prim space if we are somehow in bounds. */ + if (draw_count*sizeof(struct _mesa_prim) < 1024) { + struct _mesa_prim *space = alloca(draw_count*sizeof(struct _mesa_prim)); + memset(space, 0, draw_count*sizeof(struct _mesa_prim)); + + draw_indirect(ctx, mode, indirect_data, indirect_offset, draw_count, + stride, indirect_draw_count_buffer, + indirect_draw_count_offset, ib, space); + } else { + struct _mesa_prim *space = calloc(draw_count, sizeof(struct _mesa_prim)); + if (space == NULL) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "gl%sDraw%sIndirect%s", + (draw_count > 1) ? "Multi" : "", + ib ? "Elements" : "Arrays", + indirect_data ? "CountARB" : ""); + return; + } + + draw_indirect(ctx, mode, indirect_data, indirect_offset, draw_count, + stride, indirect_draw_count_buffer, + indirect_draw_count_offset, ib, space); + + free(space); + } +} diff --git a/src/mesa/main/draw.h b/src/mesa/main/draw.h index 0200af6797f..57b3ec9e7db 100644 --- a/src/mesa/main/draw.h +++ b/src/mesa/main/draw.h @@ -76,6 +76,17 @@ void _mesa_initialize_exec_dispatch(const struct gl_context *ctx, struct _glapi_table *exec); + +void +_mesa_draw_indirect(struct gl_context *ctx, GLuint mode, + struct gl_buffer_object *indirect_data, + GLsizeiptr indirect_offset, unsigned draw_count, + unsigned stride, + struct gl_buffer_object *indirect_draw_count_buffer, + GLsizeiptr indirect_draw_count_offset, + const struct _mesa_index_buffer *ib); + + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h index cab01dcf478..3399fcdea46 100644 --- a/src/mesa/vbo/vbo.h +++ b/src/mesa/vbo/vbo.h @@ -85,16 +85,6 @@ vbo_save_EndCallList(struct gl_context *ctx); void -_vbo_draw_indirect(struct gl_context *ctx, GLuint mode, - struct gl_buffer_object *indirect_data, - GLsizeiptr indirect_offset, unsigned draw_count, - unsigned stride, - struct gl_buffer_object *indirect_draw_count_buffer, - GLsizeiptr indirect_draw_count_offset, - const struct _mesa_index_buffer *ib); - - -void vbo_delete_minmax_cache(struct gl_buffer_object *bufferObj); void diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c index cf9405df3dc..364de2c507e 100644 --- a/src/mesa/vbo/vbo_context.c +++ b/src/mesa/vbo/vbo_context.c @@ -25,7 +25,6 @@ * Keith Whitwell <[email protected]> */ -#include "c99_alloca.h" #include "main/errors.h" #include "main/bufferobj.h" #include "math/m_eval.h" @@ -249,76 +248,3 @@ _vbo_current_binding(const struct gl_context *ctx) const struct vbo_context *vbo = vbo_context_const(ctx); return &vbo->binding; } - - -/* - * Helper function for _vbo_draw_indirect below that additionally takes a zero - * initialized array of _mesa_prim scratch space memory as the last argument. - */ -static void -draw_indirect(struct gl_context *ctx, GLuint mode, - struct gl_buffer_object *indirect_data, - GLsizeiptr indirect_offset, unsigned draw_count, - unsigned stride, - struct gl_buffer_object *indirect_draw_count_buffer, - GLsizeiptr indirect_draw_count_offset, - const struct _mesa_index_buffer *ib, - struct _mesa_prim *prim) -{ - prim[0].begin = 1; - prim[draw_count - 1].end = 1; - for (unsigned i = 0; i < draw_count; ++i, indirect_offset += stride) { - prim[i].mode = mode; - prim[i].indexed = !!ib; - prim[i].indirect_offset = indirect_offset; - prim[i].is_indirect = 1; - prim[i].draw_id = i; - } - - /* This should always be true at this time */ - assert(indirect_data == ctx->DrawIndirectBuffer); - - ctx->Driver.Draw(ctx, prim, draw_count, ib, false, 0u, ~0u, - NULL, 0, indirect_data); -} - - -/* - * Function to be put into dd_function_table::DrawIndirect as fallback. - * Calls into dd_function_table::Draw past adapting call arguments. - * See dd_function_table::DrawIndirect for call argument documentation. - */ -void -_vbo_draw_indirect(struct gl_context *ctx, GLuint mode, - struct gl_buffer_object *indirect_data, - GLsizeiptr indirect_offset, unsigned draw_count, - unsigned stride, - struct gl_buffer_object *indirect_draw_count_buffer, - GLsizeiptr indirect_draw_count_offset, - const struct _mesa_index_buffer *ib) -{ - /* Use alloca for the prim space if we are somehow in bounds. */ - if (draw_count*sizeof(struct _mesa_prim) < 1024) { - struct _mesa_prim *space = alloca(draw_count*sizeof(struct _mesa_prim)); - memset(space, 0, draw_count*sizeof(struct _mesa_prim)); - - draw_indirect(ctx, mode, indirect_data, indirect_offset, draw_count, - stride, indirect_draw_count_buffer, - indirect_draw_count_offset, ib, space); - } else { - struct _mesa_prim *space = calloc(draw_count, sizeof(struct _mesa_prim)); - if (space == NULL) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "gl%sDraw%sIndirect%s", - (draw_count > 1) ? "Multi" : "", - ib ? "Elements" : "Arrays", - indirect_data ? "CountARB" : ""); - return; - } - - draw_indirect(ctx, mode, indirect_data, indirect_offset, draw_count, - stride, indirect_draw_count_buffer, - indirect_draw_count_offset, ib, space); - - free(space); - } -} |