#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.
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;
#include "intel/compiler/brw_compiler.h"
#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.
*/
iris_batch_maybe_flush(batch, 1500);
+ iris_update_draw_info(ice, info);
iris_update_compiled_shaders(ice);
iris_predraw_resolve_inputs(ice, batch);
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);
}
}
- if (1) {
+ if (dirty & IRIS_DIRTY_VF) {
iris_emit_cmd(batch, GENX(3DSTATE_VF), vf) {
if (draw->primitive_restart) {
vf.IndexedDrawCutIndexEnable = true;