i915_fpc_translate.c revision e3c94fac4eb159f8c35798d1ad7515a40f5a2eca
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 */ 5279a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesinstatic unsigned passthrough[] = 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, 640d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 650d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* move to output color: 660d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 6779a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin (A0_MOV | 6879a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin (REG_TYPE_OC << A0_DEST_TYPE_SHIFT) | 6979a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin A0_DEST_CHANNEL_ALL | 700d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (REG_TYPE_T << A0_SRC0_TYPE_SHIFT) | 710d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (T_DIFFUSE << A0_SRC0_NR_SHIFT)), 720d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 0x01230000, /* .xyzw */ 730d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 0 740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian}; 750d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 763af1f3b9220733f5e3a76fe38fbc397974678234Brian 773af1f3b9220733f5e3a76fe38fbc397974678234Brian/* 1, -1/3!, 1/5!, -1/7! */ 78062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesinstatic const float scs_sin_constants[4] = { 1.0, 795961732c1b59403b4e736fa354a64d4a0e5d8af2Michal -1.0f / (3 * 2 * 1), 805961732c1b59403b4e736fa354a64d4a0e5d8af2Michal 1.0f / (5 * 4 * 3 * 2 * 1), 815961732c1b59403b4e736fa354a64d4a0e5d8af2Michal -1.0f / (7 * 6 * 5 * 4 * 3 * 2 * 1) 823af1f3b9220733f5e3a76fe38fbc397974678234Brian}; 833af1f3b9220733f5e3a76fe38fbc397974678234Brian 843af1f3b9220733f5e3a76fe38fbc397974678234Brian/* 1, -1/2!, 1/4!, -1/6! */ 85062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesinstatic const float scs_cos_constants[4] = { 1.0, 865961732c1b59403b4e736fa354a64d4a0e5d8af2Michal -1.0f / (2 * 1), 875961732c1b59403b4e736fa354a64d4a0e5d8af2Michal 1.0f / (4 * 3 * 2 * 1), 885961732c1b59403b4e736fa354a64d4a0e5d8af2Michal -1.0f / (6 * 5 * 4 * 3 * 2 * 1) 893af1f3b9220733f5e3a76fe38fbc397974678234Brian}; 903af1f3b9220733f5e3a76fe38fbc397974678234Brian 91fe36bc0c41ee7fd3aa7b364a8301d50613644f71Stéphane Marchesin/* 2*pi, -(2*pi)^3/3!, (2*pi)^5/5!, -(2*pi)^7/7! */ 92062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesinstatic const float sin_constants[4] = { 2.0 * M_PI, 93062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin -8.0f * M_PI * M_PI * M_PI / (3 * 2 * 1), 94062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin 32.0f * M_PI * M_PI * M_PI * M_PI * M_PI / (5 * 4 * 3 * 2 * 1), 95062a1e291fdc0ef69b6677f8ae0e3471047e281dSté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) 96062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin}; 97062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin 98fe36bc0c41ee7fd3aa7b364a8301d50613644f71Stéphane Marchesin/* 1, -(2*pi)^2/2!, (2*pi)^4/4!, -(2*pi)^6/6! */ 99062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesinstatic const float cos_constants[4] = { 1.0, 100062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin -4.0f * M_PI * M_PI / (2 * 1), 101062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin 16.0f * M_PI * M_PI * M_PI * M_PI / (4 * 3 * 2 * 1), 102062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin -64.0f * M_PI * M_PI * M_PI * M_PI * M_PI * M_PI / (6 * 5 * 4 * 3 * 2 * 1) 103062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin}; 104062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin 1053af1f3b9220733f5e3a76fe38fbc397974678234Brian 1060d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1075ac22877c98f4934cced4d42b9ec87245f266967Brian/** 1085ac22877c98f4934cced4d42b9ec87245f266967Brian * component-wise negation of ureg 1095ac22877c98f4934cced4d42b9ec87245f266967Brian */ 1105ac22877c98f4934cced4d42b9ec87245f266967Brianstatic INLINE int 1115ac22877c98f4934cced4d42b9ec87245f266967Briannegate(int reg, int x, int y, int z, int w) 1125ac22877c98f4934cced4d42b9ec87245f266967Brian{ 1135ac22877c98f4934cced4d42b9ec87245f266967Brian /* Another neat thing about the UREG representation */ 1145ac22877c98f4934cced4d42b9ec87245f266967Brian return reg ^ (((x & 1) << UREG_CHANNEL_X_NEGATE_SHIFT) | 1155ac22877c98f4934cced4d42b9ec87245f266967Brian ((y & 1) << UREG_CHANNEL_Y_NEGATE_SHIFT) | 1165ac22877c98f4934cced4d42b9ec87245f266967Brian ((z & 1) << UREG_CHANNEL_Z_NEGATE_SHIFT) | 1175ac22877c98f4934cced4d42b9ec87245f266967Brian ((w & 1) << UREG_CHANNEL_W_NEGATE_SHIFT)); 1185ac22877c98f4934cced4d42b9ec87245f266967Brian} 1195ac22877c98f4934cced4d42b9ec87245f266967Brian 1205ac22877c98f4934cced4d42b9ec87245f266967Brian 121c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian/** 122c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * In the event of a translation failure, we'll generate a simple color 123c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * pass-through program. 124c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian */ 1250d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 126c74900ee5d80c7c2b7cbe4ed87395526a742a13eBriani915_use_passthrough_shader(struct i915_fragment_shader *fs) 1270d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 128c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian fs->program = (uint *) MALLOC(sizeof(passthrough)); 129c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian if (fs->program) { 130c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memcpy(fs->program, passthrough, sizeof(passthrough)); 131c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian fs->program_len = Elements(passthrough); 1325ac22877c98f4934cced4d42b9ec87245f266967Brian } 133c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian fs->num_constants = 0; 1340d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 1350d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1360d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1370d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianvoid 138af60ebc4eedcfec2090e1ddd7630137948c26866José Fonsecai915_program_error(struct i915_fp_compile *p, const char *msg, ...) 1390d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 140af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca va_list args; 1410e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal char buffer[1024]; 142af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca 1439791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("i915_program_error: "); 144974c49ed176de55aadb335a2956ef5dfec774a23Stephane Marchesin va_start( args, msg ); 1455b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca util_vsnprintf( buffer, sizeof(buffer), msg, args ); 146af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca va_end( args ); 14796c9b39a6a9553573fcbdb5fd6db0e9d59768442Jakob Bornecrantz debug_printf("%s", buffer); 1489791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("\n"); 149af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca 1500d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->error = 1; 1510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 1520d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 153abb436526974bd090853c0927ece0839f9143393Stéphane Marchesinstatic uint get_mapping(struct i915_fragment_shader* fs, int unit) 154abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin{ 155abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin int i; 156abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin for (i = 0; i < I915_TEX_UNITS; i++) 157abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin { 158abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin if (fs->generic_mapping[i] == -1) { 159abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin fs->generic_mapping[i] = unit; 160abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin return i; 161abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin } 162abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin if (fs->generic_mapping[i] == unit) 163abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin return i; 164abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin } 165abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin debug_printf("Exceeded max generics\n"); 166abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin return 0; 167abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin} 1680d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1693af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 1703af1f3b9220733f5e3a76fe38fbc397974678234Brian * Construct a ureg for the given source register. Will emit 1713af1f3b9220733f5e3a76fe38fbc397974678234Brian * constants, apply swizzling and negation as needed. 1723af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 1733af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 1743af1f3b9220733f5e3a76fe38fbc397974678234Briansrc_vector(struct i915_fp_compile *p, 1752bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_full_src_register *source, 176abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 1773af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 17891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell uint index = source->Register.Index; 17996ad8a36003a21180ad6b61aa0b7d7c9452b3449Jakob Bornecrantz uint src = 0, sem_name, sem_ind; 1803af1f3b9220733f5e3a76fe38fbc397974678234Brian 18191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell switch (source->Register.File) { 1823af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_TEMPORARY: 18391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (source->Register.Index >= I915_MAX_TEMPORARY) { 1843af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "Exceeded max temporary reg"); 1853af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 1863af1f3b9220733f5e3a76fe38fbc397974678234Brian } 1873af1f3b9220733f5e3a76fe38fbc397974678234Brian src = UREG(REG_TYPE_R, index); 1883af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 1893af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_INPUT: 1903af1f3b9220733f5e3a76fe38fbc397974678234Brian /* XXX: Packing COL1, FOGC into a single attribute works for 1913af1f3b9220733f5e3a76fe38fbc397974678234Brian * texenv programs, but will fail for real fragment programs 1923af1f3b9220733f5e3a76fe38fbc397974678234Brian * that use these attributes and expect them to be a full 4 1933af1f3b9220733f5e3a76fe38fbc397974678234Brian * components wide. Could use a texcoord to pass these 1943af1f3b9220733f5e3a76fe38fbc397974678234Brian * attributes if necessary, but that won't work in the general 1953af1f3b9220733f5e3a76fe38fbc397974678234Brian * case. 1963af1f3b9220733f5e3a76fe38fbc397974678234Brian * 1973af1f3b9220733f5e3a76fe38fbc397974678234Brian * We also use a texture coordinate to pass wpos when possible. 1983af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 199d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian 2004901410293b35ac6bb4759142b50fcc0be8a1b25Brian sem_name = p->shader->info.input_semantic_name[index]; 2014901410293b35ac6bb4759142b50fcc0be8a1b25Brian sem_ind = p->shader->info.input_semantic_index[index]; 20237cf13ed9a429c755f121daa1776b1b30a985ab3Brian 203f69b5c56feb60791bad27d491ee9592238d4efb0Brian switch (sem_name) { 20437cf13ed9a429c755f121daa1776b1b30a985ab3Brian case TGSI_SEMANTIC_POSITION: 205d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin { 206d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin /* for fragcoord */ 207d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin int real_tex_unit = get_mapping(fs, I915_SEMANTIC_POS); 208d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_ALL); 209d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin break; 210d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin } 211f69b5c56feb60791bad27d491ee9592238d4efb0Brian case TGSI_SEMANTIC_COLOR: 212f69b5c56feb60791bad27d491ee9592238d4efb0Brian if (sem_ind == 0) { 213f69b5c56feb60791bad27d491ee9592238d4efb0Brian src = i915_emit_decl(p, REG_TYPE_T, T_DIFFUSE, D0_CHANNEL_ALL); 214f69b5c56feb60791bad27d491ee9592238d4efb0Brian } 215f69b5c56feb60791bad27d491ee9592238d4efb0Brian else { 216f69b5c56feb60791bad27d491ee9592238d4efb0Brian /* secondary color */ 217f69b5c56feb60791bad27d491ee9592238d4efb0Brian assert(sem_ind == 1); 218f69b5c56feb60791bad27d491ee9592238d4efb0Brian src = i915_emit_decl(p, REG_TYPE_T, T_SPECULAR, D0_CHANNEL_XYZ); 219f69b5c56feb60791bad27d491ee9592238d4efb0Brian src = swizzle(src, X, Y, Z, ONE); 220f69b5c56feb60791bad27d491ee9592238d4efb0Brian } 22137cf13ed9a429c755f121daa1776b1b30a985ab3Brian break; 22237cf13ed9a429c755f121daa1776b1b30a985ab3Brian case TGSI_SEMANTIC_FOG: 22337cf13ed9a429c755f121daa1776b1b30a985ab3Brian src = i915_emit_decl(p, REG_TYPE_T, T_FOG_W, D0_CHANNEL_W); 22437cf13ed9a429c755f121daa1776b1b30a985ab3Brian src = swizzle(src, W, W, W, W); 22537cf13ed9a429c755f121daa1776b1b30a985ab3Brian break; 226e9259ad0d7f674a1f2f9156ba0baeedc0e7d0d54Brian case TGSI_SEMANTIC_GENERIC: 227abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin { 228abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin int real_tex_unit = get_mapping(fs, sem_ind); 229abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_ALL); 230abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin break; 231abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin } 232ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin case TGSI_SEMANTIC_FACE: 233ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin { 234ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin /* for back/front faces */ 235ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin int real_tex_unit = get_mapping(fs, I915_SEMANTIC_FACE); 236ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_X); 237ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin break; 238ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin } 23937cf13ed9a429c755f121daa1776b1b30a985ab3Brian default: 24037cf13ed9a429c755f121daa1776b1b30a985ab3Brian i915_program_error(p, "Bad source->Index"); 24137cf13ed9a429c755f121daa1776b1b30a985ab3Brian return 0; 24237cf13ed9a429c755f121daa1776b1b30a985ab3Brian } 2433af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 2443af1f3b9220733f5e3a76fe38fbc397974678234Brian 2456c29be9f41470b22c87ef571e10b5a9824800608Brian case TGSI_FILE_IMMEDIATE: 246c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian assert(index < p->num_immediates); 247c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian index = p->immediates_map[index]; 2486c29be9f41470b22c87ef571e10b5a9824800608Brian /* fall-through */ 2493af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_CONSTANT: 2503af1f3b9220733f5e3a76fe38fbc397974678234Brian src = UREG(REG_TYPE_CONST, index); 2513af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 2523af1f3b9220733f5e3a76fe38fbc397974678234Brian 2533af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 2543af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "Bad source->File"); 2553af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 2563af1f3b9220733f5e3a76fe38fbc397974678234Brian } 2573af1f3b9220733f5e3a76fe38fbc397974678234Brian 258b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell src = swizzle(src, 25991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleX, 26091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleY, 26191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleZ, 26291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleW); 26341b3fcbf0404bc4a4f6588c0feef553bb65d4440Brian 2642154d1c5ac0bb37614ef00bed766e49635b519e8Brian /* There's both negate-all-components and per-component negation. 2652154d1c5ac0bb37614ef00bed766e49635b519e8Brian * Try to handle both here. 2662154d1c5ac0bb37614ef00bed766e49635b519e8Brian */ 2672154d1c5ac0bb37614ef00bed766e49635b519e8Brian { 26891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell int n = source->Register.Negate; 269da253319f9e5d37d9c55b975ef9328545a3ac9b4Keith Whitwell src = negate(src, n, n, n, n); 2702154d1c5ac0bb37614ef00bed766e49635b519e8Brian } 2712154d1c5ac0bb37614ef00bed766e49635b519e8Brian 27256ee132f9671f70ff2b3ee04659beac0dfc6126dKeith Whitwell /* no abs() */ 27337cf13ed9a429c755f121daa1776b1b30a985ab3Brian#if 0 27437cf13ed9a429c755f121daa1776b1b30a985ab3Brian /* XXX assertions disabled to allow arbfplight.c to run */ 27537cf13ed9a429c755f121daa1776b1b30a985ab3Brian /* XXX enable these assertions, or fix things */ 27691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell assert(!source->Register.Absolute); 27737cf13ed9a429c755f121daa1776b1b30a985ab3Brian#endif 278de33b0dd231d646cbbc7ba6c25bf6dd04a96cd86Stéphane Marchesin if (source->Register.Absolute) 2795d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin debug_printf("Unhandled absolute value\n"); 280de33b0dd231d646cbbc7ba6c25bf6dd04a96cd86Stéphane Marchesin 2813af1f3b9220733f5e3a76fe38fbc397974678234Brian return src; 2823af1f3b9220733f5e3a76fe38fbc397974678234Brian} 2833af1f3b9220733f5e3a76fe38fbc397974678234Brian 2843af1f3b9220733f5e3a76fe38fbc397974678234Brian 2850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/** 2860d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Construct a ureg for a destination register. 2870d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 2883af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 2893af1f3b9220733f5e3a76fe38fbc397974678234Brianget_result_vector(struct i915_fp_compile *p, 2902bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_full_dst_register *dest) 2913af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 2925b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch (dest->Register.File) { 2933af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_OUTPUT: 294d0bca086ab6d032909e9a429720fea297c536f97Brian { 2955b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell uint sem_name = p->shader->info.output_semantic_name[dest->Register.Index]; 296d0bca086ab6d032909e9a429720fea297c536f97Brian switch (sem_name) { 297d0bca086ab6d032909e9a429720fea297c536f97Brian case TGSI_SEMANTIC_POSITION: 298d0bca086ab6d032909e9a429720fea297c536f97Brian return UREG(REG_TYPE_OD, 0); 299d0bca086ab6d032909e9a429720fea297c536f97Brian case TGSI_SEMANTIC_COLOR: 300d0bca086ab6d032909e9a429720fea297c536f97Brian return UREG(REG_TYPE_OC, 0); 301d0bca086ab6d032909e9a429720fea297c536f97Brian default: 302d0bca086ab6d032909e9a429720fea297c536f97Brian i915_program_error(p, "Bad inst->DstReg.Index/semantics"); 303d0bca086ab6d032909e9a429720fea297c536f97Brian return 0; 304d0bca086ab6d032909e9a429720fea297c536f97Brian } 3053af1f3b9220733f5e3a76fe38fbc397974678234Brian } 3063af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_TEMPORARY: 3075b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell return UREG(REG_TYPE_R, dest->Register.Index); 3083af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 3093af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "Bad inst->DstReg.File"); 3103af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 3113af1f3b9220733f5e3a76fe38fbc397974678234Brian } 3123af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3133af1f3b9220733f5e3a76fe38fbc397974678234Brian 3143af1f3b9220733f5e3a76fe38fbc397974678234Brian 3153af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 3163af1f3b9220733f5e3a76fe38fbc397974678234Brian * Compute flags for saturation and writemask. 3173af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 3183af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 3192bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinget_result_flags(const struct i915_full_instruction *inst) 3203af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3213af1f3b9220733f5e3a76fe38fbc397974678234Brian const uint writeMask 3225b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell = inst->Dst[0].Register.WriteMask; 3233af1f3b9220733f5e3a76fe38fbc397974678234Brian uint flags = 0x0; 3243af1f3b9220733f5e3a76fe38fbc397974678234Brian 3253af1f3b9220733f5e3a76fe38fbc397974678234Brian if (inst->Instruction.Saturate == TGSI_SAT_ZERO_ONE) 3263af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_SATURATE; 3273af1f3b9220733f5e3a76fe38fbc397974678234Brian 3283af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_X) 3293af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_X; 3303af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_Y) 3313af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_Y; 3323af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_Z) 3333af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_Z; 3343af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_W) 3353af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_W; 3363af1f3b9220733f5e3a76fe38fbc397974678234Brian 3373af1f3b9220733f5e3a76fe38fbc397974678234Brian return flags; 3383af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3393af1f3b9220733f5e3a76fe38fbc397974678234Brian 3403af1f3b9220733f5e3a76fe38fbc397974678234Brian 3413af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 3423af1f3b9220733f5e3a76fe38fbc397974678234Brian * Convert TGSI_TEXTURE_x token to DO_SAMPLE_TYPE_x token 3433af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 3443af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 3453af1f3b9220733f5e3a76fe38fbc397974678234Briantranslate_tex_src_target(struct i915_fp_compile *p, uint tex) 3463af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3473af1f3b9220733f5e3a76fe38fbc397974678234Brian switch (tex) { 348776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul case TGSI_TEXTURE_SHADOW1D: 349776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul /* fall-through */ 3503af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_1D: 3513af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_2D; 352776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 353776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul case TGSI_TEXTURE_SHADOW2D: 354776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul /* fall-through */ 3553af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_2D: 3563af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_2D; 357776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 358776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul case TGSI_TEXTURE_SHADOWRECT: 359776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul /* fall-through */ 3603af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_RECT: 3613af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_2D; 362776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3633af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_3D: 3643af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_VOLUME; 365776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3663af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_CUBE: 3673af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_CUBE; 368776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3693af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 3703af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "TexSrc type"); 3713af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 3723af1f3b9220733f5e3a76fe38fbc397974678234Brian } 3733af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3743af1f3b9220733f5e3a76fe38fbc397974678234Brian 375e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin/** 376e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin * Convert TGSI_TEXTURE_x token to DO_SAMPLE_TYPE_x token 377e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin */ 378e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesinstatic uint 379e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesintexture_num_coords(struct i915_fp_compile *p, uint tex) 380e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin{ 381e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin switch (tex) { 382e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_SHADOW1D: 383e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_1D: 384e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin return 1; 385e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin 386e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_SHADOW2D: 387e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_2D: 388e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_SHADOWRECT: 389e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_RECT: 390e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin return 2; 391e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin 392e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_3D: 393e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case TGSI_TEXTURE_CUBE: 394e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin return 3; 395e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin 396e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin default: 397e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin i915_program_error(p, "Num coords"); 398e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin return 2; 399e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin } 400e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin} 401e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin 4023af1f3b9220733f5e3a76fe38fbc397974678234Brian 4033af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 4043af1f3b9220733f5e3a76fe38fbc397974678234Brian * Generate texel lookup instruction. 4053af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 4063af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void 4073af1f3b9220733f5e3a76fe38fbc397974678234Brianemit_tex(struct i915_fp_compile *p, 4082bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_full_instruction *inst, 409abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint opcode, 410abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 4113af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 4127d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell uint texture = inst->Texture.Texture; 41391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell uint unit = inst->Src[1].Register.Index; 4143af1f3b9220733f5e3a76fe38fbc397974678234Brian uint tex = translate_tex_src_target( p, texture ); 4153af1f3b9220733f5e3a76fe38fbc397974678234Brian uint sampler = i915_emit_decl(p, REG_TYPE_S, unit, tex); 416abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint coord = src_vector( p, &inst->Src[0], fs); 4173af1f3b9220733f5e3a76fe38fbc397974678234Brian 4183af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_texld( p, 4197d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector( p, &inst->Dst[0] ), 4203af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags( inst ), 4213af1f3b9220733f5e3a76fe38fbc397974678234Brian sampler, 4223af1f3b9220733f5e3a76fe38fbc397974678234Brian coord, 423e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin opcode, 424e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin texture_num_coords(p, texture) ); 4253af1f3b9220733f5e3a76fe38fbc397974678234Brian} 4263af1f3b9220733f5e3a76fe38fbc397974678234Brian 4273af1f3b9220733f5e3a76fe38fbc397974678234Brian 4283af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 4293af1f3b9220733f5e3a76fe38fbc397974678234Brian * Generate a simple arithmetic instruction 4303af1f3b9220733f5e3a76fe38fbc397974678234Brian * \param opcode the i915 opcode 4313af1f3b9220733f5e3a76fe38fbc397974678234Brian * \param numArgs the number of input/src arguments 4323af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 4333af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void 4343af1f3b9220733f5e3a76fe38fbc397974678234Brianemit_simple_arith(struct i915_fp_compile *p, 4352bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_full_instruction *inst, 436abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint opcode, uint numArgs, 437abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 4383af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 4393af1f3b9220733f5e3a76fe38fbc397974678234Brian uint arg1, arg2, arg3; 4403af1f3b9220733f5e3a76fe38fbc397974678234Brian 4413af1f3b9220733f5e3a76fe38fbc397974678234Brian assert(numArgs <= 3); 4423af1f3b9220733f5e3a76fe38fbc397974678234Brian 443abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin arg1 = (numArgs < 1) ? 0 : src_vector( p, &inst->Src[0], fs ); 444abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin arg2 = (numArgs < 2) ? 0 : src_vector( p, &inst->Src[1], fs ); 445abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin arg3 = (numArgs < 3) ? 0 : src_vector( p, &inst->Src[2], fs ); 4463af1f3b9220733f5e3a76fe38fbc397974678234Brian 4473af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith( p, 4483af1f3b9220733f5e3a76fe38fbc397974678234Brian opcode, 4497d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector( p, &inst->Dst[0]), 4503af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags( inst ), 0, 4513af1f3b9220733f5e3a76fe38fbc397974678234Brian arg1, 4523af1f3b9220733f5e3a76fe38fbc397974678234Brian arg2, 4533af1f3b9220733f5e3a76fe38fbc397974678234Brian arg3 ); 4543af1f3b9220733f5e3a76fe38fbc397974678234Brian} 4553af1f3b9220733f5e3a76fe38fbc397974678234Brian 45620839b37ed61b044d6224c0e373ce10d74be4f3dBrian 45720839b37ed61b044d6224c0e373ce10d74be4f3dBrian/** As above, but swap the first two src regs */ 45820839b37ed61b044d6224c0e373ce10d74be4f3dBrianstatic void 45920839b37ed61b044d6224c0e373ce10d74be4f3dBrianemit_simple_arith_swap2(struct i915_fp_compile *p, 4602bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_full_instruction *inst, 461abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint opcode, uint numArgs, 462abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 46320839b37ed61b044d6224c0e373ce10d74be4f3dBrian{ 4642bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct i915_full_instruction inst2; 46520839b37ed61b044d6224c0e373ce10d74be4f3dBrian 46620839b37ed61b044d6224c0e373ce10d74be4f3dBrian assert(numArgs == 2); 46720839b37ed61b044d6224c0e373ce10d74be4f3dBrian 46820839b37ed61b044d6224c0e373ce10d74be4f3dBrian /* transpose first two registers */ 46920839b37ed61b044d6224c0e373ce10d74be4f3dBrian inst2 = *inst; 4707d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell inst2.Src[0] = inst->Src[1]; 4717d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell inst2.Src[1] = inst->Src[0]; 47220839b37ed61b044d6224c0e373ce10d74be4f3dBrian 473abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, &inst2, opcode, numArgs, fs); 47420839b37ed61b044d6224c0e373ce10d74be4f3dBrian} 47520839b37ed61b044d6224c0e373ce10d74be4f3dBrian 4760d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/* 4770d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Translate TGSI instruction to i915 instruction. 4780d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * 4790d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Possible concerns: 4800d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * 481cc78eb63cdc0022684ca6816f258ea4492431916Stéphane Marchesin * DDX, DDY -- return 0 4820d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * SIN, COS -- could use another taylor step? 4830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * LIT -- results seem a little different to sw mesa 4840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * LOG -- different to mesa on negative numbers, but this is conformant. 48579a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin */ 4863af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void 4873af1f3b9220733f5e3a76fe38fbc397974678234Briani915_translate_instruction(struct i915_fp_compile *p, 4882bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_full_instruction *inst, 489abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader *fs) 4903af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 4913af1f3b9220733f5e3a76fe38fbc397974678234Brian uint writemask; 4923af1f3b9220733f5e3a76fe38fbc397974678234Brian uint src0, src1, src2, flags; 4933af1f3b9220733f5e3a76fe38fbc397974678234Brian uint tmp = 0; 4943af1f3b9220733f5e3a76fe38fbc397974678234Brian 4953af1f3b9220733f5e3a76fe38fbc397974678234Brian switch (inst->Instruction.Opcode) { 4963af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_ABS: 497abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 4983af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 4993af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MAX, 5007d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5013af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 5023af1f3b9220733f5e3a76fe38fbc397974678234Brian src0, negate(src0, 1, 1, 1, 1), 0); 5033af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5043af1f3b9220733f5e3a76fe38fbc397974678234Brian 5053af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_ADD: 506abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_ADD, 2, fs); 5073af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5083af1f3b9220733f5e3a76fe38fbc397974678234Brian 5093af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_CMP: 510abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 511abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 512abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src2 = src_vector(p, &inst->Src[2], fs); 5133af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_CMP, 5147d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5153af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 5163af1f3b9220733f5e3a76fe38fbc397974678234Brian 0, src0, src2, src1); /* NOTE: order of src2, src1 */ 5173af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5183af1f3b9220733f5e3a76fe38fbc397974678234Brian 5193af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_COS: 520abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 5213af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 5223af1f3b9220733f5e3a76fe38fbc397974678234Brian 5233af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5243af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5253af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 5260e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal src0, i915_emit_const1f(p, 1.0f / (float) (M_PI * 2.0)), 0); 5273af1f3b9220733f5e3a76fe38fbc397974678234Brian 5283af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MOD, tmp, A0_DEST_CHANNEL_X, 0, tmp, 0, 0); 5293af1f3b9220733f5e3a76fe38fbc397974678234Brian 5303af1f3b9220733f5e3a76fe38fbc397974678234Brian /* 5313af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 5323af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, 1 5333af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xxz1 t0.z111 ; x^6 x^4 x^2 1 5343af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = DP4 t0, cos_constants 5353af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 5363af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5373af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5383af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XY, 0, 5393af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 5403af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, ONE, ONE, ONE), 0); 5413af1f3b9220733f5e3a76fe38fbc397974678234Brian 5423af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5433af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5443af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XYZ, 0, 5453af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, X, ONE), 5463af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 0); 5473af1f3b9220733f5e3a76fe38fbc397974678234Brian 5483af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5493af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5503af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XYZ, 0, 5513af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, Z, ONE), 5523af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Z, ONE, ONE, ONE), 0); 5533af1f3b9220733f5e3a76fe38fbc397974678234Brian 5543af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5553af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 5567d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5573af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 5583af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, Z, Y, X), 5593af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_const4fv(p, cos_constants), 0); 5603af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5613af1f3b9220733f5e3a76fe38fbc397974678234Brian 562811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin case TGSI_OPCODE_DDX: 563811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin case TGSI_OPCODE_DDY: 564811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin /* XXX We just output 0 here */ 565811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin debug_printf("Punting DDX/DDX\n"); 566811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin src0 = get_result_vector(p, &inst->Dst[0]); 567811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin i915_emit_arith(p, 568811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin A0_MOV, 569811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 570811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin get_result_flags(inst), 0, 571811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin swizzle(src0, ZERO, ZERO, ZERO, ZERO), 0, 0); 572811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin break; 573811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin 5742292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_DP2: 575abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 576abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 5772292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 5782292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 5792292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DP3, 5802292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 5812292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_flags(inst), 0, 5822292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin swizzle(src0, X, Y, ZERO, ZERO), src1, 0); 5832292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 5842292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 5853af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DP3: 586abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_DP3, 2, fs); 5873af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5883af1f3b9220733f5e3a76fe38fbc397974678234Brian 5893af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DP4: 590abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_DP4, 2, fs); 5913af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5923af1f3b9220733f5e3a76fe38fbc397974678234Brian 5933af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DPH: 594abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 595abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 5963af1f3b9220733f5e3a76fe38fbc397974678234Brian 5973af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5983af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 5997d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6003af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 6013af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, Y, Z, ONE), src1, 0); 6023af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6033af1f3b9220733f5e3a76fe38fbc397974678234Brian 6043af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DST: 605abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 606abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 6073af1f3b9220733f5e3a76fe38fbc397974678234Brian 6083af1f3b9220733f5e3a76fe38fbc397974678234Brian /* result[0] = 1 * 1; 6093af1f3b9220733f5e3a76fe38fbc397974678234Brian * result[1] = a[1] * b[1]; 6103af1f3b9220733f5e3a76fe38fbc397974678234Brian * result[2] = a[2] * 1; 6113af1f3b9220733f5e3a76fe38fbc397974678234Brian * result[3] = 1 * b[3]; 6123af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 6133af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 6143af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 6157d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6163af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 6173af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, ONE, Y, Z, ONE), 6183af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src1, ONE, Y, ONE, W), 0); 6193af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6203af1f3b9220733f5e3a76fe38fbc397974678234Brian 6215e49ec339df1d23b1f1790c49c9f102098f42c0dBrian case TGSI_OPCODE_END: 6225e49ec339df1d23b1f1790c49c9f102098f42c0dBrian /* no-op */ 6235e49ec339df1d23b1f1790c49c9f102098f42c0dBrian break; 6245e49ec339df1d23b1f1790c49c9f102098f42c0dBrian 6253af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_EX2: 626abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 6273af1f3b9220733f5e3a76fe38fbc397974678234Brian 6283af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 6293af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_EXP, 6307d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6313af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 6323af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 6333af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6343af1f3b9220733f5e3a76fe38fbc397974678234Brian 6353af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_FLR: 636abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_FLR, 1, fs); 6373af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6383af1f3b9220733f5e3a76fe38fbc397974678234Brian 6393af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_FRC: 640abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_FRC, 1, fs); 6413af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6423af1f3b9220733f5e3a76fe38fbc397974678234Brian 6433af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_KIL: 64441b3fcbf0404bc4a4f6588c0feef553bb65d4440Brian /* kill if src[0].x < 0 || src[0].y < 0 ... */ 645abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 6463af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 6473af1f3b9220733f5e3a76fe38fbc397974678234Brian 6480235b3252100eda553babea42c014445358a2985Brian i915_emit_texld(p, 6490235b3252100eda553babea42c014445358a2985Brian tmp, /* dest reg: a dummy reg */ 6500235b3252100eda553babea42c014445358a2985Brian A0_DEST_CHANNEL_ALL, /* dest writemask */ 6510235b3252100eda553babea42c014445358a2985Brian 0, /* sampler */ 6520235b3252100eda553babea42c014445358a2985Brian src0, /* coord*/ 653e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin T0_TEXKILL, /* opcode */ 654e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin 1); /* num_coord */ 6553af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6563af1f3b9220733f5e3a76fe38fbc397974678234Brian 657db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol case TGSI_OPCODE_KILP: 658db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol assert(0); /* not tested yet */ 659db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol break; 660db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol 6613af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_LG2: 662abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 6633af1f3b9220733f5e3a76fe38fbc397974678234Brian 6643af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 6653af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_LOG, 6667d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6673af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 6683af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 6693af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6703af1f3b9220733f5e3a76fe38fbc397974678234Brian 6713af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_LIT: 672abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 6733af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 6743af1f3b9220733f5e3a76fe38fbc397974678234Brian 6753af1f3b9220733f5e3a76fe38fbc397974678234Brian /* tmp = max( a.xyzw, a.00zw ) 6763af1f3b9220733f5e3a76fe38fbc397974678234Brian * XXX: Clamp tmp.w to -128..128 6773af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp.y = log(tmp.y) 6783af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp.y = tmp.w * tmp.y 6793af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp.y = exp(tmp.y) 6803af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = cmp (a.11-x1, a.1x01, a.1xy1 ) 6813af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 6823af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MAX, tmp, A0_DEST_CHANNEL_ALL, 0, 6833af1f3b9220733f5e3a76fe38fbc397974678234Brian src0, swizzle(src0, ZERO, ZERO, Z, W), 0); 6843af1f3b9220733f5e3a76fe38fbc397974678234Brian 6853af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_LOG, tmp, A0_DEST_CHANNEL_Y, 0, 6863af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Y, Y, Y, Y), 0, 0); 6873af1f3b9220733f5e3a76fe38fbc397974678234Brian 6883af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MUL, tmp, A0_DEST_CHANNEL_Y, 0, 6893af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ZERO, Y, ZERO, ZERO), 6903af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ZERO, W, ZERO, ZERO), 0); 6913af1f3b9220733f5e3a76fe38fbc397974678234Brian 6923af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_EXP, tmp, A0_DEST_CHANNEL_Y, 0, 6933af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Y, Y, Y, Y), 0, 0); 6943af1f3b9220733f5e3a76fe38fbc397974678234Brian 6953af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_CMP, 6967d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6973af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 6983af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(swizzle(tmp, ONE, ONE, X, ONE), 0, 0, 1, 0), 6993af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, X, ZERO, ONE), 7003af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, X, Y, ONE)); 7013af1f3b9220733f5e3a76fe38fbc397974678234Brian 7023af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7033af1f3b9220733f5e3a76fe38fbc397974678234Brian 7043af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_LRP: 705abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 706abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 707abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src2 = src_vector(p, &inst->Src[2], fs); 7083af1f3b9220733f5e3a76fe38fbc397974678234Brian flags = get_result_flags(inst); 7093af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 7103af1f3b9220733f5e3a76fe38fbc397974678234Brian 7113af1f3b9220733f5e3a76fe38fbc397974678234Brian /* b*a + c*(1-a) 7123af1f3b9220733f5e3a76fe38fbc397974678234Brian * 7133af1f3b9220733f5e3a76fe38fbc397974678234Brian * b*a + c - ca 7143af1f3b9220733f5e3a76fe38fbc397974678234Brian * 7153af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp = b*a + c, 7163af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = (-c)*a + tmp 7173af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 7183af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MAD, tmp, 7193af1f3b9220733f5e3a76fe38fbc397974678234Brian flags & A0_DEST_CHANNEL_ALL, 0, src1, src0, src2); 7203af1f3b9220733f5e3a76fe38fbc397974678234Brian 7213af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MAD, 7227d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7233af1f3b9220733f5e3a76fe38fbc397974678234Brian flags, 0, negate(src2, 1, 1, 1, 1), src0, tmp); 7243af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7253af1f3b9220733f5e3a76fe38fbc397974678234Brian 7263af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MAD: 727abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MAD, 3, fs); 7283af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7293af1f3b9220733f5e3a76fe38fbc397974678234Brian 7303af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MAX: 731abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MAX, 2, fs); 7323af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7333af1f3b9220733f5e3a76fe38fbc397974678234Brian 7343af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MIN: 735abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 736abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 7373af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 7383af1f3b9220733f5e3a76fe38fbc397974678234Brian flags = get_result_flags(inst); 7393af1f3b9220733f5e3a76fe38fbc397974678234Brian 7403af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7413af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MAX, 7423af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, flags & A0_DEST_CHANNEL_ALL, 0, 7433af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(src0, 1, 1, 1, 1), 7443af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(src1, 1, 1, 1, 1), 0); 7453af1f3b9220733f5e3a76fe38fbc397974678234Brian 7463af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7473af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MOV, 7487d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7493af1f3b9220733f5e3a76fe38fbc397974678234Brian flags, 0, negate(tmp, 1, 1, 1, 1), 0, 0); 7503af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7513af1f3b9220733f5e3a76fe38fbc397974678234Brian 7523af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MOV: 753abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MOV, 1, fs); 7543af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7553af1f3b9220733f5e3a76fe38fbc397974678234Brian 7563af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MUL: 757abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MUL, 2, fs); 7583af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7593af1f3b9220733f5e3a76fe38fbc397974678234Brian 7602bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case TGSI_OPCODE_NOP: 7612bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 7622bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 7633af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_POW: 764abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 765abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 7663af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 7673af1f3b9220733f5e3a76fe38fbc397974678234Brian flags = get_result_flags(inst); 7683af1f3b9220733f5e3a76fe38fbc397974678234Brian 7693af1f3b9220733f5e3a76fe38fbc397974678234Brian /* XXX: masking on intermediate values, here and elsewhere. 7703af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 7713af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7723af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_LOG, 7733af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 7743af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 7753af1f3b9220733f5e3a76fe38fbc397974678234Brian 7763af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MUL, tmp, A0_DEST_CHANNEL_X, 0, tmp, src1, 0); 7773af1f3b9220733f5e3a76fe38fbc397974678234Brian 7783af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7793af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_EXP, 7807d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7813af1f3b9220733f5e3a76fe38fbc397974678234Brian flags, 0, swizzle(tmp, X, X, X, X), 0, 0); 7823af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 78379a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin 78444e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca case TGSI_OPCODE_RET: 78544e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca /* XXX: no-op? */ 78644e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca break; 78779a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin 7883af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_RCP: 789abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 7903af1f3b9220733f5e3a76fe38fbc397974678234Brian 7913af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7923af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_RCP, 7937d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7942292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_flags(inst), 0, 7953af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 7963af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7973af1f3b9220733f5e3a76fe38fbc397974678234Brian 7983af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_RSQ: 799abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 8003af1f3b9220733f5e3a76fe38fbc397974678234Brian 8013af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8023af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_RSQ, 8037d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 8043af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 8053af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 8063af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 8073af1f3b9220733f5e3a76fe38fbc397974678234Brian 8083af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SCS: 809abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 8103af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 8113af1f3b9220733f5e3a76fe38fbc397974678234Brian 8123af1f3b9220733f5e3a76fe38fbc397974678234Brian /* 8133af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 8143af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, x 8153af1f3b9220733f5e3a76fe38fbc397974678234Brian * t1 = MUL t0.xyyw t0.yz11 ; x^7 x^5 x^3 x 816062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin * scs.x = DP4 t1, scs_sin_constants 8173af1f3b9220733f5e3a76fe38fbc397974678234Brian * t1 = MUL t0.xxz1 t0.z111 ; x^6 x^4 x^2 1 818062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin * scs.y = DP4 t1, scs_cos_constants 8193af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 8203af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8213af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8223af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XY, 0, 8233af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, ONE, ONE), 8243af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, ONE, ONE, ONE), 0); 8253af1f3b9220733f5e3a76fe38fbc397974678234Brian 8263af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8273af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8283af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 8293af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, X, Y), 8303af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 0); 8313af1f3b9220733f5e3a76fe38fbc397974678234Brian 8325b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell writemask = inst->Dst[0].Register.WriteMask; 8333af1f3b9220733f5e3a76fe38fbc397974678234Brian 8343af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writemask & TGSI_WRITEMASK_Y) { 8353af1f3b9220733f5e3a76fe38fbc397974678234Brian uint tmp1; 8363af1f3b9220733f5e3a76fe38fbc397974678234Brian 8373af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writemask & TGSI_WRITEMASK_X) 8383af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp1 = i915_get_utemp(p); 8393af1f3b9220733f5e3a76fe38fbc397974678234Brian else 8403af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp1 = tmp; 8413af1f3b9220733f5e3a76fe38fbc397974678234Brian 8423af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8433af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8443af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp1, A0_DEST_CHANNEL_ALL, 0, 8453af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, Y, W), 8463af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Z, ONE, ONE), 0); 8473af1f3b9220733f5e3a76fe38fbc397974678234Brian 8483af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8493af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 8507d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 8513af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DEST_CHANNEL_Y, 0, 8523af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp1, W, Z, Y, X), 853062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin i915_emit_const4fv(p, scs_sin_constants), 0); 8543af1f3b9220733f5e3a76fe38fbc397974678234Brian } 8553af1f3b9220733f5e3a76fe38fbc397974678234Brian 8563af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writemask & TGSI_WRITEMASK_X) { 8573af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8583af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8593af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XYZ, 0, 8603af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, Z, ONE), 8613af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Z, ONE, ONE, ONE), 0); 8623af1f3b9220733f5e3a76fe38fbc397974678234Brian 8633af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8643af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 8657d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 8663af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DEST_CHANNEL_X, 0, 8673af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, Z, Y, X), 868062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin i915_emit_const4fv(p, scs_cos_constants), 0); 8693af1f3b9220733f5e3a76fe38fbc397974678234Brian } 8703af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 8713af1f3b9220733f5e3a76fe38fbc397974678234Brian 8722292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SEQ: 8732292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* if we're both >= and <= then we're == */ 874abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 875abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 8762292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp = i915_get_utemp(p); 8772292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 8782292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 8792292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SGE, 8802292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, A0_DEST_CHANNEL_ALL, 0, 8812292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 8822292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src1, 0); 8832292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 8842292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 8852292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SGE, 8862292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 8872292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 8882292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src1, 8892292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 0); 8902292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 8912292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 8922292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_MUL, 8932292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 8942292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 8952292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 8962292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, 0); 8972292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 8983af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 8993af1f3b9220733f5e3a76fe38fbc397974678234Brian 9002292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SGE: 901abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_SGE, 2, fs); 90220839b37ed61b044d6224c0e373ce10d74be4f3dBrian break; 90320839b37ed61b044d6224c0e373ce10d74be4f3dBrian 9043af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SIN: 905abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 9063af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 9073af1f3b9220733f5e3a76fe38fbc397974678234Brian 9083af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9093af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 9103af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 9110e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal src0, i915_emit_const1f(p, 1.0f / (float) (M_PI * 2.0)), 0); 9123af1f3b9220733f5e3a76fe38fbc397974678234Brian 9133af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MOD, tmp, A0_DEST_CHANNEL_X, 0, tmp, 0, 0); 9143af1f3b9220733f5e3a76fe38fbc397974678234Brian 9153af1f3b9220733f5e3a76fe38fbc397974678234Brian /* 9163af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 9173af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, x 9183af1f3b9220733f5e3a76fe38fbc397974678234Brian * t1 = MUL t0.xyyw t0.yz11 ; x^7 x^5 x^3 x 9193af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = DP4 t1.wzyx, sin_constants 9203af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 9213af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9223af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 9233af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XY, 0, 9243af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 9253af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, ONE, ONE, ONE), 0); 9263af1f3b9220733f5e3a76fe38fbc397974678234Brian 9273af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9283af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 9293af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 9303af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, X, Y), 9313af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 0); 9323af1f3b9220733f5e3a76fe38fbc397974678234Brian 9333af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9343af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 9353af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 9363af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, Y, W), 9373af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Z, ONE, ONE), 0); 9383af1f3b9220733f5e3a76fe38fbc397974678234Brian 9393af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9403af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 9417d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 9423af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 9433af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, W, Z, Y, X), 9443af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_const4fv(p, sin_constants), 0); 9453af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9463af1f3b9220733f5e3a76fe38fbc397974678234Brian 9472292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SLE: 9482292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* like SGE, but swap reg0, reg1 */ 949abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith_swap2(p, inst, A0_SGE, 2, fs); 9502292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 9512292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9523af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SLT: 953abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_SLT, 2, fs); 9543af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9553af1f3b9220733f5e3a76fe38fbc397974678234Brian 95620839b37ed61b044d6224c0e373ce10d74be4f3dBrian case TGSI_OPCODE_SGT: 95720839b37ed61b044d6224c0e373ce10d74be4f3dBrian /* like SLT, but swap reg0, reg1 */ 958abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith_swap2(p, inst, A0_SLT, 2, fs); 95920839b37ed61b044d6224c0e373ce10d74be4f3dBrian break; 96020839b37ed61b044d6224c0e373ce10d74be4f3dBrian 9612292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SNE: 962468c2c08414f0ad07e2c2c2a98506f6390124963Stéphane Marchesin /* if we're < or > then we're != */ 963abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 964abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 9650f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin tmp = i915_get_utemp(p); 9660f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9670f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin i915_emit_arith(p, 9682292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 9692292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, 9702292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9710f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src0, 9720f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src1, 0); 9730f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9740f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin i915_emit_arith(p, 9752292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 9760f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9770f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9780f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src1, 9790f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src0, 0); 9800f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9810f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin i915_emit_arith(p, 9822292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_ADD, 9830f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9840f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9850f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9860f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin tmp, 0); 9872292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 9880f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9892292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SSG: 9902292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* compute (src>0) - (src<0) */ 991abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 9922292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp = i915_get_utemp(p); 9932292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9942292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 9952292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 9962292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, 9972292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9982292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 9992292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin swizzle(src0, ZERO, ZERO, ZERO, ZERO), 0); 10002292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10012292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 10022292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 10032292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 10042292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 10052292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin swizzle(src0, ZERO, ZERO, ZERO, ZERO), 10062292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 0); 10072292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10082292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 10092292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_ADD, 10102292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 10112292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 10122292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 10132292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin negate(tmp, 1, 1, 1, 1), 0); 10140f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin break; 10150f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 10163af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SUB: 1017abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 1018abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 10193af1f3b9220733f5e3a76fe38fbc397974678234Brian 10203af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 10213af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_ADD, 10227d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 10233af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 10243af1f3b9220733f5e3a76fe38fbc397974678234Brian src0, negate(src1, 1, 1, 1, 1), 0); 10253af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 10263af1f3b9220733f5e3a76fe38fbc397974678234Brian 10273af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_TEX: 1028abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_tex(p, inst, T0_TEXLD, fs); 10293af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 10303af1f3b9220733f5e3a76fe38fbc397974678234Brian 10312292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_TRUNC: 1032abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_TRC, 1, fs); 10332292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 10342292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10353af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_TXB: 1036abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_tex(p, inst, T0_TEXLDB, fs); 10373af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 10383af1f3b9220733f5e3a76fe38fbc397974678234Brian 1039ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol case TGSI_OPCODE_TXP: 1040abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_tex(p, inst, T0_TEXLDP, fs); 1041ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol break; 1042ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol 10433af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_XPD: 10443af1f3b9220733f5e3a76fe38fbc397974678234Brian /* Cross product: 10453af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.x = src0.y * src1.z - src0.z * src1.y; 10463af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.y = src0.z * src1.x - src0.x * src1.z; 10473af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.z = src0.x * src1.y - src0.y * src1.x; 10483af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.w = undef; 10493af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 1050abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 1051abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 10523af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 10533af1f3b9220733f5e3a76fe38fbc397974678234Brian 10543af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 10553af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 10563af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 10573af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, Z, X, Y, ONE), 10583af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src1, Y, Z, X, ONE), 0); 10593af1f3b9220733f5e3a76fe38fbc397974678234Brian 10603af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 10613af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MAD, 10627d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 10633af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 10643af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, Y, Z, X, ONE), 10653af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src1, Z, X, Y, ONE), 10663af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(tmp, 1, 1, 1, 0)); 10673af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 10683af1f3b9220733f5e3a76fe38fbc397974678234Brian 10693af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 1070af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca i915_program_error(p, "bad opcode %d", inst->Instruction.Opcode); 107120839b37ed61b044d6224c0e373ce10d74be4f3dBrian p->error = 1; 10723af1f3b9220733f5e3a76fe38fbc397974678234Brian return; 10733af1f3b9220733f5e3a76fe38fbc397974678234Brian } 10743af1f3b9220733f5e3a76fe38fbc397974678234Brian 10753af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_release_utemps(p); 10763af1f3b9220733f5e3a76fe38fbc397974678234Brian} 10773af1f3b9220733f5e3a76fe38fbc397974678234Brian 10783af1f3b9220733f5e3a76fe38fbc397974678234Brian 10792bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinstatic void i915_translate_token(struct i915_fp_compile *p, 10802bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const union i915_full_token* token, 10812bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct i915_fragment_shader *fs) 10823af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 1083c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs = p->shader; 10842bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin switch( token->Token.Type ) { 10852bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case TGSI_TOKEN_TYPE_PROPERTY: 10862bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* 10872bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin * We only support one cbuf, but we still need to ignore the property 10882bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin * correctly so we don't hit the assert at the end of the switch case. 10892bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin */ 10902bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin assert(token->FullProperty.Property.PropertyName == 10912bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS); 10922bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 10933af1f3b9220733f5e3a76fe38fbc397974678234Brian 10942bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case TGSI_TOKEN_TYPE_DECLARATION: 10952bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (token->FullDeclaration.Declaration.File 10962bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin == TGSI_FILE_CONSTANT) { 10972bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin uint i; 10982bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for (i = token->FullDeclaration.Range.First; 10992bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i <= token->FullDeclaration.Range.Last; 11002bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i++) { 11012bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin assert(ifs->constant_flags[i] == 0x0); 11022bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ifs->constant_flags[i] = I915_CONSTFLAG_USER; 11032bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ifs->num_constants = MAX2(ifs->num_constants, i + 1); 1104c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 11052bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 11062bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin else if (token->FullDeclaration.Declaration.File 11072bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin == TGSI_FILE_TEMPORARY) { 11082bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin uint i; 11092bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for (i = token->FullDeclaration.Range.First; 11102bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i <= token->FullDeclaration.Range.Last; 11112bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i++) { 11122bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (i >= I915_MAX_TEMPORARY) 11132bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin debug_printf("Too many temps (%d)\n",i); 11142bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin else 11152bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* XXX just use shader->info->file_mask[TGSI_FILE_TEMPORARY] */ 11162bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin p->temp_flag |= (1 << i); /* mark temp as used */ 11170235b3252100eda553babea42c014445358a2985Brian } 11182bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 11192bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 11203af1f3b9220733f5e3a76fe38fbc397974678234Brian 11212bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case TGSI_TOKEN_TYPE_IMMEDIATE: 11222bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin { 11232bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct tgsi_full_immediate *imm 11242bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin = &token->FullImmediate; 11252bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const uint pos = p->num_immediates++; 11262bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin uint j; 11272bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin assert( imm->Immediate.NrTokens <= 4 + 1 ); 11282bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for (j = 0; j < imm->Immediate.NrTokens - 1; j++) { 11292bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin p->immediates[pos][j] = imm->u[j].Float; 1130c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 11312bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 11322bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 11333af1f3b9220733f5e3a76fe38fbc397974678234Brian 11342bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case TGSI_TOKEN_TYPE_INSTRUCTION: 11352bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (p->first_instruction) { 11362bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* resolve location of immediates */ 11372bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin uint i, j; 11382bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for (i = 0; i < p->num_immediates; i++) { 11392bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* find constant slot for this immediate */ 11402bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for (j = 0; j < I915_MAX_CONSTANT; j++) { 11412bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (ifs->constant_flags[j] == 0x0) { 11422bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin memcpy(ifs->constants[j], 11432bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin p->immediates[i], 11442bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 4 * sizeof(float)); 11452bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /*printf("immediate %d maps to const %d\n", i, j);*/ 11462bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ifs->constant_flags[j] = 0xf; /* all four comps used */ 11472bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin p->immediates_map[i] = j; 11482bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ifs->num_constants = MAX2(ifs->num_constants, j + 1); 11492bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 1150c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1151c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1152c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1153c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 11542bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin p->first_instruction = FALSE; 11553af1f3b9220733f5e3a76fe38fbc397974678234Brian } 11563af1f3b9220733f5e3a76fe38fbc397974678234Brian 11572bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i915_translate_instruction(p, &token->FullInstruction, fs); 11582bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 11592bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11602bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin default: 11612bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin assert( 0 ); 11622bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 11633af1f3b9220733f5e3a76fe38fbc397974678234Brian 11642bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin} 11652bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11662bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin/** 11672bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin * Translate TGSI fragment shader into i915 hardware instructions. 11682bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin * \param p the translation state 11692bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin * \param tokens the TGSI token array 11702bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin */ 11712bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinstatic void 11722bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesini915_translate_instructions(struct i915_fp_compile *p, 11732bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const struct i915_token_list *tokens, 11742bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct i915_fragment_shader *fs) 11752bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin{ 11762bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin int i; 11772bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for(i = 0; i<tokens->NumTokens; i++) { 11782bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i915_translate_token(p, &tokens->Tokens[i], fs); 11792bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 11803af1f3b9220733f5e3a76fe38fbc397974678234Brian} 11813af1f3b9220733f5e3a76fe38fbc397974678234Brian 11823af1f3b9220733f5e3a76fe38fbc397974678234Brian 11830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic struct i915_fp_compile * 11840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Briani915_init_compile(struct i915_context *i915, 1185c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs) 11860d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 11870d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian struct i915_fp_compile *p = CALLOC_STRUCT(i915_fp_compile); 1188abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin int i; 11890d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1190c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->shader = ifs; 11910d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1192c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /* Put new constants at end of const buffer, growing downward. 1193c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * The problem is we don't know how many user-defined constants might 1194c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * be specified with pipe->set_constant_buffer(). 1195c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * Should pre-scan the user's program to determine the highest-numbered 1196c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * constant referenced. 1197c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian */ 1198c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->num_constants = 0; 1199c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memset(ifs->constant_flags, 0, sizeof(ifs->constant_flags)); 1200c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 12015d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin memset(&p->register_phases, 0, sizeof(p->register_phases)); 12025d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin 1203abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin for (i = 0; i < I915_TEX_UNITS; i++) 1204abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin ifs->generic_mapping[i] = -1; 1205abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 1206c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->first_instruction = TRUE; 12070d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12080d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_tex_indirect = 1; /* correct? */ 12090d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_tex_insn = 0; 12100d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_alu_insn = 0; 12110d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_decl_insn = 0; 12120d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12130d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->csr = p->program; 12140d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->decl = p->declarations; 12150d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->decl_s = 0; 12160d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->decl_t = 0; 12170235b3252100eda553babea42c014445358a2985Brian p->temp_flag = ~0x0 << I915_MAX_TEMPORARY; 12180d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->utemp_flag = ~0x7; 12190d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12200d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* initialize the first program word */ 12210d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian *(p->decl++) = _3DSTATE_PIXEL_SHADER_PROGRAM; 12220d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12230d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian return p; 12240d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 12250d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12265ac22877c98f4934cced4d42b9ec87245f266967Brian 12270d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/* Copy compile results to the fragment program struct and destroy the 12280d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * compilation context. 12290d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 12300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 12310d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Briani915_fini_compile(struct i915_context *i915, struct i915_fp_compile *p) 12320d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 1233c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs = p->shader; 12345961732c1b59403b4e736fa354a64d4a0e5d8af2Michal unsigned long program_size = (unsigned long) (p->csr - p->program); 12355961732c1b59403b4e736fa354a64d4a0e5d8af2Michal unsigned long decl_size = (unsigned long) (p->decl - p->declarations); 12360d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12370d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_tex_indirect > I915_MAX_TEX_INDIRECT) 12385d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin debug_printf("Exceeded max nr indirect texture lookups\n"); 12390d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12400d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_tex_insn > I915_MAX_TEX_INSN) 12410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max TEX instructions"); 12420d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12430d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_alu_insn > I915_MAX_ALU_INSN) 12440d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max ALU instructions"); 12450d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12460d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_decl_insn > I915_MAX_DECL_INSN) 12470d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max DECL instructions"); 12480d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12490d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->error) { 12500d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeInstructions = 0; 12510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeAluInstructions = 0; 12520d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexInstructions = 0; 12530d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexIndirections = 0; 12540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1255c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian i915_use_passthrough_shader(ifs); 12560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian else { 12585ac22877c98f4934cced4d42b9ec87245f266967Brian p->NumNativeInstructions 12595ac22877c98f4934cced4d42b9ec87245f266967Brian = p->nr_alu_insn + p->nr_tex_insn + p->nr_decl_insn; 12600d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeAluInstructions = p->nr_alu_insn; 12610d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexInstructions = p->nr_tex_insn; 12620d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexIndirections = p->nr_tex_indirect; 12630d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12640d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* patch in the program length */ 12650d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->declarations[0] |= program_size + decl_size - 2; 12660d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12670d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* Copy compilation results to fragment program struct: 12680d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 1269c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian assert(!ifs->program); 1270c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->program 12715961732c1b59403b4e736fa354a64d4a0e5d8af2Michal = (uint *) MALLOC((program_size + decl_size) * sizeof(uint)); 1272c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian if (ifs->program) { 1273c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->program_len = program_size + decl_size; 12740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1275c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memcpy(ifs->program, 127679a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin p->declarations, 12775ac22877c98f4934cced4d42b9ec87245f266967Brian decl_size * sizeof(uint)); 12783af1f3b9220733f5e3a76fe38fbc397974678234Brian 127979a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin memcpy(ifs->program + decl_size, 128079a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin p->program, 12815ac22877c98f4934cced4d42b9ec87245f266967Brian program_size * sizeof(uint)); 12825ac22877c98f4934cced4d42b9ec87245f266967Brian } 12830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* Release the compilation struct: 12860d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 12875961732c1b59403b4e736fa354a64d4a0e5d8af2Michal FREE(p); 12880d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 12890d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12900d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12910d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12920d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12930d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12940d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/** 12950d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Rather than trying to intercept and jiggle depth writes during 12963af1f3b9220733f5e3a76fe38fbc397974678234Brian * emit, just move the value into its correct position at the end of 12973af1f3b9220733f5e3a76fe38fbc397974678234Brian * the program: 12983af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 12990d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 13003af1f3b9220733f5e3a76fe38fbc397974678234Briani915_fixup_depth_write(struct i915_fp_compile *p) 13013af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 1302f69b5c56feb60791bad27d491ee9592238d4efb0Brian /* XXX assuming pos/depth is always in output[0] */ 13034901410293b35ac6bb4759142b50fcc0be8a1b25Brian if (p->shader->info.output_semantic_name[0] == TGSI_SEMANTIC_POSITION) { 130437cf13ed9a429c755f121daa1776b1b30a985ab3Brian const uint depth = UREG(REG_TYPE_OD, 0); 13053af1f3b9220733f5e3a76fe38fbc397974678234Brian 13063af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 130737cf13ed9a429c755f121daa1776b1b30a985ab3Brian A0_MOV, /* opcode */ 130837cf13ed9a429c755f121daa1776b1b30a985ab3Brian depth, /* dest reg */ 130937cf13ed9a429c755f121daa1776b1b30a985ab3Brian A0_DEST_CHANNEL_W, /* write mask */ 131037cf13ed9a429c755f121daa1776b1b30a985ab3Brian 0, /* saturate? */ 131137cf13ed9a429c755f121daa1776b1b30a985ab3Brian swizzle(depth, X, Y, Z, Z), /* src0 */ 131237cf13ed9a429c755f121daa1776b1b30a985ab3Brian 0, 0 /* src1, src2 */); 13133af1f3b9220733f5e3a76fe38fbc397974678234Brian } 13143af1f3b9220733f5e3a76fe38fbc397974678234Brian} 13153af1f3b9220733f5e3a76fe38fbc397974678234Brian 13163af1f3b9220733f5e3a76fe38fbc397974678234Brian 13170d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianvoid 1318c74900ee5d80c7c2b7cbe4ed87395526a742a13eBriani915_translate_fragment_program( struct i915_context *i915, 1319c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *fs) 13200d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 132198b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter struct i915_fp_compile *p; 1322c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian const struct tgsi_token *tokens = fs->state.tokens; 13239726947b681225a5a438eaa7cb70c5fa36ce85eaBrian Paul struct i915_token_list* i_tokens; 13243af1f3b9220733f5e3a76fe38fbc397974678234Brian 1325c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian#if 0 1326c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian tgsi_dump(tokens, 0); 1327c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian#endif 1328c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 132998b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter /* hw doesn't seem to like empty frag programs, even when the depth write 133098b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter * fixup gets emitted below - may that one is fishy, too? */ 13319f0acfe1384d3236ac30ffca4be96e9531d2e876Jakob Bornecrantz if (fs->info.num_instructions == 1) { 133298b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter i915_use_passthrough_shader(fs); 133398b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter 133498b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter return; 133598b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter } 133698b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter 133798b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter p = i915_init_compile(i915, fs); 133898b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter 13399726947b681225a5a438eaa7cb70c5fa36ce85eaBrian Paul i_tokens = i915_optimize(tokens); 13402bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i915_translate_instructions(p, i_tokens, fs); 13410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_fixup_depth_write(p); 13420d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13430d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_fini_compile(i915, p); 13442bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin i915_optimize_free(i_tokens); 1345ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin 1346ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin#if 0 1347ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin i915_disassemble_program(NULL, fs->program, fs->program_len); 1348ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin#endif 13490d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 1350