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