[Mesa-dev] [PATCH 5/5] st/mesa: move all sampler view code into new st_sampler_view.[ch] files

Marek Olšák maraeo at gmail.com
Sun Oct 2 20:53:31 UTC 2016


One more fix for TBOs is needed:

diff --git a/src/mesa/state_tracker/st_sampler_view.c
b/src/mesa/state_tracker/st_sampler_view.c
index da1df86..a0bea46 100644
--- a/src/mesa/state_tracker/st_sampler_view.c
+++ b/src/mesa/state_tracker/st_sampler_view.c
@@ -459,7 +459,7 @@ st_get_texture_sampler_view_from_stobj(struct
st_context *st,

    sv = st_texture_get_sampler_view(st, stObj);

-   if (*sv) {
+   if (*sv && stObj->base.Target != GL_TEXTURE_BUFFER) {
       /* Debug check: make sure that the sampler view's parameters are
        * what they're supposed to be.
        */

If fixes this assertion failure:
arb_texture_buffer_range-ranges: state_tracker/st_sampler_view.c:472:
st_get_texture_sampler_view_from_stobj: Assertion `last_level(stObj)
== view->u.tex.last_level' failed.

Marek


On Sun, Oct 2, 2016 at 10:31 PM, Marek Olšák <maraeo at gmail.com> wrote:
> FYI, the series breaks this test:
>
> piglit/bin/glsl-resource-not-bound Buffer -auto -fbo
> glsl-resource-not-bound: state_tracker/st_sampler_view.c:456:
> st_get_texture_sampler_view_from_stobj: Assertion `stObj->pt' failed.
> Aborted
>
> Removing the assertion fixes it. Note that empty TBO slots are NULL.
>
> Marek
>
>
>
> On Sun, Oct 2, 2016 at 2:29 PM, Marek Olšák <maraeo at gmail.com> wrote:
>> You also need this:
>>
>> diff --git a/src/mesa/state_tracker/st_vdpau.c
>> b/src/mesa/state_tracker/st_vdpau.c
>> index 4f599dd..cafbd3d 100644
>> --- a/src/mesa/state_tracker/st_vdpau.c
>> +++ b/src/mesa/state_tracker/st_vdpau.c
>> @@ -44,6 +44,7 @@
>>  #include "st_vdpau.h"
>>  #include "st_context.h"
>>  #include "st_texture.h"
>> +#include "st_sampler_view.h"
>>  #include "st_format.h"
>>  #include "st_cb_flush.h"
>>
>> With that fixed, the series is:
>>
>> Reviewed-by: Marek Olšák <marek.olsak at amd.com>
>>
>> Marek
>>
>>
>>
>> On Sat, Oct 1, 2016 at 12:53 AM, Brian Paul <brianp at vmware.com> wrote:
>>> Previously, the sampler view code was scattered across several different
>>> files.
>>>
>>> Note, the previous REALLOC(), FREE() for st_texture_object::sampler_views
>>> are replaced by realloc(), free() to avoid conflicting macros in Mesa vs.
>>> Gallium.
>>> ---
>>>  src/mesa/Makefile.sources                      |   2 +
>>>  src/mesa/state_tracker/st_atom_pixeltransfer.c |   1 +
>>>  src/mesa/state_tracker/st_atom_texture.c       | 358 +-----------------
>>>  src/mesa/state_tracker/st_cb_bitmap.c          |   1 +
>>>  src/mesa/state_tracker/st_cb_drawpixels.c      |   1 +
>>>  src/mesa/state_tracker/st_cb_eglimage.c        |   2 +
>>>  src/mesa/state_tracker/st_cb_texture.c         |   1 +
>>>  src/mesa/state_tracker/st_context.c            |   1 +
>>>  src/mesa/state_tracker/st_sampler_view.c       | 487 +++++++++++++++++++++++++
>>>  src/mesa/state_tracker/st_sampler_view.h       |  83 +++++
>>>  src/mesa/state_tracker/st_texture.c            |  93 -----
>>>  src/mesa/state_tracker/st_texture.h            |  34 --
>>>  12 files changed, 580 insertions(+), 484 deletions(-)
>>>  create mode 100644 src/mesa/state_tracker/st_sampler_view.c
>>>  create mode 100644 src/mesa/state_tracker/st_sampler_view.h
>>>
>>> diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources
>>> index fbe5861..410a61a 100644
>>> --- a/src/mesa/Makefile.sources
>>> +++ b/src/mesa/Makefile.sources
>>> @@ -510,6 +510,8 @@ STATETRACKER_FILES = \
>>>         state_tracker/st_pbo.h \
>>>         state_tracker/st_program.c \
>>>         state_tracker/st_program.h \
>>> +       state_tracker/st_sampler_view.c \
>>> +       state_tracker/st_sampler_view.h \
>>>         state_tracker/st_scissor.c \
>>>         state_tracker/st_scissor.h \
>>>         state_tracker/st_texture.c \
>>> diff --git a/src/mesa/state_tracker/st_atom_pixeltransfer.c b/src/mesa/state_tracker/st_atom_pixeltransfer.c
>>> index 26d8ade..a2951a1 100644
>>> --- a/src/mesa/state_tracker/st_atom_pixeltransfer.c
>>> +++ b/src/mesa/state_tracker/st_atom_pixeltransfer.c
>>> @@ -30,6 +30,7 @@
>>>   */
>>>
>>>  #include "st_context.h"
>>> +#include "st_sampler_view.h"
>>>  #include "st_texture.h"
>>>
>>>  #include "util/u_inlines.h"
>>> diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
>>> index e5574bd..c8ae62c 100644
>>> --- a/src/mesa/state_tracker/st_atom_texture.c
>>> +++ b/src/mesa/state_tracker/st_atom_texture.c
>>> @@ -42,6 +42,7 @@
>>>
>>>  #include "st_context.h"
>>>  #include "st_atom.h"
>>> +#include "st_sampler_view.h"
>>>  #include "st_texture.h"
>>>  #include "st_format.h"
>>>  #include "st_cb_texture.h"
>>> @@ -51,363 +52,6 @@
>>>  #include "cso_cache/cso_context.h"
>>>
>>>
>>> -/**
>>> - * Return swizzle1(swizzle2)
>>> - */
>>> -static unsigned
>>> -swizzle_swizzle(unsigned swizzle1, unsigned swizzle2)
>>> -{
>>> -   unsigned i, swz[4];
>>> -
>>> -   if (swizzle1 == SWIZZLE_XYZW) {
>>> -      /* identity swizzle, no change to swizzle2 */
>>> -      return swizzle2;
>>> -   }
>>> -
>>> -   for (i = 0; i < 4; i++) {
>>> -      unsigned s = GET_SWZ(swizzle1, i);
>>> -      switch (s) {
>>> -      case SWIZZLE_X:
>>> -      case SWIZZLE_Y:
>>> -      case SWIZZLE_Z:
>>> -      case SWIZZLE_W:
>>> -         swz[i] = GET_SWZ(swizzle2, s);
>>> -         break;
>>> -      case SWIZZLE_ZERO:
>>> -         swz[i] = SWIZZLE_ZERO;
>>> -         break;
>>> -      case SWIZZLE_ONE:
>>> -         swz[i] = SWIZZLE_ONE;
>>> -         break;
>>> -      default:
>>> -         assert(!"Bad swizzle term");
>>> -         swz[i] = SWIZZLE_X;
>>> -      }
>>> -   }
>>> -
>>> -   return MAKE_SWIZZLE4(swz[0], swz[1], swz[2], swz[3]);
>>> -}
>>> -
>>> -
>>> -/**
>>> - * Given a user-specified texture base format, the actual gallium texture
>>> - * format and the current GL_DEPTH_MODE, return a texture swizzle.
>>> - *
>>> - * Consider the case where the user requests a GL_RGB internal texture
>>> - * format the driver actually uses an RGBA format.  The A component should
>>> - * be ignored and sampling from the texture should always return (r,g,b,1).
>>> - * But if we rendered to the texture we might have written A values != 1.
>>> - * By sampling the texture with a ".xyz1" swizzle we'll get the expected A=1.
>>> - * This function computes the texture swizzle needed to get the expected
>>> - * values.
>>> - *
>>> - * In the case of depth textures, the GL_DEPTH_MODE state determines the
>>> - * texture swizzle.
>>> - *
>>> - * This result must be composed with the user-specified swizzle to get
>>> - * the final swizzle.
>>> - */
>>> -static unsigned
>>> -compute_texture_format_swizzle(GLenum baseFormat, GLenum depthMode,
>>> -                               enum pipe_format actualFormat,
>>> -                               unsigned glsl_version)
>>> -{
>>> -   switch (baseFormat) {
>>> -   case GL_RGBA:
>>> -      return SWIZZLE_XYZW;
>>> -   case GL_RGB:
>>> -      if (util_format_has_alpha(actualFormat))
>>> -         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ONE);
>>> -      else
>>> -         return SWIZZLE_XYZW;
>>> -   case GL_RG:
>>> -      if (util_format_get_nr_components(actualFormat) > 2)
>>> -         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_ZERO, SWIZZLE_ONE);
>>> -      else
>>> -         return SWIZZLE_XYZW;
>>> -   case GL_RED:
>>> -      if (util_format_get_nr_components(actualFormat) > 1)
>>> -         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO,
>>> -                              SWIZZLE_ZERO, SWIZZLE_ONE);
>>> -      else
>>> -         return SWIZZLE_XYZW;
>>> -   case GL_ALPHA:
>>> -      if (util_format_get_nr_components(actualFormat) > 1)
>>> -         return MAKE_SWIZZLE4(SWIZZLE_ZERO, SWIZZLE_ZERO,
>>> -                              SWIZZLE_ZERO, SWIZZLE_W);
>>> -      else
>>> -         return SWIZZLE_XYZW;
>>> -   case GL_LUMINANCE:
>>> -      if (util_format_get_nr_components(actualFormat) > 1)
>>> -         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_ONE);
>>> -      else
>>> -         return SWIZZLE_XYZW;
>>> -   case GL_LUMINANCE_ALPHA:
>>> -      if (util_format_get_nr_components(actualFormat) > 2)
>>> -         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_W);
>>> -      else
>>> -         return SWIZZLE_XYZW;
>>> -   case GL_INTENSITY:
>>> -      if (util_format_get_nr_components(actualFormat) > 1)
>>> -         return SWIZZLE_XXXX;
>>> -      else
>>> -         return SWIZZLE_XYZW;
>>> -   case GL_STENCIL_INDEX:
>>> -   case GL_DEPTH_STENCIL:
>>> -   case GL_DEPTH_COMPONENT:
>>> -      /* Now examine the depth mode */
>>> -      switch (depthMode) {
>>> -      case GL_LUMINANCE:
>>> -         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_ONE);
>>> -      case GL_INTENSITY:
>>> -         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X);
>>> -      case GL_ALPHA:
>>> -         /* 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);
>>> -      default:
>>> -         assert(!"Unexpected depthMode");
>>> -         return SWIZZLE_XYZW;
>>> -      }
>>> -   default:
>>> -      assert(!"Unexpected baseFormat");
>>> -      return SWIZZLE_XYZW;
>>> -   }
>>> -}
>>> -
>>> -
>>> -static unsigned
>>> -get_texture_format_swizzle(const struct st_context *st,
>>> -                           const struct st_texture_object *stObj,
>>> -                           unsigned glsl_version)
>>> -{
>>> -   GLenum baseFormat = _mesa_texture_base_format(&stObj->base);
>>> -   unsigned tex_swizzle;
>>> -
>>> -   if (baseFormat != GL_NONE) {
>>> -      GLenum depth_mode = stObj->base.DepthMode;
>>> -      /* In ES 3.0, DEPTH_TEXTURE_MODE is expected to be GL_RED for textures
>>> -       * with depth component data specified with a sized internal format.
>>> -       */
>>> -      if (_mesa_is_gles3(st->ctx) &&
>>> -          util_format_is_depth_or_stencil(stObj->pt->format)) {
>>> -         const struct gl_texture_image *firstImage =
>>> -            _mesa_base_tex_image(&stObj->base);
>>> -         if (firstImage->InternalFormat != GL_DEPTH_COMPONENT &&
>>> -             firstImage->InternalFormat != GL_DEPTH_STENCIL &&
>>> -             firstImage->InternalFormat != GL_STENCIL_INDEX)
>>> -            depth_mode = GL_RED;
>>> -      }
>>> -      tex_swizzle = compute_texture_format_swizzle(baseFormat,
>>> -                                                   depth_mode,
>>> -                                                   stObj->pt->format,
>>> -                                                   glsl_version);
>>> -   }
>>> -   else {
>>> -      tex_swizzle = SWIZZLE_XYZW;
>>> -   }
>>> -
>>> -   /* Combine the texture format swizzle with user's swizzle */
>>> -   return swizzle_swizzle(stObj->base._Swizzle, tex_swizzle);
>>> -}
>>> -
>>> -
>>> -/**
>>> - * Return TRUE if the texture's sampler view swizzle is not equal to
>>> - * the texture's swizzle.
>>> - *
>>> - * \param stObj  the st texture object,
>>> - */
>>> -static boolean
>>> -check_sampler_swizzle(const struct st_context *st,
>>> -                      const struct st_texture_object *stObj,
>>> -                     const struct pipe_sampler_view *sv, unsigned glsl_version)
>>> -{
>>> -   unsigned swizzle = get_texture_format_swizzle(st, stObj, glsl_version);
>>> -
>>> -   return ((sv->swizzle_r != GET_SWZ(swizzle, 0)) ||
>>> -           (sv->swizzle_g != GET_SWZ(swizzle, 1)) ||
>>> -           (sv->swizzle_b != GET_SWZ(swizzle, 2)) ||
>>> -           (sv->swizzle_a != GET_SWZ(swizzle, 3)));
>>> -}
>>> -
>>> -
>>> -static unsigned
>>> -last_level(const struct st_texture_object *stObj)
>>> -{
>>> -   unsigned ret = MIN2(stObj->base.MinLevel + stObj->base._MaxLevel,
>>> -                       stObj->pt->last_level);
>>> -   if (stObj->base.Immutable)
>>> -      ret = MIN2(ret, stObj->base.MinLevel + stObj->base.NumLevels - 1);
>>> -   return ret;
>>> -}
>>> -
>>> -static unsigned
>>> -last_layer(const struct st_texture_object *stObj)
>>> -{
>>> -   if (stObj->base.Immutable && stObj->pt->array_size > 1)
>>> -      return MIN2(stObj->base.MinLayer + stObj->base.NumLayers - 1,
>>> -                  stObj->pt->array_size - 1);
>>> -   return stObj->pt->array_size - 1;
>>> -}
>>> -
>>> -
>>> -/**
>>> - * Determine the format for the texture sampler view.
>>> - */
>>> -static enum pipe_format
>>> -get_sampler_view_format(struct st_context *st,
>>> -                        const struct st_texture_object *stObj,
>>> -                        const struct gl_sampler_object *samp)
>>> -{
>>> -   enum pipe_format format;
>>> -
>>> -   if (stObj->base.Target == GL_TEXTURE_BUFFER) {
>>> -      format =
>>> -         st_mesa_format_to_pipe_format(st, stObj->base._BufferObjectFormat);
>>> -   }
>>> -   else {
>>> -      format =
>>> -         stObj->surface_based ? stObj->surface_format : stObj->pt->format;
>>> -
>>> -      if (util_format_is_depth_and_stencil(format)) {
>>> -         if (stObj->base.StencilSampling) {
>>> -            format = util_format_stencil_only(format);
>>> -         }
>>> -         else {
>>> -            GLenum baseFormat = _mesa_texture_base_format(&stObj->base);
>>> -            if (baseFormat == GL_STENCIL_INDEX) {
>>> -               format = util_format_stencil_only(format);
>>> -            }
>>> -         }
>>> -      }
>>> -      else {
>>> -         /* If sRGB decoding is off, use the linear format */
>>> -         if (samp->sRGBDecode == GL_SKIP_DECODE_EXT) {
>>> -            format = util_format_linear(format);
>>> -         }
>>> -
>>> -         /* Use R8_UNORM for video formats */
>>> -         switch (format) {
>>> -         case PIPE_FORMAT_NV12:
>>> -         case PIPE_FORMAT_IYUV:
>>> -            format = PIPE_FORMAT_R8_UNORM;
>>> -            break;
>>> -         default:
>>> -            break;
>>> -         }
>>> -      }
>>> -   }
>>> -
>>> -   return format;
>>> -}
>>> -
>>> -
>>> -static struct pipe_sampler_view *
>>> -st_create_texture_sampler_view_from_stobj(struct st_context *st,
>>> -                                         struct st_texture_object *stObj,
>>> -                                         enum pipe_format format,
>>> -                                          unsigned glsl_version)
>>> -{
>>> -   struct pipe_sampler_view templ;
>>> -   unsigned swizzle = get_texture_format_swizzle(st, stObj, glsl_version);
>>> -
>>> -   u_sampler_view_default_template(&templ,
>>> -                                   stObj->pt,
>>> -                                   format);
>>> -
>>> -   if (stObj->pt->target == PIPE_BUFFER) {
>>> -      unsigned base, size;
>>> -
>>> -      base = stObj->base.BufferOffset;
>>> -      if (base >= stObj->pt->width0)
>>> -         return NULL;
>>> -      size = MIN2(stObj->pt->width0 - base, (unsigned)stObj->base.BufferSize);
>>> -      if (!size)
>>> -         return NULL;
>>> -
>>> -      templ.u.buf.offset = base;
>>> -      templ.u.buf.size = size;
>>> -   } else {
>>> -      templ.u.tex.first_level = stObj->base.MinLevel + stObj->base.BaseLevel;
>>> -      templ.u.tex.last_level = last_level(stObj);
>>> -      assert(templ.u.tex.first_level <= templ.u.tex.last_level);
>>> -      templ.u.tex.first_layer = stObj->base.MinLayer;
>>> -      templ.u.tex.last_layer = last_layer(stObj);
>>> -      assert(templ.u.tex.first_layer <= templ.u.tex.last_layer);
>>> -      templ.target = gl_target_to_pipe(stObj->base.Target);
>>> -   }
>>> -
>>> -   templ.swizzle_r = GET_SWZ(swizzle, 0);
>>> -   templ.swizzle_g = GET_SWZ(swizzle, 1);
>>> -   templ.swizzle_b = GET_SWZ(swizzle, 2);
>>> -   templ.swizzle_a = GET_SWZ(swizzle, 3);
>>> -
>>> -   return st->pipe->create_sampler_view(st->pipe, stObj->pt, &templ);
>>> -}
>>> -
>>> -
>>> -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,
>>> -                                       unsigned glsl_version)
>>> -{
>>> -   struct pipe_sampler_view **sv;
>>> -
>>> -   if (!stObj || !stObj->pt) {
>>> -      return NULL;
>>> -   }
>>> -
>>> -   sv = st_texture_get_sampler_view(st, stObj);
>>> -
>>> -   if (*sv) {
>>> -      /* Debug check: make sure that the sampler view's parameters are
>>> -       * what they're supposed to be.
>>> -       */
>>> -      struct pipe_sampler_view *view = *sv;
>>> -      assert(!check_sampler_swizzle(st, stObj, view, glsl_version));
>>> -      assert(get_sampler_view_format(st, stObj, samp) == view->format);
>>> -      assert(gl_target_to_pipe(stObj->base.Target) == view->target);
>>> -      assert(stObj->base.MinLevel + stObj->base.BaseLevel ==
>>> -             view->u.tex.first_level);
>>> -      assert(last_level(stObj) == view->u.tex.last_level);
>>> -      assert(stObj->base.MinLayer == view->u.tex.first_layer);
>>> -      assert(last_layer(stObj) == view->u.tex.last_layer);
>>> -   }
>>> -   else {
>>> -      /* create new sampler view */
>>> -      enum pipe_format format = get_sampler_view_format(st, stObj, samp);
>>> -
>>> -      *sv = st_create_texture_sampler_view_from_stobj(st, stObj,
>>> -                                                      format, glsl_version);
>>> -
>>> -   }
>>> -
>>> -   return *sv;
>>> -}
>>> -
>>> -
>>>  static GLboolean
>>>  update_single_texture(struct st_context *st,
>>>                        struct pipe_sampler_view **sampler_view,
>>> diff --git a/src/mesa/state_tracker/st_cb_bitmap.c b/src/mesa/state_tracker/st_cb_bitmap.c
>>> index a7d269b..1e4becd 100644
>>> --- a/src/mesa/state_tracker/st_cb_bitmap.c
>>> +++ b/src/mesa/state_tracker/st_cb_bitmap.c
>>> @@ -45,6 +45,7 @@
>>>  #include "st_draw.h"
>>>  #include "st_program.h"
>>>  #include "st_cb_bitmap.h"
>>> +#include "st_sampler_view.h"
>>>  #include "st_texture.h"
>>>
>>>  #include "pipe/p_context.h"
>>> diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
>>> index b5f4227..7f92e02 100644
>>> --- a/src/mesa/state_tracker/st_cb_drawpixels.c
>>> +++ b/src/mesa/state_tracker/st_cb_drawpixels.c
>>> @@ -60,6 +60,7 @@
>>>  #include "st_draw.h"
>>>  #include "st_format.h"
>>>  #include "st_program.h"
>>> +#include "st_sampler_view.h"
>>>  #include "st_scissor.h"
>>>  #include "st_texture.h"
>>>
>>> diff --git a/src/mesa/state_tracker/st_cb_eglimage.c b/src/mesa/state_tracker/st_cb_eglimage.c
>>> index 7bea565..c425154 100644
>>> --- a/src/mesa/state_tracker/st_cb_eglimage.c
>>> +++ b/src/mesa/state_tracker/st_cb_eglimage.c
>>> @@ -35,6 +35,8 @@
>>>  #include "st_texture.h"
>>>  #include "st_format.h"
>>>  #include "st_manager.h"
>>> +#include "st_sampler_view.h"
>>> +
>>>
>>>  /**
>>>   * Return the base format just like _mesa_base_fbo_format does.
>>> diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
>>> index daef5a4..177201d 100644
>>> --- a/src/mesa/state_tracker/st_cb_texture.c
>>> +++ b/src/mesa/state_tracker/st_cb_texture.c
>>> @@ -58,6 +58,7 @@
>>>  #include "state_tracker/st_texture.h"
>>>  #include "state_tracker/st_gen_mipmap.h"
>>>  #include "state_tracker/st_atom.h"
>>> +#include "state_tracker/st_sampler_view.h"
>>>
>>>  #include "pipe/p_context.h"
>>>  #include "pipe/p_defines.h"
>>> diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
>>> index b9dc0c6..174503f 100644
>>> --- a/src/mesa/state_tracker/st_context.c
>>> +++ b/src/mesa/state_tracker/st_context.c
>>> @@ -70,6 +70,7 @@
>>>  #include "st_gen_mipmap.h"
>>>  #include "st_pbo.h"
>>>  #include "st_program.h"
>>> +#include "st_sampler_view.h"
>>>  #include "st_vdpau.h"
>>>  #include "st_texture.h"
>>>  #include "pipe/p_context.h"
>>> diff --git a/src/mesa/state_tracker/st_sampler_view.c b/src/mesa/state_tracker/st_sampler_view.c
>>> new file mode 100644
>>> index 0000000..0b07f2a
>>> --- /dev/null
>>> +++ b/src/mesa/state_tracker/st_sampler_view.c
>>> @@ -0,0 +1,487 @@
>>> +/*
>>> + * Copyright 2016 VMware, Inc.
>>> + * All Rights Reserved.
>>> + *
>>> + * Permission is hereby granted, free of charge, to any person obtaining a
>>> + * copy of this software and associated documentation files (the
>>> + * "Software"), to deal in the Software without restriction, including
>>> + * without limitation the rights to use, copy, modify, merge, publish,
>>> + * distribute, sub license, and/or sell copies of the Software, and to
>>> + * permit persons to whom the Software is furnished to do so, subject to
>>> + * the following conditions:
>>> + *
>>> + * The above copyright notice and this permission notice (including the
>>> + * next paragraph) shall be included in all copies or substantial portions
>>> + * of the Software.
>>> + *
>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
>>> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>>> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
>>> + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
>>> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
>>> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
>>> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>>> + */
>>> +
>>> +#include "pipe/p_context.h"
>>> +#include "util/u_format.h"
>>> +#include "util/u_inlines.h"
>>> +
>>> +#include "main/context.h"
>>> +#include "main/macros.h"
>>> +#include "main/mtypes.h"
>>> +#include "main/teximage.h"
>>> +#include "main/texobj.h"
>>> +#include "program/prog_instruction.h"
>>> +
>>> +#include "st_context.h"
>>> +#include "st_sampler_view.h"
>>> +#include "st_texture.h"
>>> +#include "st_format.h"
>>> +#include "st_cb_texture.h"
>>> +
>>> +
>>> +/**
>>> + * Try to find a matching sampler view for the given context.
>>> + * If none is found an empty slot is initialized with a
>>> + * template and returned instead.
>>> + */
>>> +struct pipe_sampler_view **
>>> +st_texture_get_sampler_view(struct st_context *st,
>>> +                            struct st_texture_object *stObj)
>>> +{
>>> +   struct pipe_sampler_view **free = NULL;
>>> +   GLuint i;
>>> +
>>> +   for (i = 0; i < stObj->num_sampler_views; ++i) {
>>> +      struct pipe_sampler_view **sv = &stObj->sampler_views[i];
>>> +      /* Is the array entry used ? */
>>> +      if (*sv) {
>>> +         /* check if the context matches */
>>> +         if ((*sv)->context == st->pipe) {
>>> +            return sv;
>>> +         }
>>> +      } else {
>>> +         /* Found a free slot, remember that */
>>> +         free = sv;
>>> +      }
>>> +   }
>>> +
>>> +   /* Couldn't find a slot for our context, create a new one */
>>> +
>>> +   if (!free) {
>>> +      /* Haven't even found a free one, resize the array */
>>> +      unsigned new_size = (stObj->num_sampler_views + 1) *
>>> +         sizeof(struct pipe_sampler_view *);
>>> +      stObj->sampler_views = realloc(stObj->sampler_views, new_size);
>>> +      free = &stObj->sampler_views[stObj->num_sampler_views++];
>>> +      *free = NULL;
>>> +   }
>>> +
>>> +   assert(*free == NULL);
>>> +
>>> +   return free;
>>> +}
>>> +
>>> +
>>> +/**
>>> + * For the given texture object, release any sampler views which belong
>>> + * to the calling context.
>>> + */
>>> +void
>>> +st_texture_release_sampler_view(struct st_context *st,
>>> +                                struct st_texture_object *stObj)
>>> +{
>>> +   GLuint i;
>>> +
>>> +   for (i = 0; i < stObj->num_sampler_views; ++i) {
>>> +      struct pipe_sampler_view **sv = &stObj->sampler_views[i];
>>> +
>>> +      if (*sv && (*sv)->context == st->pipe) {
>>> +         pipe_sampler_view_reference(sv, NULL);
>>> +         break;
>>> +      }
>>> +   }
>>> +}
>>> +
>>> +
>>> +/**
>>> + * Release all sampler views attached to the given texture object, regardless
>>> + * of the context.
>>> + */
>>> +void
>>> +st_texture_release_all_sampler_views(struct st_context *st,
>>> +                                     struct st_texture_object *stObj)
>>> +{
>>> +   GLuint i;
>>> +
>>> +   /* XXX This should use sampler_views[i]->pipe, not st->pipe */
>>> +   for (i = 0; i < stObj->num_sampler_views; ++i)
>>> +      pipe_sampler_view_release(st->pipe, &stObj->sampler_views[i]);
>>> +}
>>> +
>>> +
>>> +void
>>> +st_texture_free_sampler_views(struct st_texture_object *stObj)
>>> +{
>>> +   free(stObj->sampler_views);
>>> +   stObj->sampler_views = NULL;
>>> +   stObj->num_sampler_views = 0;
>>> +}
>>> +
>>> +
>>> +/**
>>> + * Return swizzle1(swizzle2)
>>> + */
>>> +static unsigned
>>> +swizzle_swizzle(unsigned swizzle1, unsigned swizzle2)
>>> +{
>>> +   unsigned i, swz[4];
>>> +
>>> +   if (swizzle1 == SWIZZLE_XYZW) {
>>> +      /* identity swizzle, no change to swizzle2 */
>>> +      return swizzle2;
>>> +   }
>>> +
>>> +   for (i = 0; i < 4; i++) {
>>> +      unsigned s = GET_SWZ(swizzle1, i);
>>> +      switch (s) {
>>> +      case SWIZZLE_X:
>>> +      case SWIZZLE_Y:
>>> +      case SWIZZLE_Z:
>>> +      case SWIZZLE_W:
>>> +         swz[i] = GET_SWZ(swizzle2, s);
>>> +         break;
>>> +      case SWIZZLE_ZERO:
>>> +         swz[i] = SWIZZLE_ZERO;
>>> +         break;
>>> +      case SWIZZLE_ONE:
>>> +         swz[i] = SWIZZLE_ONE;
>>> +         break;
>>> +      default:
>>> +         assert(!"Bad swizzle term");
>>> +         swz[i] = SWIZZLE_X;
>>> +      }
>>> +   }
>>> +
>>> +   return MAKE_SWIZZLE4(swz[0], swz[1], swz[2], swz[3]);
>>> +}
>>> +
>>> +
>>> +/**
>>> + * Given a user-specified texture base format, the actual gallium texture
>>> + * format and the current GL_DEPTH_MODE, return a texture swizzle.
>>> + *
>>> + * Consider the case where the user requests a GL_RGB internal texture
>>> + * format the driver actually uses an RGBA format.  The A component should
>>> + * be ignored and sampling from the texture should always return (r,g,b,1).
>>> + * But if we rendered to the texture we might have written A values != 1.
>>> + * By sampling the texture with a ".xyz1" swizzle we'll get the expected A=1.
>>> + * This function computes the texture swizzle needed to get the expected
>>> + * values.
>>> + *
>>> + * In the case of depth textures, the GL_DEPTH_MODE state determines the
>>> + * texture swizzle.
>>> + *
>>> + * This result must be composed with the user-specified swizzle to get
>>> + * the final swizzle.
>>> + */
>>> +static unsigned
>>> +compute_texture_format_swizzle(GLenum baseFormat, GLenum depthMode,
>>> +                               enum pipe_format actualFormat,
>>> +                               unsigned glsl_version)
>>> +{
>>> +   switch (baseFormat) {
>>> +   case GL_RGBA:
>>> +      return SWIZZLE_XYZW;
>>> +   case GL_RGB:
>>> +      if (util_format_has_alpha(actualFormat))
>>> +         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ONE);
>>> +      else
>>> +         return SWIZZLE_XYZW;
>>> +   case GL_RG:
>>> +      if (util_format_get_nr_components(actualFormat) > 2)
>>> +         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_ZERO, SWIZZLE_ONE);
>>> +      else
>>> +         return SWIZZLE_XYZW;
>>> +   case GL_RED:
>>> +      if (util_format_get_nr_components(actualFormat) > 1)
>>> +         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO,
>>> +                              SWIZZLE_ZERO, SWIZZLE_ONE);
>>> +      else
>>> +         return SWIZZLE_XYZW;
>>> +   case GL_ALPHA:
>>> +      if (util_format_get_nr_components(actualFormat) > 1)
>>> +         return MAKE_SWIZZLE4(SWIZZLE_ZERO, SWIZZLE_ZERO,
>>> +                              SWIZZLE_ZERO, SWIZZLE_W);
>>> +      else
>>> +         return SWIZZLE_XYZW;
>>> +   case GL_LUMINANCE:
>>> +      if (util_format_get_nr_components(actualFormat) > 1)
>>> +         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_ONE);
>>> +      else
>>> +         return SWIZZLE_XYZW;
>>> +   case GL_LUMINANCE_ALPHA:
>>> +      if (util_format_get_nr_components(actualFormat) > 2)
>>> +         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_W);
>>> +      else
>>> +         return SWIZZLE_XYZW;
>>> +   case GL_INTENSITY:
>>> +      if (util_format_get_nr_components(actualFormat) > 1)
>>> +         return SWIZZLE_XXXX;
>>> +      else
>>> +         return SWIZZLE_XYZW;
>>> +   case GL_STENCIL_INDEX:
>>> +   case GL_DEPTH_STENCIL:
>>> +   case GL_DEPTH_COMPONENT:
>>> +      /* Now examine the depth mode */
>>> +      switch (depthMode) {
>>> +      case GL_LUMINANCE:
>>> +         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_ONE);
>>> +      case GL_INTENSITY:
>>> +         return MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X);
>>> +      case GL_ALPHA:
>>> +         /* 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);
>>> +      default:
>>> +         assert(!"Unexpected depthMode");
>>> +         return SWIZZLE_XYZW;
>>> +      }
>>> +   default:
>>> +      assert(!"Unexpected baseFormat");
>>> +      return SWIZZLE_XYZW;
>>> +   }
>>> +}
>>> +
>>> +
>>> +static unsigned
>>> +get_texture_format_swizzle(const struct st_context *st,
>>> +                           const struct st_texture_object *stObj,
>>> +                           unsigned glsl_version)
>>> +{
>>> +   GLenum baseFormat = _mesa_texture_base_format(&stObj->base);
>>> +   unsigned tex_swizzle;
>>> +
>>> +   if (baseFormat != GL_NONE) {
>>> +      GLenum depth_mode = stObj->base.DepthMode;
>>> +      /* In ES 3.0, DEPTH_TEXTURE_MODE is expected to be GL_RED for textures
>>> +       * with depth component data specified with a sized internal format.
>>> +       */
>>> +      if (_mesa_is_gles3(st->ctx) &&
>>> +          util_format_is_depth_or_stencil(stObj->pt->format)) {
>>> +         const struct gl_texture_image *firstImage =
>>> +            _mesa_base_tex_image(&stObj->base);
>>> +         if (firstImage->InternalFormat != GL_DEPTH_COMPONENT &&
>>> +             firstImage->InternalFormat != GL_DEPTH_STENCIL &&
>>> +             firstImage->InternalFormat != GL_STENCIL_INDEX)
>>> +            depth_mode = GL_RED;
>>> +      }
>>> +      tex_swizzle = compute_texture_format_swizzle(baseFormat,
>>> +                                                   depth_mode,
>>> +                                                   stObj->pt->format,
>>> +                                                   glsl_version);
>>> +   }
>>> +   else {
>>> +      tex_swizzle = SWIZZLE_XYZW;
>>> +   }
>>> +
>>> +   /* Combine the texture format swizzle with user's swizzle */
>>> +   return swizzle_swizzle(stObj->base._Swizzle, tex_swizzle);
>>> +}
>>> +
>>> +
>>> +/**
>>> + * Return TRUE if the texture's sampler view swizzle is not equal to
>>> + * the texture's swizzle.
>>> + *
>>> + * \param stObj  the st texture object,
>>> + */
>>> +static boolean
>>> +check_sampler_swizzle(const struct st_context *st,
>>> +                      const struct st_texture_object *stObj,
>>> +                     const struct pipe_sampler_view *sv, unsigned glsl_version)
>>> +{
>>> +   unsigned swizzle = get_texture_format_swizzle(st, stObj, glsl_version);
>>> +
>>> +   return ((sv->swizzle_r != GET_SWZ(swizzle, 0)) ||
>>> +           (sv->swizzle_g != GET_SWZ(swizzle, 1)) ||
>>> +           (sv->swizzle_b != GET_SWZ(swizzle, 2)) ||
>>> +           (sv->swizzle_a != GET_SWZ(swizzle, 3)));
>>> +}
>>> +
>>> +
>>> +static unsigned
>>> +last_level(const struct st_texture_object *stObj)
>>> +{
>>> +   unsigned ret = MIN2(stObj->base.MinLevel + stObj->base._MaxLevel,
>>> +                       stObj->pt->last_level);
>>> +   if (stObj->base.Immutable)
>>> +      ret = MIN2(ret, stObj->base.MinLevel + stObj->base.NumLevels - 1);
>>> +   return ret;
>>> +}
>>> +
>>> +
>>> +static unsigned
>>> +last_layer(const struct st_texture_object *stObj)
>>> +{
>>> +   if (stObj->base.Immutable && stObj->pt->array_size > 1)
>>> +      return MIN2(stObj->base.MinLayer + stObj->base.NumLayers - 1,
>>> +                  stObj->pt->array_size - 1);
>>> +   return stObj->pt->array_size - 1;
>>> +}
>>> +
>>> +
>>> +/**
>>> + * Determine the format for the texture sampler view.
>>> + */
>>> +static enum pipe_format
>>> +get_sampler_view_format(struct st_context *st,
>>> +                        const struct st_texture_object *stObj,
>>> +                        const struct gl_sampler_object *samp)
>>> +{
>>> +   enum pipe_format format;
>>> +
>>> +   if (stObj->base.Target == GL_TEXTURE_BUFFER) {
>>> +      format =
>>> +         st_mesa_format_to_pipe_format(st, stObj->base._BufferObjectFormat);
>>> +   }
>>> +   else {
>>> +      format =
>>> +         stObj->surface_based ? stObj->surface_format : stObj->pt->format;
>>> +
>>> +      if (util_format_is_depth_and_stencil(format)) {
>>> +         if (stObj->base.StencilSampling) {
>>> +            format = util_format_stencil_only(format);
>>> +         }
>>> +         else {
>>> +            GLenum baseFormat = _mesa_texture_base_format(&stObj->base);
>>> +            if (baseFormat == GL_STENCIL_INDEX) {
>>> +               format = util_format_stencil_only(format);
>>> +            }
>>> +         }
>>> +      }
>>> +      else {
>>> +         /* If sRGB decoding is off, use the linear format */
>>> +         if (samp->sRGBDecode == GL_SKIP_DECODE_EXT) {
>>> +            format = util_format_linear(format);
>>> +         }
>>> +
>>> +         /* Use R8_UNORM for video formats */
>>> +         switch (format) {
>>> +         case PIPE_FORMAT_NV12:
>>> +         case PIPE_FORMAT_IYUV:
>>> +            format = PIPE_FORMAT_R8_UNORM;
>>> +            break;
>>> +         default:
>>> +            break;
>>> +         }
>>> +      }
>>> +   }
>>> +
>>> +   return format;
>>> +}
>>> +
>>> +
>>> +static struct pipe_sampler_view *
>>> +st_create_texture_sampler_view_from_stobj(struct st_context *st,
>>> +                                         struct st_texture_object *stObj,
>>> +                                         enum pipe_format format,
>>> +                                          unsigned glsl_version)
>>> +{
>>> +   struct pipe_sampler_view templ;
>>> +   unsigned swizzle = get_texture_format_swizzle(st, stObj, glsl_version);
>>> +
>>> +   u_sampler_view_default_template(&templ, stObj->pt, format);
>>> +
>>> +   if (stObj->pt->target == PIPE_BUFFER) {
>>> +      unsigned base, size;
>>> +
>>> +      base = stObj->base.BufferOffset;
>>> +      if (base >= stObj->pt->width0)
>>> +         return NULL;
>>> +      size = MIN2(stObj->pt->width0 - base, (unsigned)stObj->base.BufferSize);
>>> +      if (!size)
>>> +         return NULL;
>>> +
>>> +      templ.u.buf.offset = base;
>>> +      templ.u.buf.size = size;
>>> +   } else {
>>> +      templ.u.tex.first_level = stObj->base.MinLevel + stObj->base.BaseLevel;
>>> +      templ.u.tex.last_level = last_level(stObj);
>>> +      assert(templ.u.tex.first_level <= templ.u.tex.last_level);
>>> +      templ.u.tex.first_layer = stObj->base.MinLayer;
>>> +      templ.u.tex.last_layer = last_layer(stObj);
>>> +      assert(templ.u.tex.first_layer <= templ.u.tex.last_layer);
>>> +      templ.target = gl_target_to_pipe(stObj->base.Target);
>>> +   }
>>> +
>>> +   templ.swizzle_r = GET_SWZ(swizzle, 0);
>>> +   templ.swizzle_g = GET_SWZ(swizzle, 1);
>>> +   templ.swizzle_b = GET_SWZ(swizzle, 2);
>>> +   templ.swizzle_a = GET_SWZ(swizzle, 3);
>>> +
>>> +   return st->pipe->create_sampler_view(st->pipe, stObj->pt, &templ);
>>> +}
>>> +
>>> +
>>> +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,
>>> +                                       unsigned glsl_version)
>>> +{
>>> +   struct pipe_sampler_view **sv;
>>> +
>>> +   assert(stObj->pt);
>>> +   if (!stObj || !stObj->pt) {
>>> +      return NULL;
>>> +   }
>>> +
>>> +   sv = st_texture_get_sampler_view(st, stObj);
>>> +
>>> +   if (*sv) {
>>> +      /* Debug check: make sure that the sampler view's parameters are
>>> +       * what they're supposed to be.
>>> +       */
>>> +      MAYBE_UNUSED struct pipe_sampler_view *view = *sv;
>>> +      assert(!check_sampler_swizzle(st, stObj, view, glsl_version));
>>> +      assert(get_sampler_view_format(st, stObj, samp) == view->format);
>>> +      assert(gl_target_to_pipe(stObj->base.Target) == view->target);
>>> +      assert(stObj->base.MinLevel + stObj->base.BaseLevel ==
>>> +             view->u.tex.first_level);
>>> +      assert(last_level(stObj) == view->u.tex.last_level);
>>> +      assert(stObj->base.MinLayer == view->u.tex.first_layer);
>>> +      assert(last_layer(stObj) == view->u.tex.last_layer);
>>> +   }
>>> +   else {
>>> +      /* create new sampler view */
>>> +      enum pipe_format format = get_sampler_view_format(st, stObj, samp);
>>> +
>>> +      *sv = st_create_texture_sampler_view_from_stobj(st, stObj,
>>> +                                                      format, glsl_version);
>>> +
>>> +   }
>>> +
>>> +   return *sv;
>>> +}
>>> diff --git a/src/mesa/state_tracker/st_sampler_view.h b/src/mesa/state_tracker/st_sampler_view.h
>>> new file mode 100644
>>> index 0000000..d4c38bc
>>> --- /dev/null
>>> +++ b/src/mesa/state_tracker/st_sampler_view.h
>>> @@ -0,0 +1,83 @@
>>> +/*
>>> + * Copyright 2016 VMware, Inc.
>>> + * All Rights Reserved.
>>> + *
>>> + * Permission is hereby granted, free of charge, to any person obtaining a
>>> + * copy of this software and associated documentation files (the
>>> + * "Software"), to deal in the Software without restriction, including
>>> + * without limitation the rights to use, copy, modify, merge, publish,
>>> + * distribute, sub license, and/or sell copies of the Software, and to
>>> + * permit persons to whom the Software is furnished to do so, subject to
>>> + * the following conditions:
>>> + *
>>> + * The above copyright notice and this permission notice (including the
>>> + * next paragraph) shall be included in all copies or substantial portions
>>> + * of the Software.
>>> + *
>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
>>> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>>> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
>>> + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
>>> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
>>> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
>>> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>>> + */
>>> +
>>> +
>>> +#ifndef ST_SAMPLER_VIEW_H
>>> +#define ST_SAMPLER_VIEW_H
>>> +
>>> +#include "pipe/p_compiler.h"
>>> +#include "pipe/p_context.h"
>>> +#include "pipe/p_state.h"
>>> +#include "util/u_sampler.h"
>>> +
>>> +struct st_texture_object;
>>> +
>>> +
>>> +static inline struct pipe_sampler_view *
>>> +st_create_texture_sampler_view_format(struct pipe_context *pipe,
>>> +                                      struct pipe_resource *texture,
>>> +                                      enum pipe_format format)
>>> +{
>>> +   struct pipe_sampler_view templ;
>>> +
>>> +   u_sampler_view_default_template(&templ, texture, format);
>>> +
>>> +   return pipe->create_sampler_view(pipe, texture, &templ);
>>> +}
>>> +
>>> +
>>> +static inline struct pipe_sampler_view *
>>> +st_create_texture_sampler_view(struct pipe_context *pipe,
>>> +                               struct pipe_resource *texture)
>>> +{
>>> +   return st_create_texture_sampler_view_format(pipe, texture,
>>> +                                                texture->format);
>>> +}
>>> +
>>> +
>>> +extern struct pipe_sampler_view **
>>> +st_texture_get_sampler_view(struct st_context *st,
>>> +                            struct st_texture_object *stObj);
>>> +
>>> +extern void
>>> +st_texture_release_sampler_view(struct st_context *st,
>>> +                                struct st_texture_object *stObj);
>>> +
>>> +extern void
>>> +st_texture_release_all_sampler_views(struct st_context *st,
>>> +                                     struct st_texture_object *stObj);
>>> +
>>> +void
>>> +st_texture_free_sampler_views(struct st_texture_object *stObj);
>>> +
>>> +
>>> +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,
>>> +                                       unsigned glsl_version);
>>> +
>>> +
>>> +#endif /* ST_SAMPLER_VIEW_H */
>>> diff --git a/src/mesa/state_tracker/st_texture.c b/src/mesa/state_tracker/st_texture.c
>>> index 32e5b84..a2c36ac 100644
>>> --- a/src/mesa/state_tracker/st_texture.c
>>> +++ b/src/mesa/state_tracker/st_texture.c
>>> @@ -418,96 +418,3 @@ st_create_color_map_texture(struct gl_context *ctx)
>>>                            texSize, texSize, 1, 1, 0, PIPE_BIND_SAMPLER_VIEW);
>>>     return pt;
>>>  }
>>> -
>>> -/**
>>> - * Try to find a matching sampler view for the given context.
>>> - * If none is found an empty slot is initialized with a
>>> - * template and returned instead.
>>> - */
>>> -struct pipe_sampler_view **
>>> -st_texture_get_sampler_view(struct st_context *st,
>>> -                            struct st_texture_object *stObj)
>>> -{
>>> -   struct pipe_sampler_view **free = NULL;
>>> -   GLuint i;
>>> -
>>> -   for (i = 0; i < stObj->num_sampler_views; ++i) {
>>> -      struct pipe_sampler_view **sv = &stObj->sampler_views[i];
>>> -      /* Is the array entry used ? */
>>> -      if (*sv) {
>>> -         /* check if the context matches */
>>> -         if ((*sv)->context == st->pipe) {
>>> -            return sv;
>>> -         }
>>> -      } else {
>>> -         /* Found a free slot, remember that */
>>> -         free = sv;
>>> -      }
>>> -   }
>>> -
>>> -   /* Couldn't find a slot for our context, create a new one */
>>> -
>>> -   if (!free) {
>>> -      /* Haven't even found a free one, resize the array */
>>> -      GLuint old_size = stObj->num_sampler_views * sizeof(void *);
>>> -      GLuint new_size = old_size + sizeof(void *);
>>> -      stObj->sampler_views = REALLOC(stObj->sampler_views, old_size, new_size);
>>> -      free = &stObj->sampler_views[stObj->num_sampler_views++];
>>> -      *free = NULL;
>>> -   }
>>> -
>>> -   assert(*free == NULL);
>>> -
>>> -   return free;
>>> -}
>>> -
>>> -
>>> -/**
>>> - * For the given texture object, release any sampler views which belong
>>> - * to the calling context.
>>> - */
>>> -void
>>> -st_texture_release_sampler_view(struct st_context *st,
>>> -                                struct st_texture_object *stObj)
>>> -{
>>> -   GLuint i;
>>> -
>>> -   for (i = 0; i < stObj->num_sampler_views; ++i) {
>>> -      struct pipe_sampler_view **sv = &stObj->sampler_views[i];
>>> -
>>> -      if (*sv && (*sv)->context == st->pipe) {
>>> -         pipe_sampler_view_reference(sv, NULL);
>>> -         break;
>>> -      }
>>> -   }
>>> -}
>>> -
>>> -
>>> -/**
>>> - * Release all sampler views attached to the given texture object, regardless
>>> - * of the context.
>>> - */
>>> -void
>>> -st_texture_release_all_sampler_views(struct st_context *st,
>>> -                                     struct st_texture_object *stObj)
>>> -{
>>> -   GLuint i;
>>> -
>>> -   /* XXX This should use sampler_views[i]->pipe, not st->pipe */
>>> -   for (i = 0; i < stObj->num_sampler_views; ++i)
>>> -      pipe_sampler_view_release(st->pipe, &stObj->sampler_views[i]);
>>> -}
>>> -
>>> -
>>> -void
>>> -st_texture_free_sampler_views(struct st_texture_object *stObj)
>>> -{
>>> -   /* NOTE:
>>> -    * We use FREE() here to match REALLOC() above.  Both come from
>>> -    * u_memory.h, not imports.h.  If we mis-match MALLOC/FREE from
>>> -    * those two headers we can trash the heap.
>>> -    */
>>> -   FREE(stObj->sampler_views);
>>> -   stObj->sampler_views = NULL;
>>> -   stObj->num_sampler_views = 0;
>>> -}
>>> diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h
>>> index 9c9a05b..730843a 100644
>>> --- a/src/mesa/state_tracker/st_texture.h
>>> +++ b/src/mesa/state_tracker/st_texture.h
>>> @@ -155,26 +155,6 @@ st_get_stobj_resource(struct st_texture_object *stObj)
>>>  }
>>>
>>>
>>> -static inline struct pipe_sampler_view *
>>> -st_create_texture_sampler_view_format(struct pipe_context *pipe,
>>> -                                      struct pipe_resource *texture,
>>> -                                      enum pipe_format format)
>>> -{
>>> -   struct pipe_sampler_view templ;
>>> -
>>> -   u_sampler_view_default_template(&templ, texture, format);
>>> -
>>> -   return pipe->create_sampler_view(pipe, texture, &templ);
>>> -}
>>> -
>>> -static inline struct pipe_sampler_view *
>>> -st_create_texture_sampler_view(struct pipe_context *pipe,
>>> -                               struct pipe_resource *texture)
>>> -{
>>> -   return st_create_texture_sampler_view_format(pipe, texture,
>>> -                                                texture->format);
>>> -}
>>> -
>>>  static inline struct st_texture_object *
>>>  st_get_texture_object(struct gl_context *ctx,
>>>                        const struct gl_program *prog,
>>> @@ -261,20 +241,6 @@ st_texture_image_copy(struct pipe_context *pipe,
>>>  extern struct pipe_resource *
>>>  st_create_color_map_texture(struct gl_context *ctx);
>>>
>>> -extern struct pipe_sampler_view **
>>> -st_texture_get_sampler_view(struct st_context *st,
>>> -                            struct st_texture_object *stObj);
>>> -
>>> -extern void
>>> -st_texture_release_sampler_view(struct st_context *st,
>>> -                                struct st_texture_object *stObj);
>>> -
>>> -extern void
>>> -st_texture_release_all_sampler_views(struct st_context *st,
>>> -                                     struct st_texture_object *stObj);
>>> -
>>> -void
>>> -st_texture_free_sampler_views(struct st_texture_object *stObj);
>>>
>>>  bool
>>>  st_etc_fallback(struct st_context *st, struct gl_texture_image *texImage);
>>> --
>>> 1.9.1
>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list