iris: last VUE map NOS, handle > 16 FS inputs
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 15 Aug 2018 20:35:05 +0000 (13:35 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:08 +0000 (10:26 -0800)
not sure if the UNCOMPILED_FS flagging is still needed, should
reevaluate those hacks at some point

src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_program.c

index 5eee587990ae79a95dc793c343638393b2e3a98b..71c3f89965b119cd321307db3284d23e0858800e 100644 (file)
@@ -121,6 +121,7 @@ enum iris_nos_dep {
    IRIS_NOS_DEPTH_STENCIL_ALPHA,
    IRIS_NOS_RASTERIZER,
    IRIS_NOS_BLEND,
+   IRIS_NOS_LAST_VUE_MAP,
 
    IRIS_NOS_COUNT,
 };
index 39bb53602c18a6869e83130fd06f2b88b6554345..9eec3a7a0fe7460501ca95c2d7016a7d98e30372 100644 (file)
@@ -120,6 +120,12 @@ iris_create_shader_state(struct pipe_context *ctx,
                   IRIS_NOS_DEPTH_STENCIL_ALPHA |
                   IRIS_NOS_RASTERIZER |
                   IRIS_NOS_BLEND;
+
+      /* The program key needs the VUE map if there are > 16 inputs */
+      if (util_bitcount64(ish->nir->info.inputs_read &
+                          BRW_FS_VARYING_INPUT_MASK) > 16) {
+         ish->nos |= IRIS_NOS_LAST_VUE_MAP;
+      }
       break;
    case MESA_SHADER_COMPUTE:
       // XXX: NOS
@@ -742,6 +748,9 @@ iris_update_compiled_fs(struct iris_context *ice)
    struct brw_wm_prog_key key = { .program_string_id = ish->program_id };
    ice->vtbl.populate_fs_key(ice, &key);
 
+   if (ish->nos & IRIS_NOS_LAST_VUE_MAP)
+      key.input_slots_valid = ice->shaders.last_vue_map->slots_valid;
+
    if (iris_bind_cached_shader(ice, IRIS_CACHE_FS, &key))
       return;
 
@@ -789,7 +798,8 @@ update_last_vue_map(struct iris_context *ice,
       ice->state.dirty |= IRIS_DIRTY_CLIP |
                           IRIS_DIRTY_SF_CL_VIEWPORT |
                           IRIS_DIRTY_SCISSOR_RECT |
-                          IRIS_DIRTY_UNCOMPILED_FS;
+                          IRIS_DIRTY_UNCOMPILED_FS |
+                          ice->state.dirty_for_nos[IRIS_NOS_LAST_VUE_MAP];
       // XXX: CC_VIEWPORT?
    }