i915_fpc_translate.c revision abb436526974bd090853c0927ece0839f9143393
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 44d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian 450d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/** 460d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Simple pass-through fragment shader to use when we don't have 470d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * a real shader (or it fails to compile for some reason). 480d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 490d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic unsigned passthrough[] = 500d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian _3DSTATE_PIXEL_SHADER_PROGRAM | ((2*3)-1), 520d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 530d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* declare input color: 540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 550d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (D0_DCL | 560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (REG_TYPE_T << D0_TYPE_SHIFT) | 570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (T_DIFFUSE << D0_NR_SHIFT) | 580d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian D0_CHANNEL_ALL), 590d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 0, 600d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 0, 610d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 620d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* move to output color: 630d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 640d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (A0_MOV | 650d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (REG_TYPE_OC << A0_DEST_TYPE_SHIFT) | 660d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian A0_DEST_CHANNEL_ALL | 670d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (REG_TYPE_T << A0_SRC0_TYPE_SHIFT) | 680d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (T_DIFFUSE << A0_SRC0_NR_SHIFT)), 690d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 0x01230000, /* .xyzw */ 700d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 0 710d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian}; 720d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 733af1f3b9220733f5e3a76fe38fbc397974678234Brian 743af1f3b9220733f5e3a76fe38fbc397974678234Brian/* 1, -1/3!, 1/5!, -1/7! */ 753af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic const float sin_constants[4] = { 1.0, 765961732c1b59403b4e736fa354a64d4a0e5d8af2Michal -1.0f / (3 * 2 * 1), 775961732c1b59403b4e736fa354a64d4a0e5d8af2Michal 1.0f / (5 * 4 * 3 * 2 * 1), 785961732c1b59403b4e736fa354a64d4a0e5d8af2Michal -1.0f / (7 * 6 * 5 * 4 * 3 * 2 * 1) 793af1f3b9220733f5e3a76fe38fbc397974678234Brian}; 803af1f3b9220733f5e3a76fe38fbc397974678234Brian 813af1f3b9220733f5e3a76fe38fbc397974678234Brian/* 1, -1/2!, 1/4!, -1/6! */ 823af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic const float cos_constants[4] = { 1.0, 835961732c1b59403b4e736fa354a64d4a0e5d8af2Michal -1.0f / (2 * 1), 845961732c1b59403b4e736fa354a64d4a0e5d8af2Michal 1.0f / (4 * 3 * 2 * 1), 855961732c1b59403b4e736fa354a64d4a0e5d8af2Michal -1.0f / (6 * 5 * 4 * 3 * 2 * 1) 863af1f3b9220733f5e3a76fe38fbc397974678234Brian}; 873af1f3b9220733f5e3a76fe38fbc397974678234Brian 883af1f3b9220733f5e3a76fe38fbc397974678234Brian 890d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 905ac22877c98f4934cced4d42b9ec87245f266967Brian/** 915ac22877c98f4934cced4d42b9ec87245f266967Brian * component-wise negation of ureg 925ac22877c98f4934cced4d42b9ec87245f266967Brian */ 935ac22877c98f4934cced4d42b9ec87245f266967Brianstatic INLINE int 945ac22877c98f4934cced4d42b9ec87245f266967Briannegate(int reg, int x, int y, int z, int w) 955ac22877c98f4934cced4d42b9ec87245f266967Brian{ 965ac22877c98f4934cced4d42b9ec87245f266967Brian /* Another neat thing about the UREG representation */ 975ac22877c98f4934cced4d42b9ec87245f266967Brian return reg ^ (((x & 1) << UREG_CHANNEL_X_NEGATE_SHIFT) | 985ac22877c98f4934cced4d42b9ec87245f266967Brian ((y & 1) << UREG_CHANNEL_Y_NEGATE_SHIFT) | 995ac22877c98f4934cced4d42b9ec87245f266967Brian ((z & 1) << UREG_CHANNEL_Z_NEGATE_SHIFT) | 1005ac22877c98f4934cced4d42b9ec87245f266967Brian ((w & 1) << UREG_CHANNEL_W_NEGATE_SHIFT)); 1015ac22877c98f4934cced4d42b9ec87245f266967Brian} 1025ac22877c98f4934cced4d42b9ec87245f266967Brian 1035ac22877c98f4934cced4d42b9ec87245f266967Brian 104c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian/** 105c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * In the event of a translation failure, we'll generate a simple color 106c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * pass-through program. 107c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian */ 1080d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 109c74900ee5d80c7c2b7cbe4ed87395526a742a13eBriani915_use_passthrough_shader(struct i915_fragment_shader *fs) 1100d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 111c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian fs->program = (uint *) MALLOC(sizeof(passthrough)); 112c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian if (fs->program) { 113c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memcpy(fs->program, passthrough, sizeof(passthrough)); 114c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian fs->program_len = Elements(passthrough); 1155ac22877c98f4934cced4d42b9ec87245f266967Brian } 116c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian fs->num_constants = 0; 1170d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 1180d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1190d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1200d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianvoid 121af60ebc4eedcfec2090e1ddd7630137948c26866José Fonsecai915_program_error(struct i915_fp_compile *p, const char *msg, ...) 1220d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 123af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca va_list args; 1240e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal char buffer[1024]; 125af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca 1269791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("i915_program_error: "); 127af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca va_start( args, msg ); 1285b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca util_vsnprintf( buffer, sizeof(buffer), msg, args ); 129af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca va_end( args ); 13096c9b39a6a9553573fcbdb5fd6db0e9d59768442Jakob Bornecrantz debug_printf("%s", buffer); 1319791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("\n"); 132af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca 1330d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->error = 1; 1340d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 1350d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 136abb436526974bd090853c0927ece0839f9143393Stéphane Marchesinstatic uint get_mapping(struct i915_fragment_shader* fs, int unit) 137abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin{ 138abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin int i; 139abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin for (i = 0; i < I915_TEX_UNITS; i++) 140abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin { 141abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin if (fs->generic_mapping[i] == -1) { 142abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin fs->generic_mapping[i] = unit; 143abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin return i; 144abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin } 145abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin if (fs->generic_mapping[i] == unit) 146abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin return i; 147abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin } 148abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin debug_printf("Exceeded max generics\n"); 149abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin return 0; 150abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin} 1510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1523af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 1533af1f3b9220733f5e3a76fe38fbc397974678234Brian * Construct a ureg for the given source register. Will emit 1543af1f3b9220733f5e3a76fe38fbc397974678234Brian * constants, apply swizzling and negation as needed. 1553af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 1563af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 1573af1f3b9220733f5e3a76fe38fbc397974678234Briansrc_vector(struct i915_fp_compile *p, 158abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin const struct tgsi_full_src_register *source, 159abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 1603af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 16191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell uint index = source->Register.Index; 16296ad8a36003a21180ad6b61aa0b7d7c9452b3449Jakob Bornecrantz uint src = 0, sem_name, sem_ind; 1633af1f3b9220733f5e3a76fe38fbc397974678234Brian 16491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell switch (source->Register.File) { 1653af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_TEMPORARY: 16691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (source->Register.Index >= I915_MAX_TEMPORARY) { 1673af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "Exceeded max temporary reg"); 1683af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 1693af1f3b9220733f5e3a76fe38fbc397974678234Brian } 1703af1f3b9220733f5e3a76fe38fbc397974678234Brian src = UREG(REG_TYPE_R, index); 1713af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 1723af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_INPUT: 1733af1f3b9220733f5e3a76fe38fbc397974678234Brian /* XXX: Packing COL1, FOGC into a single attribute works for 1743af1f3b9220733f5e3a76fe38fbc397974678234Brian * texenv programs, but will fail for real fragment programs 1753af1f3b9220733f5e3a76fe38fbc397974678234Brian * that use these attributes and expect them to be a full 4 1763af1f3b9220733f5e3a76fe38fbc397974678234Brian * components wide. Could use a texcoord to pass these 1773af1f3b9220733f5e3a76fe38fbc397974678234Brian * attributes if necessary, but that won't work in the general 1783af1f3b9220733f5e3a76fe38fbc397974678234Brian * case. 1793af1f3b9220733f5e3a76fe38fbc397974678234Brian * 1803af1f3b9220733f5e3a76fe38fbc397974678234Brian * We also use a texture coordinate to pass wpos when possible. 1813af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 182d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian 1834901410293b35ac6bb4759142b50fcc0be8a1b25Brian sem_name = p->shader->info.input_semantic_name[index]; 1844901410293b35ac6bb4759142b50fcc0be8a1b25Brian sem_ind = p->shader->info.input_semantic_index[index]; 18537cf13ed9a429c755f121daa1776b1b30a985ab3Brian 186f69b5c56feb60791bad27d491ee9592238d4efb0Brian switch (sem_name) { 18737cf13ed9a429c755f121daa1776b1b30a985ab3Brian case TGSI_SEMANTIC_POSITION: 1889791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("SKIP SEM POS\n"); 18937cf13ed9a429c755f121daa1776b1b30a985ab3Brian /* 19037cf13ed9a429c755f121daa1776b1b30a985ab3Brian assert(p->wpos_tex != -1); 19137cf13ed9a429c755f121daa1776b1b30a985ab3Brian src = i915_emit_decl(p, REG_TYPE_T, p->wpos_tex, D0_CHANNEL_ALL); 19237cf13ed9a429c755f121daa1776b1b30a985ab3Brian */ 19337cf13ed9a429c755f121daa1776b1b30a985ab3Brian break; 194f69b5c56feb60791bad27d491ee9592238d4efb0Brian case TGSI_SEMANTIC_COLOR: 195f69b5c56feb60791bad27d491ee9592238d4efb0Brian if (sem_ind == 0) { 196f69b5c56feb60791bad27d491ee9592238d4efb0Brian src = i915_emit_decl(p, REG_TYPE_T, T_DIFFUSE, D0_CHANNEL_ALL); 197f69b5c56feb60791bad27d491ee9592238d4efb0Brian } 198f69b5c56feb60791bad27d491ee9592238d4efb0Brian else { 199f69b5c56feb60791bad27d491ee9592238d4efb0Brian /* secondary color */ 200f69b5c56feb60791bad27d491ee9592238d4efb0Brian assert(sem_ind == 1); 201f69b5c56feb60791bad27d491ee9592238d4efb0Brian src = i915_emit_decl(p, REG_TYPE_T, T_SPECULAR, D0_CHANNEL_XYZ); 202f69b5c56feb60791bad27d491ee9592238d4efb0Brian src = swizzle(src, X, Y, Z, ONE); 203f69b5c56feb60791bad27d491ee9592238d4efb0Brian } 20437cf13ed9a429c755f121daa1776b1b30a985ab3Brian break; 20537cf13ed9a429c755f121daa1776b1b30a985ab3Brian case TGSI_SEMANTIC_FOG: 20637cf13ed9a429c755f121daa1776b1b30a985ab3Brian src = i915_emit_decl(p, REG_TYPE_T, T_FOG_W, D0_CHANNEL_W); 20737cf13ed9a429c755f121daa1776b1b30a985ab3Brian src = swizzle(src, W, W, W, W); 20837cf13ed9a429c755f121daa1776b1b30a985ab3Brian break; 209e9259ad0d7f674a1f2f9156ba0baeedc0e7d0d54Brian case TGSI_SEMANTIC_GENERIC: 210abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin { 211abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin int real_tex_unit = get_mapping(fs, sem_ind); 212abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_ALL); 213abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin break; 214abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin } 21537cf13ed9a429c755f121daa1776b1b30a985ab3Brian default: 21637cf13ed9a429c755f121daa1776b1b30a985ab3Brian i915_program_error(p, "Bad source->Index"); 21737cf13ed9a429c755f121daa1776b1b30a985ab3Brian return 0; 21837cf13ed9a429c755f121daa1776b1b30a985ab3Brian } 2193af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 2203af1f3b9220733f5e3a76fe38fbc397974678234Brian 2216c29be9f41470b22c87ef571e10b5a9824800608Brian case TGSI_FILE_IMMEDIATE: 222c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian assert(index < p->num_immediates); 223c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian index = p->immediates_map[index]; 2246c29be9f41470b22c87ef571e10b5a9824800608Brian /* fall-through */ 2253af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_CONSTANT: 2263af1f3b9220733f5e3a76fe38fbc397974678234Brian src = UREG(REG_TYPE_CONST, index); 2273af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 2283af1f3b9220733f5e3a76fe38fbc397974678234Brian 2293af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 2303af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "Bad source->File"); 2313af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 2323af1f3b9220733f5e3a76fe38fbc397974678234Brian } 2333af1f3b9220733f5e3a76fe38fbc397974678234Brian 234b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell src = swizzle(src, 23591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleX, 23691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleY, 23791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleZ, 23891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleW); 23941b3fcbf0404bc4a4f6588c0feef553bb65d4440Brian 2403af1f3b9220733f5e3a76fe38fbc397974678234Brian 2412154d1c5ac0bb37614ef00bed766e49635b519e8Brian /* There's both negate-all-components and per-component negation. 2422154d1c5ac0bb37614ef00bed766e49635b519e8Brian * Try to handle both here. 2432154d1c5ac0bb37614ef00bed766e49635b519e8Brian */ 2442154d1c5ac0bb37614ef00bed766e49635b519e8Brian { 24591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell int n = source->Register.Negate; 246da253319f9e5d37d9c55b975ef9328545a3ac9b4Keith Whitwell src = negate(src, n, n, n, n); 2472154d1c5ac0bb37614ef00bed766e49635b519e8Brian } 2482154d1c5ac0bb37614ef00bed766e49635b519e8Brian 24956ee132f9671f70ff2b3ee04659beac0dfc6126dKeith Whitwell /* no abs() */ 25037cf13ed9a429c755f121daa1776b1b30a985ab3Brian#if 0 25137cf13ed9a429c755f121daa1776b1b30a985ab3Brian /* XXX assertions disabled to allow arbfplight.c to run */ 25237cf13ed9a429c755f121daa1776b1b30a985ab3Brian /* XXX enable these assertions, or fix things */ 25391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell assert(!source->Register.Absolute); 25437cf13ed9a429c755f121daa1776b1b30a985ab3Brian#endif 2553af1f3b9220733f5e3a76fe38fbc397974678234Brian return src; 2563af1f3b9220733f5e3a76fe38fbc397974678234Brian} 2573af1f3b9220733f5e3a76fe38fbc397974678234Brian 2583af1f3b9220733f5e3a76fe38fbc397974678234Brian 2590d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/** 2600d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Construct a ureg for a destination register. 2610d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 2623af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 2633af1f3b9220733f5e3a76fe38fbc397974678234Brianget_result_vector(struct i915_fp_compile *p, 2643af1f3b9220733f5e3a76fe38fbc397974678234Brian const struct tgsi_full_dst_register *dest) 2653af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 2665b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch (dest->Register.File) { 2673af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_OUTPUT: 268d0bca086ab6d032909e9a429720fea297c536f97Brian { 2695b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell uint sem_name = p->shader->info.output_semantic_name[dest->Register.Index]; 270d0bca086ab6d032909e9a429720fea297c536f97Brian switch (sem_name) { 271d0bca086ab6d032909e9a429720fea297c536f97Brian case TGSI_SEMANTIC_POSITION: 272d0bca086ab6d032909e9a429720fea297c536f97Brian return UREG(REG_TYPE_OD, 0); 273d0bca086ab6d032909e9a429720fea297c536f97Brian case TGSI_SEMANTIC_COLOR: 274d0bca086ab6d032909e9a429720fea297c536f97Brian return UREG(REG_TYPE_OC, 0); 275d0bca086ab6d032909e9a429720fea297c536f97Brian default: 276d0bca086ab6d032909e9a429720fea297c536f97Brian i915_program_error(p, "Bad inst->DstReg.Index/semantics"); 277d0bca086ab6d032909e9a429720fea297c536f97Brian return 0; 278d0bca086ab6d032909e9a429720fea297c536f97Brian } 2793af1f3b9220733f5e3a76fe38fbc397974678234Brian } 2803af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_TEMPORARY: 2815b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell return UREG(REG_TYPE_R, dest->Register.Index); 2823af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 2833af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "Bad inst->DstReg.File"); 2843af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 2853af1f3b9220733f5e3a76fe38fbc397974678234Brian } 2863af1f3b9220733f5e3a76fe38fbc397974678234Brian} 2873af1f3b9220733f5e3a76fe38fbc397974678234Brian 2883af1f3b9220733f5e3a76fe38fbc397974678234Brian 2893af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 2903af1f3b9220733f5e3a76fe38fbc397974678234Brian * Compute flags for saturation and writemask. 2913af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 2923af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 2933af1f3b9220733f5e3a76fe38fbc397974678234Brianget_result_flags(const struct tgsi_full_instruction *inst) 2943af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 2953af1f3b9220733f5e3a76fe38fbc397974678234Brian const uint writeMask 2965b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell = inst->Dst[0].Register.WriteMask; 2973af1f3b9220733f5e3a76fe38fbc397974678234Brian uint flags = 0x0; 2983af1f3b9220733f5e3a76fe38fbc397974678234Brian 2993af1f3b9220733f5e3a76fe38fbc397974678234Brian if (inst->Instruction.Saturate == TGSI_SAT_ZERO_ONE) 3003af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_SATURATE; 3013af1f3b9220733f5e3a76fe38fbc397974678234Brian 3023af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_X) 3033af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_X; 3043af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_Y) 3053af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_Y; 3063af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_Z) 3073af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_Z; 3083af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_W) 3093af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_W; 3103af1f3b9220733f5e3a76fe38fbc397974678234Brian 3113af1f3b9220733f5e3a76fe38fbc397974678234Brian return flags; 3123af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3133af1f3b9220733f5e3a76fe38fbc397974678234Brian 3143af1f3b9220733f5e3a76fe38fbc397974678234Brian 3153af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 3163af1f3b9220733f5e3a76fe38fbc397974678234Brian * Convert TGSI_TEXTURE_x token to DO_SAMPLE_TYPE_x token 3173af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 3183af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 3193af1f3b9220733f5e3a76fe38fbc397974678234Briantranslate_tex_src_target(struct i915_fp_compile *p, uint tex) 3203af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3213af1f3b9220733f5e3a76fe38fbc397974678234Brian switch (tex) { 322776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul case TGSI_TEXTURE_SHADOW1D: 323776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul /* fall-through */ 3243af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_1D: 3253af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_2D; 326776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 327776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul case TGSI_TEXTURE_SHADOW2D: 328776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul /* fall-through */ 3293af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_2D: 3303af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_2D; 331776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 332776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul case TGSI_TEXTURE_SHADOWRECT: 333776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul /* fall-through */ 3343af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_RECT: 3353af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_2D; 336776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3373af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_3D: 3383af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_VOLUME; 339776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3403af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_CUBE: 3413af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_CUBE; 342776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3433af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 3443af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "TexSrc type"); 3453af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 3463af1f3b9220733f5e3a76fe38fbc397974678234Brian } 3473af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3483af1f3b9220733f5e3a76fe38fbc397974678234Brian 3493af1f3b9220733f5e3a76fe38fbc397974678234Brian 3503af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 3513af1f3b9220733f5e3a76fe38fbc397974678234Brian * Generate texel lookup instruction. 3523af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 3533af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void 3543af1f3b9220733f5e3a76fe38fbc397974678234Brianemit_tex(struct i915_fp_compile *p, 3553af1f3b9220733f5e3a76fe38fbc397974678234Brian const struct tgsi_full_instruction *inst, 356abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint opcode, 357abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 3583af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3597d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell uint texture = inst->Texture.Texture; 36091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell uint unit = inst->Src[1].Register.Index; 3613af1f3b9220733f5e3a76fe38fbc397974678234Brian uint tex = translate_tex_src_target( p, texture ); 3623af1f3b9220733f5e3a76fe38fbc397974678234Brian uint sampler = i915_emit_decl(p, REG_TYPE_S, unit, tex); 363abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint coord = src_vector( p, &inst->Src[0], fs); 3643af1f3b9220733f5e3a76fe38fbc397974678234Brian 3653af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_texld( p, 3667d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector( p, &inst->Dst[0] ), 3673af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags( inst ), 3683af1f3b9220733f5e3a76fe38fbc397974678234Brian sampler, 3693af1f3b9220733f5e3a76fe38fbc397974678234Brian coord, 3703af1f3b9220733f5e3a76fe38fbc397974678234Brian opcode); 3713af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3723af1f3b9220733f5e3a76fe38fbc397974678234Brian 3733af1f3b9220733f5e3a76fe38fbc397974678234Brian 3743af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 3753af1f3b9220733f5e3a76fe38fbc397974678234Brian * Generate a simple arithmetic instruction 3763af1f3b9220733f5e3a76fe38fbc397974678234Brian * \param opcode the i915 opcode 3773af1f3b9220733f5e3a76fe38fbc397974678234Brian * \param numArgs the number of input/src arguments 3783af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 3793af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void 3803af1f3b9220733f5e3a76fe38fbc397974678234Brianemit_simple_arith(struct i915_fp_compile *p, 3813af1f3b9220733f5e3a76fe38fbc397974678234Brian const struct tgsi_full_instruction *inst, 382abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint opcode, uint numArgs, 383abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 3843af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3853af1f3b9220733f5e3a76fe38fbc397974678234Brian uint arg1, arg2, arg3; 3863af1f3b9220733f5e3a76fe38fbc397974678234Brian 3873af1f3b9220733f5e3a76fe38fbc397974678234Brian assert(numArgs <= 3); 3883af1f3b9220733f5e3a76fe38fbc397974678234Brian 389abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin arg1 = (numArgs < 1) ? 0 : src_vector( p, &inst->Src[0], fs ); 390abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin arg2 = (numArgs < 2) ? 0 : src_vector( p, &inst->Src[1], fs ); 391abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin arg3 = (numArgs < 3) ? 0 : src_vector( p, &inst->Src[2], fs ); 3923af1f3b9220733f5e3a76fe38fbc397974678234Brian 3933af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith( p, 3943af1f3b9220733f5e3a76fe38fbc397974678234Brian opcode, 3957d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector( p, &inst->Dst[0]), 3963af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags( inst ), 0, 3973af1f3b9220733f5e3a76fe38fbc397974678234Brian arg1, 3983af1f3b9220733f5e3a76fe38fbc397974678234Brian arg2, 3993af1f3b9220733f5e3a76fe38fbc397974678234Brian arg3 ); 4003af1f3b9220733f5e3a76fe38fbc397974678234Brian} 4013af1f3b9220733f5e3a76fe38fbc397974678234Brian 40220839b37ed61b044d6224c0e373ce10d74be4f3dBrian 40320839b37ed61b044d6224c0e373ce10d74be4f3dBrian/** As above, but swap the first two src regs */ 40420839b37ed61b044d6224c0e373ce10d74be4f3dBrianstatic void 40520839b37ed61b044d6224c0e373ce10d74be4f3dBrianemit_simple_arith_swap2(struct i915_fp_compile *p, 40620839b37ed61b044d6224c0e373ce10d74be4f3dBrian const struct tgsi_full_instruction *inst, 407abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint opcode, uint numArgs, 408abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 40920839b37ed61b044d6224c0e373ce10d74be4f3dBrian{ 41020839b37ed61b044d6224c0e373ce10d74be4f3dBrian struct tgsi_full_instruction inst2; 41120839b37ed61b044d6224c0e373ce10d74be4f3dBrian 41220839b37ed61b044d6224c0e373ce10d74be4f3dBrian assert(numArgs == 2); 41320839b37ed61b044d6224c0e373ce10d74be4f3dBrian 41420839b37ed61b044d6224c0e373ce10d74be4f3dBrian /* transpose first two registers */ 41520839b37ed61b044d6224c0e373ce10d74be4f3dBrian inst2 = *inst; 4167d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell inst2.Src[0] = inst->Src[1]; 4177d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell inst2.Src[1] = inst->Src[0]; 41820839b37ed61b044d6224c0e373ce10d74be4f3dBrian 419abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, &inst2, opcode, numArgs, fs); 42020839b37ed61b044d6224c0e373ce10d74be4f3dBrian} 42120839b37ed61b044d6224c0e373ce10d74be4f3dBrian 42220839b37ed61b044d6224c0e373ce10d74be4f3dBrian 4230e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal#ifndef M_PI 4240e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal#define M_PI 3.14159265358979323846 4250e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal#endif 4263af1f3b9220733f5e3a76fe38fbc397974678234Brian 4270d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/* 4280d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Translate TGSI instruction to i915 instruction. 4290d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * 4300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Possible concerns: 4310d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * 4320d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * SIN, COS -- could use another taylor step? 4330d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * LIT -- results seem a little different to sw mesa 4340d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * LOG -- different to mesa on negative numbers, but this is conformant. 4350d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 4363af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void 4373af1f3b9220733f5e3a76fe38fbc397974678234Briani915_translate_instruction(struct i915_fp_compile *p, 438abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin const struct tgsi_full_instruction *inst, 439abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader *fs) 4403af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 4413af1f3b9220733f5e3a76fe38fbc397974678234Brian uint writemask; 4423af1f3b9220733f5e3a76fe38fbc397974678234Brian uint src0, src1, src2, flags; 4433af1f3b9220733f5e3a76fe38fbc397974678234Brian uint tmp = 0; 4443af1f3b9220733f5e3a76fe38fbc397974678234Brian 4453af1f3b9220733f5e3a76fe38fbc397974678234Brian switch (inst->Instruction.Opcode) { 4463af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_ABS: 447abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 4483af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 4493af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MAX, 4507d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 4513af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 4523af1f3b9220733f5e3a76fe38fbc397974678234Brian src0, negate(src0, 1, 1, 1, 1), 0); 4533af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 4543af1f3b9220733f5e3a76fe38fbc397974678234Brian 4553af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_ADD: 456abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_ADD, 2, fs); 4573af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 4583af1f3b9220733f5e3a76fe38fbc397974678234Brian 4593af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_CMP: 460abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 461abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 462abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src2 = src_vector(p, &inst->Src[2], fs); 4633af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_CMP, 4647d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 4653af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 4663af1f3b9220733f5e3a76fe38fbc397974678234Brian 0, src0, src2, src1); /* NOTE: order of src2, src1 */ 4673af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 4683af1f3b9220733f5e3a76fe38fbc397974678234Brian 4693af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_COS: 470abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 4713af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 4723af1f3b9220733f5e3a76fe38fbc397974678234Brian 4733af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 4743af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 4753af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 4760e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal src0, i915_emit_const1f(p, 1.0f / (float) (M_PI * 2.0)), 0); 4773af1f3b9220733f5e3a76fe38fbc397974678234Brian 4783af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MOD, tmp, A0_DEST_CHANNEL_X, 0, tmp, 0, 0); 4793af1f3b9220733f5e3a76fe38fbc397974678234Brian 4803af1f3b9220733f5e3a76fe38fbc397974678234Brian /* By choosing different taylor constants, could get rid of this mul: 4813af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 4823af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 4833af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 4843af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 4850e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal tmp, i915_emit_const1f(p, (float) (M_PI * 2.0)), 0); 4863af1f3b9220733f5e3a76fe38fbc397974678234Brian 4873af1f3b9220733f5e3a76fe38fbc397974678234Brian /* 4883af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 4893af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, 1 4903af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xxz1 t0.z111 ; x^6 x^4 x^2 1 4913af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = DP4 t0, cos_constants 4923af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 4933af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 4943af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 4953af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XY, 0, 4963af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 4973af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, ONE, ONE, ONE), 0); 4983af1f3b9220733f5e3a76fe38fbc397974678234Brian 4993af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5003af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5013af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XYZ, 0, 5023af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, X, ONE), 5033af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 0); 5043af1f3b9220733f5e3a76fe38fbc397974678234Brian 5053af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5063af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5073af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XYZ, 0, 5083af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, Z, ONE), 5093af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Z, ONE, ONE, ONE), 0); 5103af1f3b9220733f5e3a76fe38fbc397974678234Brian 5113af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5123af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 5137d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5143af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 5153af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, Z, Y, X), 5163af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_const4fv(p, cos_constants), 0); 5173af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5183af1f3b9220733f5e3a76fe38fbc397974678234Brian 5192292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_DP2: 520abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 521abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 5222292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 5232292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 5242292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DP3, 5252292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 5262292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_flags(inst), 0, 5272292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin swizzle(src0, X, Y, ZERO, ZERO), src1, 0); 5282292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 5292292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 5303af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DP3: 531abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_DP3, 2, fs); 5323af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5333af1f3b9220733f5e3a76fe38fbc397974678234Brian 5343af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DP4: 535abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_DP4, 2, fs); 5363af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5373af1f3b9220733f5e3a76fe38fbc397974678234Brian 5383af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DPH: 539abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 540abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 5413af1f3b9220733f5e3a76fe38fbc397974678234Brian 5423af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5433af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 5447d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5453af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 5463af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, Y, Z, ONE), src1, 0); 5473af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5483af1f3b9220733f5e3a76fe38fbc397974678234Brian 5493af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DST: 550abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 551abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 5523af1f3b9220733f5e3a76fe38fbc397974678234Brian 5533af1f3b9220733f5e3a76fe38fbc397974678234Brian /* result[0] = 1 * 1; 5543af1f3b9220733f5e3a76fe38fbc397974678234Brian * result[1] = a[1] * b[1]; 5553af1f3b9220733f5e3a76fe38fbc397974678234Brian * result[2] = a[2] * 1; 5563af1f3b9220733f5e3a76fe38fbc397974678234Brian * result[3] = 1 * b[3]; 5573af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 5583af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5593af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5607d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5613af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 5623af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, ONE, Y, Z, ONE), 5633af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src1, ONE, Y, ONE, W), 0); 5643af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5653af1f3b9220733f5e3a76fe38fbc397974678234Brian 5665e49ec339df1d23b1f1790c49c9f102098f42c0dBrian case TGSI_OPCODE_END: 5675e49ec339df1d23b1f1790c49c9f102098f42c0dBrian /* no-op */ 5685e49ec339df1d23b1f1790c49c9f102098f42c0dBrian break; 5695e49ec339df1d23b1f1790c49c9f102098f42c0dBrian 5703af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_EX2: 571abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 5723af1f3b9220733f5e3a76fe38fbc397974678234Brian 5733af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5743af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_EXP, 5757d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5763af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 5773af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 5783af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5793af1f3b9220733f5e3a76fe38fbc397974678234Brian 5803af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_FLR: 581abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_FLR, 1, fs); 5823af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5833af1f3b9220733f5e3a76fe38fbc397974678234Brian 5843af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_FRC: 585abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_FRC, 1, fs); 5863af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5873af1f3b9220733f5e3a76fe38fbc397974678234Brian 5883af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_KIL: 58941b3fcbf0404bc4a4f6588c0feef553bb65d4440Brian /* kill if src[0].x < 0 || src[0].y < 0 ... */ 590abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 5913af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 5923af1f3b9220733f5e3a76fe38fbc397974678234Brian 5930235b3252100eda553babea42c014445358a2985Brian i915_emit_texld(p, 5940235b3252100eda553babea42c014445358a2985Brian tmp, /* dest reg: a dummy reg */ 5950235b3252100eda553babea42c014445358a2985Brian A0_DEST_CHANNEL_ALL, /* dest writemask */ 5960235b3252100eda553babea42c014445358a2985Brian 0, /* sampler */ 5970235b3252100eda553babea42c014445358a2985Brian src0, /* coord*/ 5980235b3252100eda553babea42c014445358a2985Brian T0_TEXKILL); /* opcode */ 5993af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6003af1f3b9220733f5e3a76fe38fbc397974678234Brian 601db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol case TGSI_OPCODE_KILP: 602db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol assert(0); /* not tested yet */ 603db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol break; 604db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol 6053af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_LG2: 606abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 6073af1f3b9220733f5e3a76fe38fbc397974678234Brian 6083af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 6093af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_LOG, 6107d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6113af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 6123af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 6133af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6143af1f3b9220733f5e3a76fe38fbc397974678234Brian 6153af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_LIT: 616abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 6173af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 6183af1f3b9220733f5e3a76fe38fbc397974678234Brian 6193af1f3b9220733f5e3a76fe38fbc397974678234Brian /* tmp = max( a.xyzw, a.00zw ) 6203af1f3b9220733f5e3a76fe38fbc397974678234Brian * XXX: Clamp tmp.w to -128..128 6213af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp.y = log(tmp.y) 6223af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp.y = tmp.w * tmp.y 6233af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp.y = exp(tmp.y) 6243af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = cmp (a.11-x1, a.1x01, a.1xy1 ) 6253af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 6263af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MAX, tmp, A0_DEST_CHANNEL_ALL, 0, 6273af1f3b9220733f5e3a76fe38fbc397974678234Brian src0, swizzle(src0, ZERO, ZERO, Z, W), 0); 6283af1f3b9220733f5e3a76fe38fbc397974678234Brian 6293af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_LOG, tmp, A0_DEST_CHANNEL_Y, 0, 6303af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Y, Y, Y, Y), 0, 0); 6313af1f3b9220733f5e3a76fe38fbc397974678234Brian 6323af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MUL, tmp, A0_DEST_CHANNEL_Y, 0, 6333af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ZERO, Y, ZERO, ZERO), 6343af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ZERO, W, ZERO, ZERO), 0); 6353af1f3b9220733f5e3a76fe38fbc397974678234Brian 6363af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_EXP, tmp, A0_DEST_CHANNEL_Y, 0, 6373af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Y, Y, Y, Y), 0, 0); 6383af1f3b9220733f5e3a76fe38fbc397974678234Brian 6393af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_CMP, 6407d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6413af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 6423af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(swizzle(tmp, ONE, ONE, X, ONE), 0, 0, 1, 0), 6433af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, X, ZERO, ONE), 6443af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, X, Y, ONE)); 6453af1f3b9220733f5e3a76fe38fbc397974678234Brian 6463af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6473af1f3b9220733f5e3a76fe38fbc397974678234Brian 6483af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_LRP: 649abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 650abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 651abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src2 = src_vector(p, &inst->Src[2], fs); 6523af1f3b9220733f5e3a76fe38fbc397974678234Brian flags = get_result_flags(inst); 6533af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 6543af1f3b9220733f5e3a76fe38fbc397974678234Brian 6553af1f3b9220733f5e3a76fe38fbc397974678234Brian /* b*a + c*(1-a) 6563af1f3b9220733f5e3a76fe38fbc397974678234Brian * 6573af1f3b9220733f5e3a76fe38fbc397974678234Brian * b*a + c - ca 6583af1f3b9220733f5e3a76fe38fbc397974678234Brian * 6593af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp = b*a + c, 6603af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = (-c)*a + tmp 6613af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 6623af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MAD, tmp, 6633af1f3b9220733f5e3a76fe38fbc397974678234Brian flags & A0_DEST_CHANNEL_ALL, 0, src1, src0, src2); 6643af1f3b9220733f5e3a76fe38fbc397974678234Brian 6653af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MAD, 6667d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6673af1f3b9220733f5e3a76fe38fbc397974678234Brian flags, 0, negate(src2, 1, 1, 1, 1), src0, tmp); 6683af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6693af1f3b9220733f5e3a76fe38fbc397974678234Brian 6703af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MAD: 671abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MAD, 3, fs); 6723af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6733af1f3b9220733f5e3a76fe38fbc397974678234Brian 6743af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MAX: 675abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MAX, 2, fs); 6763af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6773af1f3b9220733f5e3a76fe38fbc397974678234Brian 6783af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MIN: 679abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 680abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 6813af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 6823af1f3b9220733f5e3a76fe38fbc397974678234Brian flags = get_result_flags(inst); 6833af1f3b9220733f5e3a76fe38fbc397974678234Brian 6843af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 6853af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MAX, 6863af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, flags & A0_DEST_CHANNEL_ALL, 0, 6873af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(src0, 1, 1, 1, 1), 6883af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(src1, 1, 1, 1, 1), 0); 6893af1f3b9220733f5e3a76fe38fbc397974678234Brian 6903af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 6913af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MOV, 6927d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6933af1f3b9220733f5e3a76fe38fbc397974678234Brian flags, 0, negate(tmp, 1, 1, 1, 1), 0, 0); 6943af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6953af1f3b9220733f5e3a76fe38fbc397974678234Brian 6963af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MOV: 697abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MOV, 1, fs); 6983af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6993af1f3b9220733f5e3a76fe38fbc397974678234Brian 7003af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MUL: 701abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MUL, 2, fs); 7023af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7033af1f3b9220733f5e3a76fe38fbc397974678234Brian 7043af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_POW: 705abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 706abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 7073af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 7083af1f3b9220733f5e3a76fe38fbc397974678234Brian flags = get_result_flags(inst); 7093af1f3b9220733f5e3a76fe38fbc397974678234Brian 7103af1f3b9220733f5e3a76fe38fbc397974678234Brian /* XXX: masking on intermediate values, here and elsewhere. 7113af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 7123af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7133af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_LOG, 7143af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 7153af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 7163af1f3b9220733f5e3a76fe38fbc397974678234Brian 7173af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MUL, tmp, A0_DEST_CHANNEL_X, 0, tmp, src1, 0); 7183af1f3b9220733f5e3a76fe38fbc397974678234Brian 7193af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7203af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_EXP, 7217d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7223af1f3b9220733f5e3a76fe38fbc397974678234Brian flags, 0, swizzle(tmp, X, X, X, X), 0, 0); 7233af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7243af1f3b9220733f5e3a76fe38fbc397974678234Brian 72544e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca case TGSI_OPCODE_RET: 72644e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca /* XXX: no-op? */ 72744e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca break; 72844e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca 7293af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_RCP: 730abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 7313af1f3b9220733f5e3a76fe38fbc397974678234Brian 7323af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7333af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_RCP, 7347d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7352292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_flags(inst), 0, 7363af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 7373af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7383af1f3b9220733f5e3a76fe38fbc397974678234Brian 7393af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_RSQ: 740abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 7413af1f3b9220733f5e3a76fe38fbc397974678234Brian 7423af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7433af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_RSQ, 7447d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7453af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 7463af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 7473af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7483af1f3b9220733f5e3a76fe38fbc397974678234Brian 7493af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SCS: 750abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 7513af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 7523af1f3b9220733f5e3a76fe38fbc397974678234Brian 7533af1f3b9220733f5e3a76fe38fbc397974678234Brian /* 7543af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 7553af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, x 7563af1f3b9220733f5e3a76fe38fbc397974678234Brian * t1 = MUL t0.xyyw t0.yz11 ; x^7 x^5 x^3 x 7573af1f3b9220733f5e3a76fe38fbc397974678234Brian * scs.x = DP4 t1, sin_constants 7583af1f3b9220733f5e3a76fe38fbc397974678234Brian * t1 = MUL t0.xxz1 t0.z111 ; x^6 x^4 x^2 1 7593af1f3b9220733f5e3a76fe38fbc397974678234Brian * scs.y = DP4 t1, cos_constants 7603af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 7613af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7623af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 7633af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XY, 0, 7643af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, ONE, ONE), 7653af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, ONE, ONE, ONE), 0); 7663af1f3b9220733f5e3a76fe38fbc397974678234Brian 7673af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7683af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 7693af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 7703af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, X, Y), 7713af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 0); 7723af1f3b9220733f5e3a76fe38fbc397974678234Brian 7735b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell writemask = inst->Dst[0].Register.WriteMask; 7743af1f3b9220733f5e3a76fe38fbc397974678234Brian 7753af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writemask & TGSI_WRITEMASK_Y) { 7763af1f3b9220733f5e3a76fe38fbc397974678234Brian uint tmp1; 7773af1f3b9220733f5e3a76fe38fbc397974678234Brian 7783af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writemask & TGSI_WRITEMASK_X) 7793af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp1 = i915_get_utemp(p); 7803af1f3b9220733f5e3a76fe38fbc397974678234Brian else 7813af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp1 = tmp; 7823af1f3b9220733f5e3a76fe38fbc397974678234Brian 7833af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7843af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 7853af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp1, A0_DEST_CHANNEL_ALL, 0, 7863af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, Y, W), 7873af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Z, ONE, ONE), 0); 7883af1f3b9220733f5e3a76fe38fbc397974678234Brian 7893af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7903af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 7917d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7923af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DEST_CHANNEL_Y, 0, 7933af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp1, W, Z, Y, X), 7943af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_const4fv(p, sin_constants), 0); 7953af1f3b9220733f5e3a76fe38fbc397974678234Brian } 7963af1f3b9220733f5e3a76fe38fbc397974678234Brian 7973af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writemask & TGSI_WRITEMASK_X) { 7983af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7993af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8003af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XYZ, 0, 8013af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, Z, ONE), 8023af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Z, ONE, ONE, ONE), 0); 8033af1f3b9220733f5e3a76fe38fbc397974678234Brian 8043af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8053af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 8067d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 8073af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DEST_CHANNEL_X, 0, 8083af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, Z, Y, X), 8093af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_const4fv(p, cos_constants), 0); 8103af1f3b9220733f5e3a76fe38fbc397974678234Brian } 8113af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 8123af1f3b9220733f5e3a76fe38fbc397974678234Brian 8132292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SEQ: 8142292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* if we're both >= and <= then we're == */ 815abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 816abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 8172292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp = i915_get_utemp(p); 8182292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 8192292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 8202292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SGE, 8212292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, A0_DEST_CHANNEL_ALL, 0, 8222292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 8232292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src1, 0); 8242292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 8252292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 8262292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SGE, 8272292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 8282292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 8292292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src1, 8302292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 0); 8312292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 8322292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 8332292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_MUL, 8342292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 8352292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 8362292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 8372292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, 0); 8382292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 8393af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 8403af1f3b9220733f5e3a76fe38fbc397974678234Brian 8412292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SGE: 842abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_SGE, 2, fs); 84320839b37ed61b044d6224c0e373ce10d74be4f3dBrian break; 84420839b37ed61b044d6224c0e373ce10d74be4f3dBrian 8453af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SIN: 846abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 8473af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 8483af1f3b9220733f5e3a76fe38fbc397974678234Brian 8493af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8503af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8513af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 8520e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal src0, i915_emit_const1f(p, 1.0f / (float) (M_PI * 2.0)), 0); 8533af1f3b9220733f5e3a76fe38fbc397974678234Brian 8543af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MOD, tmp, A0_DEST_CHANNEL_X, 0, tmp, 0, 0); 8553af1f3b9220733f5e3a76fe38fbc397974678234Brian 8563af1f3b9220733f5e3a76fe38fbc397974678234Brian /* By choosing different taylor constants, could get rid of this mul: 8573af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 8583af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8593af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8603af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 8610e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal tmp, i915_emit_const1f(p, (float) (M_PI * 2.0)), 0); 8623af1f3b9220733f5e3a76fe38fbc397974678234Brian 8633af1f3b9220733f5e3a76fe38fbc397974678234Brian /* 8643af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 8653af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, x 8663af1f3b9220733f5e3a76fe38fbc397974678234Brian * t1 = MUL t0.xyyw t0.yz11 ; x^7 x^5 x^3 x 8673af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = DP4 t1.wzyx, sin_constants 8683af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 8693af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8703af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8713af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XY, 0, 8723af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 8733af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, ONE, ONE, ONE), 0); 8743af1f3b9220733f5e3a76fe38fbc397974678234Brian 8753af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8763af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8773af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 8783af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, X, Y), 8793af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 0); 8803af1f3b9220733f5e3a76fe38fbc397974678234Brian 8813af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8823af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8833af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 8843af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, Y, W), 8853af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Z, ONE, ONE), 0); 8863af1f3b9220733f5e3a76fe38fbc397974678234Brian 8873af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8883af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 8897d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 8903af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 8913af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, W, Z, Y, X), 8923af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_const4fv(p, sin_constants), 0); 8933af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 8943af1f3b9220733f5e3a76fe38fbc397974678234Brian 8952292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SLE: 8962292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* like SGE, but swap reg0, reg1 */ 897abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith_swap2(p, inst, A0_SGE, 2, fs); 8982292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 8992292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9003af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SLT: 901abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_SLT, 2, fs); 9023af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9033af1f3b9220733f5e3a76fe38fbc397974678234Brian 90420839b37ed61b044d6224c0e373ce10d74be4f3dBrian case TGSI_OPCODE_SGT: 90520839b37ed61b044d6224c0e373ce10d74be4f3dBrian /* like SLT, but swap reg0, reg1 */ 906abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith_swap2(p, inst, A0_SLT, 2, fs); 90720839b37ed61b044d6224c0e373ce10d74be4f3dBrian break; 90820839b37ed61b044d6224c0e373ce10d74be4f3dBrian 9092292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SNE: 9102292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* if we're neither < nor > then we're != */ 911abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 912abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 9130f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin tmp = i915_get_utemp(p); 9140f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9150f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin i915_emit_arith(p, 9162292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 9172292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, 9182292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9190f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src0, 9200f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src1, 0); 9210f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9220f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin i915_emit_arith(p, 9232292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 9240f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9250f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9260f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src1, 9270f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src0, 0); 9280f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9290f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin i915_emit_arith(p, 9302292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_ADD, 9310f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9320f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9330f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9340f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin tmp, 0); 9352292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 9360f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9372292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SSG: 9382292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* compute (src>0) - (src<0) */ 939abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 9402292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp = i915_get_utemp(p); 9412292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9422292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 9432292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 9442292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, 9452292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9462292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 9472292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin swizzle(src0, ZERO, ZERO, ZERO, ZERO), 0); 9482292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9492292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 9502292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 9512292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9522292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9532292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin swizzle(src0, ZERO, ZERO, ZERO, ZERO), 9542292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 0); 9552292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9562292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 9572292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_ADD, 9582292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9592292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9602292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9612292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin negate(tmp, 1, 1, 1, 1), 0); 9620f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin break; 9630f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9643af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SUB: 965abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 966abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 9673af1f3b9220733f5e3a76fe38fbc397974678234Brian 9683af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9693af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_ADD, 9707d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 9713af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 9723af1f3b9220733f5e3a76fe38fbc397974678234Brian src0, negate(src1, 1, 1, 1, 1), 0); 9733af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9743af1f3b9220733f5e3a76fe38fbc397974678234Brian 9753af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_TEX: 976abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_tex(p, inst, T0_TEXLD, fs); 9773af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9783af1f3b9220733f5e3a76fe38fbc397974678234Brian 9792292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_TRUNC: 980abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_TRC, 1, fs); 9812292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 9822292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9833af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_TXB: 984abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_tex(p, inst, T0_TEXLDB, fs); 9853af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9863af1f3b9220733f5e3a76fe38fbc397974678234Brian 987ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol case TGSI_OPCODE_TXP: 988abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_tex(p, inst, T0_TEXLDP, fs); 989ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol break; 990ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol 9913af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_XPD: 9923af1f3b9220733f5e3a76fe38fbc397974678234Brian /* Cross product: 9933af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.x = src0.y * src1.z - src0.z * src1.y; 9943af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.y = src0.z * src1.x - src0.x * src1.z; 9953af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.z = src0.x * src1.y - src0.y * src1.x; 9963af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.w = undef; 9973af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 998abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 999abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 10003af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 10013af1f3b9220733f5e3a76fe38fbc397974678234Brian 10023af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 10033af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 10043af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 10053af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, Z, X, Y, ONE), 10063af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src1, Y, Z, X, ONE), 0); 10073af1f3b9220733f5e3a76fe38fbc397974678234Brian 10083af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 10093af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MAD, 10107d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 10113af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 10123af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, Y, Z, X, ONE), 10133af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src1, Z, X, Y, ONE), 10143af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(tmp, 1, 1, 1, 0)); 10153af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 10163af1f3b9220733f5e3a76fe38fbc397974678234Brian 10173af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 1018af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca i915_program_error(p, "bad opcode %d", inst->Instruction.Opcode); 101920839b37ed61b044d6224c0e373ce10d74be4f3dBrian p->error = 1; 10203af1f3b9220733f5e3a76fe38fbc397974678234Brian return; 10213af1f3b9220733f5e3a76fe38fbc397974678234Brian } 10223af1f3b9220733f5e3a76fe38fbc397974678234Brian 10233af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_release_utemps(p); 10243af1f3b9220733f5e3a76fe38fbc397974678234Brian} 10253af1f3b9220733f5e3a76fe38fbc397974678234Brian 10263af1f3b9220733f5e3a76fe38fbc397974678234Brian 10273af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 10283af1f3b9220733f5e3a76fe38fbc397974678234Brian * Translate TGSI fragment shader into i915 hardware instructions. 10290d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * \param p the translation state 10300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * \param tokens the TGSI token array 10313af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 10320d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 10330d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Briani915_translate_instructions(struct i915_fp_compile *p, 1034abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin const struct tgsi_token *tokens, 1035abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader *fs) 10363af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 1037c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs = p->shader; 10383af1f3b9220733f5e3a76fe38fbc397974678234Brian struct tgsi_parse_context parse; 10393af1f3b9220733f5e3a76fe38fbc397974678234Brian 10403af1f3b9220733f5e3a76fe38fbc397974678234Brian tgsi_parse_init( &parse, tokens ); 10413af1f3b9220733f5e3a76fe38fbc397974678234Brian 10423af1f3b9220733f5e3a76fe38fbc397974678234Brian while( !tgsi_parse_end_of_tokens( &parse ) ) { 10433af1f3b9220733f5e3a76fe38fbc397974678234Brian 10443af1f3b9220733f5e3a76fe38fbc397974678234Brian tgsi_parse_token( &parse ); 10453af1f3b9220733f5e3a76fe38fbc397974678234Brian 10463af1f3b9220733f5e3a76fe38fbc397974678234Brian switch( parse.FullToken.Token.Type ) { 1047b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz case TGSI_TOKEN_TYPE_PROPERTY: 1048b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz /* 1049b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz * We only support one cbuf, but we still need to ignore the property 1050b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz * correctly so we don't hit the assert at the end of the switch case. 1051b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz */ 1052b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz assert(parse.FullToken.FullProperty.Property.PropertyName == 1053b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS); 1054b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz break; 10553af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TOKEN_TYPE_DECLARATION: 105637cf13ed9a429c755f121daa1776b1b30a985ab3Brian if (parse.FullToken.FullDeclaration.Declaration.File 1057c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian == TGSI_FILE_CONSTANT) { 1058c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian uint i; 1059fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell for (i = parse.FullToken.FullDeclaration.Range.First; 1060fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell i <= parse.FullToken.FullDeclaration.Range.Last; 1061c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian i++) { 1062c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian assert(ifs->constant_flags[i] == 0x0); 1063c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->constant_flags[i] = I915_CONSTFLAG_USER; 1064c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->num_constants = MAX2(ifs->num_constants, i + 1); 1065c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1066c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 10670235b3252100eda553babea42c014445358a2985Brian else if (parse.FullToken.FullDeclaration.Declaration.File 10680235b3252100eda553babea42c014445358a2985Brian == TGSI_FILE_TEMPORARY) { 10690235b3252100eda553babea42c014445358a2985Brian uint i; 1070fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell for (i = parse.FullToken.FullDeclaration.Range.First; 1071fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell i <= parse.FullToken.FullDeclaration.Range.Last; 10720235b3252100eda553babea42c014445358a2985Brian i++) { 10730235b3252100eda553babea42c014445358a2985Brian assert(i < I915_MAX_TEMPORARY); 10744901410293b35ac6bb4759142b50fcc0be8a1b25Brian /* XXX just use shader->info->file_mask[TGSI_FILE_TEMPORARY] */ 10750235b3252100eda553babea42c014445358a2985Brian p->temp_flag |= (1 << i); /* mark temp as used */ 10760235b3252100eda553babea42c014445358a2985Brian } 10770235b3252100eda553babea42c014445358a2985Brian } 10783af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 10793af1f3b9220733f5e3a76fe38fbc397974678234Brian 10803af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TOKEN_TYPE_IMMEDIATE: 1081c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian { 1082c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian const struct tgsi_full_immediate *imm 1083c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian = &parse.FullToken.FullImmediate; 1084c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian const uint pos = p->num_immediates++; 1085c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian uint j; 1086fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell assert( imm->Immediate.NrTokens <= 4 + 1 ); 10870020e1d10870e0d24c62e3060a7efb9a6472666dMichal Krol for (j = 0; j < imm->Immediate.NrTokens - 1; j++) { 1088fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell p->immediates[pos][j] = imm->u[j].Float; 1089c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1090c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 10913af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 10923af1f3b9220733f5e3a76fe38fbc397974678234Brian 10933af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TOKEN_TYPE_INSTRUCTION: 1094c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian if (p->first_instruction) { 1095c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /* resolve location of immediates */ 1096c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian uint i, j; 1097c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian for (i = 0; i < p->num_immediates; i++) { 1098c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /* find constant slot for this immediate */ 1099c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian for (j = 0; j < I915_MAX_CONSTANT; j++) { 1100c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian if (ifs->constant_flags[j] == 0x0) { 1101c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memcpy(ifs->constants[j], 1102c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->immediates[i], 1103c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 4 * sizeof(float)); 1104c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /*printf("immediate %d maps to const %d\n", i, j);*/ 1105c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->constant_flags[j] = 0xf; /* all four comps used */ 1106c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->immediates_map[i] = j; 1107c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->num_constants = MAX2(ifs->num_constants, j + 1); 1108c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian break; 1109c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1110c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1111c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1112c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 1113c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->first_instruction = FALSE; 1114c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1115c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 1116abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin i915_translate_instruction(p, &parse.FullToken.FullInstruction, fs); 11173af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 11183af1f3b9220733f5e3a76fe38fbc397974678234Brian 11193af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 11203af1f3b9220733f5e3a76fe38fbc397974678234Brian assert( 0 ); 11213af1f3b9220733f5e3a76fe38fbc397974678234Brian } 11223af1f3b9220733f5e3a76fe38fbc397974678234Brian 11233af1f3b9220733f5e3a76fe38fbc397974678234Brian } /* while */ 11243af1f3b9220733f5e3a76fe38fbc397974678234Brian 11253af1f3b9220733f5e3a76fe38fbc397974678234Brian tgsi_parse_free (&parse); 11263af1f3b9220733f5e3a76fe38fbc397974678234Brian} 11273af1f3b9220733f5e3a76fe38fbc397974678234Brian 11283af1f3b9220733f5e3a76fe38fbc397974678234Brian 11290d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic struct i915_fp_compile * 11300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Briani915_init_compile(struct i915_context *i915, 1131c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs) 11320d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 11330d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian struct i915_fp_compile *p = CALLOC_STRUCT(i915_fp_compile); 1134abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin int i; 11350d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1136c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->shader = ifs; 11370d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1138c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /* Put new constants at end of const buffer, growing downward. 1139c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * The problem is we don't know how many user-defined constants might 1140c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * be specified with pipe->set_constant_buffer(). 1141c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * Should pre-scan the user's program to determine the highest-numbered 1142c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * constant referenced. 1143c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian */ 1144c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->num_constants = 0; 1145c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memset(ifs->constant_flags, 0, sizeof(ifs->constant_flags)); 1146c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 1147abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin for (i = 0; i < I915_TEX_UNITS; i++) 1148abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin ifs->generic_mapping[i] = -1; 1149abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 1150c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->first_instruction = TRUE; 11510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11520d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_tex_indirect = 1; /* correct? */ 11530d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_tex_insn = 0; 11540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_alu_insn = 0; 11550d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_decl_insn = 0; 11560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->csr = p->program; 11580d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->decl = p->declarations; 11590d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->decl_s = 0; 11600d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->decl_t = 0; 11610235b3252100eda553babea42c014445358a2985Brian p->temp_flag = ~0x0 << I915_MAX_TEMPORARY; 11620d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->utemp_flag = ~0x7; 11630d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11640d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->wpos_tex = -1; 11650d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11660d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* initialize the first program word */ 11670d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian *(p->decl++) = _3DSTATE_PIXEL_SHADER_PROGRAM; 11680d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11690d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian return p; 11700d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 11710d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11725ac22877c98f4934cced4d42b9ec87245f266967Brian 11730d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/* Copy compile results to the fragment program struct and destroy the 11740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * compilation context. 11750d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 11760d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 11770d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Briani915_fini_compile(struct i915_context *i915, struct i915_fp_compile *p) 11780d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 1179c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs = p->shader; 11805961732c1b59403b4e736fa354a64d4a0e5d8af2Michal unsigned long program_size = (unsigned long) (p->csr - p->program); 11815961732c1b59403b4e736fa354a64d4a0e5d8af2Michal unsigned long decl_size = (unsigned long) (p->decl - p->declarations); 11820d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_tex_indirect > I915_MAX_TEX_INDIRECT) 11840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max nr indirect texture lookups"); 11850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11860d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_tex_insn > I915_MAX_TEX_INSN) 11870d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max TEX instructions"); 11880d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11890d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_alu_insn > I915_MAX_ALU_INSN) 11900d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max ALU instructions"); 11910d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11920d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_decl_insn > I915_MAX_DECL_INSN) 11930d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max DECL instructions"); 11940d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11950d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->error) { 11960d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeInstructions = 0; 11970d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeAluInstructions = 0; 11980d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexInstructions = 0; 11990d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexIndirections = 0; 12000d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1201c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian i915_use_passthrough_shader(ifs); 12020d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12030d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian else { 12045ac22877c98f4934cced4d42b9ec87245f266967Brian p->NumNativeInstructions 12055ac22877c98f4934cced4d42b9ec87245f266967Brian = p->nr_alu_insn + p->nr_tex_insn + p->nr_decl_insn; 12060d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeAluInstructions = p->nr_alu_insn; 12070d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexInstructions = p->nr_tex_insn; 12080d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexIndirections = p->nr_tex_indirect; 12090d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12100d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* patch in the program length */ 12110d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->declarations[0] |= program_size + decl_size - 2; 12120d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12130d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* Copy compilation results to fragment program struct: 12140d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 1215c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian assert(!ifs->program); 1216c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->program 12175961732c1b59403b4e736fa354a64d4a0e5d8af2Michal = (uint *) MALLOC((program_size + decl_size) * sizeof(uint)); 1218c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian if (ifs->program) { 1219c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->program_len = program_size + decl_size; 12200d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1221c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memcpy(ifs->program, 12225ac22877c98f4934cced4d42b9ec87245f266967Brian p->declarations, 12235ac22877c98f4934cced4d42b9ec87245f266967Brian decl_size * sizeof(uint)); 12243af1f3b9220733f5e3a76fe38fbc397974678234Brian 1225c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memcpy(ifs->program + decl_size, 12265ac22877c98f4934cced4d42b9ec87245f266967Brian p->program, 12275ac22877c98f4934cced4d42b9ec87245f266967Brian program_size * sizeof(uint)); 12285ac22877c98f4934cced4d42b9ec87245f266967Brian } 12290d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12310d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* Release the compilation struct: 12320d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 12335961732c1b59403b4e736fa354a64d4a0e5d8af2Michal FREE(p); 12340d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 12350d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12360d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12370d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/** 12380d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Find an unused texture coordinate slot to use for fragment WPOS. 12390d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Update p->fp->wpos_tex with the result (-1 if no used texcoord slot is found). 12400d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 12410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 12420d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Briani915_find_wpos_space(struct i915_fp_compile *p) 12430d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 124437cf13ed9a429c755f121daa1776b1b30a985ab3Brian#if 0 1245d8b16d416de95daa4f0ede9b839bdbf0fa6bf1b1Brian const uint inputs 1246d8b16d416de95daa4f0ede9b839bdbf0fa6bf1b1Brian = p->shader->inputs_read | (1 << TGSI_ATTRIB_POS); /*XXX hack*/ 12470d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian uint i; 12480d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12490d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->wpos_tex = -1; 12500d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1251d8b16d416de95daa4f0ede9b839bdbf0fa6bf1b1Brian if (inputs & (1 << TGSI_ATTRIB_POS)) { 12520d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian for (i = 0; i < I915_TEX_UNITS; i++) { 1253d8b16d416de95daa4f0ede9b839bdbf0fa6bf1b1Brian if ((inputs & (1 << (TGSI_ATTRIB_TEX0 + i))) == 0) { 12540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->wpos_tex = i; 12550d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian return; 12560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12580d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12590d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "No free texcoord for wpos value"); 12600d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 126137cf13ed9a429c755f121daa1776b1b30a985ab3Brian#else 12624901410293b35ac6bb4759142b50fcc0be8a1b25Brian if (p->shader->info.input_semantic_name[0] == TGSI_SEMANTIC_POSITION) { 126337cf13ed9a429c755f121daa1776b1b30a985ab3Brian /* frag shader using the fragment position input */ 126437cf13ed9a429c755f121daa1776b1b30a985ab3Brian#if 0 126537cf13ed9a429c755f121daa1776b1b30a985ab3Brian assert(0); 126637cf13ed9a429c755f121daa1776b1b30a985ab3Brian#endif 126737cf13ed9a429c755f121daa1776b1b30a985ab3Brian } 126837cf13ed9a429c755f121daa1776b1b30a985ab3Brian#endif 12690d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 12700d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12710d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12720d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12730d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/** 12750d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Rather than trying to intercept and jiggle depth writes during 12763af1f3b9220733f5e3a76fe38fbc397974678234Brian * emit, just move the value into its correct position at the end of 12773af1f3b9220733f5e3a76fe38fbc397974678234Brian * the program: 12783af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 12790d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 12803af1f3b9220733f5e3a76fe38fbc397974678234Briani915_fixup_depth_write(struct i915_fp_compile *p) 12813af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 1282f69b5c56feb60791bad27d491ee9592238d4efb0Brian /* XXX assuming pos/depth is always in output[0] */ 12834901410293b35ac6bb4759142b50fcc0be8a1b25Brian if (p->shader->info.output_semantic_name[0] == TGSI_SEMANTIC_POSITION) { 128437cf13ed9a429c755f121daa1776b1b30a985ab3Brian const uint depth = UREG(REG_TYPE_OD, 0); 12853af1f3b9220733f5e3a76fe38fbc397974678234Brian 12863af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 128737cf13ed9a429c755f121daa1776b1b30a985ab3Brian A0_MOV, /* opcode */ 128837cf13ed9a429c755f121daa1776b1b30a985ab3Brian depth, /* dest reg */ 128937cf13ed9a429c755f121daa1776b1b30a985ab3Brian A0_DEST_CHANNEL_W, /* write mask */ 129037cf13ed9a429c755f121daa1776b1b30a985ab3Brian 0, /* saturate? */ 129137cf13ed9a429c755f121daa1776b1b30a985ab3Brian swizzle(depth, X, Y, Z, Z), /* src0 */ 129237cf13ed9a429c755f121daa1776b1b30a985ab3Brian 0, 0 /* src1, src2 */); 12933af1f3b9220733f5e3a76fe38fbc397974678234Brian } 12943af1f3b9220733f5e3a76fe38fbc397974678234Brian} 12953af1f3b9220733f5e3a76fe38fbc397974678234Brian 12963af1f3b9220733f5e3a76fe38fbc397974678234Brian 12970d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianvoid 1298c74900ee5d80c7c2b7cbe4ed87395526a742a13eBriani915_translate_fragment_program( struct i915_context *i915, 1299c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *fs) 13000d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 130198b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter struct i915_fp_compile *p; 1302c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian const struct tgsi_token *tokens = fs->state.tokens; 13033af1f3b9220733f5e3a76fe38fbc397974678234Brian 1304c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian#if 0 1305c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian tgsi_dump(tokens, 0); 1306c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian#endif 1307c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 130898b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter /* hw doesn't seem to like empty frag programs, even when the depth write 130998b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter * fixup gets emitted below - may that one is fishy, too? */ 13109f0acfe1384d3236ac30ffca4be96e9531d2e876Jakob Bornecrantz if (fs->info.num_instructions == 1) { 131198b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter i915_use_passthrough_shader(fs); 131298b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter 131398b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter return; 131498b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter } 131598b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter 131698b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter p = i915_init_compile(i915, fs); 131798b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter i915_find_wpos_space(p); 131898b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter 1319abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin i915_translate_instructions(p, tokens, fs); 13200d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_fixup_depth_write(p); 13210d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13220d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_fini_compile(i915, p); 13230d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 1324