13af1f3b9220733f5e3a76fe38fbc397974678234Brian/************************************************************************** 23af1f3b9220733f5e3a76fe38fbc397974678234Brian * 33af1f3b9220733f5e3a76fe38fbc397974678234Brian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 43af1f3b9220733f5e3a76fe38fbc397974678234Brian * All Rights Reserved. 53af1f3b9220733f5e3a76fe38fbc397974678234Brian * 63af1f3b9220733f5e3a76fe38fbc397974678234Brian * Permission is hereby granted, free of charge, to any person obtaining a 73af1f3b9220733f5e3a76fe38fbc397974678234Brian * copy of this software and associated documentation files (the 83af1f3b9220733f5e3a76fe38fbc397974678234Brian * "Software"), to deal in the Software without restriction, including 93af1f3b9220733f5e3a76fe38fbc397974678234Brian * without limitation the rights to use, copy, modify, merge, publish, 103af1f3b9220733f5e3a76fe38fbc397974678234Brian * distribute, sub license, and/or sell copies of the Software, and to 113af1f3b9220733f5e3a76fe38fbc397974678234Brian * permit persons to whom the Software is furnished to do so, subject to 123af1f3b9220733f5e3a76fe38fbc397974678234Brian * the following conditions: 133af1f3b9220733f5e3a76fe38fbc397974678234Brian * 143af1f3b9220733f5e3a76fe38fbc397974678234Brian * The above copyright notice and this permission notice (including the 153af1f3b9220733f5e3a76fe38fbc397974678234Brian * next paragraph) shall be included in all copies or substantial portions 163af1f3b9220733f5e3a76fe38fbc397974678234Brian * of the Software. 173af1f3b9220733f5e3a76fe38fbc397974678234Brian * 183af1f3b9220733f5e3a76fe38fbc397974678234Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 193af1f3b9220733f5e3a76fe38fbc397974678234Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 203af1f3b9220733f5e3a76fe38fbc397974678234Brian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 213af1f3b9220733f5e3a76fe38fbc397974678234Brian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 223af1f3b9220733f5e3a76fe38fbc397974678234Brian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 233af1f3b9220733f5e3a76fe38fbc397974678234Brian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 243af1f3b9220733f5e3a76fe38fbc397974678234Brian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 253af1f3b9220733f5e3a76fe38fbc397974678234Brian * 263af1f3b9220733f5e3a76fe38fbc397974678234Brian **************************************************************************/ 273af1f3b9220733f5e3a76fe38fbc397974678234Brian 28af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca 29af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca#include <stdarg.h> 30af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca 313af1f3b9220733f5e3a76fe38fbc397974678234Brian#include "i915_reg.h" 323af1f3b9220733f5e3a76fe38fbc397974678234Brian#include "i915_context.h" 333af1f3b9220733f5e3a76fe38fbc397974678234Brian#include "i915_fpc.h" 343af1f3b9220733f5e3a76fe38fbc397974678234Brian 35abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h" 364f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_math.h" 374f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 385b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#include "util/u_string.h" 39c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_parse.h" 40c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_dump.h" 413af1f3b9220733f5e3a76fe38fbc397974678234Brian 426acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_vertex.h" 43d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian 448f0a331040fc6fa700ab2c5f96061844a2289599Jon TURNEY#ifndef M_PI 458f0a331040fc6fa700ab2c5f96061844a2289599Jon TURNEY#define M_PI 3.14159265358979323846 468f0a331040fc6fa700ab2c5f96061844a2289599Jon TURNEY#endif 47d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian 480d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/** 490d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Simple pass-through fragment shader to use when we don't have 500d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * a real shader (or it fails to compile for some reason). 510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 526512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesinstatic unsigned passthrough_decl[] = 530d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian _3DSTATE_PIXEL_SHADER_PROGRAM | ((2*3)-1), 550d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* declare input color: 570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 5879a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin (D0_DCL | 5979a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin (REG_TYPE_T << D0_TYPE_SHIFT) | 6079a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin (T_DIFFUSE << D0_NR_SHIFT) | 610d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian D0_CHANNEL_ALL), 620d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 0, 630d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 0, 646512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin}; 650d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 666512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesinstatic unsigned passthrough_program[] = 676512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin{ 680d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* move to output color: 690d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 7079a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin (A0_MOV | 7179a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin (REG_TYPE_OC << A0_DEST_TYPE_SHIFT) | 7279a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin A0_DEST_CHANNEL_ALL | 730d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (REG_TYPE_T << A0_SRC0_TYPE_SHIFT) | 740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (T_DIFFUSE << A0_SRC0_NR_SHIFT)), 750d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 0x01230000, /* .xyzw */ 760d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 0 770d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian}; 780d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 793af1f3b9220733f5e3a76fe38fbc397974678234Brian 803af1f3b9220733f5e3a76fe38fbc397974678234Brian/* 1, -1/3!, 1/5!, -1/7! */ 81062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesinstatic const float scs_sin_constants[4] = { 1.0, 825961732c1b59403b4e736fa354a64d4a0e5d8af2Michal -1.0f / (3 * 2 * 1), 835961732c1b59403b4e736fa354a64d4a0e5d8af2Michal 1.0f / (5 * 4 * 3 * 2 * 1), 845961732c1b59403b4e736fa354a64d4a0e5d8af2Michal -1.0f / (7 * 6 * 5 * 4 * 3 * 2 * 1) 853af1f3b9220733f5e3a76fe38fbc397974678234Brian}; 863af1f3b9220733f5e3a76fe38fbc397974678234Brian 873af1f3b9220733f5e3a76fe38fbc397974678234Brian/* 1, -1/2!, 1/4!, -1/6! */ 88062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesinstatic const float scs_cos_constants[4] = { 1.0, 895961732c1b59403b4e736fa354a64d4a0e5d8af2Michal -1.0f / (2 * 1), 905961732c1b59403b4e736fa354a64d4a0e5d8af2Michal 1.0f / (4 * 3 * 2 * 1), 915961732c1b59403b4e736fa354a64d4a0e5d8af2Michal -1.0f / (6 * 5 * 4 * 3 * 2 * 1) 923af1f3b9220733f5e3a76fe38fbc397974678234Brian}; 933af1f3b9220733f5e3a76fe38fbc397974678234Brian 94fe36bc0c41ee7fd3aa7b364a8301d50613644f71Stéphane Marchesin/* 2*pi, -(2*pi)^3/3!, (2*pi)^5/5!, -(2*pi)^7/7! */ 95062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesinstatic const float sin_constants[4] = { 2.0 * M_PI, 96062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin -8.0f * M_PI * M_PI * M_PI / (3 * 2 * 1), 97062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin 32.0f * M_PI * M_PI * M_PI * M_PI * M_PI / (5 * 4 * 3 * 2 * 1), 98062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin -128.0f * M_PI * M_PI * M_PI * M_PI * M_PI * M_PI * M_PI / (7 * 6 * 5 * 4 * 3 * 2 * 1) 99062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin}; 100062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin 101fe36bc0c41ee7fd3aa7b364a8301d50613644f71Stéphane Marchesin/* 1, -(2*pi)^2/2!, (2*pi)^4/4!, -(2*pi)^6/6! */ 102062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesinstatic const float cos_constants[4] = { 1.0, 103062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin -4.0f * M_PI * M_PI / (2 * 1), 104062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin 16.0f * M_PI * M_PI * M_PI * M_PI / (4 * 3 * 2 * 1), 105062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin -64.0f * M_PI * M_PI * M_PI * M_PI * M_PI * M_PI / (6 * 5 * 4 * 3 * 2 * 1) 106062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin}; 107062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin 1083af1f3b9220733f5e3a76fe38fbc397974678234Brian 1090d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1105ac22877c98f4934cced4d42b9ec87245f266967Brian/** 1115ac22877c98f4934cced4d42b9ec87245f266967Brian * component-wise negation of ureg 1125ac22877c98f4934cced4d42b9ec87245f266967Brian */ 1135ac22877c98f4934cced4d42b9ec87245f266967Brianstatic INLINE int 1145ac22877c98f4934cced4d42b9ec87245f266967Briannegate(int reg, int x, int y, int z, int w) 1155ac22877c98f4934cced4d42b9ec87245f266967Brian{ 1165ac22877c98f4934cced4d42b9ec87245f266967Brian /* Another neat thing about the UREG representation */ 1175ac22877c98f4934cced4d42b9ec87245f266967Brian return reg ^ (((x & 1) << UREG_CHANNEL_X_NEGATE_SHIFT) | 1185ac22877c98f4934cced4d42b9ec87245f266967Brian ((y & 1) << UREG_CHANNEL_Y_NEGATE_SHIFT) | 1195ac22877c98f4934cced4d42b9ec87245f266967Brian ((z & 1) << UREG_CHANNEL_Z_NEGATE_SHIFT) | 1205ac22877c98f4934cced4d42b9ec87245f266967Brian ((w & 1) << UREG_CHANNEL_W_NEGATE_SHIFT)); 1215ac22877c98f4934cced4d42b9ec87245f266967Brian} 1225ac22877c98f4934cced4d42b9ec87245f266967Brian 1235ac22877c98f4934cced4d42b9ec87245f266967Brian 124c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian/** 125c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * In the event of a translation failure, we'll generate a simple color 126c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * pass-through program. 127c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian */ 1280d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 129c74900ee5d80c7c2b7cbe4ed87395526a742a13eBriani915_use_passthrough_shader(struct i915_fragment_shader *fs) 1300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 1316512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin fs->program = (uint *) MALLOC(sizeof(passthrough_program)); 1326512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin fs->decl = (uint *) MALLOC(sizeof(passthrough_decl)); 133c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian if (fs->program) { 1346512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin memcpy(fs->program, passthrough_program, sizeof(passthrough_program)); 1356512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin memcpy(fs->decl, passthrough_decl, sizeof(passthrough_decl)); 1366512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin fs->program_len = Elements(passthrough_program); 1376512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin fs->decl_len = Elements(passthrough_decl); 1385ac22877c98f4934cced4d42b9ec87245f266967Brian } 139c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian fs->num_constants = 0; 1400d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 1410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1420d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1430d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianvoid 144af60ebc4eedcfec2090e1ddd7630137948c26866José Fonsecai915_program_error(struct i915_fp_compile *p, const char *msg, ...) 1450d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 146af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca va_list args; 1470e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal char buffer[1024]; 148af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca 1499791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("i915_program_error: "); 150974c49ed176de55aadb335a2956ef5dfec774a23Stephane Marchesin va_start( args, msg ); 1515b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca util_vsnprintf( buffer, sizeof(buffer), msg, args ); 152af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca va_end( args ); 15396c9b39a6a9553573fcbdb5fd6db0e9d59768442Jakob Bornecrantz debug_printf("%s", buffer); 1549791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("\n"); 155af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca 1560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->error = 1; 1570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 1580d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 159abb436526974bd090853c0927ece0839f9143393Stéphane Marchesinstatic uint get_mapping(struct i915_fragment_shader* fs, int unit) 160abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin{ 161abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin int i; 162abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin for (i = 0; i < I915_TEX_UNITS; i++) 163abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin { 164abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin if (fs->generic_mapping[i] == -1) { 165abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin fs->generic_mapping[i] = unit; 166abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin return i; 167abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin } 168abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin if (fs->generic_mapping[i] == unit) 169abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin return i; 170abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin } 171abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin debug_printf("Exceeded max generics\n"); 172abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin return 0; 173abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin} 1740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1753af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 1763af1f3b9220733f5e3a76fe38fbc397974678234Brian * Construct a ureg for the given source register. Will emit 1773af1f3b9220733f5e3a76fe38fbc397974678234Brian * constants, apply swizzling and negation as needed. 1783af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 1793af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 1803af1f3b9220733f5e3a76fe38fbc397974678234Briansrc_vector(struct i915_fp_compile *p, 1812bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_full_src_register *source, 182abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 1833af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 18491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell uint index = source->Register.Index; 18596ad8a36003a21180ad6b61aa0b7d7c9452b3449Jakob Bornecrantz uint src = 0, sem_name, sem_ind; 1863af1f3b9220733f5e3a76fe38fbc397974678234Brian 18791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell switch (source->Register.File) { 1883af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_TEMPORARY: 18991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (source->Register.Index >= I915_MAX_TEMPORARY) { 1903af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "Exceeded max temporary reg"); 1913af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 1923af1f3b9220733f5e3a76fe38fbc397974678234Brian } 1933af1f3b9220733f5e3a76fe38fbc397974678234Brian src = UREG(REG_TYPE_R, index); 1943af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 1953af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_INPUT: 1963af1f3b9220733f5e3a76fe38fbc397974678234Brian /* XXX: Packing COL1, FOGC into a single attribute works for 1973af1f3b9220733f5e3a76fe38fbc397974678234Brian * texenv programs, but will fail for real fragment programs 1983af1f3b9220733f5e3a76fe38fbc397974678234Brian * that use these attributes and expect them to be a full 4 1993af1f3b9220733f5e3a76fe38fbc397974678234Brian * components wide. Could use a texcoord to pass these 2003af1f3b9220733f5e3a76fe38fbc397974678234Brian * attributes if necessary, but that won't work in the general 2013af1f3b9220733f5e3a76fe38fbc397974678234Brian * case. 2023af1f3b9220733f5e3a76fe38fbc397974678234Brian * 2033af1f3b9220733f5e3a76fe38fbc397974678234Brian * We also use a texture coordinate to pass wpos when possible. 2043af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 205d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian 2064901410293b35ac6bb4759142b50fcc0be8a1b25Brian sem_name = p->shader->info.input_semantic_name[index]; 2074901410293b35ac6bb4759142b50fcc0be8a1b25Brian sem_ind = p->shader->info.input_semantic_index[index]; 20837cf13ed9a429c755f121daa1776b1b30a985ab3Brian 209f69b5c56feb60791bad27d491ee9592238d4efb0Brian switch (sem_name) { 21037cf13ed9a429c755f121daa1776b1b30a985ab3Brian case TGSI_SEMANTIC_POSITION: 211d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin { 212d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin /* for fragcoord */ 213d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin int real_tex_unit = get_mapping(fs, I915_SEMANTIC_POS); 214d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_ALL); 215d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin break; 216d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin } 217f69b5c56feb60791bad27d491ee9592238d4efb0Brian case TGSI_SEMANTIC_COLOR: 218f69b5c56feb60791bad27d491ee9592238d4efb0Brian if (sem_ind == 0) { 219f69b5c56feb60791bad27d491ee9592238d4efb0Brian src = i915_emit_decl(p, REG_TYPE_T, T_DIFFUSE, D0_CHANNEL_ALL); 220f69b5c56feb60791bad27d491ee9592238d4efb0Brian } 221f69b5c56feb60791bad27d491ee9592238d4efb0Brian else { 222f69b5c56feb60791bad27d491ee9592238d4efb0Brian /* secondary color */ 223f69b5c56feb60791bad27d491ee9592238d4efb0Brian assert(sem_ind == 1); 224f69b5c56feb60791bad27d491ee9592238d4efb0Brian src = i915_emit_decl(p, REG_TYPE_T, T_SPECULAR, D0_CHANNEL_XYZ); 225f69b5c56feb60791bad27d491ee9592238d4efb0Brian src = swizzle(src, X, Y, Z, ONE); 226f69b5c56feb60791bad27d491ee9592238d4efb0Brian } 22737cf13ed9a429c755f121daa1776b1b30a985ab3Brian break; 22837cf13ed9a429c755f121daa1776b1b30a985ab3Brian case TGSI_SEMANTIC_FOG: 22937cf13ed9a429c755f121daa1776b1b30a985ab3Brian src = i915_emit_decl(p, REG_TYPE_T, T_FOG_W, D0_CHANNEL_W); 23037cf13ed9a429c755f121daa1776b1b30a985ab3Brian src = swizzle(src, W, W, W, W); 23137cf13ed9a429c755f121daa1776b1b30a985ab3Brian break; 232e9259ad0d7f674a1f2f9156ba0baeedc0e7d0d54Brian case TGSI_SEMANTIC_GENERIC: 233abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin { 234abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin int real_tex_unit = get_mapping(fs, sem_ind); 235abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_ALL); 236abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin break; 237abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin } 238ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin case TGSI_SEMANTIC_FACE: 239ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin { 240ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin /* for back/front faces */ 241ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin int real_tex_unit = get_mapping(fs, I915_SEMANTIC_FACE); 242ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_X); 243ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin break; 244ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin } 24537cf13ed9a429c755f121daa1776b1b30a985ab3Brian default: 24637cf13ed9a429c755f121daa1776b1b30a985ab3Brian i915_program_error(p, "Bad source->Index"); 24737cf13ed9a429c755f121daa1776b1b30a985ab3Brian return 0; 24837cf13ed9a429c755f121daa1776b1b30a985ab3Brian } 2493af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 2503af1f3b9220733f5e3a76fe38fbc397974678234Brian 2516c29be9f41470b22c87ef571e10b5a9824800608Brian case TGSI_FILE_IMMEDIATE: 252c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian assert(index < p->num_immediates); 253c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian index = p->immediates_map[index]; 2546c29be9f41470b22c87ef571e10b5a9824800608Brian /* fall-through */ 2553af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_CONSTANT: 2563af1f3b9220733f5e3a76fe38fbc397974678234Brian src = UREG(REG_TYPE_CONST, index); 2573af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 2583af1f3b9220733f5e3a76fe38fbc397974678234Brian 2593af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 2603af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "Bad source->File"); 2613af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 2623af1f3b9220733f5e3a76fe38fbc397974678234Brian } 2633af1f3b9220733f5e3a76fe38fbc397974678234Brian 264b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell src = swizzle(src, 26591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleX, 26691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleY, 26791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleZ, 26891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleW); 26941b3fcbf0404bc4a4f6588c0feef553bb65d4440Brian 2702154d1c5ac0bb37614ef00bed766e49635b519e8Brian /* There's both negate-all-components and per-component negation. 2712154d1c5ac0bb37614ef00bed766e49635b519e8Brian * Try to handle both here. 2722154d1c5ac0bb37614ef00bed766e49635b519e8Brian */ 2732154d1c5ac0bb37614ef00bed766e49635b519e8Brian { 27491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell int n = source->Register.Negate; 275da253319f9e5d37d9c55b975ef9328545a3ac9b4Keith Whitwell src = negate(src, n, n, n, n); 2762154d1c5ac0bb37614ef00bed766e49635b519e8Brian } 2772154d1c5ac0bb37614ef00bed766e49635b519e8Brian 27856ee132f9671f70ff2b3ee04659beac0dfc6126dKeith Whitwell /* no abs() */ 27937cf13ed9a429c755f121daa1776b1b30a985ab3Brian#if 0 28037cf13ed9a429c755f121daa1776b1b30a985ab3Brian /* XXX assertions disabled to allow arbfplight.c to run */ 28137cf13ed9a429c755f121daa1776b1b30a985ab3Brian /* XXX enable these assertions, or fix things */ 28291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell assert(!source->Register.Absolute); 28337cf13ed9a429c755f121daa1776b1b30a985ab3Brian#endif 284de33b0dd231d646cbbc7ba6c25bf6dd04a96cd86Stéphane Marchesin if (source->Register.Absolute) 2855d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin debug_printf("Unhandled absolute value\n"); 286de33b0dd231d646cbbc7ba6c25bf6dd04a96cd86Stéphane Marchesin 2873af1f3b9220733f5e3a76fe38fbc397974678234Brian return src; 2883af1f3b9220733f5e3a76fe38fbc397974678234Brian} 2893af1f3b9220733f5e3a76fe38fbc397974678234Brian 2903af1f3b9220733f5e3a76fe38fbc397974678234Brian 2910d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/** 2920d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Construct a ureg for a destination register. 2930d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 2943af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 2953af1f3b9220733f5e3a76fe38fbc397974678234Brianget_result_vector(struct i915_fp_compile *p, 2962bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_full_dst_register *dest) 2973af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 2985b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch (dest->Register.File) { 2993af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_OUTPUT: 300d0bca086ab6d032909e9a429720fea297c536f97Brian { 3015b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell uint sem_name = p->shader->info.output_semantic_name[dest->Register.Index]; 302d0bca086ab6d032909e9a429720fea297c536f97Brian switch (sem_name) { 303d0bca086ab6d032909e9a429720fea297c536f97Brian case TGSI_SEMANTIC_POSITION: 304d0bca086ab6d032909e9a429720fea297c536f97Brian return UREG(REG_TYPE_OD, 0); 305d0bca086ab6d032909e9a429720fea297c536f97Brian case TGSI_SEMANTIC_COLOR: 306d0bca086ab6d032909e9a429720fea297c536f97Brian return UREG(REG_TYPE_OC, 0); 307d0bca086ab6d032909e9a429720fea297c536f97Brian default: 308d0bca086ab6d032909e9a429720fea297c536f97Brian i915_program_error(p, "Bad inst->DstReg.Index/semantics"); 309d0bca086ab6d032909e9a429720fea297c536f97Brian return 0; 310d0bca086ab6d032909e9a429720fea297c536f97Brian } 3113af1f3b9220733f5e3a76fe38fbc397974678234Brian } 3123af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_TEMPORARY: 3135b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell return UREG(REG_TYPE_R, dest->Register.Index); 3143af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 3153af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "Bad inst->DstReg.File"); 3163af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 3173af1f3b9220733f5e3a76fe38fbc397974678234Brian } 3183af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3193af1f3b9220733f5e3a76fe38fbc397974678234Brian 3203af1f3b9220733f5e3a76fe38fbc397974678234Brian 3213af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 3223af1f3b9220733f5e3a76fe38fbc397974678234Brian * Compute flags for saturation and writemask. 3233af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 3243af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 3252bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinget_result_flags(const struct i915_full_instruction *inst) 3263af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3273af1f3b9220733f5e3a76fe38fbc397974678234Brian const uint writeMask 3285b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell = inst->Dst[0].Register.WriteMask; 3293af1f3b9220733f5e3a76fe38fbc397974678234Brian uint flags = 0x0; 3303af1f3b9220733f5e3a76fe38fbc397974678234Brian 3313af1f3b9220733f5e3a76fe38fbc397974678234Brian if (inst->Instruction.Saturate == TGSI_SAT_ZERO_ONE) 3323af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_SATURATE; 3333af1f3b9220733f5e3a76fe38fbc397974678234Brian 3343af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_X) 3353af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_X; 3363af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_Y) 3373af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_Y; 3383af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_Z) 3393af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_Z; 3403af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_W) 3413af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_W; 3423af1f3b9220733f5e3a76fe38fbc397974678234Brian 3433af1f3b9220733f5e3a76fe38fbc397974678234Brian return flags; 3443af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3453af1f3b9220733f5e3a76fe38fbc397974678234Brian 3463af1f3b9220733f5e3a76fe38fbc397974678234Brian 3473af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 3483af1f3b9220733f5e3a76fe38fbc397974678234Brian * Convert TGSI_TEXTURE_x token to DO_SAMPLE_TYPE_x token 3493af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 3503af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 3513af1f3b9220733f5e3a76fe38fbc397974678234Briantranslate_tex_src_target(struct i915_fp_compile *p, uint tex) 3523af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3533af1f3b9220733f5e3a76fe38fbc397974678234Brian switch (tex) { 354776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul case TGSI_TEXTURE_SHADOW1D: 355776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul /* fall-through */ 3563af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_1D: 3573af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_2D; 358776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 359776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul case TGSI_TEXTURE_SHADOW2D: 360776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul /* fall-through */ 3613af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_2D: 3623af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_2D; 363776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 364776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul case TGSI_TEXTURE_SHADOWRECT: 365776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul /* fall-through */ 3663af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_RECT: 3673af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_2D; 368776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3693af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_3D: 3703af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_VOLUME; 371776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3723af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_CUBE: 3733af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_CUBE; 374776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3753af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 3763af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "TexSrc type"); 3773af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 3783af1f3b9220733f5e3a76fe38fbc397974678234Brian } 3793af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3803af1f3b9220733f5e3a76fe38fbc397974678234Brian 381e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin/** 382527235223abd8b64908b0c21311567e6c7d9920dStéphane Marchesin * Return the number of coords needed to access a given TGSI_TEXTURE_* 383e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin */ 384e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesinstatic uint 385e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesintexture_num_coords(struct i915_fp_compile *p, uint tex) 386e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin{ 387e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin switch (tex) { 388e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_SHADOW1D: 389e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_1D: 390e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin return 1; 391e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin 392e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_SHADOW2D: 393e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_2D: 394e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_SHADOWRECT: 395e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_RECT: 396e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin return 2; 397e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin 398e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_3D: 399e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_CUBE: 400e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin return 3; 401e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin 402e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin default: 403e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin i915_program_error(p, "Num coords"); 404e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin return 2; 405e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin } 406e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin} 407e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin 4083af1f3b9220733f5e3a76fe38fbc397974678234Brian 4093af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 4103af1f3b9220733f5e3a76fe38fbc397974678234Brian * Generate texel lookup instruction. 4113af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 4123af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void 4133af1f3b9220733f5e3a76fe38fbc397974678234Brianemit_tex(struct i915_fp_compile *p, 4142bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_full_instruction *inst, 415abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint opcode, 416abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 4173af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 4187d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell uint texture = inst->Texture.Texture; 41991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell uint unit = inst->Src[1].Register.Index; 4203af1f3b9220733f5e3a76fe38fbc397974678234Brian uint tex = translate_tex_src_target( p, texture ); 4213af1f3b9220733f5e3a76fe38fbc397974678234Brian uint sampler = i915_emit_decl(p, REG_TYPE_S, unit, tex); 422abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint coord = src_vector( p, &inst->Src[0], fs); 4233af1f3b9220733f5e3a76fe38fbc397974678234Brian 4243af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_texld( p, 4257d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector( p, &inst->Dst[0] ), 4263af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags( inst ), 4273af1f3b9220733f5e3a76fe38fbc397974678234Brian sampler, 4283af1f3b9220733f5e3a76fe38fbc397974678234Brian coord, 429e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin opcode, 430e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin texture_num_coords(p, texture) ); 4313af1f3b9220733f5e3a76fe38fbc397974678234Brian} 4323af1f3b9220733f5e3a76fe38fbc397974678234Brian 4333af1f3b9220733f5e3a76fe38fbc397974678234Brian 4343af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 4353af1f3b9220733f5e3a76fe38fbc397974678234Brian * Generate a simple arithmetic instruction 4363af1f3b9220733f5e3a76fe38fbc397974678234Brian * \param opcode the i915 opcode 4373af1f3b9220733f5e3a76fe38fbc397974678234Brian * \param numArgs the number of input/src arguments 4383af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 4393af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void 4403af1f3b9220733f5e3a76fe38fbc397974678234Brianemit_simple_arith(struct i915_fp_compile *p, 4412bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_full_instruction *inst, 442abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint opcode, uint numArgs, 443abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 4443af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 4453af1f3b9220733f5e3a76fe38fbc397974678234Brian uint arg1, arg2, arg3; 4463af1f3b9220733f5e3a76fe38fbc397974678234Brian 4473af1f3b9220733f5e3a76fe38fbc397974678234Brian assert(numArgs <= 3); 4483af1f3b9220733f5e3a76fe38fbc397974678234Brian 449abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin arg1 = (numArgs < 1) ? 0 : src_vector( p, &inst->Src[0], fs ); 450abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin arg2 = (numArgs < 2) ? 0 : src_vector( p, &inst->Src[1], fs ); 451abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin arg3 = (numArgs < 3) ? 0 : src_vector( p, &inst->Src[2], fs ); 4523af1f3b9220733f5e3a76fe38fbc397974678234Brian 4533af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith( p, 4543af1f3b9220733f5e3a76fe38fbc397974678234Brian opcode, 4557d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector( p, &inst->Dst[0]), 4563af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags( inst ), 0, 4573af1f3b9220733f5e3a76fe38fbc397974678234Brian arg1, 4583af1f3b9220733f5e3a76fe38fbc397974678234Brian arg2, 4593af1f3b9220733f5e3a76fe38fbc397974678234Brian arg3 ); 4603af1f3b9220733f5e3a76fe38fbc397974678234Brian} 4613af1f3b9220733f5e3a76fe38fbc397974678234Brian 46220839b37ed61b044d6224c0e373ce10d74be4f3dBrian 46320839b37ed61b044d6224c0e373ce10d74be4f3dBrian/** As above, but swap the first two src regs */ 46420839b37ed61b044d6224c0e373ce10d74be4f3dBrianstatic void 46520839b37ed61b044d6224c0e373ce10d74be4f3dBrianemit_simple_arith_swap2(struct i915_fp_compile *p, 4662bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_full_instruction *inst, 467abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint opcode, uint numArgs, 468abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 46920839b37ed61b044d6224c0e373ce10d74be4f3dBrian{ 4702bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct i915_full_instruction inst2; 47120839b37ed61b044d6224c0e373ce10d74be4f3dBrian 47220839b37ed61b044d6224c0e373ce10d74be4f3dBrian assert(numArgs == 2); 47320839b37ed61b044d6224c0e373ce10d74be4f3dBrian 47420839b37ed61b044d6224c0e373ce10d74be4f3dBrian /* transpose first two registers */ 47520839b37ed61b044d6224c0e373ce10d74be4f3dBrian inst2 = *inst; 4767d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell inst2.Src[0] = inst->Src[1]; 4777d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell inst2.Src[1] = inst->Src[0]; 47820839b37ed61b044d6224c0e373ce10d74be4f3dBrian 479abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, &inst2, opcode, numArgs, fs); 48020839b37ed61b044d6224c0e373ce10d74be4f3dBrian} 48120839b37ed61b044d6224c0e373ce10d74be4f3dBrian 4820d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/* 4830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Translate TGSI instruction to i915 instruction. 4840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * 4850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Possible concerns: 4860d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * 487cc78eb63cdc0022684ca6816f258ea4492431916Stéphane Marchesin * DDX, DDY -- return 0 4880d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * SIN, COS -- could use another taylor step? 4890d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * LIT -- results seem a little different to sw mesa 4900d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * LOG -- different to mesa on negative numbers, but this is conformant. 49179a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin */ 4923af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void 4933af1f3b9220733f5e3a76fe38fbc397974678234Briani915_translate_instruction(struct i915_fp_compile *p, 4942bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_full_instruction *inst, 495abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader *fs) 4963af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 4973af1f3b9220733f5e3a76fe38fbc397974678234Brian uint writemask; 4983af1f3b9220733f5e3a76fe38fbc397974678234Brian uint src0, src1, src2, flags; 4993af1f3b9220733f5e3a76fe38fbc397974678234Brian uint tmp = 0; 5003af1f3b9220733f5e3a76fe38fbc397974678234Brian 5013af1f3b9220733f5e3a76fe38fbc397974678234Brian switch (inst->Instruction.Opcode) { 5023af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_ABS: 503abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 5043af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5053af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MAX, 5067d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5073af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 5083af1f3b9220733f5e3a76fe38fbc397974678234Brian src0, negate(src0, 1, 1, 1, 1), 0); 5093af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5103af1f3b9220733f5e3a76fe38fbc397974678234Brian 5113af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_ADD: 512abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_ADD, 2, fs); 5133af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5143af1f3b9220733f5e3a76fe38fbc397974678234Brian 5156ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller case TGSI_OPCODE_CEIL: 5166ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller src0 = src_vector(p, &inst->Src[0], fs); 5176ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller tmp = i915_get_utemp(p); 5186ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller flags = get_result_flags(inst); 5196ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller i915_emit_arith(p, 5206ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller A0_FLR, 5216ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller tmp, 5226ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller flags & A0_DEST_CHANNEL_ALL, 0, 5236ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller negate(src0, 1, 1, 1, 1), 0, 0); 5246ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller i915_emit_arith(p, 5256ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller A0_MOV, 5266ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller get_result_vector(p, &inst->Dst[0]), 5276ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller flags, 0, 5286ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller negate(tmp, 1, 1, 1, 1), 0, 0); 5296ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller break; 5306ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller 5313af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_CMP: 532abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 533abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 534abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src2 = src_vector(p, &inst->Src[2], fs); 535c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin i915_emit_arith(p, A0_CMP, 5367d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 537c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin get_result_flags(inst), 5383af1f3b9220733f5e3a76fe38fbc397974678234Brian 0, src0, src2, src1); /* NOTE: order of src2, src1 */ 5393af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5403af1f3b9220733f5e3a76fe38fbc397974678234Brian 5413af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_COS: 542abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 5433af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 5443af1f3b9220733f5e3a76fe38fbc397974678234Brian 5453af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5463af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5473af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 5480e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal src0, i915_emit_const1f(p, 1.0f / (float) (M_PI * 2.0)), 0); 5493af1f3b9220733f5e3a76fe38fbc397974678234Brian 5503af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MOD, tmp, A0_DEST_CHANNEL_X, 0, tmp, 0, 0); 5513af1f3b9220733f5e3a76fe38fbc397974678234Brian 5523af1f3b9220733f5e3a76fe38fbc397974678234Brian /* 553175adf0776d8df066a908b06055f243bd1325a34Stéphane Marchesin * t0.xy = MUL x.xx11, x.x111 ; x^2, x, 1, 1 5543af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, 1 5553af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xxz1 t0.z111 ; x^6 x^4 x^2 1 5563af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = DP4 t0, cos_constants 5573af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 5583af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5593af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5603af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XY, 0, 5613af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 5623af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, ONE, ONE, ONE), 0); 5633af1f3b9220733f5e3a76fe38fbc397974678234Brian 5643af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5653af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5663af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XYZ, 0, 5673af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, X, ONE), 5683af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 0); 5693af1f3b9220733f5e3a76fe38fbc397974678234Brian 5703af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5713af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5723af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XYZ, 0, 5733af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, Z, ONE), 5743af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Z, ONE, ONE, ONE), 0); 5753af1f3b9220733f5e3a76fe38fbc397974678234Brian 5763af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5773af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 5787d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5793af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 5803af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, Z, Y, X), 5813af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_const4fv(p, cos_constants), 0); 5823af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5833af1f3b9220733f5e3a76fe38fbc397974678234Brian 584811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin case TGSI_OPCODE_DDX: 585811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin case TGSI_OPCODE_DDY: 586811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin /* XXX We just output 0 here */ 587811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin debug_printf("Punting DDX/DDX\n"); 588811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin src0 = get_result_vector(p, &inst->Dst[0]); 589811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin i915_emit_arith(p, 590811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin A0_MOV, 591811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 592811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin get_result_flags(inst), 0, 593811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin swizzle(src0, ZERO, ZERO, ZERO, ZERO), 0, 0); 594811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin break; 595811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin 5962292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_DP2: 597abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 598abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 5992292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 6002292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 6012292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DP3, 6022292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 6032292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_flags(inst), 0, 6042292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin swizzle(src0, X, Y, ZERO, ZERO), src1, 0); 6052292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 6062292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 6073af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DP3: 608abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_DP3, 2, fs); 6093af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6103af1f3b9220733f5e3a76fe38fbc397974678234Brian 6113af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DP4: 612abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_DP4, 2, fs); 6133af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6143af1f3b9220733f5e3a76fe38fbc397974678234Brian 6153af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DPH: 616abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 617abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 6183af1f3b9220733f5e3a76fe38fbc397974678234Brian 6193af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 6203af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 6217d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6223af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 6233af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, Y, Z, ONE), src1, 0); 6243af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6253af1f3b9220733f5e3a76fe38fbc397974678234Brian 6263af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DST: 627abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 628abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 6293af1f3b9220733f5e3a76fe38fbc397974678234Brian 6303af1f3b9220733f5e3a76fe38fbc397974678234Brian /* result[0] = 1 * 1; 6313af1f3b9220733f5e3a76fe38fbc397974678234Brian * result[1] = a[1] * b[1]; 6323af1f3b9220733f5e3a76fe38fbc397974678234Brian * result[2] = a[2] * 1; 6333af1f3b9220733f5e3a76fe38fbc397974678234Brian * result[3] = 1 * b[3]; 6343af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 6353af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 6363af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 6377d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6383af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 6393af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, ONE, Y, Z, ONE), 6403af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src1, ONE, Y, ONE, W), 0); 6413af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6423af1f3b9220733f5e3a76fe38fbc397974678234Brian 6435e49ec339df1d23b1f1790c49c9f102098f42c0dBrian case TGSI_OPCODE_END: 6445e49ec339df1d23b1f1790c49c9f102098f42c0dBrian /* no-op */ 6455e49ec339df1d23b1f1790c49c9f102098f42c0dBrian break; 6465e49ec339df1d23b1f1790c49c9f102098f42c0dBrian 6473af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_EX2: 648abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 6493af1f3b9220733f5e3a76fe38fbc397974678234Brian 6503af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 6513af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_EXP, 6527d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6533af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 6543af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 6553af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6563af1f3b9220733f5e3a76fe38fbc397974678234Brian 6573af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_FLR: 658abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_FLR, 1, fs); 6593af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6603af1f3b9220733f5e3a76fe38fbc397974678234Brian 6613af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_FRC: 662abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_FRC, 1, fs); 6633af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6643af1f3b9220733f5e3a76fe38fbc397974678234Brian 6653af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_KIL: 66641b3fcbf0404bc4a4f6588c0feef553bb65d4440Brian /* kill if src[0].x < 0 || src[0].y < 0 ... */ 667abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 6683af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 6693af1f3b9220733f5e3a76fe38fbc397974678234Brian 6700235b3252100eda553babea42c014445358a2985Brian i915_emit_texld(p, 6710235b3252100eda553babea42c014445358a2985Brian tmp, /* dest reg: a dummy reg */ 6720235b3252100eda553babea42c014445358a2985Brian A0_DEST_CHANNEL_ALL, /* dest writemask */ 6730235b3252100eda553babea42c014445358a2985Brian 0, /* sampler */ 6740235b3252100eda553babea42c014445358a2985Brian src0, /* coord*/ 675e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin T0_TEXKILL, /* opcode */ 676e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin 1); /* num_coord */ 6773af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6783af1f3b9220733f5e3a76fe38fbc397974678234Brian 679db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol case TGSI_OPCODE_KILP: 680c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin /* We emit an unconditional kill; we may want to revisit 681c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin * if we ever implement conditionals. 682c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin */ 6830e57b66fa1d7f4317f20571f19fd2ceb3593f04fStéphane Marchesin tmp = i915_get_utemp(p); 6840e57b66fa1d7f4317f20571f19fd2ceb3593f04fStéphane Marchesin 685c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin i915_emit_texld(p, 686c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin tmp, /* dest reg: a dummy reg */ 687c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin A0_DEST_CHANNEL_ALL, /* dest writemask */ 688c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin 0, /* sampler */ 689c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin negate(swizzle(0, ONE, ONE, ONE, ONE), 1, 1, 1, 1), /* coord */ 690c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin T0_TEXKILL, /* opcode */ 691c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin 1); /* num_coord */ 692db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol break; 693db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol 6943af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_LG2: 695abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 6963af1f3b9220733f5e3a76fe38fbc397974678234Brian 6973af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 6983af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_LOG, 6997d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7003af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 7013af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 7023af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7033af1f3b9220733f5e3a76fe38fbc397974678234Brian 7043af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_LIT: 705abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 7063af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 7073af1f3b9220733f5e3a76fe38fbc397974678234Brian 7083af1f3b9220733f5e3a76fe38fbc397974678234Brian /* tmp = max( a.xyzw, a.00zw ) 7093af1f3b9220733f5e3a76fe38fbc397974678234Brian * XXX: Clamp tmp.w to -128..128 7103af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp.y = log(tmp.y) 7113af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp.y = tmp.w * tmp.y 7123af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp.y = exp(tmp.y) 7133af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = cmp (a.11-x1, a.1x01, a.1xy1 ) 7143af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 7153af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MAX, tmp, A0_DEST_CHANNEL_ALL, 0, 7163af1f3b9220733f5e3a76fe38fbc397974678234Brian src0, swizzle(src0, ZERO, ZERO, Z, W), 0); 7173af1f3b9220733f5e3a76fe38fbc397974678234Brian 7183af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_LOG, tmp, A0_DEST_CHANNEL_Y, 0, 7193af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Y, Y, Y, Y), 0, 0); 7203af1f3b9220733f5e3a76fe38fbc397974678234Brian 7213af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MUL, tmp, A0_DEST_CHANNEL_Y, 0, 7223af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ZERO, Y, ZERO, ZERO), 7233af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ZERO, W, ZERO, ZERO), 0); 7243af1f3b9220733f5e3a76fe38fbc397974678234Brian 7253af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_EXP, tmp, A0_DEST_CHANNEL_Y, 0, 7263af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Y, Y, Y, Y), 0, 0); 7273af1f3b9220733f5e3a76fe38fbc397974678234Brian 7283af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_CMP, 7297d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7303af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 7313af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(swizzle(tmp, ONE, ONE, X, ONE), 0, 0, 1, 0), 7323af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, X, ZERO, ONE), 7333af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, X, Y, ONE)); 7343af1f3b9220733f5e3a76fe38fbc397974678234Brian 7353af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7363af1f3b9220733f5e3a76fe38fbc397974678234Brian 7373af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_LRP: 738abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 739abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 740abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src2 = src_vector(p, &inst->Src[2], fs); 7413af1f3b9220733f5e3a76fe38fbc397974678234Brian flags = get_result_flags(inst); 7423af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 7433af1f3b9220733f5e3a76fe38fbc397974678234Brian 7443af1f3b9220733f5e3a76fe38fbc397974678234Brian /* b*a + c*(1-a) 7453af1f3b9220733f5e3a76fe38fbc397974678234Brian * 7463af1f3b9220733f5e3a76fe38fbc397974678234Brian * b*a + c - ca 7473af1f3b9220733f5e3a76fe38fbc397974678234Brian * 7483af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp = b*a + c, 7493af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = (-c)*a + tmp 7503af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 7513af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MAD, tmp, 7523af1f3b9220733f5e3a76fe38fbc397974678234Brian flags & A0_DEST_CHANNEL_ALL, 0, src1, src0, src2); 7533af1f3b9220733f5e3a76fe38fbc397974678234Brian 7543af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MAD, 7557d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7563af1f3b9220733f5e3a76fe38fbc397974678234Brian flags, 0, negate(src2, 1, 1, 1, 1), src0, tmp); 7573af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7583af1f3b9220733f5e3a76fe38fbc397974678234Brian 7593af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MAD: 760abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MAD, 3, fs); 7613af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7623af1f3b9220733f5e3a76fe38fbc397974678234Brian 7633af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MAX: 764abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MAX, 2, fs); 7653af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7663af1f3b9220733f5e3a76fe38fbc397974678234Brian 7673af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MIN: 768abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 769abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 7703af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 7713af1f3b9220733f5e3a76fe38fbc397974678234Brian flags = get_result_flags(inst); 7723af1f3b9220733f5e3a76fe38fbc397974678234Brian 7733af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7743af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MAX, 7753af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, flags & A0_DEST_CHANNEL_ALL, 0, 7763af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(src0, 1, 1, 1, 1), 7773af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(src1, 1, 1, 1, 1), 0); 7783af1f3b9220733f5e3a76fe38fbc397974678234Brian 7793af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7803af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MOV, 7817d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7823af1f3b9220733f5e3a76fe38fbc397974678234Brian flags, 0, negate(tmp, 1, 1, 1, 1), 0, 0); 7833af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7843af1f3b9220733f5e3a76fe38fbc397974678234Brian 7853af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MOV: 786abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MOV, 1, fs); 7873af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7883af1f3b9220733f5e3a76fe38fbc397974678234Brian 7893af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MUL: 790abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MUL, 2, fs); 7913af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7923af1f3b9220733f5e3a76fe38fbc397974678234Brian 7932bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case TGSI_OPCODE_NOP: 7942bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 7952bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 7963af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_POW: 797abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 798abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 7993af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 8003af1f3b9220733f5e3a76fe38fbc397974678234Brian flags = get_result_flags(inst); 8013af1f3b9220733f5e3a76fe38fbc397974678234Brian 8023af1f3b9220733f5e3a76fe38fbc397974678234Brian /* XXX: masking on intermediate values, here and elsewhere. 8033af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 8043af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8053af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_LOG, 8063af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 8073af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 8083af1f3b9220733f5e3a76fe38fbc397974678234Brian 8093af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MUL, tmp, A0_DEST_CHANNEL_X, 0, tmp, src1, 0); 8103af1f3b9220733f5e3a76fe38fbc397974678234Brian 8113af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8123af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_EXP, 8137d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 8143af1f3b9220733f5e3a76fe38fbc397974678234Brian flags, 0, swizzle(tmp, X, X, X, X), 0, 0); 8153af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 81679a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin 81744e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca case TGSI_OPCODE_RET: 81844e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca /* XXX: no-op? */ 81944e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca break; 82079a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin 8213af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_RCP: 822abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 8233af1f3b9220733f5e3a76fe38fbc397974678234Brian 8243af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8253af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_RCP, 8267d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 8272292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_flags(inst), 0, 8283af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 8293af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 8303af1f3b9220733f5e3a76fe38fbc397974678234Brian 8313af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_RSQ: 832abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 8333af1f3b9220733f5e3a76fe38fbc397974678234Brian 8343af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8353af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_RSQ, 8367d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 8373af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 8383af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 8393af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 8403af1f3b9220733f5e3a76fe38fbc397974678234Brian 8413af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SCS: 842abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 8433af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 8443af1f3b9220733f5e3a76fe38fbc397974678234Brian 8453af1f3b9220733f5e3a76fe38fbc397974678234Brian /* 8463af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 8473af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, x 8483af1f3b9220733f5e3a76fe38fbc397974678234Brian * t1 = MUL t0.xyyw t0.yz11 ; x^7 x^5 x^3 x 849062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin * scs.x = DP4 t1, scs_sin_constants 8503af1f3b9220733f5e3a76fe38fbc397974678234Brian * t1 = MUL t0.xxz1 t0.z111 ; x^6 x^4 x^2 1 851062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin * scs.y = DP4 t1, scs_cos_constants 8523af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 8533af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8543af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8553af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XY, 0, 8563af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, ONE, ONE), 8573af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, ONE, ONE, ONE), 0); 8583af1f3b9220733f5e3a76fe38fbc397974678234Brian 8593af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8603af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8613af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 8623af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, X, Y), 8633af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 0); 8643af1f3b9220733f5e3a76fe38fbc397974678234Brian 8655b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell writemask = inst->Dst[0].Register.WriteMask; 8663af1f3b9220733f5e3a76fe38fbc397974678234Brian 8673af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writemask & TGSI_WRITEMASK_Y) { 8683af1f3b9220733f5e3a76fe38fbc397974678234Brian uint tmp1; 8693af1f3b9220733f5e3a76fe38fbc397974678234Brian 8703af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writemask & TGSI_WRITEMASK_X) 8713af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp1 = i915_get_utemp(p); 8723af1f3b9220733f5e3a76fe38fbc397974678234Brian else 8733af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp1 = tmp; 8743af1f3b9220733f5e3a76fe38fbc397974678234Brian 8753af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8763af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8773af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp1, A0_DEST_CHANNEL_ALL, 0, 8783af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, Y, W), 8793af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Z, ONE, ONE), 0); 8803af1f3b9220733f5e3a76fe38fbc397974678234Brian 8813af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8823af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 8837d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 8843af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DEST_CHANNEL_Y, 0, 8853af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp1, W, Z, Y, X), 886062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin i915_emit_const4fv(p, scs_sin_constants), 0); 8873af1f3b9220733f5e3a76fe38fbc397974678234Brian } 8883af1f3b9220733f5e3a76fe38fbc397974678234Brian 8893af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writemask & TGSI_WRITEMASK_X) { 8903af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8913af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8923af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XYZ, 0, 8933af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, Z, ONE), 8943af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Z, ONE, ONE, ONE), 0); 8953af1f3b9220733f5e3a76fe38fbc397974678234Brian 8963af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8973af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 8987d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 8993af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DEST_CHANNEL_X, 0, 9003af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, Z, Y, X), 901062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin i915_emit_const4fv(p, scs_cos_constants), 0); 9023af1f3b9220733f5e3a76fe38fbc397974678234Brian } 9033af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9043af1f3b9220733f5e3a76fe38fbc397974678234Brian 9052292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SEQ: 9062292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* if we're both >= and <= then we're == */ 907abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 908abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 9092292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp = i915_get_utemp(p); 9102292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9112292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 9122292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SGE, 9132292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, A0_DEST_CHANNEL_ALL, 0, 9142292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 9152292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src1, 0); 9162292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9172292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 9182292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SGE, 9192292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9202292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9212292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src1, 9222292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 0); 9232292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9242292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 9252292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_MUL, 9262292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9272292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9282292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9292292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, 0); 9302292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9313af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9323af1f3b9220733f5e3a76fe38fbc397974678234Brian 9332292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SGE: 934abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_SGE, 2, fs); 93520839b37ed61b044d6224c0e373ce10d74be4f3dBrian break; 93620839b37ed61b044d6224c0e373ce10d74be4f3dBrian 9373af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SIN: 938abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 9393af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 9403af1f3b9220733f5e3a76fe38fbc397974678234Brian 9413af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9423af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 9433af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 9440e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal src0, i915_emit_const1f(p, 1.0f / (float) (M_PI * 2.0)), 0); 9453af1f3b9220733f5e3a76fe38fbc397974678234Brian 9463af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MOD, tmp, A0_DEST_CHANNEL_X, 0, tmp, 0, 0); 9473af1f3b9220733f5e3a76fe38fbc397974678234Brian 9483af1f3b9220733f5e3a76fe38fbc397974678234Brian /* 9493af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 9503af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, x 9513af1f3b9220733f5e3a76fe38fbc397974678234Brian * t1 = MUL t0.xyyw t0.yz11 ; x^7 x^5 x^3 x 9523af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = DP4 t1.wzyx, sin_constants 9533af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 9543af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9553af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 9563af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XY, 0, 9573af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 9583af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, ONE, ONE, ONE), 0); 9593af1f3b9220733f5e3a76fe38fbc397974678234Brian 9603af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9613af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 9623af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 9633af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, X, Y), 9643af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 0); 9653af1f3b9220733f5e3a76fe38fbc397974678234Brian 9663af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9673af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 9683af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 9693af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, Y, W), 9703af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Z, ONE, ONE), 0); 9713af1f3b9220733f5e3a76fe38fbc397974678234Brian 9723af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9733af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 9747d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 9753af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 9763af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, W, Z, Y, X), 9773af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_const4fv(p, sin_constants), 0); 9783af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9793af1f3b9220733f5e3a76fe38fbc397974678234Brian 9802292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SLE: 9812292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* like SGE, but swap reg0, reg1 */ 982abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith_swap2(p, inst, A0_SGE, 2, fs); 9832292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 9842292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9853af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SLT: 986abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_SLT, 2, fs); 9873af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9883af1f3b9220733f5e3a76fe38fbc397974678234Brian 98920839b37ed61b044d6224c0e373ce10d74be4f3dBrian case TGSI_OPCODE_SGT: 99020839b37ed61b044d6224c0e373ce10d74be4f3dBrian /* like SLT, but swap reg0, reg1 */ 991abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith_swap2(p, inst, A0_SLT, 2, fs); 99220839b37ed61b044d6224c0e373ce10d74be4f3dBrian break; 99320839b37ed61b044d6224c0e373ce10d74be4f3dBrian 9942292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SNE: 995468c2c08414f0ad07e2c2c2a98506f6390124963Stéphane Marchesin /* if we're < or > then we're != */ 996abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 997abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 9980f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin tmp = i915_get_utemp(p); 9990f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 10000f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin i915_emit_arith(p, 10012292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 10022292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, 10032292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 10040f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src0, 10050f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src1, 0); 10060f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 10070f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin i915_emit_arith(p, 10082292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 10090f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin get_result_vector(p, &inst->Dst[0]), 10100f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 10110f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src1, 10120f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src0, 0); 10130f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 10140f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin i915_emit_arith(p, 10152292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_ADD, 10160f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin get_result_vector(p, &inst->Dst[0]), 10170f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 10180f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin get_result_vector(p, &inst->Dst[0]), 10190f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin tmp, 0); 10202292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 10210f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 10222292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SSG: 10232292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* compute (src>0) - (src<0) */ 1024abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 10252292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp = i915_get_utemp(p); 10262292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10272292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 10282292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 10292292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, 10302292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 10312292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 10322292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin swizzle(src0, ZERO, ZERO, ZERO, ZERO), 0); 10332292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10342292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 10352292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 10362292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 10372292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 10382292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin swizzle(src0, ZERO, ZERO, ZERO, ZERO), 10392292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 0); 10402292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10412292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 10422292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_ADD, 10432292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 10442292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 10452292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 10462292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin negate(tmp, 1, 1, 1, 1), 0); 10470f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin break; 10480f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 10493af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SUB: 1050abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 1051abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 10523af1f3b9220733f5e3a76fe38fbc397974678234Brian 10533af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 10543af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_ADD, 10557d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 10563af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 10573af1f3b9220733f5e3a76fe38fbc397974678234Brian src0, negate(src1, 1, 1, 1, 1), 0); 10583af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 10593af1f3b9220733f5e3a76fe38fbc397974678234Brian 10603af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_TEX: 1061abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_tex(p, inst, T0_TEXLD, fs); 10623af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 10633af1f3b9220733f5e3a76fe38fbc397974678234Brian 10642292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_TRUNC: 1065abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_TRC, 1, fs); 10662292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 10672292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10683af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_TXB: 1069abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_tex(p, inst, T0_TEXLDB, fs); 10703af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 10713af1f3b9220733f5e3a76fe38fbc397974678234Brian 1072ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol case TGSI_OPCODE_TXP: 1073abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_tex(p, inst, T0_TEXLDP, fs); 1074ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol break; 1075ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol 10763af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_XPD: 10773af1f3b9220733f5e3a76fe38fbc397974678234Brian /* Cross product: 10783af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.x = src0.y * src1.z - src0.z * src1.y; 10793af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.y = src0.z * src1.x - src0.x * src1.z; 10803af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.z = src0.x * src1.y - src0.y * src1.x; 10813af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.w = undef; 10823af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 1083abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 1084abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 10853af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 10863af1f3b9220733f5e3a76fe38fbc397974678234Brian 10873af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 10883af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 10893af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 10903af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, Z, X, Y, ONE), 10913af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src1, Y, Z, X, ONE), 0); 10923af1f3b9220733f5e3a76fe38fbc397974678234Brian 10933af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 10943af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MAD, 10957d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 10963af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 10973af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, Y, Z, X, ONE), 10983af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src1, Z, X, Y, ONE), 10993af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(tmp, 1, 1, 1, 0)); 11003af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 11013af1f3b9220733f5e3a76fe38fbc397974678234Brian 11023af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 1103af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca i915_program_error(p, "bad opcode %d", inst->Instruction.Opcode); 110420839b37ed61b044d6224c0e373ce10d74be4f3dBrian p->error = 1; 11053af1f3b9220733f5e3a76fe38fbc397974678234Brian return; 11063af1f3b9220733f5e3a76fe38fbc397974678234Brian } 11073af1f3b9220733f5e3a76fe38fbc397974678234Brian 11083af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_release_utemps(p); 11093af1f3b9220733f5e3a76fe38fbc397974678234Brian} 11103af1f3b9220733f5e3a76fe38fbc397974678234Brian 11113af1f3b9220733f5e3a76fe38fbc397974678234Brian 11122bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinstatic void i915_translate_token(struct i915_fp_compile *p, 11132bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const union i915_full_token* token, 11142bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct i915_fragment_shader *fs) 11153af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 1116c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs = p->shader; 11172bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin switch( token->Token.Type ) { 11182bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case TGSI_TOKEN_TYPE_PROPERTY: 11192bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* 11202bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin * We only support one cbuf, but we still need to ignore the property 11212bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin * correctly so we don't hit the assert at the end of the switch case. 11222bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin */ 11232bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin assert(token->FullProperty.Property.PropertyName == 11242bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS); 11252bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 11263af1f3b9220733f5e3a76fe38fbc397974678234Brian 11272bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case TGSI_TOKEN_TYPE_DECLARATION: 11282bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (token->FullDeclaration.Declaration.File 11292bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin == TGSI_FILE_CONSTANT) { 11302bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin uint i; 11312bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for (i = token->FullDeclaration.Range.First; 11322bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i <= token->FullDeclaration.Range.Last; 11332bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i++) { 11342bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin assert(ifs->constant_flags[i] == 0x0); 11352bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ifs->constant_flags[i] = I915_CONSTFLAG_USER; 11362bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ifs->num_constants = MAX2(ifs->num_constants, i + 1); 1137c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 11382bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 11392bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin else if (token->FullDeclaration.Declaration.File 11402bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin == TGSI_FILE_TEMPORARY) { 11412bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin uint i; 11422bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for (i = token->FullDeclaration.Range.First; 11432bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i <= token->FullDeclaration.Range.Last; 11442bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i++) { 11452bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (i >= I915_MAX_TEMPORARY) 11462bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin debug_printf("Too many temps (%d)\n",i); 11472bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin else 11482bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* XXX just use shader->info->file_mask[TGSI_FILE_TEMPORARY] */ 11492bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin p->temp_flag |= (1 << i); /* mark temp as used */ 11500235b3252100eda553babea42c014445358a2985Brian } 11512bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 11522bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 11533af1f3b9220733f5e3a76fe38fbc397974678234Brian 11542bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case TGSI_TOKEN_TYPE_IMMEDIATE: 11552bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin { 11562bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct tgsi_full_immediate *imm 11572bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin = &token->FullImmediate; 11582bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const uint pos = p->num_immediates++; 11592bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin uint j; 11602bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin assert( imm->Immediate.NrTokens <= 4 + 1 ); 11612bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for (j = 0; j < imm->Immediate.NrTokens - 1; j++) { 11622bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin p->immediates[pos][j] = imm->u[j].Float; 1163c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 11642bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 11652bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 11663af1f3b9220733f5e3a76fe38fbc397974678234Brian 11672bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case TGSI_TOKEN_TYPE_INSTRUCTION: 11682bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (p->first_instruction) { 11692bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* resolve location of immediates */ 11702bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin uint i, j; 11712bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for (i = 0; i < p->num_immediates; i++) { 11722bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* find constant slot for this immediate */ 11732bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for (j = 0; j < I915_MAX_CONSTANT; j++) { 11742bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (ifs->constant_flags[j] == 0x0) { 11752bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin memcpy(ifs->constants[j], 11762bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin p->immediates[i], 11772bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 4 * sizeof(float)); 11782bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /*printf("immediate %d maps to const %d\n", i, j);*/ 11792bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ifs->constant_flags[j] = 0xf; /* all four comps used */ 11802bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin p->immediates_map[i] = j; 11812bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ifs->num_constants = MAX2(ifs->num_constants, j + 1); 11822bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 1183c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1184c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1185c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1186c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 11872bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin p->first_instruction = FALSE; 11883af1f3b9220733f5e3a76fe38fbc397974678234Brian } 11893af1f3b9220733f5e3a76fe38fbc397974678234Brian 11902bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i915_translate_instruction(p, &token->FullInstruction, fs); 11912bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 11922bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11932bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin default: 11942bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin assert( 0 ); 11952bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 11963af1f3b9220733f5e3a76fe38fbc397974678234Brian 11972bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin} 11982bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11992bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin/** 12002bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin * Translate TGSI fragment shader into i915 hardware instructions. 12012bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin * \param p the translation state 12022bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin * \param tokens the TGSI token array 12032bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin */ 12042bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinstatic void 12052bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesini915_translate_instructions(struct i915_fp_compile *p, 12062bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_token_list *tokens, 12072bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct i915_fragment_shader *fs) 12082bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin{ 12092bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin int i; 12102bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for(i = 0; i<tokens->NumTokens; i++) { 12112bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i915_translate_token(p, &tokens->Tokens[i], fs); 12122bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 12133af1f3b9220733f5e3a76fe38fbc397974678234Brian} 12143af1f3b9220733f5e3a76fe38fbc397974678234Brian 12153af1f3b9220733f5e3a76fe38fbc397974678234Brian 12160d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic struct i915_fp_compile * 12170d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Briani915_init_compile(struct i915_context *i915, 1218c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs) 12190d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 12200d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian struct i915_fp_compile *p = CALLOC_STRUCT(i915_fp_compile); 1221abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin int i; 12220d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1223c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->shader = ifs; 12240d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1225c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /* Put new constants at end of const buffer, growing downward. 1226c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * The problem is we don't know how many user-defined constants might 1227c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * be specified with pipe->set_constant_buffer(). 1228c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * Should pre-scan the user's program to determine the highest-numbered 1229c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * constant referenced. 1230c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian */ 1231c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->num_constants = 0; 1232c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memset(ifs->constant_flags, 0, sizeof(ifs->constant_flags)); 1233c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 12345d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin memset(&p->register_phases, 0, sizeof(p->register_phases)); 12355d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin 1236abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin for (i = 0; i < I915_TEX_UNITS; i++) 1237abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin ifs->generic_mapping[i] = -1; 1238abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 1239c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->first_instruction = TRUE; 12400d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_tex_indirect = 1; /* correct? */ 12420d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_tex_insn = 0; 12430d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_alu_insn = 0; 12440d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_decl_insn = 0; 12450d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12460d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->csr = p->program; 12470d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->decl = p->declarations; 12480d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->decl_s = 0; 12490d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->decl_t = 0; 12500235b3252100eda553babea42c014445358a2985Brian p->temp_flag = ~0x0 << I915_MAX_TEMPORARY; 12510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->utemp_flag = ~0x7; 12520d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12530d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* initialize the first program word */ 12540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian *(p->decl++) = _3DSTATE_PIXEL_SHADER_PROGRAM; 12550d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian return p; 12570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 12580d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12595ac22877c98f4934cced4d42b9ec87245f266967Brian 12600d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/* Copy compile results to the fragment program struct and destroy the 12610d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * compilation context. 12620d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 12630d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 12640d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Briani915_fini_compile(struct i915_context *i915, struct i915_fp_compile *p) 12650d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 1266c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs = p->shader; 12675961732c1b59403b4e736fa354a64d4a0e5d8af2Michal unsigned long program_size = (unsigned long) (p->csr - p->program); 12685961732c1b59403b4e736fa354a64d4a0e5d8af2Michal unsigned long decl_size = (unsigned long) (p->decl - p->declarations); 12690d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12700d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_tex_indirect > I915_MAX_TEX_INDIRECT) 12715d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin debug_printf("Exceeded max nr indirect texture lookups\n"); 12720d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12730d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_tex_insn > I915_MAX_TEX_INSN) 12740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max TEX instructions"); 12750d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12760d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_alu_insn > I915_MAX_ALU_INSN) 12770d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max ALU instructions"); 12780d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12790d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_decl_insn > I915_MAX_DECL_INSN) 12800d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max DECL instructions"); 12810d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12820d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->error) { 12830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeInstructions = 0; 12840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeAluInstructions = 0; 12850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexInstructions = 0; 12860d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexIndirections = 0; 12870d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1288c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian i915_use_passthrough_shader(ifs); 12890d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12900d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian else { 12915ac22877c98f4934cced4d42b9ec87245f266967Brian p->NumNativeInstructions 12925ac22877c98f4934cced4d42b9ec87245f266967Brian = p->nr_alu_insn + p->nr_tex_insn + p->nr_decl_insn; 12930d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeAluInstructions = p->nr_alu_insn; 12940d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexInstructions = p->nr_tex_insn; 12950d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexIndirections = p->nr_tex_indirect; 12960d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12970d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* patch in the program length */ 12980d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->declarations[0] |= program_size + decl_size - 2; 12990d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13000d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* Copy compilation results to fragment program struct: 13010d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 13028e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin assert(!ifs->decl); 1303c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian assert(!ifs->program); 13048e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin 13058e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin ifs->decl 13068e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin = (uint *) MALLOC(decl_size * sizeof(uint)); 1307c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->program 13088e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin = (uint *) MALLOC(program_size * sizeof(uint)); 13090d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13108e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin if (ifs->decl) { 13118e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin ifs->decl_len = decl_size; 13128e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin 13138e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin memcpy(ifs->decl, 131479a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin p->declarations, 13155ac22877c98f4934cced4d42b9ec87245f266967Brian decl_size * sizeof(uint)); 13168e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin } 13178e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin 13188e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin if (ifs->program) { 13198e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin ifs->program_len = program_size; 13203af1f3b9220733f5e3a76fe38fbc397974678234Brian 13218e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin memcpy(ifs->program, 132279a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin p->program, 13235ac22877c98f4934cced4d42b9ec87245f266967Brian program_size * sizeof(uint)); 13245ac22877c98f4934cced4d42b9ec87245f266967Brian } 13250d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 13260d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13270d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* Release the compilation struct: 13280d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 13295961732c1b59403b4e736fa354a64d4a0e5d8af2Michal FREE(p); 13300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 13310d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13320d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13330d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13340d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13350d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13360d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/** 13370d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Rather than trying to intercept and jiggle depth writes during 13383af1f3b9220733f5e3a76fe38fbc397974678234Brian * emit, just move the value into its correct position at the end of 13393af1f3b9220733f5e3a76fe38fbc397974678234Brian * the program: 13403af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 13410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 13423af1f3b9220733f5e3a76fe38fbc397974678234Briani915_fixup_depth_write(struct i915_fp_compile *p) 13433af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 1344f69b5c56feb60791bad27d491ee9592238d4efb0Brian /* XXX assuming pos/depth is always in output[0] */ 13454901410293b35ac6bb4759142b50fcc0be8a1b25Brian if (p->shader->info.output_semantic_name[0] == TGSI_SEMANTIC_POSITION) { 134637cf13ed9a429c755f121daa1776b1b30a985ab3Brian const uint depth = UREG(REG_TYPE_OD, 0); 13473af1f3b9220733f5e3a76fe38fbc397974678234Brian 13483af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 134937cf13ed9a429c755f121daa1776b1b30a985ab3Brian A0_MOV, /* opcode */ 135037cf13ed9a429c755f121daa1776b1b30a985ab3Brian depth, /* dest reg */ 135137cf13ed9a429c755f121daa1776b1b30a985ab3Brian A0_DEST_CHANNEL_W, /* write mask */ 135237cf13ed9a429c755f121daa1776b1b30a985ab3Brian 0, /* saturate? */ 135337cf13ed9a429c755f121daa1776b1b30a985ab3Brian swizzle(depth, X, Y, Z, Z), /* src0 */ 135437cf13ed9a429c755f121daa1776b1b30a985ab3Brian 0, 0 /* src1, src2 */); 13553af1f3b9220733f5e3a76fe38fbc397974678234Brian } 13563af1f3b9220733f5e3a76fe38fbc397974678234Brian} 13573af1f3b9220733f5e3a76fe38fbc397974678234Brian 13583af1f3b9220733f5e3a76fe38fbc397974678234Brian 13590d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianvoid 1360c74900ee5d80c7c2b7cbe4ed87395526a742a13eBriani915_translate_fragment_program( struct i915_context *i915, 1361c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *fs) 13620d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 136398b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter struct i915_fp_compile *p; 1364c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian const struct tgsi_token *tokens = fs->state.tokens; 13659726947b681225a5a438eaa7cb70c5fa36ce85eaBrian Paul struct i915_token_list* i_tokens; 13663af1f3b9220733f5e3a76fe38fbc397974678234Brian 1367c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian#if 0 1368c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian tgsi_dump(tokens, 0); 1369c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian#endif 1370c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 137198b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter /* hw doesn't seem to like empty frag programs, even when the depth write 137298b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter * fixup gets emitted below - may that one is fishy, too? */ 13739f0acfe1384d3236ac30ffca4be96e9531d2e876Jakob Bornecrantz if (fs->info.num_instructions == 1) { 137498b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter i915_use_passthrough_shader(fs); 137598b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter 137698b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter return; 137798b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter } 137898b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter 137998b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter p = i915_init_compile(i915, fs); 138098b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter 13819726947b681225a5a438eaa7cb70c5fa36ce85eaBrian Paul i_tokens = i915_optimize(tokens); 13822bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i915_translate_instructions(p, i_tokens, fs); 13830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_fixup_depth_write(p); 13840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_fini_compile(i915, p); 13862bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i915_optimize_free(i_tokens); 1387ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin 1388ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin#if 0 1389ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin i915_disassemble_program(NULL, fs->program, fs->program_len); 1390ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin#endif 13910d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 1392