svga_state_fs.c revision 58ea42b7db72586563914dea6fed9656caaf7678
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) { 7949a6f5e68eeb6b23bb040cfc1f93befc2f1eb35aBrian Paul ret = PIPE_ERROR; /* some problem during translation */ 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]); 945f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 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 */ 1175f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paulstatic enum pipe_error 1185f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paulmake_fs_key(const struct svga_context *svga, 11958ea42b7db72586563914dea6fed9656caaf7678Brian Paul struct svga_fragment_shader *fs, 1205f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul struct svga_fs_compile_key *key) 1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int i; 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int idx = 0; 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(key, 0, sizeof *key); 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Only need fragment shader fixup for twoside lighting if doing 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * hwtnl. Otherwise the draw module does the whole job for us. 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_SWTNL 1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!svga->state.sw.need_swtnl) { 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* SVGA_NEW_RAST 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->light_twoside = svga->curr.rast->templ.light_twoside; 1360bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell key->front_ccw = svga->curr.rast->templ.front_ccw; 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 139fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell /* The blend workaround for simulating logicop xor behaviour 140fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * requires that the incoming fragment color be white. This change 1412bd9b386e6c8f47537c8da50d2f5378b287b3c4fBrian Paul * achieves that by creating a variant of the current fragment 142fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * shader that overrides all output colors with 1,1,1,1 143fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * 144fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * This will work for most shaders, including those containing 145fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * TEXKIL and/or depth-write. However, it will break on the 146fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * combination of xor-logicop plus alphatest. 147fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * 148fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * Ultimately, we could implement alphatest in the shader using 149fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * texkil prior to overriding the outgoing fragment color. 150fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * 151fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_BLEND 152fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell */ 153fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell if (svga->curr.blend->need_white_fragments) { 154fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell key->white_fragments = 1; 155fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell } 1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* XXX: want to limit this to the textures that the shader actually 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * refers to. 1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_TEXTURE_BINDING | SVGA_NEW_SAMPLER 1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 162f6106566081978f663cf08e54bb8908cb58a5316Michal Krol for (i = 0; i < svga->curr.num_sampler_views; i++) { 163f6106566081978f663cf08e54bb8908cb58a5316Michal Krol if (svga->curr.sampler_views[i]) { 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(svga->curr.sampler[i]); 165f6106566081978f663cf08e54bb8908cb58a5316Michal Krol assert(svga->curr.sampler_views[i]->texture); 166f6106566081978f663cf08e54bb8908cb58a5316Michal Krol key->tex[i].texture_target = svga->curr.sampler_views[i]->texture->target; 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!svga->curr.sampler[i]->normalized_coords) { 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].width_height_idx = idx++; 1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].unnormalized = TRUE; 1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ++key->num_unnormalized_coords; 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1729bd15aef865352b9234fedae76617fc51c71e6d5Brian Paul 1739bd15aef865352b9234fedae76617fc51c71e6d5Brian Paul key->tex[i].swizzle_r = svga->curr.sampler_views[i]->swizzle_r; 1749bd15aef865352b9234fedae76617fc51c71e6d5Brian Paul key->tex[i].swizzle_g = svga->curr.sampler_views[i]->swizzle_g; 1759bd15aef865352b9234fedae76617fc51c71e6d5Brian Paul key->tex[i].swizzle_b = svga->curr.sampler_views[i]->swizzle_b; 1769bd15aef865352b9234fedae76617fc51c71e6d5Brian Paul key->tex[i].swizzle_a = svga->curr.sampler_views[i]->swizzle_a; 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 179f6106566081978f663cf08e54bb8908cb58a5316Michal Krol key->num_textures = svga->curr.num_sampler_views; 1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz idx = 0; 1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < svga->curr.num_samplers; ++i) { 1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->curr.sampler[i]) { 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].compare_mode = svga->curr.sampler[i]->compare_mode; 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].compare_func = svga->curr.sampler[i]->compare_func; 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1892f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul /* sprite coord gen state */ 1902f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul for (i = 0; i < svga->curr.num_samplers; ++i) { 1912f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul key->tex[i].sprite_texgen = 1922f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul svga->curr.rast->templ.sprite_coord_enable & (1 << i); 1932f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul } 1942f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul 1952f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul key->sprite_origin_lower_left = (svga->curr.rast->templ.sprite_coord_mode 1962f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul == PIPE_SPRITE_COORD_LOWER_LEFT); 1972f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul 1985f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul return PIPE_OK; 1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2035f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paulstatic enum pipe_error 2045f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paulemit_hw_fs(struct svga_context *svga, unsigned dirty) 2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_shader_result *result = NULL; 2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned id = SVGA3D_INVALID_ID; 2085f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul enum pipe_error ret = PIPE_OK; 2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 210fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell struct svga_fragment_shader *fs = svga->curr.fs; 211fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell struct svga_fs_compile_key key; 212fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell 2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* SVGA_NEW_BLEND 214fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_TEXTURE_BINDING 215fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_RAST 216fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_NEED_SWTNL 217fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_SAMPLER 2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 21958ea42b7db72586563914dea6fed9656caaf7678Brian Paul ret = make_fs_key( svga, fs, &key ); 2205f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 221fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell return ret; 222fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell 223fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell result = search_fs_key( fs, &key ); 224fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell if (!result) { 225fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell ret = compile_fs( svga, fs, &key, &result ); 2265f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 230fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell assert (result); 231fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell id = result->id; 232fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell 2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(id != SVGA3D_INVALID_ID); 2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 235cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (result != svga->state.hw_draw.fs) { 2368ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca ret = SVGA3D_SetShader(svga->swc, 2378ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca SVGA3D_SHADERTYPE_PS, 2388ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca id ); 2395f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 2408ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca return ret; 2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->dirty |= SVGA_NEW_FS_RESULT; 2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.fs = result; 2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2465f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul return PIPE_OK; 2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_tracked_state svga_hw_fs = 2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "fragment shader (hwtnl)", 2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (SVGA_NEW_FS | 2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_TEXTURE_BINDING | 2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_NEED_SWTNL | 2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_RAST | 2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_SAMPLER | 2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_BLEND), 2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz emit_hw_fs 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 263