128d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul/**************************************************************************
250ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc.
428d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * All Rights Reserved.
550ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul *
628d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
728d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * copy of this software and associated documentation files (the
828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * "Software"), to deal in the Software without restriction, including
928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * without limitation the rights to use, copy, modify, merge, publish,
1028d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * distribute, sub license, and/or sell copies of the Software, and to
1128d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * permit persons to whom the Software is furnished to do so, subject to
1228d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * the following conditions:
1350ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul *
1428d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * The above copyright notice and this permission notice (including the
1528d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * next paragraph) shall be included in all copies or substantial portions
1628d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * of the Software.
1750ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul *
1828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2028d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
2228d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2328d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2428d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2550ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul *
2628d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul **************************************************************************/
2728d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul
2828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul /*
2928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul  * Authors:
30877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca  *   Keith Whitwell <keithw@vmware.com>
3128d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul  *   Brian Paul
3228d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul  */
3350ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul
3428d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul
350b10ec1086d90de45ca2fab7b7b212508f50d1aaIlia Mirkin#include "main/context.h"
36853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol#include "main/macros.h"
371f32c665c8af0622e2bbf451edb999ffbcd7d0feEric Anholt#include "main/mtypes.h"
381f32c665c8af0622e2bbf451edb999ffbcd7d0feEric Anholt#include "main/samplerobj.h"
3958e8dd6b9da69905c169cea07562c71a06a88270Brian Paul#include "main/teximage.h"
40ea2aca036c742474cda03e3b7012b188a14d0287Brian Paul#include "main/texobj.h"
41ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_instruction.h"
42853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol
4328d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul#include "st_context.h"
4428d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul#include "st_atom.h"
456963f94e98e9b0a1432bc0071d495c9e31b899aeBrian Paul#include "st_sampler_view.h"
4658edb0683db45c449b219988a8715cf8fd69e42dBrian Paul#include "st_texture.h"
47a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie#include "st_format.h"
4828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul#include "st_cb_texture.h"
4928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul#include "pipe/p_context.h"
50e794fac35a9639d87a4ebd785e1e6b84490090efMarek Olšák#include "util/u_format.h"
5128486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
52332b77b852905224741084c5a4f5d2f4625dd119Brian Paul#include "cso_cache/cso_context.h"
53332b77b852905224741084c5a4f5d2f4625dd119Brian Paul
54f579a05a9f3962728e86b858deee97f9dca30f20Brian Paul
55c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airliestatic GLboolean
5650ad155d48c2be9d78c18573745d5a1f68368fadBrian Paulupdate_single_texture(struct st_context *st,
5750ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul                      struct pipe_sampler_view **sampler_view,
58768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák		      GLuint texUnit, unsigned glsl_version)
59c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie{
6099feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul   struct gl_context *ctx = st->ctx;
61c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie   const struct gl_sampler_object *samp;
62c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie   struct gl_texture_object *texObj;
63c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie   struct st_texture_object *stObj;
64c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie   GLboolean retval;
65c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie
6699feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul   samp = _mesa_get_samplerobj(ctx, texUnit);
67c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie
6899feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul   texObj = ctx->Texture.Unit[texUnit]._Current;
69c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie
70c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie   if (!texObj) {
71ea2aca036c742474cda03e3b7012b188a14d0287Brian Paul      texObj = _mesa_get_fallback_texture(ctx, TEXTURE_2D_INDEX);
72c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie      samp = &texObj->Sampler;
73c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie   }
74c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie   stObj = st_texture_object(texObj);
75c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie
76c0e343f995c1af592eacd2709aa9a4d585a35e68Michal Srb   retval = st_finalize_texture(ctx, st->pipe, texObj, 0);
77c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie   if (!retval) {
78c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie      /* out of mem */
79c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie      return GL_FALSE;
80c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie   }
81c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie
82e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul   /* Check a few pieces of state outside the texture object to see if we
83e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul    * need to force revalidation.
84e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul    */
85e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul   if (stObj->prev_glsl_version != glsl_version ||
86e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul       stObj->prev_sRGBDecode != samp->sRGBDecode) {
87e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul
88e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul      st_texture_release_all_sampler_views(st, stObj);
89e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul
90e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul      stObj->prev_glsl_version = glsl_version;
91e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul      stObj->prev_sRGBDecode = samp->sRGBDecode;
92e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul   }
93ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark
94768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák   *sampler_view =
95e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul      st_get_texture_sampler_view_from_stobj(st, stObj, samp, glsl_version);
96c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie   return GL_TRUE;
97c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie}
98f579a05a9f3962728e86b858deee97f9dca30f20Brian Paul
9950ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul
1002aac0d145a3f03572f19fd913bed2e951d543030Brian Paul
10150ad155d48c2be9d78c18573745d5a1f68368fadBrian Paulstatic void
1022aac0d145a3f03572f19fd913bed2e951d543030Brian Paulupdate_textures(struct st_context *st,
103768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák                gl_shader_stage mesa_shader,
1042aac0d145a3f03572f19fd913bed2e951d543030Brian Paul                const struct gl_program *prog,
1052aac0d145a3f03572f19fd913bed2e951d543030Brian Paul                unsigned max_units,
1062aac0d145a3f03572f19fd913bed2e951d543030Brian Paul                struct pipe_sampler_view **sampler_views,
1072aac0d145a3f03572f19fd913bed2e951d543030Brian Paul                unsigned *num_textures)
10828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul{
1092aac0d145a3f03572f19fd913bed2e951d543030Brian Paul   const GLuint old_max = *num_textures;
1102aac0d145a3f03572f19fd913bed2e951d543030Brian Paul   GLbitfield samplers_used = prog->SamplersUsed;
111ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark   GLbitfield free_slots = ~prog->SamplersUsed;
112ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark   GLbitfield external_samplers_used = prog->ExternalSamplersUsed;
1131454f894ff0df7eb3021584f0d1c1baa70444da5Timothy Arceri   GLuint unit;
114532db3b7881f3dfcd299320cbf44443d06b88373Kai Wasserbäch   enum pipe_shader_type shader_stage = st_shader_stage_to_ptarget(mesa_shader);
115c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie
116dd6aafcf72e79d7caacd4406528da9b2003915daBrian Paul   if (samplers_used == 0x0 && old_max == 0)
117833a33bf6e085a79ec74c5f296a8e55ebec9f9b5Dave Airlie      return;
118833a33bf6e085a79ec74c5f296a8e55ebec9f9b5Dave Airlie
1192aac0d145a3f03572f19fd913bed2e951d543030Brian Paul   *num_textures = 0;
120c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie
121c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie   /* loop over sampler units (aka tex image units) */
1222aac0d145a3f03572f19fd913bed2e951d543030Brian Paul   for (unit = 0; unit < max_units; unit++, samplers_used >>= 1) {
123c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie      struct pipe_sampler_view *sampler_view = NULL;
124dd6aafcf72e79d7caacd4406528da9b2003915daBrian Paul
125dd6aafcf72e79d7caacd4406528da9b2003915daBrian Paul      if (samplers_used & 1) {
1263477f67057f11b3608366f7096f4c6f1c57db509Marek Olšák         /* prog->sh.data is NULL if it's ARB_fragment_program */
1273477f67057f11b3608366f7096f4c6f1c57db509Marek Olšák         unsigned glsl_version = prog->sh.data ? prog->sh.data->Version : 0;
1282aac0d145a3f03572f19fd913bed2e951d543030Brian Paul         const GLuint texUnit = prog->SamplerUnits[unit];
129c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie         GLboolean retval;
130c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie
131768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák         retval = update_single_texture(st, &sampler_view, texUnit,
1323477f67057f11b3608366f7096f4c6f1c57db509Marek Olšák                                        glsl_version);
13333ca21fc3ca78d9e93d2a750b6da3505346d2b86Morgan Armand         if (retval == GL_FALSE)
13433ca21fc3ca78d9e93d2a750b6da3505346d2b86Morgan Armand            continue;
135c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie
1362aac0d145a3f03572f19fd913bed2e951d543030Brian Paul         *num_textures = unit + 1;
1372aac0d145a3f03572f19fd913bed2e951d543030Brian Paul      }
1382aac0d145a3f03572f19fd913bed2e951d543030Brian Paul      else if (samplers_used == 0 && unit >= old_max) {
139dd6aafcf72e79d7caacd4406528da9b2003915daBrian Paul         /* if we've reset all the old views and we have no more new ones */
140dd6aafcf72e79d7caacd4406528da9b2003915daBrian Paul         break;
141c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie      }
142dd6aafcf72e79d7caacd4406528da9b2003915daBrian Paul
1432aac0d145a3f03572f19fd913bed2e951d543030Brian Paul      pipe_sampler_view_reference(&(sampler_views[unit]), sampler_view);
144c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie   }
145c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie
146ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark   /* For any external samplers with multiplaner YUV, stuff the additional
147ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark    * sampler views we need at the end.
148ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark    *
149ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark    * Trying to cache the sampler view in the stObj looks painful, so just
150ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark    * re-create the sampler view for the extra planes each time.  Main use
151ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark    * case is video playback (ie. fps games wouldn't be using this) so I
152ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark    * guess no point to try to optimize this feature.
153ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark    */
154ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark   while (unlikely(external_samplers_used)) {
155ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      GLuint unit = u_bit_scan(&external_samplers_used);
156ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      GLuint extra = 0;
157ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      struct st_texture_object *stObj =
158ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark            st_get_texture_object(st->ctx, prog, unit);
159ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      struct pipe_sampler_view tmpl;
160ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark
161ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      if (!stObj)
162ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         continue;
163ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark
164ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      /* use original view as template: */
165ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      tmpl = *sampler_views[unit];
166ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark
167ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      switch (st_get_view_format(stObj)) {
168ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      case PIPE_FORMAT_NV12:
169ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         /* we need one additional R8G8 view: */
170ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         tmpl.format = PIPE_FORMAT_RG88_UNORM;
171ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         tmpl.swizzle_g = PIPE_SWIZZLE_Y;   /* tmpl from Y plane is R8 */
172ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         extra = u_bit_scan(&free_slots);
173ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         sampler_views[extra] =
174ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark               st->pipe->create_sampler_view(st->pipe, stObj->pt->next, &tmpl);
175ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         break;
176ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      case PIPE_FORMAT_IYUV:
177ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         /* we need two additional R8 views: */
178ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         tmpl.format = PIPE_FORMAT_R8_UNORM;
179ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         extra = u_bit_scan(&free_slots);
180ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         sampler_views[extra] =
181ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark               st->pipe->create_sampler_view(st->pipe, stObj->pt->next, &tmpl);
182ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         extra = u_bit_scan(&free_slots);
183ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         sampler_views[extra] =
184ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark               st->pipe->create_sampler_view(st->pipe, stObj->pt->next->next, &tmpl);
185ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         break;
186ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      default:
187ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark         break;
188ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      }
189ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark
190ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark      *num_textures = MAX2(*num_textures, extra + 1);
191ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark   }
192ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark
1932aac0d145a3f03572f19fd913bed2e951d543030Brian Paul   cso_set_sampler_views(st->cso_context,
1942aac0d145a3f03572f19fd913bed2e951d543030Brian Paul                         shader_stage,
1951454f894ff0df7eb3021584f0d1c1baa70444da5Timothy Arceri                         *num_textures,
1962aac0d145a3f03572f19fd913bed2e951d543030Brian Paul                         sampler_views);
197c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie}
198c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie
19950ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul
2002aac0d145a3f03572f19fd913bed2e951d543030Brian Paul
20150ad155d48c2be9d78c18573745d5a1f68368fadBrian Paulstatic void
2022aac0d145a3f03572f19fd913bed2e951d543030Brian Paulupdate_vertex_textures(struct st_context *st)
203c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie{
20499feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul   const struct gl_context *ctx = st->ctx;
20523c52caafba52c77092b9721bd4601f8ea592625Dave Airlie
20684732a982c3eeaca2e2809532c8422dc5f7045c1Paul Berry   if (ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
2072aac0d145a3f03572f19fd913bed2e951d543030Brian Paul      update_textures(st,
208768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák                      MESA_SHADER_VERTEX,
20981faead818a0b2fde131df019f5dfb0baef49273Timothy Arceri                      ctx->VertexProgram._Current,
21084732a982c3eeaca2e2809532c8422dc5f7045c1Paul Berry                      ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
2116c8a13215813841703e7c2efa233e8d4cf517dfdBrian Paul                      st->state.sampler_views[PIPE_SHADER_VERTEX],
2126c8a13215813841703e7c2efa233e8d4cf517dfdBrian Paul                      &st->state.num_sampler_views[PIPE_SHADER_VERTEX]);
2132aac0d145a3f03572f19fd913bed2e951d543030Brian Paul   }
2142aac0d145a3f03572f19fd913bed2e951d543030Brian Paul}
2158f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul
216c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie
2172aac0d145a3f03572f19fd913bed2e951d543030Brian Paulstatic void
2182aac0d145a3f03572f19fd913bed2e951d543030Brian Paulupdate_fragment_textures(struct st_context *st)
2192aac0d145a3f03572f19fd913bed2e951d543030Brian Paul{
2202aac0d145a3f03572f19fd913bed2e951d543030Brian Paul   const struct gl_context *ctx = st->ctx;
2214528287e040415c2071012d02f20979ff995c754Keith Whitwell
2222aac0d145a3f03572f19fd913bed2e951d543030Brian Paul   update_textures(st,
223768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák                   MESA_SHADER_FRAGMENT,
2243423488d55b9c483fcdb3996eb89b424c1031d24Timothy Arceri                   ctx->FragmentProgram._Current,
22584732a982c3eeaca2e2809532c8422dc5f7045c1Paul Berry                   ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
2266c8a13215813841703e7c2efa233e8d4cf517dfdBrian Paul                   st->state.sampler_views[PIPE_SHADER_FRAGMENT],
2276c8a13215813841703e7c2efa233e8d4cf517dfdBrian Paul                   &st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
22828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul}
22928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul
23050ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul
231f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paulstatic void
232f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paulupdate_geometry_textures(struct st_context *st)
233f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul{
234f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul   const struct gl_context *ctx = st->ctx;
235f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul
236f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul   if (ctx->GeometryProgram._Current) {
237f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul      update_textures(st,
238768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák                      MESA_SHADER_GEOMETRY,
23992f77e9c01085c6babe6ce80dfe4e0e7abab61a1Timothy Arceri                      ctx->GeometryProgram._Current,
2400df3551bf43cbd37933464746670ff6814118f0dMarek Olšák                      ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits,
241f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul                      st->state.sampler_views[PIPE_SHADER_GEOMETRY],
242f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul                      &st->state.num_sampler_views[PIPE_SHADER_GEOMETRY]);
243f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul   }
244f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul}
245f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul
246f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul
24740bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkinstatic void
24840bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkinupdate_tessctrl_textures(struct st_context *st)
24940bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin{
25040bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin   const struct gl_context *ctx = st->ctx;
25140bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin
25240bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin   if (ctx->TessCtrlProgram._Current) {
25340bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin      update_textures(st,
254768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák                      MESA_SHADER_TESS_CTRL,
25564d9773cfebded42691a70e3b233cadf896e53baTimothy Arceri                      ctx->TessCtrlProgram._Current,
25640bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin                      ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits,
25740bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin                      st->state.sampler_views[PIPE_SHADER_TESS_CTRL],
25840bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin                      &st->state.num_sampler_views[PIPE_SHADER_TESS_CTRL]);
25940bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin   }
26040bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin}
26140bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin
26240bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin
26340bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkinstatic void
26440bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkinupdate_tesseval_textures(struct st_context *st)
26540bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin{
26640bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin   const struct gl_context *ctx = st->ctx;
26740bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin
26840bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin   if (ctx->TessEvalProgram._Current) {
26940bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin      update_textures(st,
270768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák                      MESA_SHADER_TESS_EVAL,
27167c2d80a839614e4638d6cff390627122f8148caTimothy Arceri                      ctx->TessEvalProgram._Current,
27240bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin                      ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits,
27340bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin                      st->state.sampler_views[PIPE_SHADER_TESS_EVAL],
27440bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin                      &st->state.num_sampler_views[PIPE_SHADER_TESS_EVAL]);
27540bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin   }
27640bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin}
27740bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin
27840bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin
279805d92e54038255c145e464670d3352276ae27a9Samuel Pitoisetstatic void
280805d92e54038255c145e464670d3352276ae27a9Samuel Pitoisetupdate_compute_textures(struct st_context *st)
281805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset{
282805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset   const struct gl_context *ctx = st->ctx;
283805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset
284805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset   if (ctx->ComputeProgram._Current) {
285805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset      update_textures(st,
286805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset                      MESA_SHADER_COMPUTE,
2879605b98a078654f6f76e85221599e5fa8c073de6Timothy Arceri                      ctx->ComputeProgram._Current,
288805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset                      ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits,
289805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset                      st->state.sampler_views[PIPE_SHADER_COMPUTE],
290805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset                      &st->state.num_sampler_views[PIPE_SHADER_COMPUTE]);
291805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset   }
292805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset}
293805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset
294805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset
295f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paulconst struct st_tracked_state st_update_fragment_texture = {
296bb31ecf4fb5b2dc9bad801397562535bf38ccf9bDave Airlie   update_fragment_textures				/* update */
297bb31ecf4fb5b2dc9bad801397562535bf38ccf9bDave Airlie};
298bb31ecf4fb5b2dc9bad801397562535bf38ccf9bDave Airlie
29950ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul
300bb31ecf4fb5b2dc9bad801397562535bf38ccf9bDave Airlieconst struct st_tracked_state st_update_vertex_texture = {
301bb31ecf4fb5b2dc9bad801397562535bf38ccf9bDave Airlie   update_vertex_textures				/* update */
30228d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul};
3031a82d9648b3db780e58e4966924157542d148c58Brian Paul
30450ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul
305f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paulconst struct st_tracked_state st_update_geometry_texture = {
306f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul   update_geometry_textures				/* update */
307f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul};
308f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul
309f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul
31040bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkinconst struct st_tracked_state st_update_tessctrl_texture = {
31140bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin   update_tessctrl_textures				/* update */
31240bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin};
31340bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin
31440bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin
31540bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkinconst struct st_tracked_state st_update_tesseval_texture = {
31640bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin   update_tesseval_textures				/* update */
31740bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin};
318805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset
319805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset
320805d92e54038255c145e464670d3352276ae27a9Samuel Pitoisetconst struct st_tracked_state st_update_compute_texture = {
321805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset   update_compute_textures				/* update */
322805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset};
323