svga_state_fs.c revision 8d38ef455196e6ddda22536e435638a02a7b48f3
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 263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_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; 753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret; 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); 84cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if(result->id == UTIL_BITMASK_INVALID_INDEX) 85cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca goto fail; 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_DefineShader(svga->swc, 88cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca result->id, 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3D_SHADERTYPE_PS, 903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result->tokens, 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result->nr_tokens * sizeof result->tokens[0]); 923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret) 933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto fail; 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *out_result = result; 963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result->next = fs->base.results; 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz fs->base.results = result; 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_OK; 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzfail: 101cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (result) { 102cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (result->id != UTIL_BITMASK_INVALID_INDEX) 103cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_clear( svga->fs_bm, result->id ); 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_destroy_shader_result( result ); 105cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca } 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* The blend workaround for simulating logicop xor behaviour requires 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * that the incoming fragment color be white. This change achieves 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * that by hooking up a hard-wired fragment shader that just emits 1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * color 1,1,1,1 1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * This is a slightly incomplete solution as it assumes that the 1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * actual bound shader has no other effects beyond generating a 1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * fragment color. In particular shaders containing TEXKIL and/or 1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * depth-write will not have the correct behaviour, nor will those 1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * expecting to use alphatest. 1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * These are avoidable issues, but they are not much worse than the 1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * unavoidable ones associated with this technique, so it's not clear 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * how much effort should be expended trying to resolve them - the 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ultimate result will still not be correct in most cases. 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Shader below was generated with: 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_DEBUG=tgsi ./mesa/progs/fp/fp-tri white.txt 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic int emit_white_fs( struct svga_context *svga ) 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 130cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca int ret = PIPE_ERROR; 1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* ps_3_0 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * def c0, 1.000000, 0.000000, 0.000000, 1.000000 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * mov oC0, c0.x 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * end 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz static const unsigned white_tokens[] = { 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 0xffff0300, 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 0x05000051, 1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 0xa00f0000, 1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 0x3f800000, 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 0x00000000, 1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 0x00000000, 1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 0x3f800000, 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 0x02000001, 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 0x800f0800, 1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 0xa0000000, 1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 0x0000ffff, 1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz }; 1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 151cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca assert(SVGA3D_INVALID_ID == UTIL_BITMASK_INVALID_INDEX); 152cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca svga->state.white_fs_id = util_bitmask_add(svga->fs_bm); 153cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if(svga->state.white_fs_id == SVGA3D_INVALID_ID) 154cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca goto no_fs_id; 155cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca 1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_DefineShader(svga->swc, 157cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca svga->state.white_fs_id, 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3D_SHADERTYPE_PS, 1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz white_tokens, 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sizeof(white_tokens)); 1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret) 162cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca goto no_definition; 1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return 0; 165cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca 166cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonsecano_definition: 167cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_clear(svga->fs_bm, svga->state.white_fs_id); 168cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca svga->state.white_fs_id = SVGA3D_INVALID_ID; 169cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonsecano_fs_id: 170cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca return ret; 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* SVGA_NEW_TEXTURE_BINDING 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_RAST 1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_NEED_SWTNL 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_SAMPLER 1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic int make_fs_key( const struct svga_context *svga, 1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_fs_compile_key *key ) 1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int i; 1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int idx = 0; 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(key, 0, sizeof *key); 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Only need fragment shader fixup for twoside lighting if doing 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * hwtnl. Otherwise the draw module does the whole job for us. 1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_SWTNL 1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!svga->state.sw.need_swtnl) { 1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* SVGA_NEW_RAST 1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->light_twoside = svga->curr.rast->templ.light_twoside; 1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->front_cw = (svga->curr.rast->templ.front_winding == 1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz PIPE_WINDING_CW); 1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* XXX: want to limit this to the textures that the shader actually 2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * refers to. 2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_TEXTURE_BINDING | SVGA_NEW_SAMPLER 2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < svga->curr.num_textures; i++) { 2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->curr.texture[i]) { 2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(svga->curr.sampler[i]); 2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].texture_target = svga->curr.texture[i]->target; 2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!svga->curr.sampler[i]->normalized_coords) { 2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].width_height_idx = idx++; 2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].unnormalized = TRUE; 2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ++key->num_unnormalized_coords; 2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->num_textures = svga->curr.num_textures; 2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz idx = 0; 2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < svga->curr.num_samplers; ++i) { 2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->curr.sampler[i]) { 2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].compare_mode = svga->curr.sampler[i]->compare_mode; 2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz key->tex[i].compare_func = svga->curr.sampler[i]->compare_func; 2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return 0; 2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic int emit_hw_fs( struct svga_context *svga, 2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned dirty ) 2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_shader_result *result = NULL; 2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned id = SVGA3D_INVALID_ID; 2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int ret = 0; 2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* SVGA_NEW_BLEND 2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->curr.blend->need_white_fragments) { 2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->state.white_fs_id == SVGA3D_INVALID_ID) { 2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = emit_white_fs( svga ); 2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret) 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz id = svga->state.white_fs_id; 2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else { 2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_fragment_shader *fs = svga->curr.fs; 2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_fs_compile_key key; 2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* SVGA_NEW_TEXTURE_BINDING 2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_RAST 2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_NEED_SWTNL 2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_NEW_SAMPLER 2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = make_fs_key( svga, &key ); 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret) 2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result = search_fs_key( fs, &key ); 2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!result) { 2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = compile_fs( svga, fs, &key, &result ); 2653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret) 2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 2673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert (result); 2703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz id = result->id; 2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(id != SVGA3D_INVALID_ID); 2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 275cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (result != svga->state.hw_draw.fs) { 2768ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca ret = SVGA3D_SetShader(svga->swc, 2778ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca SVGA3D_SHADERTYPE_PS, 2788ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca id ); 2798ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca if (ret) 2808ebef37c7ba67c4449367b95821293176a0a370bJosé Fonseca return ret; 2813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->dirty |= SVGA_NEW_FS_RESULT; 2833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.fs = result; 2843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return 0; 2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_tracked_state svga_hw_fs = 2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "fragment shader (hwtnl)", 2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (SVGA_NEW_FS | 2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_TEXTURE_BINDING | 2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_NEED_SWTNL | 2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_RAST | 2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_SAMPLER | 2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_BLEND), 2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz emit_hw_fs 2993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 3003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 303