svga_state_fs.c revision 0bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72c
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" 283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_math.h" 29cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca#include "util/u_bitmask.h" 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_state.h" 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h" 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_tgsi.h" 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_hw_reg.h" 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE int compare_fs_keys( const struct svga_fs_compile_key *a, 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_fs_compile_key *b ) 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 438d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol unsigned keysize_a = svga_fs_key_size( a ); 448d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol unsigned keysize_b = svga_fs_key_size( b ); 458d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol 468d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol if (keysize_a != keysize_b) { 478d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol return (int)(keysize_a - keysize_b); 488d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol } 498d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol return memcmp( a, b, keysize_a ); 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic struct svga_shader_result *search_fs_key( struct svga_fragment_shader *fs, 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_fs_compile_key *key ) 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_shader_result *result = fs->base.results; 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(key); 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for ( ; result; result = result->next) { 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (compare_fs_keys( key, &result->key.fkey ) == 0) 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return result; 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return NULL; 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic enum pipe_error compile_fs( struct svga_context *svga, 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_fragment_shader *fs, 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_fs_compile_key *key, 723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_shader_result **out_result ) 733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_shader_result *result; 75468f270f3fc0efc136d03d0b6022916ddd8ea893Vinson Lee enum pipe_error ret = PIPE_ERROR; 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result = svga_translate_fragment_program( fs, key ); 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (result == NULL) { 793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = PIPE_ERROR_OUT_OF_MEMORY; 803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto fail; 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 83cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca result->id = util_bitmask_add(svga->fs_bm); 841b333453e4998d5db76952aed6caa34d98dfdc7cJosé Fonseca if(result->id == UTIL_BITMASK_INVALID_INDEX) { 851b333453e4998d5db76952aed6caa34d98dfdc7cJosé Fonseca ret = PIPE_ERROR_OUT_OF_MEMORY; 86cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca goto fail; 871b333453e4998d5db76952aed6caa34d98dfdc7cJosé Fonseca } 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_DefineShader(svga->swc, 90cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca result->id, 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3D_SHADERTYPE_PS, 923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result->tokens, 933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result->nr_tokens * sizeof result->tokens[0]); 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret) 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto fail; 963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *out_result = result; 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result->next = fs->base.results; 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz fs->base.results = result; 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_OK; 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzfail: 103cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (result) { 104cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (result->id != UTIL_BITMASK_INVALID_INDEX) 105cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_clear( svga->fs_bm, result->id ); 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_destroy_shader_result( result ); 107cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca } 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* SVGA_NEW_TEXTURE_BINDING 1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_RAST 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_NEED_SWTNL 1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_SAMPLER 1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic int make_fs_key( const struct svga_context *svga, 1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_fs_compile_key *key ) 1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int i; 1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int idx = 0; 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(key, 0, sizeof *key); 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Only need fragment shader fixup for twoside lighting if doing 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * hwtnl. Otherwise the draw module does the whole job for us. 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_SWTNL 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!svga->state.sw.need_swtnl) { 1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* SVGA_NEW_RAST 1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->light_twoside = svga->curr.rast->templ.light_twoside; 1340bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell key->front_ccw = svga->curr.rast->templ.front_ccw; 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 137fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell /* The blend workaround for simulating logicop xor behaviour 138fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * requires that the incoming fragment color be white. This change 139fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * achieves that by creating a varient of the current fragment 140fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * shader that overrides all output colors with 1,1,1,1 141fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * 142fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * This will work for most shaders, including those containing 143fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * TEXKIL and/or depth-write. However, it will break on the 144fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * combination of xor-logicop plus alphatest. 145fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * 146fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * Ultimately, we could implement alphatest in the shader using 147fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * texkil prior to overriding the outgoing fragment color. 148fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * 149fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_BLEND 150fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell */ 151fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell if (svga->curr.blend->need_white_fragments) { 152fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell key->white_fragments = 1; 153fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell } 1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* XXX: want to limit this to the textures that the shader actually 1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * refers to. 1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_TEXTURE_BINDING | SVGA_NEW_SAMPLER 1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 160f6106566081978f663cf08e54bb8908cb58a5316Michal Krol for (i = 0; i < svga->curr.num_sampler_views; i++) { 161f6106566081978f663cf08e54bb8908cb58a5316Michal Krol if (svga->curr.sampler_views[i]) { 1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(svga->curr.sampler[i]); 163f6106566081978f663cf08e54bb8908cb58a5316Michal Krol assert(svga->curr.sampler_views[i]->texture); 164f6106566081978f663cf08e54bb8908cb58a5316Michal Krol key->tex[i].texture_target = svga->curr.sampler_views[i]->texture->target; 1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!svga->curr.sampler[i]->normalized_coords) { 1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].width_height_idx = idx++; 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].unnormalized = TRUE; 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ++key->num_unnormalized_coords; 1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 172f6106566081978f663cf08e54bb8908cb58a5316Michal Krol key->num_textures = svga->curr.num_sampler_views; 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz idx = 0; 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < svga->curr.num_samplers; ++i) { 1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->curr.sampler[i]) { 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].compare_mode = svga->curr.sampler[i]->compare_mode; 1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].compare_func = svga->curr.sampler[i]->compare_func; 1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return 0; 1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic int emit_hw_fs( struct svga_context *svga, 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned dirty ) 1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_shader_result *result = NULL; 1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned id = SVGA3D_INVALID_ID; 1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int ret = 0; 1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 194fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell struct svga_fragment_shader *fs = svga->curr.fs; 195fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell struct svga_fs_compile_key key; 196fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell 1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* SVGA_NEW_BLEND 198fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_TEXTURE_BINDING 199fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_RAST 200fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_NEED_SWTNL 201fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_SAMPLER 2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 203fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell ret = make_fs_key( svga, &key ); 204fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell if (ret) 205fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell return ret; 206fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell 207fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell result = search_fs_key( fs, &key ); 208fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell if (!result) { 209fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell ret = compile_fs( svga, fs, &key, &result ); 2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret) 2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 214fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell assert (result); 215fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell id = result->id; 216fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell 2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(id != SVGA3D_INVALID_ID); 2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 219cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (result != svga->state.hw_draw.fs) { 2208ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca ret = SVGA3D_SetShader(svga->swc, 2218ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca SVGA3D_SHADERTYPE_PS, 2228ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca id ); 2238ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca if (ret) 2248ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca return ret; 2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->dirty |= SVGA_NEW_FS_RESULT; 2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.fs = result; 2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return 0; 2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_tracked_state svga_hw_fs = 2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "fragment shader (hwtnl)", 2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (SVGA_NEW_FS | 2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_TEXTURE_BINDING | 2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_NEED_SWTNL | 2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_RAST | 2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_SAMPLER | 2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_BLEND), 2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz emit_hw_fs 2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 247