nir/spirv: Add support for more CS intrinsics
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 15 Dec 2015 04:33:46 +0000 (20:33 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 15 Dec 2015 18:20:23 +0000 (10:20 -0800)
src/glsl/nir/spirv_to_nir.c

index a8f3016e05026318a2203f39b7925a690258ddb9..6fe68f9e6bde44844cf6188dd15178ae8a1f4143 100644 (file)
@@ -818,14 +818,12 @@ vtn_get_builtin_location(struct vtn_builder *b,
       assert(*mode == nir_var_shader_out);
       break;
    case SpvBuiltInNumWorkgroups:
+      *location = SYSTEM_VALUE_NUM_WORK_GROUPS;
+      set_mode_system_value(mode);
    case SpvBuiltInWorkgroupSize:
-      /* these are constants, need to be handled specially */
+      /* This should already be handled */
       unreachable("unsupported builtin");
       break;
-   case SpvBuiltInGlobalInvocationId:
-   case SpvBuiltInLocalInvocationIndex:
-      /* these are computed values, need to be handled specially */
-      unreachable("unsupported builtin");
    case SpvBuiltInWorkgroupId:
       *location = SYSTEM_VALUE_WORK_GROUP_ID;
       set_mode_system_value(mode);
@@ -834,6 +832,14 @@ vtn_get_builtin_location(struct vtn_builder *b,
       *location = SYSTEM_VALUE_LOCAL_INVOCATION_ID;
       set_mode_system_value(mode);
       break;
+   case SpvBuiltInLocalInvocationIndex:
+      *location = SYSTEM_VALUE_LOCAL_INVOCATION_INDEX;
+      set_mode_system_value(mode);
+      break;
+   case SpvBuiltInGlobalInvocationId:
+      *location = SYSTEM_VALUE_GLOBAL_INVOCATION_ID;
+      set_mode_system_value(mode);
+      break;
    case SpvBuiltInHelperInvocation:
    default:
       unreachable("unsupported builtin");
@@ -894,6 +900,19 @@ var_decoration_cb(struct vtn_builder *b, struct vtn_value *val, int member,
    case SpvDecorationBuiltIn: {
       SpvBuiltIn builtin = dec->literals[0];
 
+      if (builtin == SpvBuiltInWorkgroupSize) {
+         /* This shouldn't be a builtin.  It's actually a constant. */
+         var->data.mode = nir_var_global;
+         var->data.read_only = true;
+
+         nir_constant *val = ralloc(var, nir_constant);
+         val->value.u[0] = b->shader->info.cs.local_size[0];
+         val->value.u[1] = b->shader->info.cs.local_size[1];
+         val->value.u[2] = b->shader->info.cs.local_size[2];
+         var->constant_initializer = val;
+         break;
+      }
+
       nir_variable_mode mode = var->data.mode;
       vtn_get_builtin_location(b, builtin, &var->data.location, &mode);
       var->data.explicit_location = true;