tgsi_to_nir: be careful about not losing any TGSI properties silently (v2)
authorMarek Olšák <marek.olsak@amd.com>
Wed, 31 Jul 2019 21:16:23 +0000 (17:16 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 12 Aug 2019 18:52:17 +0000 (14:52 -0400)
v2: squash with Timur Kristof's commit

Reviewed-By: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
src/gallium/auxiliary/nir/tgsi_to_nir.c

index 95074287624e794ee2828ac06741693d66834a61..4770e8f479086926624f26bd10761f53ece26c88 100644 (file)
@@ -162,6 +162,25 @@ tgsi_varying_semantic_to_slot(unsigned semantic, unsigned index)
    }
 }
 
+static enum gl_frag_depth_layout
+ttn_get_depth_layout(unsigned tgsi_fs_depth_layout)
+{
+   switch (tgsi_fs_depth_layout) {
+   case TGSI_FS_DEPTH_LAYOUT_NONE:
+      return FRAG_DEPTH_LAYOUT_NONE;
+   case TGSI_FS_DEPTH_LAYOUT_ANY:
+      return FRAG_DEPTH_LAYOUT_ANY;
+   case TGSI_FS_DEPTH_LAYOUT_GREATER:
+      return FRAG_DEPTH_LAYOUT_GREATER;
+   case TGSI_FS_DEPTH_LAYOUT_LESS:
+      return FRAG_DEPTH_LAYOUT_LESS;
+   case TGSI_FS_DEPTH_LAYOUT_UNCHANGED:
+      return FRAG_DEPTH_LAYOUT_UNCHANGED;
+   default:
+      unreachable("bad TGSI FS depth layout");
+   }
+}
+
 static nir_ssa_def *
 ttn_src_for_dest(nir_builder *b, nir_alu_dest *dest)
 {
@@ -2066,7 +2085,35 @@ ttn_compile_init(const void *tgsi_tokens,
    s->num_uniforms = scan.const_file_max[0] + 1;
    s->num_outputs = scan.file_max[TGSI_FILE_OUTPUT] + 1;
 
-   s->info.vs.window_space_position = scan.properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION];
+   for (unsigned i = 0; i < TGSI_PROPERTY_COUNT; i++) {
+      unsigned value = scan.properties[i];
+
+      switch (i) {
+      case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
+         break; /* handled in ttn_emit_declaration */
+      case TGSI_PROPERTY_FS_COORD_ORIGIN:
+         s->info.fs.origin_upper_left = value == TGSI_FS_COORD_ORIGIN_UPPER_LEFT;
+         break;
+      case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER:
+         s->info.fs.pixel_center_integer = value == TGSI_FS_COORD_PIXEL_CENTER_INTEGER;
+         break;
+      case TGSI_PROPERTY_FS_DEPTH_LAYOUT:
+         s->info.fs.depth_layout = ttn_get_depth_layout(value);
+         break;
+      case TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION:
+         s->info.vs.window_space_position = value;
+         break;
+      case TGSI_PROPERTY_NEXT_SHADER:
+         s->info.next_stage = tgsi_processor_to_shader_stage(value);
+         break;
+      default:
+         if (value) {
+            fprintf(stderr, "tgsi_to_nir: unhandled TGSI property %u = %u\n",
+                    i, value);
+            unreachable("unhandled TGSI property");
+         }
+      }
+   }
 
    c->inputs = rzalloc_array(c, struct nir_variable *, s->num_inputs);
    c->outputs = rzalloc_array(c, struct nir_variable *, s->num_outputs);