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