[Mesa-dev] [PATCH 07/10] mesa/glsl/i965: set and get tes layouts directly to and from shader_info

Timothy Arceri timothy.arceri at collabora.com
Thu Jan 19 06:23:13 UTC 2017


---
 src/compiler/glsl/linker.cpp        | 64 +++++++++++++++++++------------------
 src/mesa/drivers/dri/i965/brw_tcs.c |  6 ++--
 src/mesa/main/shaderapi.c           | 15 +++------
 3 files changed, 40 insertions(+), 45 deletions(-)

diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index 8a50644..b1dbbc2 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -1713,18 +1713,19 @@ link_tcs_out_layout_qualifiers(struct gl_shader_program *prog,
  */
 static void
 link_tes_in_layout_qualifiers(struct gl_shader_program *prog,
-                              struct gl_linked_shader *linked_shader,
+                              struct gl_program *gl_prog,
                               struct gl_shader **shader_list,
                               unsigned num_shaders)
 {
-   linked_shader->info.TessEval.PrimitiveMode = PRIM_UNKNOWN;
-   linked_shader->info.TessEval.Spacing = TESS_SPACING_UNSPECIFIED;
-   linked_shader->info.TessEval.VertexOrder = 0;
-   linked_shader->info.TessEval.PointMode = -1;
-
-   if (linked_shader->Stage != MESA_SHADER_TESS_EVAL)
+   if (gl_prog->info.stage != MESA_SHADER_TESS_EVAL)
       return;
 
+   int point_mode = -1;
+   unsigned vertex_order = 0;
+
+   gl_prog->info.tess.primitive_mode = PRIM_UNKNOWN;
+   gl_prog->info.tess.spacing = TESS_SPACING_UNSPECIFIED;
+
    /* From the GLSL 4.0 spec (chapter 4.3.8.1):
     *
     *     "At least one tessellation evaluation shader (compilation unit) in
@@ -1743,49 +1744,45 @@ link_tes_in_layout_qualifiers(struct gl_shader_program *prog,
       struct gl_shader *shader = shader_list[i];
 
       if (shader->info.TessEval.PrimitiveMode != PRIM_UNKNOWN) {
-         if (linked_shader->info.TessEval.PrimitiveMode != PRIM_UNKNOWN &&
-             linked_shader->info.TessEval.PrimitiveMode !=
+         if (gl_prog->info.tess.primitive_mode != PRIM_UNKNOWN &&
+             gl_prog->info.tess.primitive_mode !=
              shader->info.TessEval.PrimitiveMode) {
             linker_error(prog, "tessellation evaluation shader defined with "
                          "conflicting input primitive modes.\n");
             return;
          }
-         linked_shader->info.TessEval.PrimitiveMode = shader->info.TessEval.PrimitiveMode;
+         gl_prog->info.tess.primitive_mode =
+            shader->info.TessEval.PrimitiveMode;
       }
 
       if (shader->info.TessEval.Spacing != 0) {
-         if (linked_shader->info.TessEval.Spacing != 0 &&
-             linked_shader->info.TessEval.Spacing !=
+         if (gl_prog->info.tess.spacing != 0 && gl_prog->info.tess.spacing !=
              shader->info.TessEval.Spacing) {
             linker_error(prog, "tessellation evaluation shader defined with "
                          "conflicting vertex spacing.\n");
             return;
          }
-         linked_shader->info.TessEval.Spacing = shader->info.TessEval.Spacing;
+         gl_prog->info.tess.spacing = shader->info.TessEval.Spacing;
       }
 
       if (shader->info.TessEval.VertexOrder != 0) {
-         if (linked_shader->info.TessEval.VertexOrder != 0 &&
-             linked_shader->info.TessEval.VertexOrder !=
-             shader->info.TessEval.VertexOrder) {
+         if (vertex_order != 0 &&
+             vertex_order != shader->info.TessEval.VertexOrder) {
             linker_error(prog, "tessellation evaluation shader defined with "
                          "conflicting ordering.\n");
             return;
          }
-         linked_shader->info.TessEval.VertexOrder =
-            shader->info.TessEval.VertexOrder;
+         vertex_order = shader->info.TessEval.VertexOrder;
       }
 
       if (shader->info.TessEval.PointMode != -1) {
-         if (linked_shader->info.TessEval.PointMode != -1 &&
-             linked_shader->info.TessEval.PointMode !=
-             shader->info.TessEval.PointMode) {
+         if (point_mode != -1 &&
+             point_mode != shader->info.TessEval.PointMode) {
             linker_error(prog, "tessellation evaluation shader defined with "
                          "conflicting point modes.\n");
             return;
          }
-         linked_shader->info.TessEval.PointMode =
-            shader->info.TessEval.PointMode;
+         point_mode = shader->info.TessEval.PointMode;
       }
 
    }
@@ -1794,21 +1791,26 @@ link_tes_in_layout_qualifiers(struct gl_shader_program *prog,
     * since we already know we're in the right type of shader program
     * for doing it.
     */
-   if (linked_shader->info.TessEval.PrimitiveMode == PRIM_UNKNOWN) {
+   if (gl_prog->info.tess.primitive_mode == PRIM_UNKNOWN) {
       linker_error(prog,
                    "tessellation evaluation shader didn't declare input "
                    "primitive modes.\n");
       return;
    }
 
-   if (linked_shader->info.TessEval.Spacing == TESS_SPACING_UNSPECIFIED)
-      linked_shader->info.TessEval.Spacing = TESS_SPACING_EQUAL;
+   if (gl_prog->info.tess.spacing == TESS_SPACING_UNSPECIFIED)
+      gl_prog->info.tess.spacing = TESS_SPACING_EQUAL;
 
-   if (linked_shader->info.TessEval.VertexOrder == 0)
-      linked_shader->info.TessEval.VertexOrder = GL_CCW;
+   if (vertex_order == 0)
+      gl_prog->info.tess.ccw = true;
+   else
+      gl_prog->info.tess.ccw = false;
+   
 
-   if (linked_shader->info.TessEval.PointMode == -1)
-      linked_shader->info.TessEval.PointMode = GL_FALSE;
+   if (point_mode == -1)
+      gl_prog->info.tess.point_mode = false;
+   else
+      gl_prog->info.tess.point_mode = true;
 }
 
 
@@ -2204,7 +2206,7 @@ link_intrastage_shaders(void *mem_ctx,
 
    link_fs_inout_layout_qualifiers(prog, linked, shader_list, num_shaders);
    link_tcs_out_layout_qualifiers(prog, gl_prog, shader_list, num_shaders);
-   link_tes_in_layout_qualifiers(prog, linked, shader_list, num_shaders);
+   link_tes_in_layout_qualifiers(prog, gl_prog, shader_list, num_shaders);
    link_gs_inout_layout_qualifiers(prog, linked, shader_list, num_shaders);
    link_cs_input_layout_qualifiers(prog, linked, shader_list, num_shaders);
    link_xfb_stride_layout_qualifiers(ctx, prog, linked, shader_list,
diff --git a/src/mesa/drivers/dri/i965/brw_tcs.c b/src/mesa/drivers/dri/i965/brw_tcs.c
index cafa4b4..858ecf9 100644
--- a/src/mesa/drivers/dri/i965/brw_tcs.c
+++ b/src/mesa/drivers/dri/i965/brw_tcs.c
@@ -386,10 +386,10 @@ brw_tcs_precompile(struct gl_context *ctx,
    struct brw_program *btep;
    if (tes) {
       btep = brw_program(tes->Program);
-      key.tes_primitive_mode = tes->info.TessEval.PrimitiveMode;
+      key.tes_primitive_mode = tes->Program->info.tess.primitive_mode;
       key.quads_workaround = brw->gen < 9 &&
-                             tes->info.TessEval.PrimitiveMode == GL_QUADS &&
-                             tes->info.TessEval.Spacing == TESS_SPACING_EQUAL;
+                             tes->Program->info.tess.primitive_mode == GL_QUADS &&
+                             tes->Program->info.tess.spacing == TESS_SPACING_EQUAL;
    } else {
       btep = NULL;
       key.tes_primitive_mode = GL_TRIANGLES;
diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
index 889ac0f..5c9b06f 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -829,7 +829,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
          break;
       if (check_tes_query(ctx, shProg)) {
          *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]->
-            info.TessEval.PrimitiveMode;
+            Program->info.tess.primitive_mode;
       }
       return;
    case GL_TESS_GEN_SPACING:
@@ -838,7 +838,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
       if (check_tes_query(ctx, shProg)) {
          const struct gl_linked_shader *tes =
             shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL];
-         switch (tes->info.TessEval.Spacing) {
+         switch (tes->Program->info.tess.spacing) {
          case TESS_SPACING_EQUAL:
             *params = GL_EQUAL;
             break;
@@ -859,7 +859,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
          break;
       if (check_tes_query(ctx, shProg)) {
          *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]->
-            info.TessEval.VertexOrder;
+            Program->info.tess.ccw ? GL_CCW : GL_CW;
          }
       return;
    case GL_TESS_GEN_POINT_MODE:
@@ -867,7 +867,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
          break;
       if (check_tes_query(ctx, shProg)) {
          *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]->
-            info.TessEval.PointMode;
+            Program->info.tess.point_mode ? GL_TRUE : GL_FALSE;
       }
       return;
    default:
@@ -2202,13 +2202,6 @@ _mesa_copy_linked_program_data(const struct gl_shader_program *src,
    dst->info.separate_shader = src->SeparateShader;
 
    switch (dst_sh->Stage) {
-   case MESA_SHADER_TESS_EVAL: {
-      dst->info.tess.primitive_mode = dst_sh->info.TessEval.PrimitiveMode;
-      dst->info.tess.spacing = dst_sh->info.TessEval.Spacing;
-      dst->info.tess.ccw = dst_sh->info.TessEval.VertexOrder == GL_CCW;
-      dst->info.tess.point_mode = dst_sh->info.TessEval.PointMode;
-      break;
-   }
    case MESA_SHADER_GEOMETRY: {
       dst->info.gs.vertices_in = src->Geom.VerticesIn;
       dst->info.gs.vertices_out = dst_sh->info.Geom.VerticesOut;
-- 
2.9.3



More information about the mesa-dev mailing list