On 28/02/18 03:45, Marek Olšák wrote:
On Mon, Feb 26, 2018 at 10:43 AM, Timothy Arceri <tarc...@itsqueeze.com> wrote:
---
  src/compiler/shader_info.h                |  5 +++++
  src/mesa/state_tracker/st_glsl_to_nir.cpp | 13 +++++++++++++
  2 files changed, 18 insertions(+)

diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h
index e7fd7dbe62..11a59ff6ac 100644
--- a/src/compiler/shader_info.h
+++ b/src/compiler/shader_info.h
@@ -54,6 +54,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 */
diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp 
b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index 765c827d93..914fd2e898 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -317,6 +317,19 @@ 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) u_bit_scan(&stages_mask) : MESA_SHADER_FRAGMENT;

ffs would be better.

Also, ureg sets ..._SHADER_FRAGMENT if st/mesa doesn't set anything
(e.g. it's a separate shader).

Yes the ureg function does that, which is what the "stages_mask ?" above does too. However separate shaders don't get set because ureg_set_next_shader_processor() won't get called for them.

   /* Set the next shader stage hint for VS and TES. */
   switch (procType) {
   case PIPE_SHADER_VERTEX:
   case PIPE_SHADER_TESS_EVAL:
      if (program->shader_program->SeparateShader)
         break;

      for (i = program->shader->Stage+1; i <= MESA_SHADER_FRAGMENT; i++) {
         if (program->shader_program->_LinkedShaders[i]) {
            ureg_set_next_shader_processor(
                  ureg, pipe_shader_type_from_mesa((gl_shader_stage)i));
            break;
         }
      }
      break;
   }




Marek

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to