st_atom_sampler.c revision f3c3aff6efed49b7740a144f767c713cb22561e2
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/**************************************************************************
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer *
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * All Rights Reserved.
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner *
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner * Permission is hereby granted, free of charge, to any person obtaining a
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * copy of this software and associated documentation files (the
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * "Software"), to deal in the Software without restriction, including
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * without limitation the rights to use, copy, modify, merge, publish,
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * distribute, sub license, and/or sell copies of the Software, and to
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * permit persons to whom the Software is furnished to do so, subject to
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * the following conditions:
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer *
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * The above copyright notice and this permission notice (including the
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * next paragraph) shall be included in all copies or substantial portions
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * of the Software.
17af8fa25c0d4e0540952a50bbd06dc1558954ccd9Ted Kremenek *
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
199c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
215d75de0f821023f4ed4815825bf3aea8a0b5e40dChris Lattner * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
226137dc99ef0c2b14050631367057758b0d596cb3Ted Kremenek * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
231b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24d7a3e2c5f61cd4893f95b69a424fe4def3aa0f69Benjamin Kramer * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25c7229c338c21ef26b01ef3ecf9eec4fd373fa9ecChris Lattner *
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer **************************************************************************/
27cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner
284f32786ac45210143654390177105eb749b614e9Ted Kremenek /*
290827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  * Authors:
30caaa7df2c78bbd40197823034c0275f3dcbd63e7Ted Kremenek  *   Keith Whitwell <keith@tungstengraphics.com>
31f4d5eb4866a27d497f0bb75b12c2ffd48ad4d9c0Benjamin Kramer  *   Brian Paul
325b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  */
330ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek
342e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "main/macros.h"
368fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "main/mtypes.h"
378fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "main/samplerobj.h"
388fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "main/texobj.h"
398fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "st_context.h"
411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include "st_cb_texture.h"
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "st_format.h"
4388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor#include "st_atom.h"
445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "st_texture.h"
455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "pipe/p_context.h"
465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "pipe/p_defines.h"
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "cso_cache/cso_context.h"
492e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/**
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Convert GLenum texcoord wrap tokens to pipe tokens.
53f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor */
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic GLuint
5594dc8f640ebea52241412512ed48601626edbc58Douglas Gregorgl_wrap_xlate(GLenum wrap)
566aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor{
57ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie   switch (wrap) {
58e5956bd2730c051835f9acd9e957c5d79f99e7c3Chris Lattner   case GL_REPEAT:
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return PIPE_TEX_WRAP_REPEAT;
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   case GL_CLAMP:
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return PIPE_TEX_WRAP_CLAMP;
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   case GL_CLAMP_TO_EDGE:
63c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith      return PIPE_TEX_WRAP_CLAMP_TO_EDGE;
64d7a3e2c5f61cd4893f95b69a424fe4def3aa0f69Benjamin Kramer   case GL_CLAMP_TO_BORDER:
654e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie      return PIPE_TEX_WRAP_CLAMP_TO_BORDER;
66998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor   case GL_MIRRORED_REPEAT:
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return PIPE_TEX_WRAP_MIRROR_REPEAT;
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   case GL_MIRROR_CLAMP_EXT:
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return PIPE_TEX_WRAP_MIRROR_CLAMP;
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   case GL_MIRROR_CLAMP_TO_EDGE_EXT:
716aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor      return PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE;
721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   case GL_MIRROR_CLAMP_TO_BORDER_EXT:
7388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor      return PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER;
7488a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor   default:
75a5d10c4df435964600e104ebef6a96b106e416b7Kovarththanan Rajaratnam      assert(0);
76ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie      return 0;
776137dc99ef0c2b14050631367057758b0d596cb3Ted Kremenek   }
786137dc99ef0c2b14050631367057758b0d596cb3Ted Kremenek}
796f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith
801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
810ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenekstatic GLuint
820ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenekgl_filter_to_mip_filter(GLenum filter)
830ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek{
841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   switch (filter) {
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   case GL_NEAREST:
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   case GL_LINEAR:
875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return PIPE_TEX_MIPFILTER_NONE;
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   case GL_NEAREST_MIPMAP_NEAREST:
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   case GL_LINEAR_MIPMAP_NEAREST:
91c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner      return PIPE_TEX_MIPFILTER_NEAREST;
921ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall
931ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall   case GL_NEAREST_MIPMAP_LINEAR:
94148772a841cae6f32db16d890e788b92a763bb3fChris Lattner   case GL_LINEAR_MIPMAP_LINEAR:
95c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne      return PIPE_TEX_MIPFILTER_LINEAR;
96148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
97cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson   default:
9892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson      assert(0);
9992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson      return PIPE_TEX_MIPFILTER_NONE;
100d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek   }
1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
103c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic GLuint
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencergl_filter_to_img_filter(GLenum filter)
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer{
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   switch (filter) {
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   case GL_NEAREST:
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   case GL_NEAREST_MIPMAP_NEAREST:
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   case GL_NEAREST_MIPMAP_LINEAR:
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return PIPE_TEX_FILTER_NEAREST;
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
113f84139a1331c63c998e8b7d54148c75ac0b48ccdEli Friedman   case GL_LINEAR:
114ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie   case GL_LINEAR_MIPMAP_NEAREST:
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   case GL_LINEAR_MIPMAP_LINEAR:
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return PIPE_TEX_FILTER_LINEAR;
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1185814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar   default:
1195814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar      assert(0);
1205814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar      return PIPE_TEX_FILTER_NEAREST;
1211d9c54df56391ac4740db27d551782e81189cb51Chris Lattner   }
1221d9c54df56391ac4740db27d551782e81189cb51Chris Lattner}
1231d9c54df56391ac4740db27d551782e81189cb51Chris Lattner
1248c0b3787e7ccc7978b42dfbb84da2b802c743a5dDavid Blaikie
1258c0b3787e7ccc7978b42dfbb84da2b802c743a5dDavid Blaikiestatic void
1268c0b3787e7ccc7978b42dfbb84da2b802c743a5dDavid Blaikieconvert_sampler(struct st_context *st,
1278c0b3787e7ccc7978b42dfbb84da2b802c743a5dDavid Blaikie                struct pipe_sampler_state *sampler,
1288c0b3787e7ccc7978b42dfbb84da2b802c743a5dDavid Blaikie                GLuint texUnit)
1298c0b3787e7ccc7978b42dfbb84da2b802c743a5dDavid Blaikie{
1308c0b3787e7ccc7978b42dfbb84da2b802c743a5dDavid Blaikie   struct gl_texture_object *texobj;
13188a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor   struct gl_context *ctx = st->ctx;
13288a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor   struct gl_sampler_object *msamp;
133a5d10c4df435964600e104ebef6a96b106e416b7Kovarththanan Rajaratnam
13414e645557ae91c6770d62beb00a1c522e0bfd5d6Argyrios Kyrtzidis   texobj = ctx->Texture.Unit[texUnit]._Current;
13514e645557ae91c6770d62beb00a1c522e0bfd5d6Argyrios Kyrtzidis   if (!texobj) {
13614e645557ae91c6770d62beb00a1c522e0bfd5d6Argyrios Kyrtzidis      texobj = _mesa_get_fallback_texture(ctx, TEXTURE_2D_INDEX);
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   }
1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
139c3222091e1ffa35d0264ca6b680a88c9dc84ede2Daniel Dunbar   msamp = _mesa_get_samplerobj(ctx, texUnit);
1401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14168d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff   memset(sampler, 0, sizeof(*sampler));
14268d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff   sampler->wrap_s = gl_wrap_xlate(msamp->WrapS);
1439e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth   sampler->wrap_t = gl_wrap_xlate(msamp->WrapT);
14468d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff   sampler->wrap_r = gl_wrap_xlate(msamp->WrapR);
1451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14668d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff   sampler->min_img_filter = gl_filter_to_img_filter(msamp->MinFilter);
147083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   sampler->min_mip_filter = gl_filter_to_mip_filter(msamp->MinFilter);
14829238a0bf7cbf5b396efb451a0adb5fe4aa037caSteve Naroff   sampler->mag_img_filter = gl_filter_to_img_filter(msamp->MagFilter);
1492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1501b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner   if (texobj->Target != GL_TEXTURE_RECTANGLE_ARB)
1511b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner      sampler->normalized_coords = 1;
1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   sampler->lod_bias = ctx->Texture.Unit[texUnit].LodBias + msamp->LodBias;
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   sampler->min_lod = CLAMP(msamp->MinLod,
1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                            0.0f,
1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                            (GLfloat) texobj->MaxLevel - texobj->BaseLevel);
1582e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor   sampler->max_lod = MIN2((GLfloat) texobj->MaxLevel - texobj->BaseLevel,
1592e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor                           msamp->MaxLod);
1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   if (sampler->max_lod < sampler->min_lod) {
161e55329d6834647ba0e06f8a319e5d84c77310035Axel Naumann      /* The GL spec doesn't seem to specify what to do in this case.
162e55329d6834647ba0e06f8a319e5d84c77310035Axel Naumann       * Swap the values.
163e55329d6834647ba0e06f8a319e5d84c77310035Axel Naumann       */
164e55329d6834647ba0e06f8a319e5d84c77310035Axel Naumann      float tmp = sampler->max_lod;
165f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor      sampler->max_lod = sampler->min_lod;
166f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor      sampler->min_lod = tmp;
167ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie      assert(sampler->min_lod <= sampler->max_lod);
1682968442603b029949246467253eeac8139a5b6d8Douglas Gregor   }
1692968442603b029949246467253eeac8139a5b6d8Douglas Gregor
1702968442603b029949246467253eeac8139a5b6d8Douglas Gregor   if (msamp->BorderColor.ui[0] ||
1717d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis       msamp->BorderColor.ui[1] ||
1727d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis       msamp->BorderColor.ui[2] ||
1737d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis       msamp->BorderColor.ui[3]) {
1747d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis      struct gl_texture_image *teximg;
1757d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis
1767d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis      teximg = texobj->Image[0][texobj->BaseLevel];
1777d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis
1787d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis      st_translate_color(msamp->BorderColor.f,
1797d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                         teximg ? teximg->_BaseFormat : GL_RGBA,
1807d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                         sampler->border_color.f);
1817d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis   }
1827d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis
183c13a34b690d2dc2a03c2fea75a0a1438636c19ceDouglas Gregor   sampler->max_anisotropy = (msamp->MaxAnisotropy == 1.0 ?
184c13a34b690d2dc2a03c2fea75a0a1438636c19ceDouglas Gregor                              0 : (GLuint) msamp->MaxAnisotropy);
185b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor
1868dfac0baaf0f81d3945bcb306480e358ba8d1f08John McCall   /* only care about ARB_shadow, not SGI shadow */
187b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor   if (msamp->CompareMode == GL_COMPARE_R_TO_TEXTURE) {
188b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor      sampler->compare_mode = PIPE_TEX_COMPARE_R_TO_TEXTURE;
189b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor      sampler->compare_func
190b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor         = st_compare_func_to_pipe(msamp->CompareFunc);
191b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor   }
192b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor
193b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor   sampler->seamless_cube_map =
194b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor      ctx->Texture.CubeMapSeamless || msamp->CubeMapSeamless;
1958dfac0baaf0f81d3945bcb306480e358ba8d1f08John McCall}
1968dfac0baaf0f81d3945bcb306480e358ba8d1f08John McCall
1978dfac0baaf0f81d3945bcb306480e358ba8d1f08John McCall
198ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/**
1997d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis * Update the gallium driver's sampler state for fragment, vertex or
2007d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis * geometry shader stage.
2017d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis */
202f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregorstatic void
203f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregorupdate_shader_samplers(struct st_context *st,
204f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor                       unsigned shader_stage,
205f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor                       const struct gl_program *prog,
206f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor                       unsigned max_units,
207ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie                       struct pipe_sampler_state *samplers,
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                       unsigned *num_samplers)
2099c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek{
2109c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek   GLuint unit;
2116f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith   GLbitfield samplers_used;
2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   const GLuint old_max = *num_samplers;
2139c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek
2149c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek   samplers_used = prog->SamplersUsed;
2159c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek
2166f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith   if (*num_samplers == 0 && samplers_used == 0x0)
2171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump       return;
2189c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek
2199c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek   *num_samplers = 0;
2209c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek
22123f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner   /* loop over sampler units (aka tex image units) */
222ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie   for (unit = 0; unit < max_units; unit++, samplers_used >>= 1) {
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      struct pipe_sampler_state *sampler = samplers + unit;
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (samplers_used & 1) {
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         const GLuint texUnit = prog->SamplerUnits[unit];
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2286cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner         convert_sampler(st, sampler, texUnit);
2296cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner
2306f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith         *num_samplers = unit + 1;
2311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
232b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor         cso_single_sampler(st->cso_context, shader_stage, unit, sampler);
233ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie      }
234ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie      else if (samplers_used != 0 || unit < old_max) {
235ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie         cso_single_sampler(st->cso_context, shader_stage, unit, NULL);
236ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie      }
237b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor      else {
238b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor         /* if we've reset all the old samplers and we have no more new ones */
239b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor         break;
240b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor      }
2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   }
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2436cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner   cso_single_sampler_done(st->cso_context, shader_stage);
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
245b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor
2469c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek
2479c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenekstatic void
2489c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenekupdate_samplers(struct st_context *st)
2491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{
2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   const struct gl_context *ctx = st->ctx;
2519c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek
252ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie   update_shader_samplers(st,
253b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor                          PIPE_SHADER_FRAGMENT,
2549c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek                          &ctx->FragmentProgram._Current->Base,
255ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie                          ctx->Const.MaxTextureImageUnits,
256b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor                          st->state.samplers[PIPE_SHADER_FRAGMENT],
2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                          &st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
2585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   update_shader_samplers(st,
2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                          PIPE_SHADER_VERTEX,
2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                          &ctx->VertexProgram._Current->Base,
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                          ctx->Const.MaxVertexTextureImageUnits,
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                          st->state.samplers[PIPE_SHADER_VERTEX],
26466c44e700fb3f244b2c443bfbd6a05b5f1843ec0Argyrios Kyrtzidis                          &st->state.num_samplers[PIPE_SHADER_VERTEX]);
26566c44e700fb3f244b2c443bfbd6a05b5f1843ec0Argyrios Kyrtzidis
26666c44e700fb3f244b2c443bfbd6a05b5f1843ec0Argyrios Kyrtzidis   if (ctx->GeometryProgram._Current) {
26766c44e700fb3f244b2c443bfbd6a05b5f1843ec0Argyrios Kyrtzidis      update_shader_samplers(st,
26866c44e700fb3f244b2c443bfbd6a05b5f1843ec0Argyrios Kyrtzidis                             PIPE_SHADER_GEOMETRY,
26966c44e700fb3f244b2c443bfbd6a05b5f1843ec0Argyrios Kyrtzidis                             &ctx->GeometryProgram._Current->Base,
27066c44e700fb3f244b2c443bfbd6a05b5f1843ec0Argyrios Kyrtzidis                             ctx->Const.MaxGeometryTextureImageUnits,
27166c44e700fb3f244b2c443bfbd6a05b5f1843ec0Argyrios Kyrtzidis                             st->state.samplers[PIPE_SHADER_GEOMETRY],
27266c44e700fb3f244b2c443bfbd6a05b5f1843ec0Argyrios Kyrtzidis                             &st->state.num_samplers[PIPE_SHADER_GEOMETRY]);
273cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner   }
274cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner}
275cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner
2761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2770827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidisconst struct st_tracked_state st_update_sampler = {
2780827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis   "st_update_sampler",					/* name */
2790827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis   {							/* dirty */
2800827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis      _NEW_TEXTURE,					/* mesa */
2810827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis      0,						/* st */
2820827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis   },
2830827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis   update_samplers					/* update */
2840827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis};
2850827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis