[Mesa-dev] [PATCH 5/5] st/mesa: move all sampler view code into new st_sampler_view.[ch] files
Brian Paul
brianp at vmware.com
Mon Oct 3 15:21:25 UTC 2016
Actually, I just need to bracket some of the assertions with the test
for GL_TEXTURE_BUFFER. I'll make that change and re-test before
pushing. I suspect I did my piglit run w/ a release build on Windows.
Thanks for reviewing.
-Brian
On 10/02/2016 02:53 PM, Marek Olšák wrote:
> 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://urldefense.proofpoint.com/v2/url?u=https-3A__lists.freedesktop.org_mailman_listinfo_mesa-2Ddev&d=CwIFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=T0t4QG7chq2ZwJo6wilkFznRSFy-8uDKartPGbomVj8&m=qewvEskMVJroW2jTj4r53TusQPOf4OpGkM2Mgq48ITM&s=yEcyTRPAo3MDOW89JHDwfcrpaRIz1DG13QYBWH8YXgY&e=
More information about the mesa-dev
mailing list