diff options
author | Marek Olšák <marek.olsak@amd.com> | 2020-11-01 13:43:43 -0500 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-11-18 01:41:25 +0000 |
commit | 51c7c64f0a43c337e6816d2dece44d26c48f8cb8 (patch) | |
tree | b8fff7a70c555ef9306eda68005ac15b27d23d06 /src/mesa/drivers/dri | |
parent | e8c0c80ecd713b1eff30fca423a9c31747669650 (diff) |
mesa: add primitive restart state to Driver.Draw parameters
so that display lists don't have to disable it and drivers are simpler.
This will also enable unification with Gallium.
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7441>
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.h | 1 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_draw.c | 18 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_draw.h | 12 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_primitive_restart.c | 29 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/genX_state_upload.c | 6 | ||||
-rw-r--r-- | src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c | 6 |
6 files changed, 47 insertions, 25 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 4fcbf1674e0..aaf1a7e0d0b 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1202,6 +1202,7 @@ struct brw_context struct { bool in_progress; bool enable_cut_index; + unsigned restart_index; } prim_restart; /** Computed depth/stencil/hiz state from the current attached diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index 3f32f00437e..f1d233aeae7 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -1137,6 +1137,8 @@ brw_draw_prims(struct gl_context *ctx, unsigned nr_prims, const struct _mesa_index_buffer *ib, bool index_bounds_valid, + bool primitive_restart, + unsigned restart_index, unsigned min_index, unsigned max_index, unsigned num_instances, @@ -1151,7 +1153,8 @@ brw_draw_prims(struct gl_context *ctx, /* Handle primitive restart if needed */ if (brw_handle_primitive_restart(ctx, prims, nr_prims, ib, num_instances, - base_instance)) { + base_instance, primitive_restart, + restart_index)) { /* The draw was handled, so we can exit now */ return; } @@ -1164,7 +1167,8 @@ brw_draw_prims(struct gl_context *ctx, _mesa_enum_to_string(ctx->RenderMode)); _swsetup_Wakeup(ctx); _tnl_wakeup(ctx); - _tnl_draw(ctx, prims, nr_prims, ib, index_bounds_valid, min_index, + _tnl_draw(ctx, prims, nr_prims, ib, index_bounds_valid, + primitive_restart, restart_index, min_index, max_index, num_instances, base_instance); return; } @@ -1176,7 +1180,8 @@ brw_draw_prims(struct gl_context *ctx, if (!index_bounds_valid && _mesa_draw_user_array_bits(ctx) != 0) { perf_debug("Scanning index buffer to compute index buffer bounds. " "Use glDrawRangeElements() to avoid this.\n"); - vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index, nr_prims); + vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index, nr_prims, + primitive_restart, restart_index); index_bounds_valid = true; } @@ -1275,7 +1280,9 @@ brw_draw_indirect_prims(struct gl_context *ctx, unsigned stride, struct gl_buffer_object *indirect_params, GLsizeiptr indirect_params_offset, - const struct _mesa_index_buffer *ib) + const struct _mesa_index_buffer *ib, + bool primitive_restart, + unsigned restart_index) { struct brw_context *brw = brw_context(ctx); struct _mesa_prim *prim; @@ -1309,7 +1316,8 @@ brw_draw_indirect_prims(struct gl_context *ctx, brw->draw.draw_indirect_data = indirect_data; - brw_draw_prims(ctx, prim, draw_count, ib, false, 0, ~0, 0, 0); + brw_draw_prims(ctx, prim, draw_count, ib, false, primitive_restart, + restart_index, 0, ~0, 0, 0); brw->draw.draw_indirect_data = NULL; free(prim); diff --git a/src/mesa/drivers/dri/i965/brw_draw.h b/src/mesa/drivers/dri/i965/brw_draw.h index 06f127b83cd..8500fa68f52 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.h +++ b/src/mesa/drivers/dri/i965/brw_draw.h @@ -49,7 +49,9 @@ void brw_draw_prims(struct gl_context *ctx, unsigned nr_prims, const struct _mesa_index_buffer *ib, bool index_bounds_valid, - unsigned min_index, + bool primitive_restart, + unsigned restart_index, + unsigned min_index, unsigned max_index, unsigned num_instances, unsigned base_instance); @@ -66,7 +68,9 @@ brw_handle_primitive_restart(struct gl_context *ctx, const struct _mesa_prim *prims, GLuint nr_prims, const struct _mesa_index_buffer *ib, - GLuint num_instances, GLuint base_instance); + GLuint num_instances, GLuint base_instance, + bool primitive_restart, + unsigned restart_index); void brw_draw_indirect_prims(struct gl_context *ctx, @@ -77,5 +81,7 @@ brw_draw_indirect_prims(struct gl_context *ctx, unsigned stride, struct gl_buffer_object *indirect_params, GLsizeiptr indirect_params_offset, - const struct _mesa_index_buffer *ib); + const struct _mesa_index_buffer *ib, + bool primitive_restart, + unsigned restart_index); #endif diff --git a/src/mesa/drivers/dri/i965/brw_primitive_restart.c b/src/mesa/drivers/dri/i965/brw_primitive_restart.c index 4d15ea51e7f..1f548a175b4 100644 --- a/src/mesa/drivers/dri/i965/brw_primitive_restart.c +++ b/src/mesa/drivers/dri/i965/brw_primitive_restart.c @@ -41,7 +41,8 @@ */ static bool can_cut_index_handle_restart_index(struct gl_context *ctx, - const struct _mesa_index_buffer *ib) + const struct _mesa_index_buffer *ib, + unsigned restart_index) { /* The FixedIndex variant means 0xFF, 0xFFFF, or 0xFFFFFFFF based on * the index buffer type, which corresponds exactly to the hardware. @@ -53,13 +54,13 @@ can_cut_index_handle_restart_index(struct gl_context *ctx, switch (ib->index_size_shift) { case 0: - cut_index_will_work = ctx->Array.RestartIndex == 0xff; + cut_index_will_work = restart_index == 0xff; break; case 1: - cut_index_will_work = ctx->Array.RestartIndex == 0xffff; + cut_index_will_work = restart_index == 0xffff; break; case 2: - cut_index_will_work = ctx->Array.RestartIndex == 0xffffffff; + cut_index_will_work = restart_index == 0xffffffff; break; default: unreachable("not reached"); @@ -76,7 +77,8 @@ static bool can_cut_index_handle_prims(struct gl_context *ctx, const struct _mesa_prim *prim, GLuint nr_prims, - const struct _mesa_index_buffer *ib) + const struct _mesa_index_buffer *ib, + unsigned restart_index) { struct brw_context *brw = brw_context(ctx); const struct gen_device_info *devinfo = &brw->screen->devinfo; @@ -85,7 +87,7 @@ can_cut_index_handle_prims(struct gl_context *ctx, if (devinfo->gen >= 8 || devinfo->is_haswell) return true; - if (!can_cut_index_handle_restart_index(ctx, ib)) { + if (!can_cut_index_handle_restart_index(ctx, ib, restart_index)) { /* The primitive restart index can't be handled, so take * the software path */ @@ -130,7 +132,9 @@ brw_handle_primitive_restart(struct gl_context *ctx, const struct _mesa_prim *prims, GLuint nr_prims, const struct _mesa_index_buffer *ib, - GLuint num_instances, GLuint base_instance) + GLuint num_instances, GLuint base_instance, + bool primitive_restart, + unsigned restart_index) { struct brw_context *brw = brw_context(ctx); @@ -149,7 +153,7 @@ brw_handle_primitive_restart(struct gl_context *ctx, /* If PrimitiveRestart is not enabled, then we aren't concerned about * handling this draw. */ - if (!ctx->Array._PrimitiveRestart[ib->index_size_shift]) { + if (!primitive_restart) { return GL_FALSE; } @@ -158,11 +162,13 @@ brw_handle_primitive_restart(struct gl_context *ctx, */ brw->prim_restart.in_progress = true; - if (can_cut_index_handle_prims(ctx, prims, nr_prims, ib)) { + if (can_cut_index_handle_prims(ctx, prims, nr_prims, ib, restart_index)) { /* Cut index should work for primitive restart, so use it */ brw->prim_restart.enable_cut_index = true; - brw_draw_prims(ctx, prims, nr_prims, ib, GL_FALSE, -1, -1, + brw->prim_restart.restart_index = restart_index; + brw_draw_prims(ctx, prims, nr_prims, ib, false, primitive_restart, + restart_index, -1, -1, num_instances, base_instance); brw->prim_restart.enable_cut_index = false; } else { @@ -176,7 +182,8 @@ brw_handle_primitive_restart(struct gl_context *ctx, vbo_sw_primitive_restart(ctx, prims, nr_prims, ib, num_instances, base_instance, indirect_data, - brw->draw.draw_indirect_offset); + brw->draw.draw_indirect_offset, + primitive_restart, restart_index); } brw->prim_restart.in_progress = false; diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c index 46c9477f054..244746b53fe 100644 --- a/src/mesa/drivers/dri/i965/genX_state_upload.c +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c @@ -900,12 +900,10 @@ static const struct brw_tracked_state genX(index_buffer) = { static void genX(upload_cut_index)(struct brw_context *brw) { - const struct gl_context *ctx = &brw->ctx; - brw_batch_emit(brw, GENX(3DSTATE_VF), vf) { - if (ctx->Array._PrimitiveRestart[brw->ib.ib->index_size_shift] && brw->ib.ib) { + if (brw->prim_restart.enable_cut_index && brw->ib.ib) { vf.IndexedDrawCutIndexEnable = true; - vf.CutIndex = ctx->Array._RestartIndex[brw->ib.ib->index_size_shift]; + vf.CutIndex = brw->prim_restart.restart_index; } } } diff --git a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c index e27862df82e..2bfae729b62 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c @@ -493,7 +493,7 @@ TAG(vbo_render_prims)(struct gl_context *ctx, if (!index_bounds_valid) vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index, - nr_prims); + nr_prims, 0, false); vbo_choose_render_mode(ctx, arrays); vbo_choose_attrs(ctx, arrays); @@ -545,7 +545,9 @@ TAG(vbo_draw)(struct gl_context *ctx, const struct _mesa_prim *prims, unsigned nr_prims, const struct _mesa_index_buffer *ib, bool index_bounds_valid, - unsigned min_index, unsigned max_index, + bool primitive_restart, + unsigned restart_index, + unsigned min_index, unsigned max_index, unsigned num_instances, unsigned base_instance) { /* Borrow and update the inputs list from the tnl context */ |