13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/********************************************************** 23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2008-2009 VMware, Inc. All rights reserved. 33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person 53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation 63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without 73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy, 83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies 93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is 103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions: 113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be 133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software. 143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE. 233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/ 253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2628486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_defines.h" 281a35fde7c8571c999147bdaeed462b294a86923aBrian Paul#include "util/u_format.h" 293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_math.h" 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h" 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "tgsi/tgsi_parse.h" 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 34287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_resource_texture.h" 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_debug.h" 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE unsigned 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztranslate_wrap_mode(unsigned wrap) 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz switch (wrap) { 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_WRAP_REPEAT: 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return SVGA3D_TEX_ADDRESS_WRAP; 443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_WRAP_CLAMP: 463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return SVGA3D_TEX_ADDRESS_CLAMP; 473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_WRAP_CLAMP_TO_EDGE: 493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Unfortunately SVGA3D_TEX_ADDRESS_EDGE not respected by 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * hardware. 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return SVGA3D_TEX_ADDRESS_CLAMP; 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_WRAP_CLAMP_TO_BORDER: 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return SVGA3D_TEX_ADDRESS_BORDER; 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_WRAP_MIRROR_REPEAT: 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return SVGA3D_TEX_ADDRESS_MIRROR; 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_WRAP_MIRROR_CLAMP: 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE: 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER: 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return SVGA3D_TEX_ADDRESS_MIRRORONCE; 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz default: 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(0); 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return SVGA3D_TEX_ADDRESS_WRAP; 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE unsigned translate_img_filter( unsigned filter ) 723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz switch (filter) { 743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_FILTER_NEAREST: return SVGA3D_TEX_FILTER_NEAREST; 753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_FILTER_LINEAR: return SVGA3D_TEX_FILTER_LINEAR; 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz default: 773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(0); 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return SVGA3D_TEX_FILTER_NEAREST; 793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE unsigned translate_mip_filter( unsigned filter ) 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz switch (filter) { 853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_MIPFILTER_NONE: return SVGA3D_TEX_FILTER_NONE; 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_MIPFILTER_NEAREST: return SVGA3D_TEX_FILTER_NEAREST; 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz case PIPE_TEX_MIPFILTER_LINEAR: return SVGA3D_TEX_FILTER_LINEAR; 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz default: 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(0); 903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return SVGA3D_TEX_FILTER_NONE; 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void * 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_create_sampler_state(struct pipe_context *pipe, 963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct pipe_sampler_state *sampler) 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context(pipe); 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_sampler_state *cso = CALLOC_STRUCT( svga_sampler_state ); 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1016b745a4e245305aae7b41b246c853a273a397673Brian Paul if (!cso) 1026b745a4e245305aae7b41b246c853a273a397673Brian Paul return NULL; 1036b745a4e245305aae7b41b246c853a273a397673Brian Paul 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->mipfilter = translate_mip_filter(sampler->min_mip_filter); 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->magfilter = translate_img_filter( sampler->mag_img_filter ); 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->minfilter = translate_img_filter( sampler->min_img_filter ); 107ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger cso->aniso_level = MAX2( sampler->max_anisotropy, 1 ); 108ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger if(sampler->max_anisotropy) 109f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri cso->magfilter = cso->minfilter = SVGA3D_TEX_FILTER_ANISOTROPIC; 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->lod_bias = sampler->lod_bias; 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->addressu = translate_wrap_mode(sampler->wrap_s); 1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->addressv = translate_wrap_mode(sampler->wrap_t); 1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->addressw = translate_wrap_mode(sampler->wrap_r); 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->normalized_coords = sampler->normalized_coords; 1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->compare_mode = sampler->compare_mode; 1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->compare_func = sampler->compare_func; 1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 1199f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie uint32 r = float_to_ubyte(sampler->border_color.f[0]); 1209f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie uint32 g = float_to_ubyte(sampler->border_color.f[1]); 1219f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie uint32 b = float_to_ubyte(sampler->border_color.f[2]); 1229f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie uint32 a = float_to_ubyte(sampler->border_color.f[3]); 1236b1193820f8985e2a7182fcc983fbaf17802e139José Fonseca 1246b1193820f8985e2a7182fcc983fbaf17802e139José Fonseca cso->bordercolor = (a << 24) | (r << 16) | (g << 8) | b; 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* No SVGA3D support for: 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * - min/max LOD clamping 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->min_lod = 0; 1315abcd198b8e644c0d97c6766c6707e20fe22f0fbBrian Paul cso->view_min_lod = MAX2((int) (sampler->min_lod + 0.5), 0); 1325abcd198b8e644c0d97c6766c6707e20fe22f0fbBrian Paul cso->view_max_lod = MAX2((int) (sampler->max_lod + 0.5), 0); 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Use min_mipmap */ 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->debug.use_min_mipmap) { 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (cso->view_min_lod == cso->view_max_lod) { 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->min_lod = cso->view_min_lod; 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->view_min_lod = 0; 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->view_max_lod = 1000; /* Just a high number */ 1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->mipfilter = SVGA3D_TEX_FILTER_NONE; 1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_DBG(DEBUG_VIEWS, "min %u, view(min %u, max %u) lod, mipfilter %s\n", 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->min_lod, cso->view_min_lod, cso->view_max_lod, 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz cso->mipfilter == SVGA3D_TEX_FILTER_NONE ? "SVGA3D_TEX_FILTER_NONE" : "SOMETHING"); 1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return cso; 1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1515026841d5edc1f3c94e9057f7b331d4f56f0199aBrian Paulstatic void 152bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paulsvga_bind_sampler_states(struct pipe_context *pipe, 153bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul unsigned shader, 154bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul unsigned start, 155bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul unsigned num, 156bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul void **samplers) 1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context(pipe); 1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned i; 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 161bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul assert(shader < PIPE_SHADER_TYPES); 162bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul assert(start + num <= PIPE_MAX_SAMPLERS); 163bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul 164bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul /* we only support fragment shader samplers at this time */ 165bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul if (shader != PIPE_SHADER_FRAGMENT) 166bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul return; 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Check for no-op */ 169bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul if (start + num <= svga->curr.num_samplers && 170bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul !memcmp(svga->curr.sampler + start, samplers, num * sizeof(void *))) { 1719b348d0ed125a22be3f318ac60cef6f201edfdabMichal Krol if (0) debug_printf("sampler noop\n"); 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return; 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < num; i++) 176bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul svga->curr.sampler[start + i] = samplers[i]; 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 178bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul /* find highest non-null sampler_views[] entry */ 179bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul { 180bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul unsigned j = MAX2(svga->curr.num_samplers, start + num); 181bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul while (j > 0 && svga->curr.sampler[j - 1] == NULL) 182bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul j--; 183bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul svga->curr.num_samplers = j; 184bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul } 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->dirty |= SVGA_NEW_SAMPLER; 1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 189bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul 190bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paulstatic void 191bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paulsvga_bind_fragment_sampler_states(struct pipe_context *pipe, 192bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul unsigned num, void **sampler) 193bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul{ 194bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul svga_bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT, 0, num, sampler); 195bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul} 196bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul 197bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul 1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_delete_sampler_state(struct pipe_context *pipe, 1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz void *sampler) 2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE(sampler); 2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 205ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krolstatic struct pipe_sampler_view * 206ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krolsvga_create_sampler_view(struct pipe_context *pipe, 207287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *texture, 208ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol const struct pipe_sampler_view *templ) 209ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol{ 210ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol struct pipe_sampler_view *view = CALLOC_STRUCT(pipe_sampler_view); 211ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol 212530b9910c2fd25344e6d28b6d9aa0eaad31618e7Michal Krol if (view) { 213530b9910c2fd25344e6d28b6d9aa0eaad31618e7Michal Krol *view = *templ; 214530b9910c2fd25344e6d28b6d9aa0eaad31618e7Michal Krol view->reference.count = 1; 215530b9910c2fd25344e6d28b6d9aa0eaad31618e7Michal Krol view->texture = NULL; 216287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&view->texture, texture); 217530b9910c2fd25344e6d28b6d9aa0eaad31618e7Michal Krol view->context = pipe; 218530b9910c2fd25344e6d28b6d9aa0eaad31618e7Michal Krol } 219ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol 220ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol return view; 221ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol} 222ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol 223ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol 224ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krolstatic void 225ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krolsvga_sampler_view_destroy(struct pipe_context *pipe, 226ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol struct pipe_sampler_view *view) 227ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol{ 228287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&view->texture, NULL); 229ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol FREE(view); 230ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol} 231ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol 2325026841d5edc1f3c94e9057f7b331d4f56f0199aBrian Paulstatic void 233bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paulsvga_set_sampler_views(struct pipe_context *pipe, 234bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul unsigned shader, 235bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul unsigned start, 236bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul unsigned num, 237bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul struct pipe_sampler_view **views) 2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context(pipe); 2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned flag_1d = 0; 2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned flag_srgb = 0; 2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz uint i; 2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 244bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul assert(shader < PIPE_SHADER_TYPES); 245bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul assert(start + num <= Elements(svga->curr.sampler_views)); 246bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul 247bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul /* we only support fragment shader sampler views at this time */ 248bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul if (shader != PIPE_SHADER_FRAGMENT) 249bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul return; 2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Check for no-op */ 252bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul if (start + num <= svga->curr.num_sampler_views && 253bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul !memcmp(svga->curr.sampler_views + start, views, 254bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul num * sizeof(struct pipe_sampler_view *))) { 2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (0) debug_printf("texture noop\n"); 2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return; 2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < num; i++) { 260bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul if (svga->curr.sampler_views[start + i] != views[i]) { 261810584270d5b34f6a130eac06a5529d616d82b0aBrian Paul /* Note: we're using pipe_sampler_view_release() here to work around 262810584270d5b34f6a130eac06a5529d616d82b0aBrian Paul * a possible crash when the old view belongs to another context that 263810584270d5b34f6a130eac06a5529d616d82b0aBrian Paul * was already destroyed. 264810584270d5b34f6a130eac06a5529d616d82b0aBrian Paul */ 265bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul pipe_sampler_view_release(pipe, &svga->curr.sampler_views[start + i]); 266bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul pipe_sampler_view_reference(&svga->curr.sampler_views[start + i], 267bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul views[i]); 268810584270d5b34f6a130eac06a5529d616d82b0aBrian Paul } 2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 270f6106566081978f663cf08e54bb8908cb58a5316Michal Krol if (!views[i]) 2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz continue; 2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2731a35fde7c8571c999147bdaeed462b294a86923aBrian Paul if (util_format_is_srgb(views[i]->format)) 274bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul flag_srgb |= 1 << (start + i); 2753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 276f6106566081978f663cf08e54bb8908cb58a5316Michal Krol if (views[i]->texture->target == PIPE_TEXTURE_1D) 277bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul flag_1d |= 1 << (start + i); 2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 280bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul /* find highest non-null sampler_views[] entry */ 281bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul { 282bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul unsigned j = MAX2(svga->curr.num_sampler_views, start + num); 283bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul while (j > 0 && svga->curr.sampler_views[j - 1] == NULL) 284bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul j--; 285bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul svga->curr.num_sampler_views = j; 286bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul } 2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->dirty |= SVGA_NEW_TEXTURE_BINDING; 2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (flag_srgb != svga->curr.tex_flags.flag_srgb || 2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz flag_1d != svga->curr.tex_flags.flag_1d) 2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->dirty |= SVGA_NEW_TEXTURE_FLAGS; 2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->curr.tex_flags.flag_1d = flag_1d; 2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->curr.tex_flags.flag_srgb = flag_srgb; 2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 300bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paulstatic void 301bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paulsvga_set_fragment_sampler_views(struct pipe_context *pipe, 302bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul unsigned num, 303bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul struct pipe_sampler_view **views) 304bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul{ 305bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul svga_set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num, views); 306bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul} 307bd3733c0be174f947dd729e5fd987ea3a9566c27Brian Paul 3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid svga_init_sampler_functions( struct svga_context *svga ) 3103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 3113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.create_sampler_state = svga_create_sampler_state; 3125026841d5edc1f3c94e9057f7b331d4f56f0199aBrian Paul svga->pipe.bind_fragment_sampler_states = svga_bind_fragment_sampler_states; 3133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.delete_sampler_state = svga_delete_sampler_state; 3145026841d5edc1f3c94e9057f7b331d4f56f0199aBrian Paul svga->pipe.set_fragment_sampler_views = svga_set_fragment_sampler_views; 315ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol svga->pipe.create_sampler_view = svga_create_sampler_view; 316ad230a1fb12640ac515096d892b58e2bfdb995e7Michal Krol svga->pipe.sampler_view_destroy = svga_sampler_view_destroy; 3173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 3183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 321