[Mesa-dev] st/mesa: fix GLSL 1.30 texture shadow functions with the GL_ALPHA depth mode (v2)

Submitted by Marek Olšák on July 24, 2015, 5:16 p.m.

Details

Message ID 1437758162-20769-1-git-send-email-maraeo@gmail.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Marek Olšák July 24, 2015, 5:16 p.m.
From: Marek Olšák <marek.olsak@amd.com>

Fixes piglit:
    spec@glsl-1.30@execution@fs-texture-sampler2dshadow-10
    spec@glsl-1.30@execution@fs-texture-sampler2dshadow-11

v2: use st_shader_stage_to_ptarget
---
 src/mesa/state_tracker/st_atom_texture.c   | 74 +++++++++++++++++++++---------
 src/mesa/state_tracker/st_context.h        | 23 ++++++++++
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 27 +----------
 3 files changed, 77 insertions(+), 47 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
index ba3cf9b..4012d88 100644
--- a/src/mesa/state_tracker/st_atom_texture.c
+++ b/src/mesa/state_tracker/st_atom_texture.c
@@ -103,7 +103,8 @@  swizzle_swizzle(unsigned swizzle1, unsigned swizzle2)
  */
 static unsigned
 compute_texture_format_swizzle(GLenum baseFormat, GLenum depthMode,
-                               enum pipe_format actualFormat)
+                               enum pipe_format actualFormat,
+                               unsigned glsl_version)
 {
    switch (baseFormat) {
    case GL_RGBA:
@@ -157,8 +158,26 @@  compute_texture_format_swizzle(GLenum baseFormat, GLenum depthMode,
       case GL_INTENSITY:
          return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X);
       case GL_ALPHA:
-         return MAKE_SWIZZLE4(SWIZZLE_ZERO, SWIZZLE_ZERO,
-                              SWIZZLE_ZERO, SWIZZLE_X);
+         /* The texture(sampler*Shadow) functions from GLSL 1.30 ignore
+          * the depth mode and return float, while older shadow* functions
+          * and ARB_fp instructions return vec4 according to the depth mode.
+          *
+          * The problem with the GLSL 1.30 functions is that GL_ALPHA forces
+          * them to return 0, breaking them completely.
+          *
+          * A proper fix would increase code complexity and that's not worth
+          * it for a rarely used feature such as the GL_ALPHA depth mode
+          * in GL3. Therefore, change GL_ALPHA to GL_INTENSITY for all
+          * shaders that use GLSL 1.30 or later.
+          *
+          * BTW, it's required that sampler views are updated when
+          * shaders change (check_sampler_swizzle takes care of that).
+          */
+         if (glsl_version && glsl_version >= 130)
+            return SWIZZLE_XXXX;
+         else
+            return MAKE_SWIZZLE4(SWIZZLE_ZERO, SWIZZLE_ZERO,
+                                 SWIZZLE_ZERO, SWIZZLE_X);
       case GL_RED:
          return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO,
                               SWIZZLE_ZERO, SWIZZLE_ONE);
@@ -174,7 +193,8 @@  compute_texture_format_swizzle(GLenum baseFormat, GLenum depthMode,
 
 
 static unsigned
-get_texture_format_swizzle(const struct st_texture_object *stObj)
+get_texture_format_swizzle(const struct st_texture_object *stObj,
+                           unsigned glsl_version)
 {
    GLenum baseFormat = _mesa_texture_base_format(&stObj->base);
    unsigned tex_swizzle;
@@ -182,7 +202,8 @@  get_texture_format_swizzle(const struct st_texture_object *stObj)
    if (baseFormat != GL_NONE) {
       tex_swizzle = compute_texture_format_swizzle(baseFormat,
                                                    stObj->base.DepthMode,
-                                                   stObj->pt->format);
+                                                   stObj->pt->format,
+                                                   glsl_version);
    }
    else {
       tex_swizzle = SWIZZLE_XYZW;
@@ -201,9 +222,9 @@  get_texture_format_swizzle(const struct st_texture_object *stObj)
  */
 static boolean
 check_sampler_swizzle(const struct st_texture_object *stObj,
-		      struct pipe_sampler_view *sv)
+		      struct pipe_sampler_view *sv, unsigned glsl_version)
 {
-   unsigned swizzle = get_texture_format_swizzle(stObj);
+   unsigned swizzle = get_texture_format_swizzle(stObj, glsl_version);
 
    return ((sv->swizzle_r != GET_SWZ(swizzle, 0)) ||
            (sv->swizzle_g != GET_SWZ(swizzle, 1)) ||
@@ -233,10 +254,11 @@  static struct pipe_sampler_view *
 st_create_texture_sampler_view_from_stobj(struct pipe_context *pipe,
 					  struct st_texture_object *stObj,
                                           const struct gl_sampler_object *samp,
-					  enum pipe_format format)
+					  enum pipe_format format,
+                                          unsigned glsl_version)
 {
    struct pipe_sampler_view templ;
-   unsigned swizzle = get_texture_format_swizzle(stObj);
+   unsigned swizzle = get_texture_format_swizzle(stObj, glsl_version);
 
    u_sampler_view_default_template(&templ,
                                    stObj->pt,
@@ -284,7 +306,8 @@  static struct pipe_sampler_view *
 st_get_texture_sampler_view_from_stobj(struct st_context *st,
                                        struct st_texture_object *stObj,
                                        const struct gl_sampler_object *samp,
-				       enum pipe_format format)
+				       enum pipe_format format,
+                                       unsigned glsl_version)
 {
    struct pipe_sampler_view **sv;
    const struct st_texture_image *firstImage;
@@ -306,7 +329,7 @@  st_get_texture_sampler_view_from_stobj(struct st_context *st,
 
    /* if sampler view has changed dereference it */
    if (*sv) {
-      if (check_sampler_swizzle(stObj, *sv) ||
+      if (check_sampler_swizzle(stObj, *sv, glsl_version) ||
 	  (format != (*sv)->format) ||
           gl_target_to_pipe(stObj->base.Target) != (*sv)->target ||
           stObj->base.MinLevel + stObj->base.BaseLevel != (*sv)->u.tex.first_level ||
@@ -318,7 +341,8 @@  st_get_texture_sampler_view_from_stobj(struct st_context *st,
    }
 
    if (!*sv) {
-      *sv = st_create_texture_sampler_view_from_stobj(st->pipe, stObj, samp, format);
+      *sv = st_create_texture_sampler_view_from_stobj(st->pipe, stObj, samp,
+                                                      format, glsl_version);
 
    } else if ((*sv)->context != st->pipe) {
       /* Recreate view in correct context, use existing view as template */
@@ -334,7 +358,7 @@  st_get_texture_sampler_view_from_stobj(struct st_context *st,
 static GLboolean
 update_single_texture(struct st_context *st,
                       struct pipe_sampler_view **sampler_view,
-		      GLuint texUnit)
+		      GLuint texUnit, unsigned glsl_version)
 {
    struct gl_context *ctx = st->ctx;
    const struct gl_sampler_object *samp;
@@ -374,8 +398,9 @@  update_single_texture(struct st_context *st,
       }
    }
 
-   *sampler_view = st_get_texture_sampler_view_from_stobj(st, stObj, samp,
-							  view_format);
+   *sampler_view =
+      st_get_texture_sampler_view_from_stobj(st, stObj, samp, view_format,
+                                             glsl_version);
    return GL_TRUE;
 }
 
@@ -383,7 +408,7 @@  update_single_texture(struct st_context *st,
 
 static void
 update_textures(struct st_context *st,
-                unsigned shader_stage,
+                gl_shader_stage mesa_shader,
                 const struct gl_program *prog,
                 unsigned max_units,
                 struct pipe_sampler_view **sampler_views,
@@ -392,6 +417,10 @@  update_textures(struct st_context *st,
    const GLuint old_max = *num_textures;
    GLbitfield samplers_used = prog->SamplersUsed;
    GLuint unit;
+   struct gl_shader_program *shader =
+      st->ctx->_Shader->CurrentProgram[mesa_shader];
+   unsigned glsl_version = shader ? shader->Version : 0;
+   unsigned shader_stage = st_shader_stage_to_ptarget(mesa_shader);
 
    if (samplers_used == 0x0 && old_max == 0)
       return;
@@ -406,7 +435,8 @@  update_textures(struct st_context *st,
          const GLuint texUnit = prog->SamplerUnits[unit];
          GLboolean retval;
 
-         retval = update_single_texture(st, &sampler_view, texUnit);
+         retval = update_single_texture(st, &sampler_view, texUnit,
+                                        glsl_version);
          if (retval == GL_FALSE)
             continue;
 
@@ -435,7 +465,7 @@  update_vertex_textures(struct st_context *st)
 
    if (ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
       update_textures(st,
-                      PIPE_SHADER_VERTEX,
+                      MESA_SHADER_VERTEX,
                       &ctx->VertexProgram._Current->Base,
                       ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
                       st->state.sampler_views[PIPE_SHADER_VERTEX],
@@ -450,7 +480,7 @@  update_fragment_textures(struct st_context *st)
    const struct gl_context *ctx = st->ctx;
 
    update_textures(st,
-                   PIPE_SHADER_FRAGMENT,
+                   MESA_SHADER_FRAGMENT,
                    &ctx->FragmentProgram._Current->Base,
                    ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
                    st->state.sampler_views[PIPE_SHADER_FRAGMENT],
@@ -465,7 +495,7 @@  update_geometry_textures(struct st_context *st)
 
    if (ctx->GeometryProgram._Current) {
       update_textures(st,
-                      PIPE_SHADER_GEOMETRY,
+                      MESA_SHADER_GEOMETRY,
                       &ctx->GeometryProgram._Current->Base,
                       ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits,
                       st->state.sampler_views[PIPE_SHADER_GEOMETRY],
@@ -481,7 +511,7 @@  update_tessctrl_textures(struct st_context *st)
 
    if (ctx->TessCtrlProgram._Current) {
       update_textures(st,
-                      PIPE_SHADER_TESS_CTRL,
+                      MESA_SHADER_TESS_CTRL,
                       &ctx->TessCtrlProgram._Current->Base,
                       ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits,
                       st->state.sampler_views[PIPE_SHADER_TESS_CTRL],
@@ -497,7 +527,7 @@  update_tesseval_textures(struct st_context *st)
 
    if (ctx->TessEvalProgram._Current) {
       update_textures(st,
-                      PIPE_SHADER_TESS_EVAL,
+                      MESA_SHADER_TESS_EVAL,
                       &ctx->TessEvalProgram._Current->Base,
                       ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits,
                       st->state.sampler_views[PIPE_SHADER_TESS_EVAL],
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 8183412..0d89260 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -278,6 +278,29 @@  st_fb_orientation(const struct gl_framebuffer *fb)
 }
 
 
+static inline unsigned
+st_shader_stage_to_ptarget(gl_shader_stage stage)
+{
+   switch (stage) {
+   case MESA_SHADER_VERTEX:
+      return PIPE_SHADER_VERTEX;
+   case MESA_SHADER_FRAGMENT:
+      return PIPE_SHADER_FRAGMENT;
+   case MESA_SHADER_GEOMETRY:
+      return PIPE_SHADER_GEOMETRY;
+   case MESA_SHADER_TESS_CTRL:
+      return PIPE_SHADER_TESS_CTRL;
+   case MESA_SHADER_TESS_EVAL:
+      return PIPE_SHADER_TESS_EVAL;
+   case MESA_SHADER_COMPUTE:
+      return PIPE_SHADER_COMPUTE;
+   }
+
+   assert(!"should not be reached");
+   return PIPE_SHADER_VERTEX;
+}
+
+
 /** clear-alloc a struct-sized object, with casting */
 #define ST_CALLOC_STRUCT(T)   (struct T *) calloc(1, sizeof(struct T))
 
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 905d661..4c6e48a 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -5693,29 +5693,6 @@  out:
 /* ----------------------------- End TGSI code ------------------------------ */
 
 
-static unsigned
-shader_stage_to_ptarget(gl_shader_stage stage)
-{
-   switch (stage) {
-   case MESA_SHADER_VERTEX:
-      return PIPE_SHADER_VERTEX;
-   case MESA_SHADER_FRAGMENT:
-      return PIPE_SHADER_FRAGMENT;
-   case MESA_SHADER_GEOMETRY:
-      return PIPE_SHADER_GEOMETRY;
-   case MESA_SHADER_TESS_CTRL:
-      return PIPE_SHADER_TESS_CTRL;
-   case MESA_SHADER_TESS_EVAL:
-      return PIPE_SHADER_TESS_EVAL;
-   case MESA_SHADER_COMPUTE:
-      return PIPE_SHADER_COMPUTE;
-   }
-
-   assert(!"should not be reached");
-   return PIPE_SHADER_VERTEX;
-}
-
-
 /**
  * Convert a shader's GLSL IR into a Mesa gl_program, although without
  * generating Mesa IR.
@@ -5732,7 +5709,7 @@  get_mesa_program(struct gl_context *ctx,
    struct gl_shader_compiler_options *options =
          &ctx->Const.ShaderCompilerOptions[_mesa_shader_enum_to_shader_stage(shader->Type)];
    struct pipe_screen *pscreen = ctx->st->pipe->screen;
-   unsigned ptarget = shader_stage_to_ptarget(shader->Stage);
+   unsigned ptarget = st_shader_stage_to_ptarget(shader->Stage);
 
    validate_ir_tree(shader->ir);
 
@@ -5921,7 +5898,7 @@  st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
       gl_shader_stage stage = _mesa_shader_enum_to_shader_stage(prog->_LinkedShaders[i]->Type);
       const struct gl_shader_compiler_options *options =
             &ctx->Const.ShaderCompilerOptions[stage];
-      unsigned ptarget = shader_stage_to_ptarget(stage);
+      unsigned ptarget = st_shader_stage_to_ptarget(stage);
       bool have_dround = pscreen->get_shader_param(pscreen, ptarget,
                                                    PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED);
       bool have_dfrexp = pscreen->get_shader_param(pscreen, ptarget,

Comments

Ping.

Marek

On Fri, Jul 24, 2015 at 7:16 PM, Marek Olšák <maraeo@gmail.com> wrote:
> From: Marek Olšák <marek.olsak@amd.com>
>
> Fixes piglit:
>     spec@glsl-1.30@execution@fs-texture-sampler2dshadow-10
>     spec@glsl-1.30@execution@fs-texture-sampler2dshadow-11
>
> v2: use st_shader_stage_to_ptarget
> ---
>  src/mesa/state_tracker/st_atom_texture.c   | 74 +++++++++++++++++++++---------
>  src/mesa/state_tracker/st_context.h        | 23 ++++++++++
>  src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 27 +----------
>  3 files changed, 77 insertions(+), 47 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
> index ba3cf9b..4012d88 100644
> --- a/src/mesa/state_tracker/st_atom_texture.c
> +++ b/src/mesa/state_tracker/st_atom_texture.c
> @@ -103,7 +103,8 @@ swizzle_swizzle(unsigned swizzle1, unsigned swizzle2)
>   */
>  static unsigned
>  compute_texture_format_swizzle(GLenum baseFormat, GLenum depthMode,
> -                               enum pipe_format actualFormat)
> +                               enum pipe_format actualFormat,
> +                               unsigned glsl_version)
>  {
>     switch (baseFormat) {
>     case GL_RGBA:
> @@ -157,8 +158,26 @@ compute_texture_format_swizzle(GLenum baseFormat, GLenum depthMode,
>        case GL_INTENSITY:
>           return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X);
>        case GL_ALPHA:
> -         return MAKE_SWIZZLE4(SWIZZLE_ZERO, SWIZZLE_ZERO,
> -                              SWIZZLE_ZERO, SWIZZLE_X);
> +         /* The texture(sampler*Shadow) functions from GLSL 1.30 ignore
> +          * the depth mode and return float, while older shadow* functions
> +          * and ARB_fp instructions return vec4 according to the depth mode.
> +          *
> +          * The problem with the GLSL 1.30 functions is that GL_ALPHA forces
> +          * them to return 0, breaking them completely.
> +          *
> +          * A proper fix would increase code complexity and that's not worth
> +          * it for a rarely used feature such as the GL_ALPHA depth mode
> +          * in GL3. Therefore, change GL_ALPHA to GL_INTENSITY for all
> +          * shaders that use GLSL 1.30 or later.
> +          *
> +          * BTW, it's required that sampler views are updated when
> +          * shaders change (check_sampler_swizzle takes care of that).
> +          */
> +         if (glsl_version && glsl_version >= 130)
> +            return SWIZZLE_XXXX;
> +         else
> +            return MAKE_SWIZZLE4(SWIZZLE_ZERO, SWIZZLE_ZERO,
> +                                 SWIZZLE_ZERO, SWIZZLE_X);
>        case GL_RED:
>           return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO,
>                                SWIZZLE_ZERO, SWIZZLE_ONE);
> @@ -174,7 +193,8 @@ compute_texture_format_swizzle(GLenum baseFormat, GLenum depthMode,
>
>
>  static unsigned
> -get_texture_format_swizzle(const struct st_texture_object *stObj)
> +get_texture_format_swizzle(const struct st_texture_object *stObj,
> +                           unsigned glsl_version)
>  {
>     GLenum baseFormat = _mesa_texture_base_format(&stObj->base);
>     unsigned tex_swizzle;
> @@ -182,7 +202,8 @@ get_texture_format_swizzle(const struct st_texture_object *stObj)
>     if (baseFormat != GL_NONE) {
>        tex_swizzle = compute_texture_format_swizzle(baseFormat,
>                                                     stObj->base.DepthMode,
> -                                                   stObj->pt->format);
> +                                                   stObj->pt->format,
> +                                                   glsl_version);
>     }
>     else {
>        tex_swizzle = SWIZZLE_XYZW;
> @@ -201,9 +222,9 @@ get_texture_format_swizzle(const struct st_texture_object *stObj)
>   */
>  static boolean
>  check_sampler_swizzle(const struct st_texture_object *stObj,
> -                     struct pipe_sampler_view *sv)
> +                     struct pipe_sampler_view *sv, unsigned glsl_version)
>  {
> -   unsigned swizzle = get_texture_format_swizzle(stObj);
> +   unsigned swizzle = get_texture_format_swizzle(stObj, glsl_version);
>
>     return ((sv->swizzle_r != GET_SWZ(swizzle, 0)) ||
>             (sv->swizzle_g != GET_SWZ(swizzle, 1)) ||
> @@ -233,10 +254,11 @@ static struct pipe_sampler_view *
>  st_create_texture_sampler_view_from_stobj(struct pipe_context *pipe,
>                                           struct st_texture_object *stObj,
>                                            const struct gl_sampler_object *samp,
> -                                         enum pipe_format format)
> +                                         enum pipe_format format,
> +                                          unsigned glsl_version)
>  {
>     struct pipe_sampler_view templ;
> -   unsigned swizzle = get_texture_format_swizzle(stObj);
> +   unsigned swizzle = get_texture_format_swizzle(stObj, glsl_version);
>
>     u_sampler_view_default_template(&templ,
>                                     stObj->pt,
> @@ -284,7 +306,8 @@ static struct pipe_sampler_view *
>  st_get_texture_sampler_view_from_stobj(struct st_context *st,
>                                         struct st_texture_object *stObj,
>                                         const struct gl_sampler_object *samp,
> -                                      enum pipe_format format)
> +                                      enum pipe_format format,
> +                                       unsigned glsl_version)
>  {
>     struct pipe_sampler_view **sv;
>     const struct st_texture_image *firstImage;
> @@ -306,7 +329,7 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
>
>     /* if sampler view has changed dereference it */
>     if (*sv) {
> -      if (check_sampler_swizzle(stObj, *sv) ||
> +      if (check_sampler_swizzle(stObj, *sv, glsl_version) ||
>           (format != (*sv)->format) ||
>            gl_target_to_pipe(stObj->base.Target) != (*sv)->target ||
>            stObj->base.MinLevel + stObj->base.BaseLevel != (*sv)->u.tex.first_level ||
> @@ -318,7 +341,8 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
>     }
>
>     if (!*sv) {
> -      *sv = st_create_texture_sampler_view_from_stobj(st->pipe, stObj, samp, format);
> +      *sv = st_create_texture_sampler_view_from_stobj(st->pipe, stObj, samp,
> +                                                      format, glsl_version);
>
>     } else if ((*sv)->context != st->pipe) {
>        /* Recreate view in correct context, use existing view as template */
> @@ -334,7 +358,7 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
>  static GLboolean
>  update_single_texture(struct st_context *st,
>                        struct pipe_sampler_view **sampler_view,
> -                     GLuint texUnit)
> +                     GLuint texUnit, unsigned glsl_version)
>  {
>     struct gl_context *ctx = st->ctx;
>     const struct gl_sampler_object *samp;
> @@ -374,8 +398,9 @@ update_single_texture(struct st_context *st,
>        }
>     }
>
> -   *sampler_view = st_get_texture_sampler_view_from_stobj(st, stObj, samp,
> -                                                         view_format);
> +   *sampler_view =
> +      st_get_texture_sampler_view_from_stobj(st, stObj, samp, view_format,
> +                                             glsl_version);
>     return GL_TRUE;
>  }
>
> @@ -383,7 +408,7 @@ update_single_texture(struct st_context *st,
>
>  static void
>  update_textures(struct st_context *st,
> -                unsigned shader_stage,
> +                gl_shader_stage mesa_shader,
>                  const struct gl_program *prog,
>                  unsigned max_units,
>                  struct pipe_sampler_view **sampler_views,
> @@ -392,6 +417,10 @@ update_textures(struct st_context *st,
>     const GLuint old_max = *num_textures;
>     GLbitfield samplers_used = prog->SamplersUsed;
>     GLuint unit;
> +   struct gl_shader_program *shader =
> +      st->ctx->_Shader->CurrentProgram[mesa_shader];
> +   unsigned glsl_version = shader ? shader->Version : 0;
> +   unsigned shader_stage = st_shader_stage_to_ptarget(mesa_shader);
>
>     if (samplers_used == 0x0 && old_max == 0)
>        return;
> @@ -406,7 +435,8 @@ update_textures(struct st_context *st,
>           const GLuint texUnit = prog->SamplerUnits[unit];
>           GLboolean retval;
>
> -         retval = update_single_texture(st, &sampler_view, texUnit);
> +         retval = update_single_texture(st, &sampler_view, texUnit,
> +                                        glsl_version);
>           if (retval == GL_FALSE)
>              continue;
>
> @@ -435,7 +465,7 @@ update_vertex_textures(struct st_context *st)
>
>     if (ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
>        update_textures(st,
> -                      PIPE_SHADER_VERTEX,
> +                      MESA_SHADER_VERTEX,
>                        &ctx->VertexProgram._Current->Base,
>                        ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
>                        st->state.sampler_views[PIPE_SHADER_VERTEX],
> @@ -450,7 +480,7 @@ update_fragment_textures(struct st_context *st)
>     const struct gl_context *ctx = st->ctx;
>
>     update_textures(st,
> -                   PIPE_SHADER_FRAGMENT,
> +                   MESA_SHADER_FRAGMENT,
>                     &ctx->FragmentProgram._Current->Base,
>                     ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>                     st->state.sampler_views[PIPE_SHADER_FRAGMENT],
> @@ -465,7 +495,7 @@ update_geometry_textures(struct st_context *st)
>
>     if (ctx->GeometryProgram._Current) {
>        update_textures(st,
> -                      PIPE_SHADER_GEOMETRY,
> +                      MESA_SHADER_GEOMETRY,
>                        &ctx->GeometryProgram._Current->Base,
>                        ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits,
>                        st->state.sampler_views[PIPE_SHADER_GEOMETRY],
> @@ -481,7 +511,7 @@ update_tessctrl_textures(struct st_context *st)
>
>     if (ctx->TessCtrlProgram._Current) {
>        update_textures(st,
> -                      PIPE_SHADER_TESS_CTRL,
> +                      MESA_SHADER_TESS_CTRL,
>                        &ctx->TessCtrlProgram._Current->Base,
>                        ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits,
>                        st->state.sampler_views[PIPE_SHADER_TESS_CTRL],
> @@ -497,7 +527,7 @@ update_tesseval_textures(struct st_context *st)
>
>     if (ctx->TessEvalProgram._Current) {
>        update_textures(st,
> -                      PIPE_SHADER_TESS_EVAL,
> +                      MESA_SHADER_TESS_EVAL,
>                        &ctx->TessEvalProgram._Current->Base,
>                        ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits,
>                        st->state.sampler_views[PIPE_SHADER_TESS_EVAL],
> diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
> index 8183412..0d89260 100644
> --- a/src/mesa/state_tracker/st_context.h
> +++ b/src/mesa/state_tracker/st_context.h
> @@ -278,6 +278,29 @@ st_fb_orientation(const struct gl_framebuffer *fb)
>  }
>
>
> +static inline unsigned
> +st_shader_stage_to_ptarget(gl_shader_stage stage)
> +{
> +   switch (stage) {
> +   case MESA_SHADER_VERTEX:
> +      return PIPE_SHADER_VERTEX;
> +   case MESA_SHADER_FRAGMENT:
> +      return PIPE_SHADER_FRAGMENT;
> +   case MESA_SHADER_GEOMETRY:
> +      return PIPE_SHADER_GEOMETRY;
> +   case MESA_SHADER_TESS_CTRL:
> +      return PIPE_SHADER_TESS_CTRL;
> +   case MESA_SHADER_TESS_EVAL:
> +      return PIPE_SHADER_TESS_EVAL;
> +   case MESA_SHADER_COMPUTE:
> +      return PIPE_SHADER_COMPUTE;
> +   }
> +
> +   assert(!"should not be reached");
> +   return PIPE_SHADER_VERTEX;
> +}
> +
> +
>  /** clear-alloc a struct-sized object, with casting */
>  #define ST_CALLOC_STRUCT(T)   (struct T *) calloc(1, sizeof(struct T))
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 905d661..4c6e48a 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -5693,29 +5693,6 @@ out:
>  /* ----------------------------- End TGSI code ------------------------------ */
>
>
> -static unsigned
> -shader_stage_to_ptarget(gl_shader_stage stage)
> -{
> -   switch (stage) {
> -   case MESA_SHADER_VERTEX:
> -      return PIPE_SHADER_VERTEX;
> -   case MESA_SHADER_FRAGMENT:
> -      return PIPE_SHADER_FRAGMENT;
> -   case MESA_SHADER_GEOMETRY:
> -      return PIPE_SHADER_GEOMETRY;
> -   case MESA_SHADER_TESS_CTRL:
> -      return PIPE_SHADER_TESS_CTRL;
> -   case MESA_SHADER_TESS_EVAL:
> -      return PIPE_SHADER_TESS_EVAL;
> -   case MESA_SHADER_COMPUTE:
> -      return PIPE_SHADER_COMPUTE;
> -   }
> -
> -   assert(!"should not be reached");
> -   return PIPE_SHADER_VERTEX;
> -}
> -
> -
>  /**
>   * Convert a shader's GLSL IR into a Mesa gl_program, although without
>   * generating Mesa IR.
> @@ -5732,7 +5709,7 @@ get_mesa_program(struct gl_context *ctx,
>     struct gl_shader_compiler_options *options =
>           &ctx->Const.ShaderCompilerOptions[_mesa_shader_enum_to_shader_stage(shader->Type)];
>     struct pipe_screen *pscreen = ctx->st->pipe->screen;
> -   unsigned ptarget = shader_stage_to_ptarget(shader->Stage);
> +   unsigned ptarget = st_shader_stage_to_ptarget(shader->Stage);
>
>     validate_ir_tree(shader->ir);
>
> @@ -5921,7 +5898,7 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
>        gl_shader_stage stage = _mesa_shader_enum_to_shader_stage(prog->_LinkedShaders[i]->Type);
>        const struct gl_shader_compiler_options *options =
>              &ctx->Const.ShaderCompilerOptions[stage];
> -      unsigned ptarget = shader_stage_to_ptarget(stage);
> +      unsigned ptarget = st_shader_stage_to_ptarget(stage);
>        bool have_dround = pscreen->get_shader_param(pscreen, ptarget,
>                                                     PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED);
>        bool have_dfrexp = pscreen->get_shader_param(pscreen, ptarget,
> --
> 2.1.4
>
I thought someone else R-b'd this.

LGTM.  Reviewed-by: Brian Paul <brianp@vmware.com>


On 07/28/2015 01:45 PM, Marek Olšák wrote:
> Ping.
>
> Marek
>
> On Fri, Jul 24, 2015 at 7:16 PM, Marek Olšák <maraeo@gmail.com> wrote:
>> From: Marek Olšák <marek.olsak@amd.com>
>>
>> Fixes piglit:
>>      spec@glsl-1.30@execution@fs-texture-sampler2dshadow-10
>>      spec@glsl-1.30@execution@fs-texture-sampler2dshadow-11
>>
>> v2: use st_shader_stage_to_ptarget
>> ---
>>   src/mesa/state_tracker/st_atom_texture.c   | 74 +++++++++++++++++++++---------
>>   src/mesa/state_tracker/st_context.h        | 23 ++++++++++
>>   src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 27 +----------
>>   3 files changed, 77 insertions(+), 47 deletions(-)
>>
>> diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
>> index ba3cf9b..4012d88 100644
>> --- a/src/mesa/state_tracker/st_atom_texture.c
>> +++ b/src/mesa/state_tracker/st_atom_texture.c
>> @@ -103,7 +103,8 @@ swizzle_swizzle(unsigned swizzle1, unsigned swizzle2)
>>    */
>>   static unsigned
>>   compute_texture_format_swizzle(GLenum baseFormat, GLenum depthMode,
>> -                               enum pipe_format actualFormat)
>> +                               enum pipe_format actualFormat,
>> +                               unsigned glsl_version)
>>   {
>>      switch (baseFormat) {
>>      case GL_RGBA:
>> @@ -157,8 +158,26 @@ compute_texture_format_swizzle(GLenum baseFormat, GLenum depthMode,
>>         case GL_INTENSITY:
>>            return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X);
>>         case GL_ALPHA:
>> -         return MAKE_SWIZZLE4(SWIZZLE_ZERO, SWIZZLE_ZERO,
>> -                              SWIZZLE_ZERO, SWIZZLE_X);
>> +         /* The texture(sampler*Shadow) functions from GLSL 1.30 ignore
>> +          * the depth mode and return float, while older shadow* functions
>> +          * and ARB_fp instructions return vec4 according to the depth mode.
>> +          *
>> +          * The problem with the GLSL 1.30 functions is that GL_ALPHA forces
>> +          * them to return 0, breaking them completely.
>> +          *
>> +          * A proper fix would increase code complexity and that's not worth
>> +          * it for a rarely used feature such as the GL_ALPHA depth mode
>> +          * in GL3. Therefore, change GL_ALPHA to GL_INTENSITY for all
>> +          * shaders that use GLSL 1.30 or later.
>> +          *
>> +          * BTW, it's required that sampler views are updated when
>> +          * shaders change (check_sampler_swizzle takes care of that).
>> +          */
>> +         if (glsl_version && glsl_version >= 130)
>> +            return SWIZZLE_XXXX;
>> +         else
>> +            return MAKE_SWIZZLE4(SWIZZLE_ZERO, SWIZZLE_ZERO,
>> +                                 SWIZZLE_ZERO, SWIZZLE_X);
>>         case GL_RED:
>>            return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO,
>>                                 SWIZZLE_ZERO, SWIZZLE_ONE);
>> @@ -174,7 +193,8 @@ compute_texture_format_swizzle(GLenum baseFormat, GLenum depthMode,
>>
>>
>>   static unsigned
>> -get_texture_format_swizzle(const struct st_texture_object *stObj)
>> +get_texture_format_swizzle(const struct st_texture_object *stObj,
>> +                           unsigned glsl_version)
>>   {
>>      GLenum baseFormat = _mesa_texture_base_format(&stObj->base);
>>      unsigned tex_swizzle;
>> @@ -182,7 +202,8 @@ get_texture_format_swizzle(const struct st_texture_object *stObj)
>>      if (baseFormat != GL_NONE) {
>>         tex_swizzle = compute_texture_format_swizzle(baseFormat,
>>                                                      stObj->base.DepthMode,
>> -                                                   stObj->pt->format);
>> +                                                   stObj->pt->format,
>> +                                                   glsl_version);
>>      }
>>      else {
>>         tex_swizzle = SWIZZLE_XYZW;
>> @@ -201,9 +222,9 @@ get_texture_format_swizzle(const struct st_texture_object *stObj)
>>    */
>>   static boolean
>>   check_sampler_swizzle(const struct st_texture_object *stObj,
>> -                     struct pipe_sampler_view *sv)
>> +                     struct pipe_sampler_view *sv, unsigned glsl_version)
>>   {
>> -   unsigned swizzle = get_texture_format_swizzle(stObj);
>> +   unsigned swizzle = get_texture_format_swizzle(stObj, glsl_version);
>>
>>      return ((sv->swizzle_r != GET_SWZ(swizzle, 0)) ||
>>              (sv->swizzle_g != GET_SWZ(swizzle, 1)) ||
>> @@ -233,10 +254,11 @@ static struct pipe_sampler_view *
>>   st_create_texture_sampler_view_from_stobj(struct pipe_context *pipe,
>>                                            struct st_texture_object *stObj,
>>                                             const struct gl_sampler_object *samp,
>> -                                         enum pipe_format format)
>> +                                         enum pipe_format format,
>> +                                          unsigned glsl_version)
>>   {
>>      struct pipe_sampler_view templ;
>> -   unsigned swizzle = get_texture_format_swizzle(stObj);
>> +   unsigned swizzle = get_texture_format_swizzle(stObj, glsl_version);
>>
>>      u_sampler_view_default_template(&templ,
>>                                      stObj->pt,
>> @@ -284,7 +306,8 @@ static struct pipe_sampler_view *
>>   st_get_texture_sampler_view_from_stobj(struct st_context *st,
>>                                          struct st_texture_object *stObj,
>>                                          const struct gl_sampler_object *samp,
>> -                                      enum pipe_format format)
>> +                                      enum pipe_format format,
>> +                                       unsigned glsl_version)
>>   {
>>      struct pipe_sampler_view **sv;
>>      const struct st_texture_image *firstImage;
>> @@ -306,7 +329,7 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
>>
>>      /* if sampler view has changed dereference it */
>>      if (*sv) {
>> -      if (check_sampler_swizzle(stObj, *sv) ||
>> +      if (check_sampler_swizzle(stObj, *sv, glsl_version) ||
>>            (format != (*sv)->format) ||
>>             gl_target_to_pipe(stObj->base.Target) != (*sv)->target ||
>>             stObj->base.MinLevel + stObj->base.BaseLevel != (*sv)->u.tex.first_level ||
>> @@ -318,7 +341,8 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
>>      }
>>
>>      if (!*sv) {
>> -      *sv = st_create_texture_sampler_view_from_stobj(st->pipe, stObj, samp, format);
>> +      *sv = st_create_texture_sampler_view_from_stobj(st->pipe, stObj, samp,
>> +                                                      format, glsl_version);
>>
>>      } else if ((*sv)->context != st->pipe) {
>>         /* Recreate view in correct context, use existing view as template */
>> @@ -334,7 +358,7 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
>>   static GLboolean
>>   update_single_texture(struct st_context *st,
>>                         struct pipe_sampler_view **sampler_view,
>> -                     GLuint texUnit)
>> +                     GLuint texUnit, unsigned glsl_version)
>>   {
>>      struct gl_context *ctx = st->ctx;
>>      const struct gl_sampler_object *samp;
>> @@ -374,8 +398,9 @@ update_single_texture(struct st_context *st,
>>         }
>>      }
>>
>> -   *sampler_view = st_get_texture_sampler_view_from_stobj(st, stObj, samp,
>> -                                                         view_format);
>> +   *sampler_view =
>> +      st_get_texture_sampler_view_from_stobj(st, stObj, samp, view_format,
>> +                                             glsl_version);
>>      return GL_TRUE;
>>   }
>>
>> @@ -383,7 +408,7 @@ update_single_texture(struct st_context *st,
>>
>>   static void
>>   update_textures(struct st_context *st,
>> -                unsigned shader_stage,
>> +                gl_shader_stage mesa_shader,
>>                   const struct gl_program *prog,
>>                   unsigned max_units,
>>                   struct pipe_sampler_view **sampler_views,
>> @@ -392,6 +417,10 @@ update_textures(struct st_context *st,
>>      const GLuint old_max = *num_textures;
>>      GLbitfield samplers_used = prog->SamplersUsed;
>>      GLuint unit;
>> +   struct gl_shader_program *shader =
>> +      st->ctx->_Shader->CurrentProgram[mesa_shader];
>> +   unsigned glsl_version = shader ? shader->Version : 0;
>> +   unsigned shader_stage = st_shader_stage_to_ptarget(mesa_shader);
>>
>>      if (samplers_used == 0x0 && old_max == 0)
>>         return;
>> @@ -406,7 +435,8 @@ update_textures(struct st_context *st,
>>            const GLuint texUnit = prog->SamplerUnits[unit];
>>            GLboolean retval;
>>
>> -         retval = update_single_texture(st, &sampler_view, texUnit);
>> +         retval = update_single_texture(st, &sampler_view, texUnit,
>> +                                        glsl_version);
>>            if (retval == GL_FALSE)
>>               continue;
>>
>> @@ -435,7 +465,7 @@ update_vertex_textures(struct st_context *st)
>>
>>      if (ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
>>         update_textures(st,
>> -                      PIPE_SHADER_VERTEX,
>> +                      MESA_SHADER_VERTEX,
>>                         &ctx->VertexProgram._Current->Base,
>>                         ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
>>                         st->state.sampler_views[PIPE_SHADER_VERTEX],
>> @@ -450,7 +480,7 @@ update_fragment_textures(struct st_context *st)
>>      const struct gl_context *ctx = st->ctx;
>>
>>      update_textures(st,
>> -                   PIPE_SHADER_FRAGMENT,
>> +                   MESA_SHADER_FRAGMENT,
>>                      &ctx->FragmentProgram._Current->Base,
>>                      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>>                      st->state.sampler_views[PIPE_SHADER_FRAGMENT],
>> @@ -465,7 +495,7 @@ update_geometry_textures(struct st_context *st)
>>
>>      if (ctx->GeometryProgram._Current) {
>>         update_textures(st,
>> -                      PIPE_SHADER_GEOMETRY,
>> +                      MESA_SHADER_GEOMETRY,
>>                         &ctx->GeometryProgram._Current->Base,
>>                         ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits,
>>                         st->state.sampler_views[PIPE_SHADER_GEOMETRY],
>> @@ -481,7 +511,7 @@ update_tessctrl_textures(struct st_context *st)
>>
>>      if (ctx->TessCtrlProgram._Current) {
>>         update_textures(st,
>> -                      PIPE_SHADER_TESS_CTRL,
>> +                      MESA_SHADER_TESS_CTRL,
>>                         &ctx->TessCtrlProgram._Current->Base,
>>                         ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits,
>>                         st->state.sampler_views[PIPE_SHADER_TESS_CTRL],
>> @@ -497,7 +527,7 @@ update_tesseval_textures(struct st_context *st)
>>
>>      if (ctx->TessEvalProgram._Current) {
>>         update_textures(st,
>> -                      PIPE_SHADER_TESS_EVAL,
>> +                      MESA_SHADER_TESS_EVAL,
>>                         &ctx->TessEvalProgram._Current->Base,
>>                         ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits,
>>                         st->state.sampler_views[PIPE_SHADER_TESS_EVAL],
>> diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
>> index 8183412..0d89260 100644
>> --- a/src/mesa/state_tracker/st_context.h
>> +++ b/src/mesa/state_tracker/st_context.h
>> @@ -278,6 +278,29 @@ st_fb_orientation(const struct gl_framebuffer *fb)
>>   }
>>
>>
>> +static inline unsigned
>> +st_shader_stage_to_ptarget(gl_shader_stage stage)
>> +{
>> +   switch (stage) {
>> +   case MESA_SHADER_VERTEX:
>> +      return PIPE_SHADER_VERTEX;
>> +   case MESA_SHADER_FRAGMENT:
>> +      return PIPE_SHADER_FRAGMENT;
>> +   case MESA_SHADER_GEOMETRY:
>> +      return PIPE_SHADER_GEOMETRY;
>> +   case MESA_SHADER_TESS_CTRL:
>> +      return PIPE_SHADER_TESS_CTRL;
>> +   case MESA_SHADER_TESS_EVAL:
>> +      return PIPE_SHADER_TESS_EVAL;
>> +   case MESA_SHADER_COMPUTE:
>> +      return PIPE_SHADER_COMPUTE;
>> +   }
>> +
>> +   assert(!"should not be reached");
>> +   return PIPE_SHADER_VERTEX;
>> +}
>> +
>> +
>>   /** clear-alloc a struct-sized object, with casting */
>>   #define ST_CALLOC_STRUCT(T)   (struct T *) calloc(1, sizeof(struct T))
>>
>> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> index 905d661..4c6e48a 100644
>> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> @@ -5693,29 +5693,6 @@ out:
>>   /* ----------------------------- End TGSI code ------------------------------ */
>>
>>
>> -static unsigned
>> -shader_stage_to_ptarget(gl_shader_stage stage)
>> -{
>> -   switch (stage) {
>> -   case MESA_SHADER_VERTEX:
>> -      return PIPE_SHADER_VERTEX;
>> -   case MESA_SHADER_FRAGMENT:
>> -      return PIPE_SHADER_FRAGMENT;
>> -   case MESA_SHADER_GEOMETRY:
>> -      return PIPE_SHADER_GEOMETRY;
>> -   case MESA_SHADER_TESS_CTRL:
>> -      return PIPE_SHADER_TESS_CTRL;
>> -   case MESA_SHADER_TESS_EVAL:
>> -      return PIPE_SHADER_TESS_EVAL;
>> -   case MESA_SHADER_COMPUTE:
>> -      return PIPE_SHADER_COMPUTE;
>> -   }
>> -
>> -   assert(!"should not be reached");
>> -   return PIPE_SHADER_VERTEX;
>> -}
>> -
>> -
>>   /**
>>    * Convert a shader's GLSL IR into a Mesa gl_program, although without
>>    * generating Mesa IR.
>> @@ -5732,7 +5709,7 @@ get_mesa_program(struct gl_context *ctx,
>>      struct gl_shader_compiler_options *options =
>>            &ctx->Const.ShaderCompilerOptions[_mesa_shader_enum_to_shader_stage(shader->Type)];
>>      struct pipe_screen *pscreen = ctx->st->pipe->screen;
>> -   unsigned ptarget = shader_stage_to_ptarget(shader->Stage);
>> +   unsigned ptarget = st_shader_stage_to_ptarget(shader->Stage);
>>
>>      validate_ir_tree(shader->ir);
>>
>> @@ -5921,7 +5898,7 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
>>         gl_shader_stage stage = _mesa_shader_enum_to_shader_stage(prog->_LinkedShaders[i]->Type);
>>         const struct gl_shader_compiler_options *options =
>>               &ctx->Const.ShaderCompilerOptions[stage];
>> -      unsigned ptarget = shader_stage_to_ptarget(stage);
>> +      unsigned ptarget = st_shader_stage_to_ptarget(stage);
>>         bool have_dround = pscreen->get_shader_param(pscreen, ptarget,
>>                                                      PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED);
>>         bool have_dfrexp = pscreen->get_shader_param(pscreen, ptarget,
>> --
>> 2.1.4
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.freedesktop.org_mailman_listinfo_mesa-2Ddev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=T0t4QG7chq2ZwJo6wilkFznRSFy-8uDKartPGbomVj8&m=j3acVBWT2Mo6k2EXgcyVt6SYAbFZyykzLFi4EePv5xM&s=9ZXY63kq-RvPoImpdGDgd0W_rpSnMdqJ7R1Er6Wct58&e=
>