summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/iris
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/iris')
-rw-r--r--src/gallium/drivers/iris/iris_context.h7
-rw-r--r--src/gallium/drivers/iris/iris_draw.c24
-rw-r--r--src/gallium/drivers/iris/iris_state.c4
3 files changed, 33 insertions, 2 deletions
diff --git a/src/gallium/drivers/iris/iris_context.h b/src/gallium/drivers/iris/iris_context.h
index 92e55173993..f7411727bb0 100644
--- a/src/gallium/drivers/iris/iris_context.h
+++ b/src/gallium/drivers/iris/iris_context.h
@@ -106,6 +106,8 @@ struct blorp_params;
#define IRIS_DIRTY_SO_DECL_LIST (1ull << 49)
#define IRIS_DIRTY_STREAMOUT (1ull << 50)
#define IRIS_DIRTY_VF_SGVS (1ull << 51)
+#define IRIS_DIRTY_VF (1ull << 52)
+#define IRIS_DIRTY_VF_TOPOLOGY (1ull << 53)
/**
* Non-orthogonal state (NOS) dependency flags.
@@ -345,6 +347,11 @@ struct iris_context {
struct pipe_stencil_ref stencil_ref;
struct pipe_framebuffer_state framebuffer;
+ bool primitive_restart;
+ unsigned cut_index;
+ enum pipe_prim_type prim_mode:8;
+ uint8_t vertices_per_patch;
+
/** Are depth writes enabled? (Depth buffer may or may not exist.) */
bool depth_writes_enabled;
diff --git a/src/gallium/drivers/iris/iris_draw.c b/src/gallium/drivers/iris/iris_draw.c
index d938c3d0f4f..f6911350a7b 100644
--- a/src/gallium/drivers/iris/iris_draw.c
+++ b/src/gallium/drivers/iris/iris_draw.c
@@ -38,6 +38,29 @@
#include "iris_context.h"
/**
+ * Record the current primitive mode and restart information, flagging
+ * related packets as dirty if necessary.
+ */
+static void
+iris_update_draw_info(struct iris_context *ice,
+ const struct pipe_draw_info *info)
+{
+ if (ice->state.prim_mode != info->mode ||
+ ice->state.vertices_per_patch != info->vertices_per_patch) {
+ ice->state.prim_mode = info->mode;
+ ice->state.vertices_per_patch = info->vertices_per_patch;
+ ice->state.dirty |= IRIS_DIRTY_VF_TOPOLOGY;
+ }
+
+ if (ice->state.primitive_restart != info->primitive_restart ||
+ ice->state.cut_index != info->restart_index) {
+ ice->state.dirty |= IRIS_DIRTY_VF;
+ ice->state.primitive_restart = info->primitive_restart;
+ ice->state.cut_index = info->restart_index;
+ }
+}
+
+/**
* The pipe->draw_vbo() driver hook. Performs a draw on the GPU.
*/
void
@@ -51,6 +74,7 @@ iris_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
iris_batch_maybe_flush(batch, 1500);
+ iris_update_draw_info(ice, info);
iris_update_compiled_shaders(ice);
iris_predraw_resolve_inputs(ice, batch);
diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c
index abe4c442089..cfdd69bdde2 100644
--- a/src/gallium/drivers/iris/iris_state.c
+++ b/src/gallium/drivers/iris/iris_state.c
@@ -3641,7 +3641,7 @@ iris_upload_dirty_render_state(struct iris_context *ice,
iris_batch_emit(batch, cso->line_stipple, sizeof(cso->line_stipple));
}
- if (1) {
+ if (dirty & IRIS_DIRTY_VF_TOPOLOGY) {
iris_emit_cmd(batch, GENX(3DSTATE_VF_TOPOLOGY), topo) {
topo.PrimitiveTopologyType =
translate_prim_type(draw->mode, draw->vertices_per_patch);
@@ -3692,7 +3692,7 @@ iris_upload_dirty_render_state(struct iris_context *ice,
}
}
- if (1) {
+ if (dirty & IRIS_DIRTY_VF) {
iris_emit_cmd(batch, GENX(3DSTATE_VF), vf) {
if (draw->primitive_restart) {
vf.IndexedDrawCutIndexEnable = true;