nir/spirv: Get the shader stage from the SPIR-V
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 31 Dec 2015 01:00:16 +0000 (17:00 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 31 Dec 2015 01:45:43 +0000 (17:45 -0800)
Previously, we depended on it being passed in.

src/glsl/nir/spirv/nir_spirv.h
src/glsl/nir/spirv/spirv_to_nir.c
src/glsl/nir/spirv/vtn_private.h
src/glsl/nir/spirv2nir.c
src/vulkan/anv_pipeline.c

index 1f09174ad7f44c68be493744db34b2c55cfed012..3254f10a88d36f0ecc277ad618e751735140df83 100644 (file)
@@ -37,7 +37,6 @@ extern "C" {
 #endif
 
 nir_shader *spirv_to_nir(const uint32_t *words, size_t word_count,
-                         gl_shader_stage stage,
                          const nir_shader_compiler_options *options);
 
 #ifdef __cplusplus
index 5e8ec8f826024a9264da51e4315b822b655cdf33..9caba9746e6533552f14450e41a030a8e32a9a0d 100644 (file)
@@ -3207,10 +3207,7 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
       switch ((SpvCapability)w[1]) {
       case SpvCapabilityMatrix:
       case SpvCapabilityShader:
-         /* All shaders support these */
-         break;
       case SpvCapabilityGeometry:
-         assert(b->shader->stage == MESA_SHADER_GEOMETRY);
          break;
       default:
          assert(!"Unsupported capability");
@@ -3647,9 +3644,29 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
    return true;
 }
 
+static gl_shader_stage
+stage_for_execution_model(SpvExecutionModel model)
+{
+   switch (model) {
+   case SpvExecutionModelVertex:
+      return MESA_SHADER_VERTEX;
+   case SpvExecutionModelTessellationControl:
+      return MESA_SHADER_TESS_CTRL;
+   case SpvExecutionModelTessellationEvaluation:
+      return MESA_SHADER_TESS_EVAL;
+   case SpvExecutionModelGeometry:
+      return MESA_SHADER_GEOMETRY;
+   case SpvExecutionModelFragment:
+      return MESA_SHADER_FRAGMENT;
+   case SpvExecutionModelGLCompute:
+      return MESA_SHADER_COMPUTE;
+   default:
+      unreachable("Unsupported execution model");
+   }
+}
+
 nir_shader *
 spirv_to_nir(const uint32_t *words, size_t word_count,
-             gl_shader_stage stage,
              const nir_shader_compiler_options *options)
 {
    const uint32_t *word_end = words + word_count;
@@ -3665,11 +3682,8 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
 
    words+= 5;
 
-   nir_shader *shader = nir_shader_create(NULL, stage, options);
-
    /* Initialize the stn_builder object */
    struct vtn_builder *b = rzalloc(NULL, struct vtn_builder);
-   b->shader = shader;
    b->value_id_bound = value_id_bound;
    b->values = rzalloc_array(b, struct vtn_value, value_id_bound);
    exec_list_make_empty(&b->functions);
@@ -3678,6 +3692,10 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
    words = vtn_foreach_instruction(b, words, word_end,
                                    vtn_handle_preamble_instruction);
 
+   gl_shader_stage stage = stage_for_execution_model(b->execution_model);
+   nir_shader *shader = nir_shader_create(NULL, stage, options);
+   b->shader = shader;
+
    /* Parse execution modes */
    vtn_foreach_execution_mode(b, b->entry_point,
                               vtn_handle_execution_mode, NULL);
@@ -3699,12 +3717,12 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
                               vtn_handle_phi_second_pass);
    }
 
+   ralloc_free(b);
+
    /* Because we can still have output reads in NIR, we need to lower
     * outputs to temporaries before we are truely finished.
     */
    nir_lower_outputs_to_temporaries(shader);
 
-   ralloc_free(b);
-
    return shader;
 }
index 3498215ad5e3b666f845434ee872e7080f599fce..318f60804cc86c094c2b63b61809b76d6859d565 100644 (file)
@@ -317,9 +317,9 @@ struct vtn_builder {
    unsigned value_id_bound;
    struct vtn_value *values;
 
+   struct vtn_value *entry_point;
    SpvExecutionModel execution_model;
    bool origin_upper_left;
-   struct vtn_value *entry_point;
 
    struct vtn_function *func;
    struct exec_list functions;
index 6cf891517c75c94c50fb44217fcb4c8fbda244d1..f86825bedc502bd01a8486d7fdd248281cb09648 100644 (file)
@@ -49,7 +49,6 @@ int main(int argc, char **argv)
    const void *map = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
    assert(map != NULL);
 
-   nir_shader *shader = spirv_to_nir(map, MESA_SHADER_FRAGMENT,
-                                     word_count, NULL);
+   nir_shader *shader = spirv_to_nir(map, word_count, NULL);
    nir_print_shader(shader, stderr);
 }
index c17809c519fade63929c773abec61f65dea65236..0f7835ea84f24bfcce2e22537257494fbfcb3c24 100644 (file)
@@ -108,7 +108,8 @@ anv_shader_compile_to_nir(struct anv_device *device,
       assert(spirv[0] == SPIR_V_MAGIC_NUMBER);
       assert(module->size % 4 == 0);
 
-      nir = spirv_to_nir(spirv, module->size / 4, stage, nir_options);
+      nir = spirv_to_nir(spirv, module->size / 4, nir_options);
+      assert(nir->stage == stage);
       nir_validate_shader(nir);
 
       nir_lower_returns(nir);