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