iris: don't unconditionally emit 3DSTATE_VF / 3DSTATE_VF_TOPOLOGY

this was just laziness on my part
This commit is contained in:
Kenneth Graunke 2018-08-31 18:03:19 -07:00
parent 4c27cb031c
commit 5a2257bb2f
3 changed files with 33 additions and 2 deletions

View file

@ -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;

View file

@ -37,6 +37,29 @@
#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.
*/
@ -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);

View file

@ -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;