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
273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_compiler.h"
283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_shader_tokens.h"
293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_defines.h"
303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "tgsi/tgsi_parse.h"
313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "tgsi/tgsi_dump.h"
323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "tgsi/tgsi_scan.h"
3358ea42b7db72586563914dea6fed9656caaf7678Brian Paul#include "util/u_math.h"
343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h"
35cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca#include "util/u_bitmask.h"
363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
37178407f33c413cbe7434597b2129abde90041b6bJosé Fonseca#include "svgadump/svga_shader_dump.h"
383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h"
40e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul#include "svga_shader.h"
413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_tgsi.h"
423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_tgsi_emit.h"
433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_debug.h"
443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_hw_reg.h"
463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga3d_shaderdefs.h"
473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Sinkhole used only in error conditions.
503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic char err_buf[128];
523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
542e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paulstatic boolean
552e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paulsvga_shader_expand(struct svga_shader_emitter *emit)
563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   char *new_buf;
583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   unsigned newsize = emit->size * 2;
593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
602e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul   if (emit->buf != err_buf)
613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      new_buf = REALLOC(emit->buf, emit->size, newsize);
623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   else
633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      new_buf = NULL;
643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6513eb5f596bc8ece3d1805b388aa53917e6158d7bEdward O'Callaghan   if (!new_buf) {
663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      emit->ptr = err_buf;
673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      emit->buf = err_buf;
683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      emit->size = sizeof(err_buf);
693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return FALSE;
703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit->size = newsize;
733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit->ptr = new_buf + (emit->ptr - emit->buf);
743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit->buf = new_buf;
753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return TRUE;
762e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul}
772e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul
783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
79a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean
802e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paulreserve(struct svga_shader_emitter *emit, unsigned nr_dwords)
813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (emit->ptr - emit->buf + nr_dwords * sizeof(unsigned) >= emit->size) {
832e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul      if (!svga_shader_expand(emit)) {
843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         return FALSE;
852e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul      }
863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return TRUE;
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
912e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul
922e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paulboolean
932e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paulsvga_shader_emit_dword(struct svga_shader_emitter * emit, unsigned dword)
943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (!reserve(emit, 1))
963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return FALSE;
973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
982e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul   *(unsigned *) emit->ptr = dword;
993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit->ptr += sizeof dword;
1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return TRUE;
1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1032e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul
1042e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paulboolean
1052e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paulsvga_shader_emit_dwords(struct svga_shader_emitter * emit,
1062e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul                        const unsigned *dwords, unsigned nr)
1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (!reserve(emit, nr))
1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return FALSE;
1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1112e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul   memcpy(emit->ptr, dwords, nr * sizeof *dwords);
1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit->ptr += nr * sizeof *dwords;
1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return TRUE;
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1162e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul
1172e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paulboolean
1182e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paulsvga_shader_emit_opcode(struct svga_shader_emitter * emit, unsigned opcode)
1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dShaderInstToken *here;
1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (!reserve(emit, 1))
1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return FALSE;
1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1252e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul   here = (SVGA3dShaderInstToken *) emit->ptr;
1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   here->value = opcode;
1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (emit->insn_offset) {
1292e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul      SVGA3dShaderInstToken *prev =
1302e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul         (SVGA3dShaderInstToken *) (emit->buf + emit->insn_offset);
1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      prev->size = (here - prev) - 1;
1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
1332e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul
1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit->insn_offset = emit->ptr - emit->buf;
1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit->ptr += sizeof(unsigned);
1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return TRUE;
1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1402e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paulstatic boolean
1412e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paulsvga_shader_emit_header(struct svga_shader_emitter *emit)
1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dShaderVersion header;
1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1452e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul   memset(&header, 0, sizeof header);
1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   switch (emit->unit) {
1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_SHADER_FRAGMENT:
14994b219b9e2c20711078b1628cf1fa599a29bf67fBrian Paul      header.value = SVGA3D_PS_30;
1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      break;
1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_SHADER_VERTEX:
15294b219b9e2c20711078b1628cf1fa599a29bf67fBrian Paul      header.value = SVGA3D_VS_30;
1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      break;
1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
1552e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul
1562e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul   return svga_shader_emit_dword(emit, header.value);
1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
16058ea42b7db72586563914dea6fed9656caaf7678Brian Paul/**
1612e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul * Parse TGSI shader and translate to SVGA/DX9 serialized
1622e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul * representation.
1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * In this function SVGA shader is emitted to an in-memory buffer that
1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * can be dynamically grown.  Once we've finished and know how large
1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * it is, it will be copied to a hardware buffer for upload.
1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
168e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paulstruct svga_shader_variant *
1698d0d5dca5bd076ef363d3e923e6473916f3a9d35Brian Paulsvga_tgsi_vgpu9_translate(struct svga_context *svga,
1708d0d5dca5bd076ef363d3e923e6473916f3a9d35Brian Paul                          const struct svga_shader *shader,
171e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                          const struct svga_compile_key *key, unsigned unit)
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1732a30379dcdb9f643d97ba48811fddf90484a84f2Brian Paul   struct svga_shader_variant *variant = NULL;
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_shader_emitter emit;
1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1762e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee   SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_TGSIVGPU9TRANSLATE);
1772e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee
1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&emit, 0, sizeof(emit));
1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit.size = 1024;
1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit.buf = MALLOC(emit.size);
1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (emit.buf == NULL) {
1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      goto fail;
1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit.ptr = emit.buf;
1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit.unit = unit;
188ba4979810fe072bcd2a4ad110988837a7e542744Brian Paul   emit.key = *key;
1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1902e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul   tgsi_scan_shader(shader->tokens, &emit.info);
1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit.imm_start = emit.info.file_max[TGSI_FILE_CONSTANT] + 1;
1932e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul
1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (unit == PIPE_SHADER_FRAGMENT)
195e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      emit.imm_start += key->num_unnormalized_coords;
1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (unit == PIPE_SHADER_VERTEX) {
198e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      emit.imm_start += key->vs.need_prescale ? 2 : 0;
1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2012e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul   emit.nr_hw_float_const =
2022e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul      (emit.imm_start + emit.info.file_max[TGSI_FILE_IMMEDIATE] + 1);
2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit.nr_hw_temp = emit.info.file_max[TGSI_FILE_TEMPORARY] + 1;
2052e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul
2069b3d87b0924a3d19b99b2ceb2ae55dd74c9088a7Brian Paul   if (emit.nr_hw_temp >= SVGA3D_TEMPREG_MAX) {
2072e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul      debug_printf("svga: too many temporary registers (%u)\n",
2082e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul                   emit.nr_hw_temp);
209f12f67c00a5a75ec58bef14f3cecda6c4c685727Brian Paul      goto fail;
2109b3d87b0924a3d19b99b2ceb2ae55dd74c9088a7Brian Paul   }
211f12f67c00a5a75ec58bef14f3cecda6c4c685727Brian Paul
2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   emit.in_main_func = TRUE;
2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2142e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul   if (!svga_shader_emit_header(&emit)) {
2159b3d87b0924a3d19b99b2ceb2ae55dd74c9088a7Brian Paul      debug_printf("svga: emit header failed\n");
2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      goto fail;
2179b3d87b0924a3d19b99b2ceb2ae55dd74c9088a7Brian Paul   }
2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2192e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul   if (!svga_shader_emit_instructions(&emit, shader->tokens)) {
2209b3d87b0924a3d19b99b2ceb2ae55dd74c9088a7Brian Paul      debug_printf("svga: emit instructions failed\n");
2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      goto fail;
2229b3d87b0924a3d19b99b2ceb2ae55dd74c9088a7Brian Paul   }
2239b3d87b0924a3d19b99b2ceb2ae55dd74c9088a7Brian Paul
224f413f1a17c506d5d4474a1baa0556a9e9f554c63Brian Paul   variant = svga_new_shader_variant(svga);
22513eb5f596bc8ece3d1805b388aa53917e6158d7bEdward O'Callaghan   if (!variant)
2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      goto fail;
2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2282a30379dcdb9f643d97ba48811fddf90484a84f2Brian Paul   variant->shader = shader;
2292a30379dcdb9f643d97ba48811fddf90484a84f2Brian Paul   variant->tokens = (const unsigned *) emit.buf;
2302a30379dcdb9f643d97ba48811fddf90484a84f2Brian Paul   variant->nr_tokens = (emit.ptr - emit.buf) / sizeof(unsigned);
2312a30379dcdb9f643d97ba48811fddf90484a84f2Brian Paul   memcpy(&variant->key, key, sizeof(*key));
2322a30379dcdb9f643d97ba48811fddf90484a84f2Brian Paul   variant->id = UTIL_BITMASK_INVALID_INDEX;
2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
234e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   variant->pstipple_sampler_unit = emit.pstipple_sampler_unit;
235e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
2361082735bb69e9f64cb3991a52f0e270902917855Brian Paul   /* If there was exactly one write to a fragment shader output register
2371082735bb69e9f64cb3991a52f0e270902917855Brian Paul    * and it came from a constant buffer, we know all fragments will have
2381082735bb69e9f64cb3991a52f0e270902917855Brian Paul    * the same color (except for blending).
2391082735bb69e9f64cb3991a52f0e270902917855Brian Paul    */
2401082735bb69e9f64cb3991a52f0e270902917855Brian Paul   variant->constant_color_output =
2411082735bb69e9f64cb3991a52f0e270902917855Brian Paul      emit.constant_color_output && emit.num_output_writes == 1;
2421082735bb69e9f64cb3991a52f0e270902917855Brian Paul
243e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul#if 0
244e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   if (!svga_shader_verify(variant->tokens, variant->nr_tokens) ||
245e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul       SVGA_DEBUG & DEBUG_TGSI) {
2462e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul      debug_printf("#####################################\n");
2472e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul      debug_printf("Shader %u below\n", shader->id);
2482e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul      tgsi_dump(shader->tokens, 0);
2496dd9676a8fc43062a7017f2951e0f032889fac9eJosé Fonseca      if (SVGA_DEBUG & DEBUG_TGSI) {
2502e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul         debug_printf("Shader %u compiled below\n", shader->id);
2512a30379dcdb9f643d97ba48811fddf90484a84f2Brian Paul         svga_shader_dump(variant->tokens, variant->nr_tokens, FALSE);
2526dd9676a8fc43062a7017f2951e0f032889fac9eJosé Fonseca      }
2532e8c51c98fa3047f6a690c0c3f6edfb817bdfe1fBrian Paul      debug_printf("#####################################\n");
2546dd9676a8fc43062a7017f2951e0f032889fac9eJosé Fonseca   }
255e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul#endif
2566dd9676a8fc43062a7017f2951e0f032889fac9eJosé Fonseca
2572e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee   goto done;
2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2592e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Leefail:
2602a30379dcdb9f643d97ba48811fddf90484a84f2Brian Paul   FREE(variant);
26196e0894106b25eec2bab4545566d832846e99034Brian Paul   if (emit.buf != err_buf)
26296e0894106b25eec2bab4545566d832846e99034Brian Paul      FREE(emit.buf);
2632e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee   variant = NULL;
2642e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee
2652e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Leedone:
2662e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee   SVGA_STATS_TIME_POP(svga_sws(svga));
2672e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee   return variant;
2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
269