gallium: add a view mask to the draw command
This allows the caller to specify the view mask for this draw in a multiview draw environment This has been packed into the upper nibble and 2 bits of the index size to retain the struct size as small as possible for tc. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Roland Scheidegger <sroland@vmware.com> Acked-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9399>
This commit is contained in:
parent
684f97de80
commit
e3b8f449e1
|
@ -746,7 +746,8 @@ struct pipe_draw_info
|
||||||
{
|
{
|
||||||
enum pipe_prim_type mode:8; /**< the mode of the primitive */
|
enum pipe_prim_type mode:8; /**< the mode of the primitive */
|
||||||
ubyte vertices_per_patch; /**< the number of vertices per patch */
|
ubyte vertices_per_patch; /**< the number of vertices per patch */
|
||||||
ubyte index_size; /**< if 0, the draw is not indexed. */
|
unsigned index_size:4; /**< if 0, the draw is not indexed. */
|
||||||
|
unsigned view_mask:6; /**< mask of multiviews for this draw */
|
||||||
bool primitive_restart:1;
|
bool primitive_restart:1;
|
||||||
bool has_user_indices:1; /**< if true, use index.user_buffer */
|
bool has_user_indices:1; /**< if true, use index.user_buffer */
|
||||||
bool index_bounds_valid:1; /**< whether min_index and max_index are valid;
|
bool index_bounds_valid:1; /**< whether min_index and max_index are valid;
|
||||||
|
@ -754,7 +755,7 @@ struct pipe_draw_info
|
||||||
bool increment_draw_id:1; /**< whether drawid increments for direct draws */
|
bool increment_draw_id:1; /**< whether drawid increments for direct draws */
|
||||||
bool take_index_buffer_ownership:1; /**< callee inherits caller's refcount
|
bool take_index_buffer_ownership:1; /**< callee inherits caller's refcount
|
||||||
(no need to reference indexbuf, but still needs to unreference it) */
|
(no need to reference indexbuf, but still needs to unreference it) */
|
||||||
char _pad:3; /**< padding for memcmp */
|
char _pad:1; /**< padding for memcmp */
|
||||||
|
|
||||||
unsigned start_instance; /**< first instance id */
|
unsigned start_instance; /**< first instance id */
|
||||||
unsigned instance_count; /**< number of instances */
|
unsigned instance_count; /**< number of instances */
|
||||||
|
|
|
@ -1336,6 +1336,7 @@ _mesa_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
|
||||||
info.start_instance = baseInstance;
|
info.start_instance = baseInstance;
|
||||||
info.instance_count = numInstances;
|
info.instance_count = numInstances;
|
||||||
info.drawid = 0;
|
info.drawid = 0;
|
||||||
|
info.view_mask = 0;
|
||||||
info.min_index = start;
|
info.min_index = start;
|
||||||
info.max_index = start + count - 1;
|
info.max_index = start + count - 1;
|
||||||
|
|
||||||
|
@ -1664,6 +1665,7 @@ _mesa_MultiDrawArrays(GLenum mode, const GLint *first,
|
||||||
info.start_instance = 0;
|
info.start_instance = 0;
|
||||||
info.instance_count = 1;
|
info.instance_count = 1;
|
||||||
info.drawid = 0;
|
info.drawid = 0;
|
||||||
|
info.view_mask = 0;
|
||||||
|
|
||||||
for (int i = 0; i < primcount; i++) {
|
for (int i = 0; i < primcount; i++) {
|
||||||
draw[i].start = first[i];
|
draw[i].start = first[i];
|
||||||
|
@ -1778,6 +1780,7 @@ _mesa_validated_drawrangeelements(struct gl_context *ctx, GLenum mode,
|
||||||
info.start_instance = baseInstance;
|
info.start_instance = baseInstance;
|
||||||
info.instance_count = numInstances;
|
info.instance_count = numInstances;
|
||||||
info.drawid = 0;
|
info.drawid = 0;
|
||||||
|
info.view_mask = 0;
|
||||||
info.index_bias = basevertex;
|
info.index_bias = basevertex;
|
||||||
info.restart_index = ctx->Array._RestartIndex[index_size_shift];
|
info.restart_index = ctx->Array._RestartIndex[index_size_shift];
|
||||||
|
|
||||||
|
@ -2176,6 +2179,7 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
|
||||||
info.start_instance = 0;
|
info.start_instance = 0;
|
||||||
info.instance_count = 1;
|
info.instance_count = 1;
|
||||||
info.drawid = 0;
|
info.drawid = 0;
|
||||||
|
info.view_mask = 0;
|
||||||
info.restart_index = ctx->Array._RestartIndex[index_size_shift];
|
info.restart_index = ctx->Array._RestartIndex[index_size_shift];
|
||||||
|
|
||||||
if (info.has_user_indices)
|
if (info.has_user_indices)
|
||||||
|
|
|
@ -161,6 +161,7 @@ st_draw_vbo(struct gl_context *ctx,
|
||||||
info.instance_count = num_instances;
|
info.instance_count = num_instances;
|
||||||
info.take_index_buffer_ownership = false;
|
info.take_index_buffer_ownership = false;
|
||||||
info._pad = 0;
|
info._pad = 0;
|
||||||
|
info.view_mask = 0;
|
||||||
|
|
||||||
if (ib) {
|
if (ib) {
|
||||||
struct gl_buffer_object *bufobj = ib->obj;
|
struct gl_buffer_object *bufobj = ib->obj;
|
||||||
|
|
|
@ -127,6 +127,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
|
||||||
info.take_index_buffer_ownership = false;
|
info.take_index_buffer_ownership = false;
|
||||||
info.vertices_per_patch = ctx->TessCtrlProgram.patch_vertices;
|
info.vertices_per_patch = ctx->TessCtrlProgram.patch_vertices;
|
||||||
info.restart_index = 0;
|
info.restart_index = 0;
|
||||||
|
info.view_mask = 0;
|
||||||
|
|
||||||
st_flush_bitmap_cache(st);
|
st_flush_bitmap_cache(st);
|
||||||
st_invalidate_readpix_cache(st);
|
st_invalidate_readpix_cache(st);
|
||||||
|
|
Loading…
Reference in New Issue