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 "draw/draw_context.h" 2728486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_math.h" 293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h" 30cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca#include "util/u_bitmask.h" 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "tgsi/tgsi_parse.h" 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "tgsi/tgsi_text.h" 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_tgsi.h" 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_hw_reg.h" 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h" 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_debug.h" 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic const struct tgsi_token *substitute_vs( 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned shader_id, 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct tgsi_token *old_tokens ) 443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#if 0 463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (shader_id == 12) { 473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz static struct tgsi_token tokens[300]; 483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const char *text = 50456b5bd5d0dbed172a5d8f88625eeb63fd87c8ddMichal Krol "VERT\n" 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "DCL IN[0]\n" 523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "DCL IN[1]\n" 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "DCL IN[2]\n" 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "DCL OUT[0], POSITION\n" 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "DCL TEMP[0..4]\n" 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "IMM FLT32 { 1.0000, 1.0000, 1.0000, 1.0000 }\n" 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "IMM FLT32 { 0.45, 1.0000, 1.0000, 1.0000 }\n" 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "IMM FLT32 { 1.297863, 0.039245, 0.035993, 0.035976}\n" 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "IMM FLT32 { -0.019398, 1.696131, -0.202151, -0.202050 }\n" 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "IMM FLT32 { 0.051711, -0.348713, -0.979204, -0.978714 }\n" 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "IMM FLT32 { 0.000000, 0.000003, 139.491577, 141.421356 }\n" 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "DCL CONST[0..7]\n" 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "DCL CONST[9..16]\n" 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz " MOV TEMP[2], IMM[0]\n" 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz " MOV TEMP[2].xyz, IN[2]\n" 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz " MOV TEMP[2].xyz, IN[0]\n" 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz " MOV TEMP[2].xyz, IN[1]\n" 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz " MUL TEMP[1], IMM[3], TEMP[2].yyyy\n" 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz " MAD TEMP[3], IMM[2], TEMP[2].xxxx, TEMP[1]\n" 723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz " MAD TEMP[1], IMM[4], TEMP[2].zzzz, TEMP[3]\n" 733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz " MAD TEMP[4], IMM[5], TEMP[2].wwww, TEMP[1]\n" 743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz " MOV OUT[0], TEMP[4]\n" 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz " END\n"; 773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!tgsi_text_translate( text, 793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz tokens, 803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz Elements(tokens) )) 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(0); 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return NULL; 843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return tokens; 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#endif 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return old_tokens; 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*********************************************************************** 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Vertex shaders 963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void * 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_create_vs_state(struct pipe_context *pipe, 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct pipe_shader_state *templ) 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context(pipe); 1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_vertex_shader *vs = CALLOC_STRUCT(svga_vertex_shader); 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!vs) 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return NULL; 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* substitute a debug shader? 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vs->base.tokens = tgsi_dup_tokens(substitute_vs(svga->debug.shader_id, 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz templ->tokens)); 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Collect basic info that we'll need later: 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz tgsi_scan_shader(vs->base.tokens, &vs->base.info); 1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Need to do construct a new template in case we substitued a 1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * debug shader. 1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_shader_state tmp2 = *templ; 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz tmp2.tokens = vs->base.tokens; 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vs->draw_shader = draw_create_vertex_shader(svga->swtnl.draw, &tmp2); 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vs->base.id = svga->debug.shader_id++; 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (SVGA_DEBUG & DEBUG_TGSI || 0) { 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz debug_printf("%s id: %u, inputs: %u, outputs: %u\n", 1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz __FUNCTION__, vs->base.id, 1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vs->base.info.num_inputs, vs->base.info.num_outputs); 1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return vs; 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_bind_vs_state(struct pipe_context *pipe, void *shader) 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_vertex_shader *vs = (struct svga_vertex_shader *)shader; 1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context(pipe); 1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->curr.vs = vs; 1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->dirty |= SVGA_NEW_VS; 1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_delete_vs_state(struct pipe_context *pipe, void *shader) 1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context(pipe); 1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_vertex_shader *vs = (struct svga_vertex_shader *)shader; 1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_shader_result *result, *tmp; 1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret; 1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_hwtnl_flush_retry( svga ); 1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz draw_delete_vertex_shader(svga->swtnl.draw, vs->draw_shader); 1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (result = vs->base.results; result; result = tmp ) { 1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz tmp = result->next; 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_DestroyShader(svga->swc, 1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result->id, 1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3D_SHADERTYPE_VS ); 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(ret != PIPE_OK) { 1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_context_flush(svga, NULL); 1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_DestroyShader(svga->swc, 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz result->id, 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3D_SHADERTYPE_VS ); 1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(ret == PIPE_OK); 1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 172cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_clear( svga->vs_bm, result->id ); 173cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_destroy_shader_result( result ); 17538d8b180038eef692cbc75731d340c9fcc721784José Fonseca 17638d8b180038eef692cbc75731d340c9fcc721784José Fonseca /* 17738d8b180038eef692cbc75731d340c9fcc721784José Fonseca * Remove stale references to this result to ensure a new result on the 17838d8b180038eef692cbc75731d340c9fcc721784José Fonseca * same address will be detected as a change. 17938d8b180038eef692cbc75731d340c9fcc721784José Fonseca */ 18038d8b180038eef692cbc75731d340c9fcc721784José Fonseca if(result == svga->state.hw_draw.vs) 18138d8b180038eef692cbc75731d340c9fcc721784José Fonseca svga->state.hw_draw.vs = NULL; 1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE((void *)vs->base.tokens); 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE(vs); 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid svga_init_vs_functions( struct svga_context *svga ) 1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.create_vs_state = svga_create_vs_state; 1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.bind_vs_state = svga_bind_vs_state; 1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.delete_vs_state = svga_delete_vs_state; 1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 196