st_atom_texture.c revision ec2b92f98c2e7f161521b447cc1d9a36bce3707c
128d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul/**************************************************************************
228d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul *
328d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
428d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * All Rights Reserved.
528d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian 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:
1328d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian 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.
1728d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian 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.
2128d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * IN NO EVENT SHALL TUNGSTEN GRAPHICS 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.
2528d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul *
2628d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul **************************************************************************/
2728d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul
2828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul /*
2928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul  * Authors:
3028d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul  *   Keith Whitwell <keith@tungstengraphics.com>
3128d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul  *   Brian Paul
3228d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul  */
3328d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul
3428d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul
35853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol#include "main/macros.h"
36ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_instruction.h"
37853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol
3828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul#include "st_context.h"
3928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul#include "st_atom.h"
4058edb0683db45c449b219988a8715cf8fd69e42dBrian Paul#include "st_texture.h"
41a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie#include "st_format.h"
4228d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul#include "st_cb_texture.h"
4328d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul#include "pipe/p_context.h"
4428486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
45332b77b852905224741084c5a4f5d2f4625dd119Brian Paul#include "cso_cache/cso_context.h"
46332b77b852905224741084c5a4f5d2f4625dd119Brian Paul
4742ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airliestatic boolean check_sampler_swizzle(struct pipe_sampler_view *sv,
4842ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie				   uint32_t _swizzle)
4942ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie{
5042ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   if ((sv->swizzle_r != GET_SWZ(_swizzle, 0)) ||
5142ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie       (sv->swizzle_g != GET_SWZ(_swizzle, 1)) ||
5242ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie       (sv->swizzle_b != GET_SWZ(_swizzle, 2)) ||
5342ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie       (sv->swizzle_a != GET_SWZ(_swizzle, 3)))
5442ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie      return true;
5542ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   return false;
5642ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie}
5742ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie
5842ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airliestatic INLINE struct pipe_sampler_view *
5942ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airliest_create_texture_sampler_view_from_stobj(struct pipe_context *pipe,
60a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie					  struct st_texture_object *stObj,
61a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie					  enum pipe_format format)
6242ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie
6342ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie{
6442ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   struct pipe_sampler_view templ;
6542ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie
6642ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   u_sampler_view_default_template(&templ,
6742ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie                                   stObj->pt,
68a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie                                   format);
6942ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie
7042ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   if (stObj->base._Swizzle != SWIZZLE_NOOP) {
7142ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie      templ.swizzle_r = GET_SWZ(stObj->base._Swizzle, 0);
7242ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie      templ.swizzle_g = GET_SWZ(stObj->base._Swizzle, 1);
7342ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie      templ.swizzle_b = GET_SWZ(stObj->base._Swizzle, 2);
7442ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie      templ.swizzle_a = GET_SWZ(stObj->base._Swizzle, 3);
7542ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   }
7642ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie
7742ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   return pipe->create_sampler_view(pipe, stObj->pt, &templ);
7842ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie}
7942ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie
8042ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie
8142ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airliestatic INLINE struct pipe_sampler_view *
8242ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airliest_get_texture_sampler_view_from_stobj(struct st_texture_object *stObj,
83a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie				       struct pipe_context *pipe,
84a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie				       enum pipe_format format)
8542ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie
8642ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie{
8742ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   if (!stObj || !stObj->pt) {
8842ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie      return NULL;
8942ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   }
9042ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie
9142ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   if (!stObj->sampler_view) {
92a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie      stObj->sampler_view = st_create_texture_sampler_view_from_stobj(pipe, stObj, format);
9342ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   }
9442ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie
9542ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   return stObj->sampler_view;
9642ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie}
97332b77b852905224741084c5a4f5d2f4625dd119Brian Paul
9828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paulstatic void
9928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paulupdate_textures(struct st_context *st)
10028d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul{
1015d3d63d45a037fdf603ddcff88da635c3ce8075eBrian Paul   struct pipe_context *pipe = st->pipe;
1029271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul   struct gl_vertex_program *vprog = st->ctx->VertexProgram._Current;
103c3af68dc5022715cc8f126b7df12f3f5248aefe7Keith Whitwell   struct gl_fragment_program *fprog = st->ctx->FragmentProgram._Current;
1049271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul   const GLbitfield samplersUsed = (vprog->Base.SamplersUsed |
1059271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul                                    fprog->Base.SamplersUsed);
10674a6a46b749668032c17f8fb2312e927f214768cBrian Paul   GLuint su;
107c3af68dc5022715cc8f126b7df12f3f5248aefe7Keith Whitwell
1084528287e040415c2071012d02f20979ff995c754Keith Whitwell   st->state.num_textures = 0;
1094528287e040415c2071012d02f20979ff995c754Keith Whitwell
1109271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul   /* loop over sampler units (aka tex image units) */
111d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul   for (su = 0; su < st->ctx->Const.MaxTextureImageUnits; su++) {
112b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol      struct pipe_sampler_view *sampler_view = NULL;
113a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie      enum pipe_format st_view_format;
1149271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul      if (samplersUsed & (1 << su)) {
1159271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul         struct gl_texture_object *texObj;
1168f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul         struct st_texture_object *stObj;
117295a87f6c211322faefc4ef7f88f02722973f5b6Brian Paul         GLboolean retval;
1189271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul         GLuint texUnit;
1199271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul
1209271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul         if (fprog->Base.SamplersUsed & (1 << su))
1219271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul            texUnit = fprog->Base.SamplerUnits[su];
1229271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul         else
1239271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul            texUnit = vprog->Base.SamplerUnits[su];
1249271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul
1259271662ae9acda08ed6e444d1ee18384eebf8987Brian Paul         texObj = st->ctx->Texture.Unit[texUnit]._Current;
126762e96c80454c94981cd0ccb4b342f192ba8f77eBrian Paul
1278f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul         if (!texObj) {
1288f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul            texObj = st_get_default_texture(st);
1298f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul         }
1308f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul         stObj = st_texture_object(texObj);
131762e96c80454c94981cd0ccb4b342f192ba8f77eBrian Paul
132295a87f6c211322faefc4ef7f88f02722973f5b6Brian Paul         retval = st_finalize_texture(st->ctx, st->pipe, texObj);
1338f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul         if (!retval) {
1348f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul            /* out of mem */
1358f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul            continue;
1363b3774b1227743147159676795b542c0eb7c2bdfBrian Paul         }
1374528287e040415c2071012d02f20979ff995c754Keith Whitwell
138a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie	 st_view_format = stObj->pt->format;
139a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie	 {
140a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie	    struct st_texture_image *firstImage;
141a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie	    enum pipe_format firstImageFormat;
142a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie	    firstImage = st_texture_image(stObj->base.Image[0][stObj->base.BaseLevel]);
143a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie
144a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie	    firstImageFormat = st_mesa_format_to_pipe_format(firstImage->base.TexFormat);
145a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie	    if (firstImageFormat != stObj->pt->format)
146a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie	       st_view_format = firstImageFormat;
147a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie
148a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie	 }
1498f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul         st->state.num_textures = su + 1;
1508f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul
15142ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie	 /* if sampler view has changed dereference it */
15242ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie	 if (stObj->sampler_view)
153a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie	    if (check_sampler_swizzle(stObj->sampler_view, stObj->base._Swizzle) || (st_view_format != stObj->sampler_view->format))
15442ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie	       pipe_sampler_view_reference(&stObj->sampler_view, NULL);
1558cc668a4a8d67af21af6883e18fe7423f28999f9Brian Paul
156a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie         sampler_view = st_get_texture_sampler_view_from_stobj(stObj, pipe, st_view_format);
15742ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie      }
158b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol      pipe_sampler_view_reference(&st->state.sampler_views[su], sampler_view);
15928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul   }
1604528287e040415c2071012d02f20979ff995c754Keith Whitwell
161b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol   cso_set_fragment_sampler_views(st->cso_context,
162b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol                                  st->state.num_textures,
163b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol                                  st->state.sampler_views);
164853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol   if (st->ctx->Const.MaxVertexTextureImageUnits > 0) {
165b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol      cso_set_vertex_sampler_views(st->cso_context,
166b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol                                   MIN2(st->state.num_textures,
167b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol                                        st->ctx->Const.MaxVertexTextureImageUnits),
168b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol                                   st->state.sampler_views);
169853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol   }
17028d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul}
17128d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul
17228d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul
17328d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paulconst struct st_tracked_state st_update_texture = {
17454507125e735ffa595e252282eaabf38095c21e1Alan Hourihane   "st_update_texture",					/* name */
17554507125e735ffa595e252282eaabf38095c21e1Alan Hourihane   {							/* dirty */
17654507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      _NEW_TEXTURE,					/* mesa */
17754507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      ST_NEW_FRAGMENT_PROGRAM,				/* st */
17828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul   },
17954507125e735ffa595e252282eaabf38095c21e1Alan Hourihane   update_textures					/* update */
18028d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul};
1811a82d9648b3db780e58e4966924157542d148c58Brian Paul
1821a82d9648b3db780e58e4966924157542d148c58Brian Paul
1831a82d9648b3db780e58e4966924157542d148c58Brian Paul
1841a82d9648b3db780e58e4966924157542d148c58Brian Paul
1851a82d9648b3db780e58e4966924157542d148c58Brian Paulstatic void
1861a82d9648b3db780e58e4966924157542d148c58Brian Paulfinalize_textures(struct st_context *st)
1871a82d9648b3db780e58e4966924157542d148c58Brian Paul{
1881a82d9648b3db780e58e4966924157542d148c58Brian Paul   struct gl_fragment_program *fprog = st->ctx->FragmentProgram._Current;
1891a82d9648b3db780e58e4966924157542d148c58Brian Paul   const GLboolean prev_missing_textures = st->missing_textures;
1901a82d9648b3db780e58e4966924157542d148c58Brian Paul   GLuint su;
1911a82d9648b3db780e58e4966924157542d148c58Brian Paul
1921a82d9648b3db780e58e4966924157542d148c58Brian Paul   st->missing_textures = GL_FALSE;
1931a82d9648b3db780e58e4966924157542d148c58Brian Paul
1941a82d9648b3db780e58e4966924157542d148c58Brian Paul   for (su = 0; su < st->ctx->Const.MaxTextureCoordUnits; su++) {
1951a82d9648b3db780e58e4966924157542d148c58Brian Paul      if (fprog->Base.SamplersUsed & (1 << su)) {
1961a82d9648b3db780e58e4966924157542d148c58Brian Paul         const GLuint texUnit = fprog->Base.SamplerUnits[su];
1971a82d9648b3db780e58e4966924157542d148c58Brian Paul         struct gl_texture_object *texObj
1981a82d9648b3db780e58e4966924157542d148c58Brian Paul            = st->ctx->Texture.Unit[texUnit]._Current;
1991a82d9648b3db780e58e4966924157542d148c58Brian Paul
2001a82d9648b3db780e58e4966924157542d148c58Brian Paul         if (texObj) {
201295a87f6c211322faefc4ef7f88f02722973f5b6Brian Paul            GLboolean retval;
2021a82d9648b3db780e58e4966924157542d148c58Brian Paul
203295a87f6c211322faefc4ef7f88f02722973f5b6Brian Paul            retval = st_finalize_texture(st->ctx, st->pipe, texObj);
2041a82d9648b3db780e58e4966924157542d148c58Brian Paul            if (!retval) {
2051a82d9648b3db780e58e4966924157542d148c58Brian Paul               /* out of mem */
2061a82d9648b3db780e58e4966924157542d148c58Brian Paul               st->missing_textures = GL_TRUE;
2071a82d9648b3db780e58e4966924157542d148c58Brian Paul               continue;
2081a82d9648b3db780e58e4966924157542d148c58Brian Paul            }
2091a82d9648b3db780e58e4966924157542d148c58Brian Paul         }
2101a82d9648b3db780e58e4966924157542d148c58Brian Paul      }
2111a82d9648b3db780e58e4966924157542d148c58Brian Paul   }
2121a82d9648b3db780e58e4966924157542d148c58Brian Paul
2131a82d9648b3db780e58e4966924157542d148c58Brian Paul   if (prev_missing_textures != st->missing_textures)
2141a82d9648b3db780e58e4966924157542d148c58Brian Paul      st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
2151a82d9648b3db780e58e4966924157542d148c58Brian Paul}
2161a82d9648b3db780e58e4966924157542d148c58Brian Paul
2171a82d9648b3db780e58e4966924157542d148c58Brian Paul
2181a82d9648b3db780e58e4966924157542d148c58Brian Paul
2191a82d9648b3db780e58e4966924157542d148c58Brian Paulconst struct st_tracked_state st_finalize_textures = {
2201a82d9648b3db780e58e4966924157542d148c58Brian Paul   "st_finalize_textures",		/* name */
2211a82d9648b3db780e58e4966924157542d148c58Brian Paul   {					/* dirty */
2221a82d9648b3db780e58e4966924157542d148c58Brian Paul      _NEW_TEXTURE,			/* mesa */
2231a82d9648b3db780e58e4966924157542d148c58Brian Paul      0,				/* st */
2241a82d9648b3db780e58e4966924157542d148c58Brian Paul   },
2251a82d9648b3db780e58e4966924157542d148c58Brian Paul   finalize_textures			/* update */
2261a82d9648b3db780e58e4966924157542d148c58Brian Paul};
227