}
-static void
-_mesa_validated_multidrawarraysindirect(struct gl_context *ctx, GLenum mode,
- GLintptr indirect,
- GLintptr drawcount_offset,
- GLsizei drawcount, GLsizei stride,
- struct gl_buffer_object *drawcount_buffer)
-{
- /* If drawcount_buffer is set, drawcount is the maximum draw count.*/
- if (drawcount == 0)
- return;
-
- st_indirect_draw_vbo(ctx, mode, ctx->DrawIndirectBuffer, indirect,
- drawcount, stride, drawcount_buffer,
- drawcount_offset, NULL, false, 0);
-
- if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
- _mesa_flush(ctx);
-}
-
-
-static void
-_mesa_validated_multidrawelementsindirect(struct gl_context *ctx,
- GLenum mode, GLenum type,
- GLintptr indirect,
- GLintptr drawcount_offset,
- GLsizei drawcount, GLsizei stride,
- struct gl_buffer_object *drawcount_buffer)
-{
- /* 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;
- ib.index_size_shift = get_index_size_shift(type);
-
- st_indirect_draw_vbo(ctx, mode, ctx->DrawIndirectBuffer, indirect,
- drawcount, stride, drawcount_buffer,
- drawcount_offset, &ib,
- ctx->Array._PrimitiveRestart[ib.index_size_shift],
- ctx->Array._RestartIndex[ib.index_size_shift]);
-
- if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
- _mesa_flush(ctx);
-}
-
-
/**
* Like [Multi]DrawArrays/Elements, but they take most arguments from
* a buffer object.
!_mesa_validate_DrawArraysIndirect(ctx, mode, indirect))
return;
- _mesa_validated_multidrawarraysindirect(ctx, mode, (GLintptr)indirect,
- 0, 1, 16, NULL);
+ st_indirect_draw_vbo(ctx, mode, 0, (GLintptr)indirect, 0, 1, 16);
}
!_mesa_validate_DrawElementsIndirect(ctx, mode, type, indirect))
return;
- _mesa_validated_multidrawelementsindirect(ctx, mode, type,
- (GLintptr)indirect, 0,
- 1, 20, NULL);
+ st_indirect_draw_vbo(ctx, mode, type, (GLintptr)indirect, 0, 1, 20);
}
primcount, stride))
return;
- _mesa_validated_multidrawarraysindirect(ctx, mode, (GLintptr)indirect, 0,
- primcount, stride, NULL);
+ st_indirect_draw_vbo(ctx, mode, 0, (GLintptr)indirect, 0, primcount, stride);
}
primcount, stride))
return;
- _mesa_validated_multidrawelementsindirect(ctx, mode, type,
- (GLintptr)indirect, 0, primcount,
- stride, NULL);
+ st_indirect_draw_vbo(ctx, mode, type, (GLintptr)indirect, 0, primcount, stride);
}
maxdrawcount, stride))
return;
- _mesa_validated_multidrawarraysindirect(ctx, mode, indirect,
- drawcount_offset, maxdrawcount,
- stride, ctx->ParameterBuffer);
+ st_indirect_draw_vbo(ctx, mode, 0, (GLintptr)indirect, drawcount_offset,
+ maxdrawcount, stride);
}
maxdrawcount, stride))
return;
- _mesa_validated_multidrawelementsindirect(ctx, mode, type, indirect,
- drawcount_offset, maxdrawcount,
- stride, ctx->ParameterBuffer);
+ st_indirect_draw_vbo(ctx, mode, type, (GLintptr)indirect, drawcount_offset,
+ maxdrawcount, stride);
}
* Keith Whitwell <keithw@vmware.com>
*/
-
+#include "main/context.h"
#include "main/errors.h"
#include "main/image.h"
void
st_indirect_draw_vbo(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,
- GLsizeiptr indirect_draw_count_offset,
- const struct _mesa_index_buffer *ib,
- bool primitive_restart,
- unsigned restart_index)
+ GLenum mode, GLenum index_type,
+ GLintptr indirect_offset,
+ GLintptr indirect_draw_count_offset,
+ GLsizei draw_count, GLsizei stride)
{
+ struct gl_buffer_object *indirect_data = ctx->DrawIndirectBuffer;
+ struct gl_buffer_object *indirect_draw_count = ctx->ParameterBuffer;
struct st_context *st = st_context(ctx);
struct pipe_draw_info info;
struct pipe_draw_indirect_info indirect;
struct pipe_draw_start_count_bias draw = {0};
+ /* If indirect_draw_count is set, drawcount is the maximum draw count.*/
+ if (!draw_count)
+ return;
+
assert(stride);
prepare_draw(st, ctx, ST_PIPELINE_RENDER_STATE_MASK, ST_PIPELINE_RENDER);
util_draw_init_info(&info);
info.max_index = ~0u; /* so that u_vbuf can tell that it's unknown */
- if (ib) {
- struct gl_buffer_object *bufobj = ib->obj;
+ switch (index_type) {
+ case GL_UNSIGNED_BYTE:
+ info.index_size = 1;
+ break;
+ case GL_UNSIGNED_SHORT:
+ info.index_size = 2;
+ break;
+ case GL_UNSIGNED_INT:
+ info.index_size = 4;
+ break;
+ }
+
+ if (info.index_size) {
+ struct gl_buffer_object *bufobj = ctx->Array.VAO->IndexBufferObj;
/* indices are always in a real VBO */
assert(bufobj);
- info.index_size = 1 << ib->index_size_shift;
info.index.resource = bufobj->buffer;
- draw.start = pointer_to_offset(ib->ptr) >> ib->index_size_shift;
+ draw.start = 0;
- info.restart_index = restart_index;
- info.primitive_restart = primitive_restart;
+ unsigned index_size_shift = util_logbase2(info.index_size);
+ info.restart_index = ctx->Array._RestartIndex[index_size_shift];
+ info.primitive_restart = ctx->Array._PrimitiveRestart[index_size_shift];
}
info.mode = translate_prim(ctx, mode);
}
cso_draw_vbo(st->cso_context, &info, 0, &indirect, draw);
}
+
+ if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
+ _mesa_flush(ctx);
}
void
#include "main/glheader.h"
-struct _mesa_index_buffer;
struct gl_context;
struct st_context;
void
st_indirect_draw_vbo(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,
- GLsizeiptr indirect_draw_count_offset,
- const struct _mesa_index_buffer *ib,
- bool primitive_restart,
- unsigned restart_index);
+ GLenum mode, GLenum index_type,
+ GLintptr indirect_offset,
+ GLintptr indirect_draw_count_offset,
+ GLsizei draw_count, GLsizei stride);
bool
st_draw_hw_select_prepare_common(struct gl_context *ctx);