summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2020-11-01 13:43:43 -0500
committerMarge Bot <eric+marge@anholt.net>2020-11-18 01:41:25 +0000
commit51c7c64f0a43c337e6816d2dece44d26c48f8cb8 (patch)
treeb8fff7a70c555ef9306eda68005ac15b27d23d06 /src/mesa/drivers/dri
parente8c0c80ecd713b1eff30fca423a9c31747669650 (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.h1
-rw-r--r--src/mesa/drivers/dri/i965/brw_draw.c18
-rw-r--r--src/mesa/drivers/dri/i965/brw_draw.h12
-rw-r--r--src/mesa/drivers/dri/i965/brw_primitive_restart.c29
-rw-r--r--src/mesa/drivers/dri/i965/genX_state_upload.c6
-rw-r--r--src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c6
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 */