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