st/glsl_to_nir: gather next_stage in shader_info
authorTimothy Arceri <tarceri@itsqueeze.com>
Mon, 26 Feb 2018 09:40:38 +0000 (20:40 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Mon, 2 Apr 2018 04:56:00 +0000 (14:56 +1000)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/compiler/shader_info.h
src/mesa/state_tracker/st_glsl_to_nir.cpp

index 737e9cffa8628cb68145dd26b5096a91f9e09a01..ababe520b2d63dd83a5b388e5e9ede4dc8ad1014 100644 (file)
@@ -64,6 +64,11 @@ typedef struct shader_info {
    /** The shader stage, such as MESA_SHADER_VERTEX. */
    gl_shader_stage stage;
 
+   /** The shader stage in a non SSO linked program that follows this stage,
+     * such as MESA_SHADER_FRAGMENT.
+     */
+   gl_shader_stage next_stage;
+
    /* Number of textures used by this shader */
    unsigned num_textures;
    /* Number of uniform buffers used by this shader */
index 2cd1d97baecd8f21f9eca1c71f8dcefc72624c53..f2d4b184d674e8bd08d061ad3955f1399479584f 100644 (file)
@@ -362,6 +362,21 @@ st_glsl_to_nir(struct st_context *st, struct gl_program *prog,
 
    nir_shader *nir = glsl_to_nir(shader_program, stage, options);
 
+   /* Set the next shader stage hint for VS and TES. */
+   if (!nir->info.separate_shader &&
+       (nir->info.stage == MESA_SHADER_VERTEX ||
+        nir->info.stage == MESA_SHADER_TESS_EVAL)) {
+
+      unsigned prev_stages = (1 << (prog->info.stage + 1)) - 1;
+      unsigned stages_mask =
+         ~prev_stages & shader_program->data->linked_stages;
+
+      nir->info.next_stage = stages_mask ?
+         (gl_shader_stage) ffs(stages_mask) : MESA_SHADER_FRAGMENT;
+   } else {
+      nir->info.next_stage = MESA_SHADER_FRAGMENT;
+   }
+
    nir_variable_mode mask =
       (nir_variable_mode) (nir_var_shader_in | nir_var_shader_out);
    nir_remove_dead_variables(nir, mask);