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" 298a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul#include "util/u_memory.h" 30cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca#include "util/u_bitmask.h" 318a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul#include "tgsi/tgsi_ureg.h" 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_state.h" 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h" 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_tgsi.h" 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_hw_reg.h" 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE int compare_fs_keys( const struct svga_fs_compile_key *a, 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_fs_compile_key *b ) 443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 458d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol unsigned keysize_a = svga_fs_key_size( a ); 468d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol unsigned keysize_b = svga_fs_key_size( b ); 478d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol 488d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol if (keysize_a != keysize_b) { 498d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol return (int)(keysize_a - keysize_b); 508d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol } 518d38ef455196e6ddda22536e435638a02a7b48f3Michal Krol return memcmp( a, b, keysize_a ); 523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic struct svga_shader_result *search_fs_key( struct svga_fragment_shader *fs, 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_fs_compile_key *key ) 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_shader_result *result = fs->base.results; 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(key); 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for ( ; result; result = result->next) { 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (compare_fs_keys( key, &result->key.fkey ) == 0) 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return result; 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return NULL; 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 718a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul/** 728a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul * If we fail to compile a fragment shader (because it uses too many 738a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul * registers, for example) we'll use a dummy/fallback shader that 748a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul * simply emits a constant color. 758a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul */ 768a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paulstatic const struct tgsi_token * 778a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paulget_dummy_fragment_shader(void) 788a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul{ 798a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul static const float red[4] = { 1.0, 0.0, 0.0, 0.0 }; 808a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul struct ureg_program *ureg; 818a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul const struct tgsi_token *tokens; 828a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul struct ureg_src src; 838a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul struct ureg_dst dst; 848a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul unsigned num_tokens; 858a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul 868a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT); 878a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul if (!ureg) 888a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul return NULL; 898a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul 908a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0); 918a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul src = ureg_DECL_immediate(ureg, red, 4); 928a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul ureg_MOV(ureg, dst, src); 938a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul ureg_END(ureg); 948a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul 958a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul tokens = ureg_get_tokens(ureg, &num_tokens); 968a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul 978a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul ureg_destroy(ureg); 988a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul 998a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul return tokens; 1008a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul} 1018a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul 1028a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul 1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic enum pipe_error compile_fs( struct svga_context *svga, 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_fragment_shader *fs, 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_fs_compile_key *key, 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_shader_result **out_result ) 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_shader_result *result; 109468f270f3fc0efc136d03d0b6022916ddd8ea893Vinson Lee enum pipe_error ret = PIPE_ERROR; 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result = svga_translate_fragment_program( fs, key ); 1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (result == NULL) { 1138a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul /* some problem during translation, try the dummy shader */ 1148a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul const struct tgsi_token *dummy = get_dummy_fragment_shader(); 1158a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul if (!dummy) { 1168a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul ret = PIPE_ERROR_OUT_OF_MEMORY; 1178a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul goto fail; 1188a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul } 1198a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul debug_printf("Failed to compile fragment shader, using dummy shader instead.\n"); 1208a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul FREE((void *) fs->base.tokens); 1218a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul fs->base.tokens = dummy; 1228a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul result = svga_translate_fragment_program(fs, key); 1238a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul if (result == NULL) { 1248a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul ret = PIPE_ERROR; 1258a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul goto fail; 1268a9cad6384c61670e96165ad8c5f6ade927c6fa0Brian Paul } 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 129cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca result->id = util_bitmask_add(svga->fs_bm); 1301b333453e4998d5db76952aed6caa34d98dfdc7cJosé Fonseca if(result->id == UTIL_BITMASK_INVALID_INDEX) { 1311b333453e4998d5db76952aed6caa34d98dfdc7cJosé Fonseca ret = PIPE_ERROR_OUT_OF_MEMORY; 132cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca goto fail; 1331b333453e4998d5db76952aed6caa34d98dfdc7cJosé Fonseca } 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_DefineShader(svga->swc, 136cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca result->id, 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3D_SHADERTYPE_PS, 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result->tokens, 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result->nr_tokens * sizeof result->tokens[0]); 1405f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto fail; 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *out_result = result; 1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result->next = fs->base.results; 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz fs->base.results = result; 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_OK; 1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzfail: 149cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (result) { 150cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (result->id != UTIL_BITMASK_INVALID_INDEX) 151cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_clear( svga->fs_bm, result->id ); 1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_destroy_shader_result( result ); 153cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca } 1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* SVGA_NEW_TEXTURE_BINDING 1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_RAST 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_NEED_SWTNL 1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_SAMPLER 1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1635f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paulstatic enum pipe_error 1645f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paulmake_fs_key(const struct svga_context *svga, 16558ea42b7db72586563914dea6fed9656caaf7678Brian Paul struct svga_fragment_shader *fs, 1665f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul struct svga_fs_compile_key *key) 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int i; 1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int idx = 0; 1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(key, 0, sizeof *key); 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Only need fragment shader fixup for twoside lighting if doing 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * hwtnl. Otherwise the draw module does the whole job for us. 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_SWTNL 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!svga->state.sw.need_swtnl) { 1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* SVGA_NEW_RAST 1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->light_twoside = svga->curr.rast->templ.light_twoside; 1820bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell key->front_ccw = svga->curr.rast->templ.front_ccw; 1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 185fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell /* The blend workaround for simulating logicop xor behaviour 186fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * requires that the incoming fragment color be white. This change 1872bd9b386e6c8f47537c8da50d2f5378b287b3c4fBrian Paul * achieves that by creating a variant of the current fragment 188fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * shader that overrides all output colors with 1,1,1,1 189fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * 190fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * This will work for most shaders, including those containing 191fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * TEXKIL and/or depth-write. However, it will break on the 192fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * combination of xor-logicop plus alphatest. 193fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * 194fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * Ultimately, we could implement alphatest in the shader using 195fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * texkil prior to overriding the outgoing fragment color. 196fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * 197fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_BLEND 198fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell */ 199fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell if (svga->curr.blend->need_white_fragments) { 200fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell key->white_fragments = 1; 201fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell } 2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* XXX: want to limit this to the textures that the shader actually 2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * refers to. 2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_TEXTURE_BINDING | SVGA_NEW_SAMPLER 2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 208f6106566081978f663cf08e54bb8908cb58a5316Michal Krol for (i = 0; i < svga->curr.num_sampler_views; i++) { 209f6106566081978f663cf08e54bb8908cb58a5316Michal Krol if (svga->curr.sampler_views[i]) { 2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(svga->curr.sampler[i]); 211f6106566081978f663cf08e54bb8908cb58a5316Michal Krol assert(svga->curr.sampler_views[i]->texture); 212f6106566081978f663cf08e54bb8908cb58a5316Michal Krol key->tex[i].texture_target = svga->curr.sampler_views[i]->texture->target; 2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!svga->curr.sampler[i]->normalized_coords) { 2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].width_height_idx = idx++; 2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].unnormalized = TRUE; 2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ++key->num_unnormalized_coords; 2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2189bd15aef865352b9234fedae76617fc51c71e6d5Brian Paul 2199bd15aef865352b9234fedae76617fc51c71e6d5Brian Paul key->tex[i].swizzle_r = svga->curr.sampler_views[i]->swizzle_r; 2209bd15aef865352b9234fedae76617fc51c71e6d5Brian Paul key->tex[i].swizzle_g = svga->curr.sampler_views[i]->swizzle_g; 2219bd15aef865352b9234fedae76617fc51c71e6d5Brian Paul key->tex[i].swizzle_b = svga->curr.sampler_views[i]->swizzle_b; 2229bd15aef865352b9234fedae76617fc51c71e6d5Brian Paul key->tex[i].swizzle_a = svga->curr.sampler_views[i]->swizzle_a; 2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 225f6106566081978f663cf08e54bb8908cb58a5316Michal Krol key->num_textures = svga->curr.num_sampler_views; 2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz idx = 0; 2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < svga->curr.num_samplers; ++i) { 2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->curr.sampler[i]) { 2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].compare_mode = svga->curr.sampler[i]->compare_mode; 2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].compare_func = svga->curr.sampler[i]->compare_func; 2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2352f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul /* sprite coord gen state */ 2362f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul for (i = 0; i < svga->curr.num_samplers; ++i) { 2372f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul key->tex[i].sprite_texgen = 2382f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul svga->curr.rast->templ.sprite_coord_enable & (1 << i); 2392f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul } 2402f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul 2412f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul key->sprite_origin_lower_left = (svga->curr.rast->templ.sprite_coord_mode 2422f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul == PIPE_SPRITE_COORD_LOWER_LEFT); 2432f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul 2445f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul return PIPE_OK; 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2495f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paulstatic enum pipe_error 2505f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paulemit_hw_fs(struct svga_context *svga, unsigned dirty) 2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_shader_result *result = NULL; 2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned id = SVGA3D_INVALID_ID; 2545f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul enum pipe_error ret = PIPE_OK; 2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 256fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell struct svga_fragment_shader *fs = svga->curr.fs; 257fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell struct svga_fs_compile_key key; 258fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* SVGA_NEW_BLEND 260fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_TEXTURE_BINDING 261fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_RAST 262fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_NEED_SWTNL 263fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell * SVGA_NEW_SAMPLER 2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 26558ea42b7db72586563914dea6fed9656caaf7678Brian Paul ret = make_fs_key( svga, fs, &key ); 2665f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 267fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell return ret; 268fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell 269fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell result = search_fs_key( fs, &key ); 270fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell if (!result) { 271fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell ret = compile_fs( svga, fs, &key, &result ); 2725f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 276fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell assert (result); 277fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell id = result->id; 278fc3efccdc67390847fc544f97dbdb1826442ae9aKeith Whitwell 2793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(id != SVGA3D_INVALID_ID); 2803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 281cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (result != svga->state.hw_draw.fs) { 2828ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca ret = SVGA3D_SetShader(svga->swc, 2838ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca SVGA3D_SHADERTYPE_PS, 2848ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca id ); 2855f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 2868ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca return ret; 2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->dirty |= SVGA_NEW_FS_RESULT; 2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.fs = result; 2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2925f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul return PIPE_OK; 2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_tracked_state svga_hw_fs = 2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "fragment shader (hwtnl)", 2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (SVGA_NEW_FS | 2993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_TEXTURE_BINDING | 3003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_NEED_SWTNL | 3013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_RAST | 3023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_SAMPLER | 3033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_BLEND), 3043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz emit_hw_fs 3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 309