113682d959ddacde1ce65843aa8c5b43dc9017b32Brian/************************************************************************** 213682d959ddacde1ce65843aa8c5b43dc9017b32Brian * 313682d959ddacde1ce65843aa8c5b43dc9017b32Brian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 413682d959ddacde1ce65843aa8c5b43dc9017b32Brian * All Rights Reserved. 513682d959ddacde1ce65843aa8c5b43dc9017b32Brian * 613682d959ddacde1ce65843aa8c5b43dc9017b32Brian * Permission is hereby granted, free of charge, to any person obtaining a 713682d959ddacde1ce65843aa8c5b43dc9017b32Brian * copy of this software and associated documentation files (the 813682d959ddacde1ce65843aa8c5b43dc9017b32Brian * "Software"), to deal in the Software without restriction, including 913682d959ddacde1ce65843aa8c5b43dc9017b32Brian * without limitation the rights to use, copy, modify, merge, publish, 1013682d959ddacde1ce65843aa8c5b43dc9017b32Brian * distribute, sub license, and/or sell copies of the Software, and to 1113682d959ddacde1ce65843aa8c5b43dc9017b32Brian * permit persons to whom the Software is furnished to do so, subject to 1213682d959ddacde1ce65843aa8c5b43dc9017b32Brian * the following conditions: 1313682d959ddacde1ce65843aa8c5b43dc9017b32Brian * 1413682d959ddacde1ce65843aa8c5b43dc9017b32Brian * The above copyright notice and this permission notice (including the 1513682d959ddacde1ce65843aa8c5b43dc9017b32Brian * next paragraph) shall be included in all copies or substantial portions 1613682d959ddacde1ce65843aa8c5b43dc9017b32Brian * of the Software. 1713682d959ddacde1ce65843aa8c5b43dc9017b32Brian * 1813682d959ddacde1ce65843aa8c5b43dc9017b32Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1913682d959ddacde1ce65843aa8c5b43dc9017b32Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2013682d959ddacde1ce65843aa8c5b43dc9017b32Brian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2113682d959ddacde1ce65843aa8c5b43dc9017b32Brian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2213682d959ddacde1ce65843aa8c5b43dc9017b32Brian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2313682d959ddacde1ce65843aa8c5b43dc9017b32Brian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2413682d959ddacde1ce65843aa8c5b43dc9017b32Brian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2513682d959ddacde1ce65843aa8c5b43dc9017b32Brian * 2613682d959ddacde1ce65843aa8c5b43dc9017b32Brian **************************************************************************/ 2713682d959ddacde1ce65843aa8c5b43dc9017b32Brian 2813682d959ddacde1ce65843aa8c5b43dc9017b32Brian /* 2913682d959ddacde1ce65843aa8c5b43dc9017b32Brian * Authors: 3013682d959ddacde1ce65843aa8c5b43dc9017b32Brian * Keith Whitwell <keith@tungstengraphics.com> 3113682d959ddacde1ce65843aa8c5b43dc9017b32Brian * Brian Paul 3213682d959ddacde1ce65843aa8c5b43dc9017b32Brian */ 3313682d959ddacde1ce65843aa8c5b43dc9017b32Brian 3413682d959ddacde1ce65843aa8c5b43dc9017b32Brian 35736f535b4f1c5e6912b5b2fe9415a3b44a678844Brian Paul#include "main/macros.h" 361f32c665c8af0622e2bbf451edb999ffbcd7d0feEric Anholt#include "main/mtypes.h" 3723c71839e994c9c0ca684e54630991e16b0530afMarek Olšák#include "main/glformats.h" 381f32c665c8af0622e2bbf451edb999ffbcd7d0feEric Anholt#include "main/samplerobj.h" 39ea2aca036c742474cda03e3b7012b188a14d0287Brian Paul#include "main/texobj.h" 40736f535b4f1c5e6912b5b2fe9415a3b44a678844Brian Paul 4113682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "st_context.h" 428f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul#include "st_cb_texture.h" 43e2d108ec828bdbebdc7e8f9df30c86f0b521aa8dBrian Paul#include "st_format.h" 4413682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "st_atom.h" 45ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul#include "st_texture.h" 4613682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "pipe/p_context.h" 4713682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "pipe/p_defines.h" 48736f535b4f1c5e6912b5b2fe9415a3b44a678844Brian Paul 49339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h" 5013682d959ddacde1ce65843aa8c5b43dc9017b32Brian 5113682d959ddacde1ce65843aa8c5b43dc9017b32Brian 5213682d959ddacde1ce65843aa8c5b43dc9017b32Brian/** 5313682d959ddacde1ce65843aa8c5b43dc9017b32Brian * Convert GLenum texcoord wrap tokens to pipe tokens. 5413682d959ddacde1ce65843aa8c5b43dc9017b32Brian */ 5513682d959ddacde1ce65843aa8c5b43dc9017b32Brianstatic GLuint 56a07e68df6826d979d6a9575d17599f14afd51fe9Brian Paulgl_wrap_xlate(GLenum wrap) 5713682d959ddacde1ce65843aa8c5b43dc9017b32Brian{ 5813682d959ddacde1ce65843aa8c5b43dc9017b32Brian switch (wrap) { 5913682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_REPEAT: 6013682d959ddacde1ce65843aa8c5b43dc9017b32Brian return PIPE_TEX_WRAP_REPEAT; 6113682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_CLAMP: 6213682d959ddacde1ce65843aa8c5b43dc9017b32Brian return PIPE_TEX_WRAP_CLAMP; 6313682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_CLAMP_TO_EDGE: 6413682d959ddacde1ce65843aa8c5b43dc9017b32Brian return PIPE_TEX_WRAP_CLAMP_TO_EDGE; 6513682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_CLAMP_TO_BORDER: 6613682d959ddacde1ce65843aa8c5b43dc9017b32Brian return PIPE_TEX_WRAP_CLAMP_TO_BORDER; 6713682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_MIRRORED_REPEAT: 6813682d959ddacde1ce65843aa8c5b43dc9017b32Brian return PIPE_TEX_WRAP_MIRROR_REPEAT; 6913682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_MIRROR_CLAMP_EXT: 7013682d959ddacde1ce65843aa8c5b43dc9017b32Brian return PIPE_TEX_WRAP_MIRROR_CLAMP; 7113682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_MIRROR_CLAMP_TO_EDGE_EXT: 7213682d959ddacde1ce65843aa8c5b43dc9017b32Brian return PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE; 7313682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_MIRROR_CLAMP_TO_BORDER_EXT: 7413682d959ddacde1ce65843aa8c5b43dc9017b32Brian return PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER; 7513682d959ddacde1ce65843aa8c5b43dc9017b32Brian default: 76c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca assert(0); 7713682d959ddacde1ce65843aa8c5b43dc9017b32Brian return 0; 7813682d959ddacde1ce65843aa8c5b43dc9017b32Brian } 7913682d959ddacde1ce65843aa8c5b43dc9017b32Brian} 8013682d959ddacde1ce65843aa8c5b43dc9017b32Brian 8113682d959ddacde1ce65843aa8c5b43dc9017b32Brian 8213682d959ddacde1ce65843aa8c5b43dc9017b32Brianstatic GLuint 8378b1a29a0da8d1877408421df5012d37084a96deKeith Whitwellgl_filter_to_mip_filter(GLenum filter) 8413682d959ddacde1ce65843aa8c5b43dc9017b32Brian{ 8513682d959ddacde1ce65843aa8c5b43dc9017b32Brian switch (filter) { 8613682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_NEAREST: 8713682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_LINEAR: 8878b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell return PIPE_TEX_MIPFILTER_NONE; 8978b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell 9013682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_NEAREST_MIPMAP_NEAREST: 9178b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell case GL_LINEAR_MIPMAP_NEAREST: 9278b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell return PIPE_TEX_MIPFILTER_NEAREST; 9378b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell 9413682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_NEAREST_MIPMAP_LINEAR: 9578b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell case GL_LINEAR_MIPMAP_LINEAR: 9678b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell return PIPE_TEX_MIPFILTER_LINEAR; 9778b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell 9878b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell default: 9978b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell assert(0); 10078b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell return PIPE_TEX_MIPFILTER_NONE; 10178b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell } 10278b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell} 10378b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell 10478b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell 10578b1a29a0da8d1877408421df5012d37084a96deKeith Whitwellstatic GLuint 10678b1a29a0da8d1877408421df5012d37084a96deKeith Whitwellgl_filter_to_img_filter(GLenum filter) 10778b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell{ 10878b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell switch (filter) { 10978b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell case GL_NEAREST: 11078b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell case GL_NEAREST_MIPMAP_NEAREST: 11178b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell case GL_NEAREST_MIPMAP_LINEAR: 11278b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell return PIPE_TEX_FILTER_NEAREST; 11378b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell 11478b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell case GL_LINEAR: 11513682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_LINEAR_MIPMAP_NEAREST: 11613682d959ddacde1ce65843aa8c5b43dc9017b32Brian case GL_LINEAR_MIPMAP_LINEAR: 11778b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell return PIPE_TEX_FILTER_LINEAR; 11878b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell 11913682d959ddacde1ce65843aa8c5b43dc9017b32Brian default: 12078b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell assert(0); 12178b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell return PIPE_TEX_FILTER_NEAREST; 12213682d959ddacde1ce65843aa8c5b43dc9017b32Brian } 12313682d959ddacde1ce65843aa8c5b43dc9017b32Brian} 12413682d959ddacde1ce65843aa8c5b43dc9017b32Brian 1253751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1263751aa4592fb9e97823876ae1b434bf573d4639bBrian Paulstatic void 1273751aa4592fb9e97823876ae1b434bf573d4639bBrian Paulconvert_sampler(struct st_context *st, 1283751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul struct pipe_sampler_state *sampler, 1293751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul GLuint texUnit) 130c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie{ 1313751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul struct gl_texture_object *texobj; 1323751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul struct gl_context *ctx = st->ctx; 1333751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul struct gl_sampler_object *msamp; 1343751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1353751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul texobj = ctx->Texture.Unit[texUnit]._Current; 1363751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul if (!texobj) { 137ea2aca036c742474cda03e3b7012b188a14d0287Brian Paul texobj = _mesa_get_fallback_texture(ctx, TEXTURE_2D_INDEX); 1383751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul } 1393751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1403751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul msamp = _mesa_get_samplerobj(ctx, texUnit); 1413751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1423751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul memset(sampler, 0, sizeof(*sampler)); 1433751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->wrap_s = gl_wrap_xlate(msamp->WrapS); 1443751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->wrap_t = gl_wrap_xlate(msamp->WrapT); 1453751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->wrap_r = gl_wrap_xlate(msamp->WrapR); 1463751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1473751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->min_img_filter = gl_filter_to_img_filter(msamp->MinFilter); 1483751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->min_mip_filter = gl_filter_to_mip_filter(msamp->MinFilter); 1493751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->mag_img_filter = gl_filter_to_img_filter(msamp->MagFilter); 1503751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1513751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul if (texobj->Target != GL_TEXTURE_RECTANGLE_ARB) 1523751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->normalized_coords = 1; 1533751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1543751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->lod_bias = ctx->Texture.Unit[texUnit].LodBias + msamp->LodBias; 1553751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1563751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->min_lod = CLAMP(msamp->MinLod, 1573751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 0.0f, 1583751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul (GLfloat) texobj->MaxLevel - texobj->BaseLevel); 1593751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->max_lod = MIN2((GLfloat) texobj->MaxLevel - texobj->BaseLevel, 1603751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul msamp->MaxLod); 1613751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul if (sampler->max_lod < sampler->min_lod) { 1623751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul /* The GL spec doesn't seem to specify what to do in this case. 1633751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul * Swap the values. 1643751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul */ 1653751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul float tmp = sampler->max_lod; 1663751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->max_lod = sampler->min_lod; 1673751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->min_lod = tmp; 1683751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul assert(sampler->min_lod <= sampler->max_lod); 1693751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul } 1703751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1713751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul if (msamp->BorderColor.ui[0] || 1723751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul msamp->BorderColor.ui[1] || 1733751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul msamp->BorderColor.ui[2] || 1743751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul msamp->BorderColor.ui[3]) { 1753751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul struct gl_texture_image *teximg; 17623c71839e994c9c0ca684e54630991e16b0530afMarek Olšák GLboolean is_integer = GL_FALSE; 1773751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1783751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul teximg = texobj->Image[0][texobj->BaseLevel]; 1793751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 18023c71839e994c9c0ca684e54630991e16b0530afMarek Olšák if (teximg) { 18123c71839e994c9c0ca684e54630991e16b0530afMarek Olšák is_integer = _mesa_is_enum_format_integer(teximg->InternalFormat); 18223c71839e994c9c0ca684e54630991e16b0530afMarek Olšák } 18323c71839e994c9c0ca684e54630991e16b0530afMarek Olšák 18423c71839e994c9c0ca684e54630991e16b0530afMarek Olšák st_translate_color(&msamp->BorderColor, 18523c71839e994c9c0ca684e54630991e16b0530afMarek Olšák &sampler->border_color, 18623c71839e994c9c0ca684e54630991e16b0530afMarek Olšák teximg ? teximg->_BaseFormat : GL_RGBA, is_integer); 1873751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul } 1883751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1893751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->max_anisotropy = (msamp->MaxAnisotropy == 1.0 ? 1903751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 0 : (GLuint) msamp->MaxAnisotropy); 1913751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1923751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul /* only care about ARB_shadow, not SGI shadow */ 1933751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul if (msamp->CompareMode == GL_COMPARE_R_TO_TEXTURE) { 1943751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->compare_mode = PIPE_TEX_COMPARE_R_TO_TEXTURE; 1953751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->compare_func 1963751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul = st_compare_func_to_pipe(msamp->CompareFunc); 1973751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul } 1983751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 1993751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul sampler->seamless_cube_map = 2003751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul ctx->Texture.CubeMapSeamless || msamp->CubeMapSeamless; 201c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie} 20213682d959ddacde1ce65843aa8c5b43dc9017b32Brian 2033751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 2048eeeef37057e8f31834e421902c529b273295d0bBrian Paul/** 2058eeeef37057e8f31834e421902c529b273295d0bBrian Paul * Update the gallium driver's sampler state for fragment, vertex or 2068eeeef37057e8f31834e421902c529b273295d0bBrian Paul * geometry shader stage. 2078eeeef37057e8f31834e421902c529b273295d0bBrian Paul */ 208c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airliestatic void 2098eeeef37057e8f31834e421902c529b273295d0bBrian Paulupdate_shader_samplers(struct st_context *st, 2108eeeef37057e8f31834e421902c529b273295d0bBrian Paul unsigned shader_stage, 2118eeeef37057e8f31834e421902c529b273295d0bBrian Paul const struct gl_program *prog, 2128eeeef37057e8f31834e421902c529b273295d0bBrian Paul unsigned max_units, 2138eeeef37057e8f31834e421902c529b273295d0bBrian Paul struct pipe_sampler_state *samplers, 2148eeeef37057e8f31834e421902c529b273295d0bBrian Paul unsigned *num_samplers) 21513682d959ddacde1ce65843aa8c5b43dc9017b32Brian{ 2168eeeef37057e8f31834e421902c529b273295d0bBrian Paul GLuint unit; 2178eeeef37057e8f31834e421902c529b273295d0bBrian Paul GLbitfield samplers_used; 2188eeeef37057e8f31834e421902c529b273295d0bBrian Paul const GLuint old_max = *num_samplers; 219c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 2208eeeef37057e8f31834e421902c529b273295d0bBrian Paul samplers_used = prog->SamplersUsed; 221c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 2228eeeef37057e8f31834e421902c529b273295d0bBrian Paul if (*num_samplers == 0 && samplers_used == 0x0) 223819e786339fe0eebcd6e8e0ec9e501da548846baBrian Paul return; 22413682d959ddacde1ce65843aa8c5b43dc9017b32Brian 2258eeeef37057e8f31834e421902c529b273295d0bBrian Paul *num_samplers = 0; 2264528287e040415c2071012d02f20979ff995c754Keith Whitwell 227f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian /* loop over sampler units (aka tex image units) */ 2288eeeef37057e8f31834e421902c529b273295d0bBrian Paul for (unit = 0; unit < max_units; unit++, samplers_used >>= 1) { 2298eeeef37057e8f31834e421902c529b273295d0bBrian Paul struct pipe_sampler_state *sampler = samplers + unit; 23013682d959ddacde1ce65843aa8c5b43dc9017b32Brian 23123c52caafba52c77092b9721bd4601f8ea592625Dave Airlie if (samplers_used & 1) { 2328eeeef37057e8f31834e421902c529b273295d0bBrian Paul const GLuint texUnit = prog->SamplerUnits[unit]; 233c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 23423c52caafba52c77092b9721bd4601f8ea592625Dave Airlie convert_sampler(st, sampler, texUnit); 235a5f0a11477ae90f47f3adb59a93c5576dc8c7325Marek Olšák 2368eeeef37057e8f31834e421902c529b273295d0bBrian Paul *num_samplers = unit + 1; 2374528287e040415c2071012d02f20979ff995c754Keith Whitwell 2388eeeef37057e8f31834e421902c529b273295d0bBrian Paul cso_single_sampler(st->cso_context, shader_stage, unit, sampler); 2390dd79011b9c407191e40c2697c68946f35bc557aBrian } 2408eeeef37057e8f31834e421902c529b273295d0bBrian Paul else if (samplers_used != 0 || unit < old_max) { 2418eeeef37057e8f31834e421902c529b273295d0bBrian Paul cso_single_sampler(st->cso_context, shader_stage, unit, NULL); 2428eeeef37057e8f31834e421902c529b273295d0bBrian Paul } 2438eeeef37057e8f31834e421902c529b273295d0bBrian Paul else { 244819e786339fe0eebcd6e8e0ec9e501da548846baBrian Paul /* if we've reset all the old samplers and we have no more new ones */ 24523c52caafba52c77092b9721bd4601f8ea592625Dave Airlie break; 2460dd79011b9c407191e40c2697c68946f35bc557aBrian } 24713682d959ddacde1ce65843aa8c5b43dc9017b32Brian } 2484528287e040415c2071012d02f20979ff995c754Keith Whitwell 2498eeeef37057e8f31834e421902c529b273295d0bBrian Paul cso_single_sampler_done(st->cso_context, shader_stage); 25013682d959ddacde1ce65843aa8c5b43dc9017b32Brian} 25113682d959ddacde1ce65843aa8c5b43dc9017b32Brian 2523751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 253c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airliestatic void 254c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlieupdate_samplers(struct st_context *st) 255c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie{ 2568eeeef37057e8f31834e421902c529b273295d0bBrian Paul const struct gl_context *ctx = st->ctx; 2578eeeef37057e8f31834e421902c529b273295d0bBrian Paul 2588eeeef37057e8f31834e421902c529b273295d0bBrian Paul update_shader_samplers(st, 2598eeeef37057e8f31834e421902c529b273295d0bBrian Paul PIPE_SHADER_FRAGMENT, 2608eeeef37057e8f31834e421902c529b273295d0bBrian Paul &ctx->FragmentProgram._Current->Base, 2618eeeef37057e8f31834e421902c529b273295d0bBrian Paul ctx->Const.MaxTextureImageUnits, 2626c8a13215813841703e7c2efa233e8d4cf517dfdBrian Paul st->state.samplers[PIPE_SHADER_FRAGMENT], 2636c8a13215813841703e7c2efa233e8d4cf517dfdBrian Paul &st->state.num_samplers[PIPE_SHADER_FRAGMENT]); 2648eeeef37057e8f31834e421902c529b273295d0bBrian Paul 2658eeeef37057e8f31834e421902c529b273295d0bBrian Paul update_shader_samplers(st, 2668eeeef37057e8f31834e421902c529b273295d0bBrian Paul PIPE_SHADER_VERTEX, 2678eeeef37057e8f31834e421902c529b273295d0bBrian Paul &ctx->VertexProgram._Current->Base, 2688eeeef37057e8f31834e421902c529b273295d0bBrian Paul ctx->Const.MaxVertexTextureImageUnits, 2696c8a13215813841703e7c2efa233e8d4cf517dfdBrian Paul st->state.samplers[PIPE_SHADER_VERTEX], 2706c8a13215813841703e7c2efa233e8d4cf517dfdBrian Paul &st->state.num_samplers[PIPE_SHADER_VERTEX]); 2718eeeef37057e8f31834e421902c529b273295d0bBrian Paul 272f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul if (ctx->GeometryProgram._Current) { 273f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul update_shader_samplers(st, 274f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul PIPE_SHADER_GEOMETRY, 275f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul &ctx->GeometryProgram._Current->Base, 276f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul ctx->Const.MaxGeometryTextureImageUnits, 277f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul st->state.samplers[PIPE_SHADER_GEOMETRY], 278f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul &st->state.num_samplers[PIPE_SHADER_GEOMETRY]); 279f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul } 280c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie} 28113682d959ddacde1ce65843aa8c5b43dc9017b32Brian 2823751aa4592fb9e97823876ae1b434bf573d4639bBrian Paul 28313682d959ddacde1ce65843aa8c5b43dc9017b32Brianconst struct st_tracked_state st_update_sampler = { 28454507125e735ffa595e252282eaabf38095c21e1Alan Hourihane "st_update_sampler", /* name */ 28554507125e735ffa595e252282eaabf38095c21e1Alan Hourihane { /* dirty */ 28654507125e735ffa595e252282eaabf38095c21e1Alan Hourihane _NEW_TEXTURE, /* mesa */ 28754507125e735ffa595e252282eaabf38095c21e1Alan Hourihane 0, /* st */ 28813682d959ddacde1ce65843aa8c5b43dc9017b32Brian }, 28954507125e735ffa595e252282eaabf38095c21e1Alan Hourihane update_samplers /* update */ 29013682d959ddacde1ce65843aa8c5b43dc9017b32Brian}; 291