nir: add nir_var_shader_storage
[mesa.git] / src / glsl / nir / nir_lower_system_values.c
index 7bb02a77bd953e4506333e000fb4a8436b317760..a6eec653e33ea1f45445573541c902f478f69ca0 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 #include "nir.h"
+#include "main/mtypes.h"
 
 static void
 convert_instr(nir_intrinsic_instr *instr)
@@ -48,6 +49,12 @@ convert_instr(nir_intrinsic_instr *instr)
    case SYSTEM_VALUE_VERTEX_ID:
       op = nir_intrinsic_load_vertex_id;
       break;
+   case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:
+      op = nir_intrinsic_load_vertex_id_zero_base;
+      break;
+   case SYSTEM_VALUE_BASE_VERTEX:
+      op = nir_intrinsic_load_base_vertex;
+      break;
    case SYSTEM_VALUE_INSTANCE_ID:
       op = nir_intrinsic_load_instance_id;
       break;
@@ -64,12 +71,21 @@ convert_instr(nir_intrinsic_instr *instr)
       op = nir_intrinsic_load_invocation_id;
       break;
    default:
-      assert(0);
-      break;
+      unreachable("not reached");
    }
 
    nir_intrinsic_instr *new_instr = nir_intrinsic_instr_create(mem_ctx, op);
-   new_instr->dest = nir_dest_copy(instr->dest, mem_ctx);
+
+   if (instr->dest.is_ssa) {
+      nir_ssa_dest_init(&new_instr->instr, &new_instr->dest,
+                        instr->dest.ssa.num_components, NULL);
+      nir_ssa_def_rewrite_uses(&instr->dest.ssa,
+                               nir_src_for_ssa(&new_instr->dest.ssa),
+                               mem_ctx);
+   } else {
+      nir_dest_copy(&new_instr->dest, &instr->dest, mem_ctx);
+   }
+
    nir_instr_insert_before(&instr->instr, &new_instr->instr);
    nir_instr_remove(&instr->instr);
 }