On 10.08.2016 13:05, Marek Olšák wrote:
On Tue, Aug 9, 2016 at 12:56 PM, Nicolai Hähnle <nhaeh...@gmail.com> wrote:
On 07.08.2016 03:12, Marek Olšák wrote:

From: Marek Olšák <marek.ol...@amd.com>

At compile time, each shader determines which ST_NEW flags should be set
at shader bind time.

This just sets the new field for all shaders. The next commit will use it.
---
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 175
++++++++++++++++++++++++++++-
 src/mesa/state_tracker/st_program.c        |  37 +++++-
 src/mesa/state_tracker/st_program.h        |   6 +
 3 files changed, 215 insertions(+), 3 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 362559f..fd14766 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -6666,31 +6666,202 @@ get_mesa_program_tgsi(struct gl_context *ctx,

 static struct gl_program *
 get_mesa_program(struct gl_context *ctx,
                  struct gl_shader_program *shader_program,
                  struct gl_linked_shader *shader)
 {
    struct pipe_screen *pscreen = ctx->st->pipe->screen;
    unsigned ptarget = st_shader_stage_to_ptarget(shader->Stage);
    enum pipe_shader_ir preferred_ir = (enum pipe_shader_ir)
       pscreen->get_shader_param(pscreen, ptarget,
PIPE_SHADER_CAP_PREFERRED_IR);
+   struct gl_program *prog = NULL;
+
    if (preferred_ir == PIPE_SHADER_IR_NIR) {
       /* TODO only for GLSL VS/FS for now: */
       switch (shader->Stage) {
       case MESA_SHADER_VERTEX:
       case MESA_SHADER_FRAGMENT:
-         return st_nir_get_mesa_program(ctx, shader_program, shader);
+         prog = st_nir_get_mesa_program(ctx, shader_program, shader);
       default:
          break;
       }
+   } else {
+      prog = get_mesa_program_tgsi(ctx, shader_program, shader);
+   }
+
+   if (prog) {
+      uint64_t *states;
+
+      /* This determines which states will be updated when the shader is
+       * bound.
+       */
+      switch (shader->Stage) {
+      case MESA_SHADER_VERTEX:
+         states = &((struct st_vertex_program*)prog)->affected_states;
+
+         *states = ST_NEW_VS_STATE |
+                   ST_NEW_RASTERIZER |
+                   ST_NEW_VERTEX_ARRAYS;
+
+         if (prog->Parameters->NumParameters)
+            *states |= ST_NEW_VS_CONSTANTS;
+
+         if (shader->num_samplers)
+            *states |= ST_NEW_VS_SAMPLER_VIEWS |
+                       ST_NEW_RENDER_SAMPLERS;
+
+         if (shader->NumImages)
+            *states |= ST_NEW_VS_IMAGES;
+
+         if (shader->NumUniformBlocks)
+            *states |= ST_NEW_VS_UBOS;
+
+         if (shader->NumShaderStorageBlocks)
+            *states |= ST_NEW_VS_SSBOS;
+
+         if (shader->NumAtomicBuffers)
+            *states |= ST_NEW_VS_ATOMICS;


I'm not overly fond of the code duplication here. Perhaps these could all be
expressed relative to a stage-specific base flag?

Not really. It shouldn't rely on the order the flags are declared. I
can't make it better than this:

I don't know why we can't just say we should be able to rely on the order, but the alternative below is indeed not really any better.

Cheers,
Nicolai

diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index fd14766..3e5b322 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -6664,6 +6664,37 @@ get_mesa_program_tgsi(struct gl_context *ctx,
    return prog;
 }

+static void
+set_affected_state_flags(uint64_t *states,
+                         struct gl_program *prog,
+                         struct gl_linked_shader *shader,
+                         uint64_t new_constants,
+                         uint64_t new_sampler_views,
+                         uint64_t new_samplers,
+                         uint64_t new_images,
+                         uint64_t new_ubos,
+                         uint64_t new_ssbos,
+                         uint64_t new_atomics)
+{
+   if (prog->Parameters->NumParameters)
+      *states |= new_constants;
+
+   if (shader->num_samplers)
+      *states |= new_sampler_views | new_samplers;
+
+   if (shader->NumImages)
+      *states |= new_images;
+
+   if (shader->NumUniformBlocks)
+      *states |= new_ubos;
+
+   if (shader->NumShaderStorageBlocks)
+      *states |= new_ssbos;
+
+   if (shader->NumAtomicBuffers)
+      *states |= new_atomics;
+}
+
 static struct gl_program *
 get_mesa_program(struct gl_context *ctx,
                  struct gl_shader_program *shader_program,
@@ -6702,24 +6733,14 @@ get_mesa_program(struct gl_context *ctx,
                    ST_NEW_RASTERIZER |
                    ST_NEW_VERTEX_ARRAYS;

-         if (prog->Parameters->NumParameters)
-            *states |= ST_NEW_VS_CONSTANTS;
-
-         if (shader->num_samplers)
-            *states |= ST_NEW_VS_SAMPLER_VIEWS |
-                       ST_NEW_RENDER_SAMPLERS;
-
-         if (shader->NumImages)
-            *states |= ST_NEW_VS_IMAGES;
-
-         if (shader->NumUniformBlocks)
-            *states |= ST_NEW_VS_UBOS;
-
-         if (shader->NumShaderStorageBlocks)
-            *states |= ST_NEW_VS_SSBOS;
-
-         if (shader->NumAtomicBuffers)
-            *states |= ST_NEW_VS_ATOMICS;
+         set_affected_state_flags(states, prog, shader,
+                                  ST_NEW_VS_CONSTANTS,
+                                  ST_NEW_VS_SAMPLER_VIEWS,
+                                  ST_NEW_RENDER_SAMPLERS,
+                                  ST_NEW_VS_IMAGES,
+                                  ST_NEW_VS_UBOS,
+                                  ST_NEW_VS_SSBOS,
+                                  ST_NEW_VS_ATOMICS);
          break;

       case MESA_SHADER_TESS_CTRL:
@@ -6727,24 +6748,14 @@ get_mesa_program(struct gl_context *ctx,

          *states = ST_NEW_TCS_STATE;

-         if (prog->Parameters->NumParameters)
-            *states |= ST_NEW_TCS_CONSTANTS;
-
-         if (shader->num_samplers)
-            *states |= ST_NEW_TCS_SAMPLER_VIEWS |
-                       ST_NEW_RENDER_SAMPLERS;
-
-         if (shader->NumImages)
-            *states |= ST_NEW_TCS_IMAGES;
-
-         if (shader->NumUniformBlocks)
-            *states |= ST_NEW_TCS_UBOS;
-
-         if (shader->NumShaderStorageBlocks)
-            *states |= ST_NEW_TCS_SSBOS;
-
-         if (shader->NumAtomicBuffers)
-            *states |= ST_NEW_TCS_ATOMICS;
+         set_affected_state_flags(states, prog, shader,
+                                  ST_NEW_TCS_CONSTANTS,
+                                  ST_NEW_TCS_SAMPLER_VIEWS,
+                                  ST_NEW_RENDER_SAMPLERS,
+                                  ST_NEW_TCS_IMAGES,
+                                  ST_NEW_TCS_UBOS,
+                                  ST_NEW_TCS_SSBOS,
+                                  ST_NEW_TCS_ATOMICS);
          break;

       case MESA_SHADER_TESS_EVAL:
@@ -6753,24 +6764,14 @@ get_mesa_program(struct gl_context *ctx,
          *states = ST_NEW_TES_STATE |
                    ST_NEW_RASTERIZER;

-         if (prog->Parameters->NumParameters)
-            *states |= ST_NEW_TES_CONSTANTS;
-
-         if (shader->num_samplers)
-            *states |= ST_NEW_TES_SAMPLER_VIEWS |
-                       ST_NEW_RENDER_SAMPLERS;
-
-         if (shader->NumImages)
-            *states |= ST_NEW_TES_IMAGES;
-
-         if (shader->NumUniformBlocks)
-            *states |= ST_NEW_TES_UBOS;
-
-         if (shader->NumShaderStorageBlocks)
-            *states |= ST_NEW_TES_SSBOS;
-
-         if (shader->NumAtomicBuffers)
-            *states |= ST_NEW_TES_ATOMICS;
+         set_affected_state_flags(states, prog, shader,
+                                  ST_NEW_TES_CONSTANTS,
+                                  ST_NEW_TES_SAMPLER_VIEWS,
+                                  ST_NEW_RENDER_SAMPLERS,
+                                  ST_NEW_TES_IMAGES,
+                                  ST_NEW_TES_UBOS,
+                                  ST_NEW_TES_SSBOS,
+                                  ST_NEW_TES_ATOMICS);
          break;

       case MESA_SHADER_GEOMETRY:
@@ -6779,24 +6780,14 @@ get_mesa_program(struct gl_context *ctx,
          *states = ST_NEW_GS_STATE |
                    ST_NEW_RASTERIZER;

-         if (prog->Parameters->NumParameters)
-            *states |= ST_NEW_GS_CONSTANTS;
-
-         if (shader->num_samplers)
-            *states |= ST_NEW_GS_SAMPLER_VIEWS |
-                       ST_NEW_RENDER_SAMPLERS;
-
-         if (shader->NumImages)
-            *states |= ST_NEW_GS_IMAGES;
-
-         if (shader->NumUniformBlocks)
-            *states |= ST_NEW_GS_UBOS;
-
-         if (shader->NumShaderStorageBlocks)
-            *states |= ST_NEW_GS_SSBOS;
-
-         if (shader->NumAtomicBuffers)
-            *states |= ST_NEW_GS_ATOMICS;
+         set_affected_state_flags(states, prog, shader,
+                                  ST_NEW_GS_CONSTANTS,
+                                  ST_NEW_GS_SAMPLER_VIEWS,
+                                  ST_NEW_RENDER_SAMPLERS,
+                                  ST_NEW_GS_IMAGES,
+                                  ST_NEW_GS_UBOS,
+                                  ST_NEW_GS_SSBOS,
+                                  ST_NEW_GS_ATOMICS);
          break;

       case MESA_SHADER_FRAGMENT:
@@ -6807,21 +6798,14 @@ get_mesa_program(struct gl_context *ctx,
                    ST_NEW_SAMPLE_SHADING |
                    ST_NEW_FS_CONSTANTS;

-         if (shader->num_samplers)
-            *states |= ST_NEW_FS_SAMPLER_VIEWS |
-                       ST_NEW_RENDER_SAMPLERS;
-
-         if (shader->NumImages)
-            *states |= ST_NEW_FS_IMAGES;
-
-         if (shader->NumUniformBlocks)
-            *states |= ST_NEW_FS_UBOS;
-
-         if (shader->NumShaderStorageBlocks)
-            *states |= ST_NEW_FS_SSBOS;
-
-         if (shader->NumAtomicBuffers)
-            *states |= ST_NEW_FS_ATOMICS;
+         set_affected_state_flags(states, prog, shader,
+                                  ST_NEW_FS_CONSTANTS,
+                                  ST_NEW_FS_SAMPLER_VIEWS,
+                                  ST_NEW_RENDER_SAMPLERS,
+                                  ST_NEW_FS_IMAGES,
+                                  ST_NEW_FS_UBOS,
+                                  ST_NEW_FS_SSBOS,
+                                  ST_NEW_FS_ATOMICS);
          break;

       case MESA_SHADER_COMPUTE:
@@ -6829,24 +6813,14 @@ get_mesa_program(struct gl_context *ctx,

          *states = ST_NEW_CS_STATE;

-         if (prog->Parameters->NumParameters)
-            *states |= ST_NEW_CS_CONSTANTS;
-
-         if (shader->num_samplers)
-            *states |= ST_NEW_CS_SAMPLER_VIEWS |
-                       ST_NEW_CS_SAMPLERS;
-
-         if (shader->NumImages)
-            *states |= ST_NEW_CS_IMAGES;
-
-         if (shader->NumUniformBlocks)
-            *states |= ST_NEW_CS_UBOS;
-
-         if (shader->NumShaderStorageBlocks)
-            *states |= ST_NEW_CS_SSBOS;
-
-         if (shader->NumAtomicBuffers)
-            *states |= ST_NEW_CS_ATOMICS;
+         set_affected_state_flags(states, prog, shader,
+                                  ST_NEW_CS_CONSTANTS,
+                                  ST_NEW_CS_SAMPLER_VIEWS,
+                                  ST_NEW_CS_SAMPLERS,
+                                  ST_NEW_CS_IMAGES,
+                                  ST_NEW_CS_UBOS,
+                                  ST_NEW_CS_SSBOS,
+                                  ST_NEW_CS_ATOMICS);
          break;

       default:

Marek

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

Reply via email to