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