st_atom_sampler.c revision 736f535b4f1c5e6912b5b2fe9415a3b44a678844
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"
36736f535b4f1c5e6912b5b2fe9415a3b44a678844Brian Paul
3713682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "st_context.h"
3813682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "st_atom.h"
39f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian#include "st_program.h"
4013682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "pipe/p_context.h"
4113682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "pipe/p_defines.h"
42736f535b4f1c5e6912b5b2fe9415a3b44a678844Brian Paul
43339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h"
4413682d959ddacde1ce65843aa8c5b43dc9017b32Brian
4513682d959ddacde1ce65843aa8c5b43dc9017b32Brian
4613682d959ddacde1ce65843aa8c5b43dc9017b32Brian/**
4713682d959ddacde1ce65843aa8c5b43dc9017b32Brian * Convert GLenum texcoord wrap tokens to pipe tokens.
4813682d959ddacde1ce65843aa8c5b43dc9017b32Brian */
4913682d959ddacde1ce65843aa8c5b43dc9017b32Brianstatic GLuint
5013682d959ddacde1ce65843aa8c5b43dc9017b32Briangl_wrap_to_sp(GLenum wrap)
5113682d959ddacde1ce65843aa8c5b43dc9017b32Brian{
5213682d959ddacde1ce65843aa8c5b43dc9017b32Brian   switch (wrap) {
5313682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_REPEAT:
5413682d959ddacde1ce65843aa8c5b43dc9017b32Brian      return PIPE_TEX_WRAP_REPEAT;
5513682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_CLAMP:
5613682d959ddacde1ce65843aa8c5b43dc9017b32Brian      return PIPE_TEX_WRAP_CLAMP;
5713682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_CLAMP_TO_EDGE:
5813682d959ddacde1ce65843aa8c5b43dc9017b32Brian      return PIPE_TEX_WRAP_CLAMP_TO_EDGE;
5913682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_CLAMP_TO_BORDER:
6013682d959ddacde1ce65843aa8c5b43dc9017b32Brian      return PIPE_TEX_WRAP_CLAMP_TO_BORDER;
6113682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_MIRRORED_REPEAT:
6213682d959ddacde1ce65843aa8c5b43dc9017b32Brian      return PIPE_TEX_WRAP_MIRROR_REPEAT;
6313682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_MIRROR_CLAMP_EXT:
6413682d959ddacde1ce65843aa8c5b43dc9017b32Brian      return PIPE_TEX_WRAP_MIRROR_CLAMP;
6513682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_MIRROR_CLAMP_TO_EDGE_EXT:
6613682d959ddacde1ce65843aa8c5b43dc9017b32Brian      return PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE;
6713682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_MIRROR_CLAMP_TO_BORDER_EXT:
6813682d959ddacde1ce65843aa8c5b43dc9017b32Brian      return PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER;
6913682d959ddacde1ce65843aa8c5b43dc9017b32Brian   default:
7013682d959ddacde1ce65843aa8c5b43dc9017b32Brian      abort();
7113682d959ddacde1ce65843aa8c5b43dc9017b32Brian      return 0;
7213682d959ddacde1ce65843aa8c5b43dc9017b32Brian   }
7313682d959ddacde1ce65843aa8c5b43dc9017b32Brian}
7413682d959ddacde1ce65843aa8c5b43dc9017b32Brian
7513682d959ddacde1ce65843aa8c5b43dc9017b32Brian
7613682d959ddacde1ce65843aa8c5b43dc9017b32Brianstatic GLuint
7778b1a29a0da8d1877408421df5012d37084a96deKeith Whitwellgl_filter_to_mip_filter(GLenum filter)
7813682d959ddacde1ce65843aa8c5b43dc9017b32Brian{
7913682d959ddacde1ce65843aa8c5b43dc9017b32Brian   switch (filter) {
8013682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_NEAREST:
8113682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_LINEAR:
8278b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell      return PIPE_TEX_MIPFILTER_NONE;
8378b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell
8413682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_NEAREST_MIPMAP_NEAREST:
8578b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell   case GL_LINEAR_MIPMAP_NEAREST:
8678b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell      return PIPE_TEX_MIPFILTER_NEAREST;
8778b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell
8813682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_NEAREST_MIPMAP_LINEAR:
8978b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell   case GL_LINEAR_MIPMAP_LINEAR:
9078b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell      return PIPE_TEX_MIPFILTER_LINEAR;
9178b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell
9278b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell   default:
9378b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell      assert(0);
9478b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell      return PIPE_TEX_MIPFILTER_NONE;
9578b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell   }
9678b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell}
9778b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell
9878b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell
9978b1a29a0da8d1877408421df5012d37084a96deKeith Whitwellstatic GLuint
10078b1a29a0da8d1877408421df5012d37084a96deKeith Whitwellgl_filter_to_img_filter(GLenum filter)
10178b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell{
10278b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell   switch (filter) {
10378b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell   case GL_NEAREST:
10478b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell   case GL_NEAREST_MIPMAP_NEAREST:
10578b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell   case GL_NEAREST_MIPMAP_LINEAR:
10678b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell      return PIPE_TEX_FILTER_NEAREST;
10778b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell
10878b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell   case GL_LINEAR:
10913682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_LINEAR_MIPMAP_NEAREST:
11013682d959ddacde1ce65843aa8c5b43dc9017b32Brian   case GL_LINEAR_MIPMAP_LINEAR:
11178b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell      return PIPE_TEX_FILTER_LINEAR;
11278b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell
11313682d959ddacde1ce65843aa8c5b43dc9017b32Brian   default:
11478b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell      assert(0);
11578b1a29a0da8d1877408421df5012d37084a96deKeith Whitwell      return PIPE_TEX_FILTER_NEAREST;
11613682d959ddacde1ce65843aa8c5b43dc9017b32Brian   }
11713682d959ddacde1ce65843aa8c5b43dc9017b32Brian}
11813682d959ddacde1ce65843aa8c5b43dc9017b32Brian
11913682d959ddacde1ce65843aa8c5b43dc9017b32Brian
12013682d959ddacde1ce65843aa8c5b43dc9017b32Brianstatic void
12113682d959ddacde1ce65843aa8c5b43dc9017b32Brianupdate_samplers(struct st_context *st)
12213682d959ddacde1ce65843aa8c5b43dc9017b32Brian{
123f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian   const struct st_fragment_program *fs = st->fp;
124f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian   GLuint su;
12513682d959ddacde1ce65843aa8c5b43dc9017b32Brian
1264528287e040415c2071012d02f20979ff995c754Keith Whitwell   st->state.num_samplers = 0;
1274528287e040415c2071012d02f20979ff995c754Keith Whitwell
128f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian   /* loop over sampler units (aka tex image units) */
129f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian   for (su = 0; su < st->ctx->Const.MaxTextureImageUnits; su++) {
130339e7ec6805e6de8794514c0a935081b5d36d38fBrian      struct pipe_sampler_state *sampler = st->state.samplers + su;
13113682d959ddacde1ce65843aa8c5b43dc9017b32Brian
132339e7ec6805e6de8794514c0a935081b5d36d38fBrian      memset(sampler, 0, sizeof(*sampler));
13313682d959ddacde1ce65843aa8c5b43dc9017b32Brian
134f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian      if (fs->Base.Base.SamplersUsed & (1 << su)) {
135f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian         GLuint texUnit = fs->Base.Base.SamplerUnits[su];
136f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian         const struct gl_texture_object *texobj
137f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian            = st->ctx->Texture.Unit[texUnit]._Current;
138f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian
139f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian         assert(texobj);
140f3b3ea9742e6511fa46332c2c6d2433f96cc5c10Brian
141339e7ec6805e6de8794514c0a935081b5d36d38fBrian         sampler->wrap_s = gl_wrap_to_sp(texobj->WrapS);
142339e7ec6805e6de8794514c0a935081b5d36d38fBrian         sampler->wrap_t = gl_wrap_to_sp(texobj->WrapT);
143339e7ec6805e6de8794514c0a935081b5d36d38fBrian         sampler->wrap_r = gl_wrap_to_sp(texobj->WrapR);
14413682d959ddacde1ce65843aa8c5b43dc9017b32Brian
145339e7ec6805e6de8794514c0a935081b5d36d38fBrian         sampler->min_img_filter = gl_filter_to_img_filter(texobj->MinFilter);
146339e7ec6805e6de8794514c0a935081b5d36d38fBrian         sampler->min_mip_filter = gl_filter_to_mip_filter(texobj->MinFilter);
147339e7ec6805e6de8794514c0a935081b5d36d38fBrian         sampler->mag_img_filter = gl_filter_to_img_filter(texobj->MagFilter);
14813682d959ddacde1ce65843aa8c5b43dc9017b32Brian
149369eefc34c8d7acdb881ea5b0516406d71344fc4Brian         if (texobj->Target != GL_TEXTURE_RECTANGLE_ARB)
150339e7ec6805e6de8794514c0a935081b5d36d38fBrian            sampler->normalized_coords = 1;
151369eefc34c8d7acdb881ea5b0516406d71344fc4Brian
152339e7ec6805e6de8794514c0a935081b5d36d38fBrian         sampler->lod_bias = st->ctx->Texture.Unit[su].LodBias;
1533837d401cc665eccf079eba5822b1a3eec565b81Brian Paul         sampler->min_lod = MAX2(0.0f, texobj->MinLod);
1543837d401cc665eccf079eba5822b1a3eec565b81Brian Paul         sampler->max_lod = MIN2(texobj->MaxLevel - texobj->BaseLevel,
1553837d401cc665eccf079eba5822b1a3eec565b81Brian Paul                                 texobj->MaxLod);
156cdf99a9fad0fcb080244faa7d32b33b1cfaf6ff7Brian
157216603348c399b58fadf39b972d3f708e82f253bRoland Scheidegger         sampler->border_color[0] = texobj->BorderColor[RCOMP];
158216603348c399b58fadf39b972d3f708e82f253bRoland Scheidegger         sampler->border_color[1] = texobj->BorderColor[GCOMP];
159216603348c399b58fadf39b972d3f708e82f253bRoland Scheidegger         sampler->border_color[2] = texobj->BorderColor[BCOMP];
160216603348c399b58fadf39b972d3f708e82f253bRoland Scheidegger         sampler->border_color[3] = texobj->BorderColor[ACOMP];
161216603348c399b58fadf39b972d3f708e82f253bRoland Scheidegger
162339e7ec6805e6de8794514c0a935081b5d36d38fBrian	 sampler->max_anisotropy = texobj->MaxAnisotropy;
16398ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell         if (sampler->max_anisotropy > 1.0) {
16498ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell            sampler->min_img_filter = PIPE_TEX_FILTER_ANISO;
16598ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell            sampler->mag_img_filter = PIPE_TEX_FILTER_ANISO;
16698ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell         }
167562fdca12de5bbba491fafc7a26d86b23b5f7c93Brian
168a736670219c67a45483f58b07ab9d55095efdbbdBrian         /* only care about ARB_shadow, not SGI shadow */
169a736670219c67a45483f58b07ab9d55095efdbbdBrian         if (texobj->CompareMode == GL_COMPARE_R_TO_TEXTURE) {
170339e7ec6805e6de8794514c0a935081b5d36d38fBrian            sampler->compare_mode = PIPE_TEX_COMPARE_R_TO_TEXTURE;
171339e7ec6805e6de8794514c0a935081b5d36d38fBrian            sampler->compare_func
172a736670219c67a45483f58b07ab9d55095efdbbdBrian               = st_compare_func_to_pipe(texobj->CompareFunc);
173a736670219c67a45483f58b07ab9d55095efdbbdBrian         }
174a736670219c67a45483f58b07ab9d55095efdbbdBrian
1754528287e040415c2071012d02f20979ff995c754Keith Whitwell         st->state.num_samplers = su + 1;
1764528287e040415c2071012d02f20979ff995c754Keith Whitwell
177d78dab126724e6e9d475289a086fb6f85adc3985Brian         /* XXX more sampler state here */
17813682d959ddacde1ce65843aa8c5b43dc9017b32Brian
1790dd79011b9c407191e40c2697c68946f35bc557aBrian         cso_single_sampler(st->cso_context, su, sampler);
1800dd79011b9c407191e40c2697c68946f35bc557aBrian      }
1810dd79011b9c407191e40c2697c68946f35bc557aBrian      else {
1820dd79011b9c407191e40c2697c68946f35bc557aBrian         cso_single_sampler(st->cso_context, su, NULL);
1830dd79011b9c407191e40c2697c68946f35bc557aBrian      }
18413682d959ddacde1ce65843aa8c5b43dc9017b32Brian   }
1854528287e040415c2071012d02f20979ff995c754Keith Whitwell
186339e7ec6805e6de8794514c0a935081b5d36d38fBrian   cso_single_sampler_done(st->cso_context);
18713682d959ddacde1ce65843aa8c5b43dc9017b32Brian}
18813682d959ddacde1ce65843aa8c5b43dc9017b32Brian
18913682d959ddacde1ce65843aa8c5b43dc9017b32Brian
19013682d959ddacde1ce65843aa8c5b43dc9017b32Brianconst struct st_tracked_state st_update_sampler = {
19154507125e735ffa595e252282eaabf38095c21e1Alan Hourihane   "st_update_sampler",					/* name */
19254507125e735ffa595e252282eaabf38095c21e1Alan Hourihane   {							/* dirty */
19354507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      _NEW_TEXTURE,					/* mesa */
19454507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      0,						/* st */
19513682d959ddacde1ce65843aa8c5b43dc9017b32Brian   },
19654507125e735ffa595e252282eaabf38095c21e1Alan Hourihane   update_samplers					/* update */
19713682d959ddacde1ce65843aa8c5b43dc9017b32Brian};
198