i915_fpc_translate.c revision ef3dac2aff5fda16d7b7662c2c8828f07c9842ae
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: 188d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin { 189d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin /* for fragcoord */ 190d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin int real_tex_unit = get_mapping(fs, I915_SEMANTIC_POS); 191d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_ALL); 192d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin break; 193d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin } 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 } 215ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin case TGSI_SEMANTIC_FACE: 216ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin { 217ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin /* for back/front faces */ 218ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin /* XXX also emit something from 0,1 to -1,1 */ 219ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin int real_tex_unit = get_mapping(fs, I915_SEMANTIC_FACE); 220ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin printf("semantic face fpc at %d\n",real_tex_unit); 221ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_X); 222ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin break; 223ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin } 22437cf13ed9a429c755f121daa1776b1b30a985ab3Brian default: 22537cf13ed9a429c755f121daa1776b1b30a985ab3Brian i915_program_error(p, "Bad source->Index"); 22637cf13ed9a429c755f121daa1776b1b30a985ab3Brian return 0; 22737cf13ed9a429c755f121daa1776b1b30a985ab3Brian } 2283af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 2293af1f3b9220733f5e3a76fe38fbc397974678234Brian 2306c29be9f41470b22c87ef571e10b5a9824800608Brian case TGSI_FILE_IMMEDIATE: 231c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian assert(index < p->num_immediates); 232c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian index = p->immediates_map[index]; 2336c29be9f41470b22c87ef571e10b5a9824800608Brian /* fall-through */ 2343af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_CONSTANT: 2353af1f3b9220733f5e3a76fe38fbc397974678234Brian src = UREG(REG_TYPE_CONST, index); 2363af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 2373af1f3b9220733f5e3a76fe38fbc397974678234Brian 2383af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 2393af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "Bad source->File"); 2403af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 2413af1f3b9220733f5e3a76fe38fbc397974678234Brian } 2423af1f3b9220733f5e3a76fe38fbc397974678234Brian 243b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell src = swizzle(src, 24491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleX, 24591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleY, 24691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleZ, 24791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell source->Register.SwizzleW); 24841b3fcbf0404bc4a4f6588c0feef553bb65d4440Brian 2493af1f3b9220733f5e3a76fe38fbc397974678234Brian 2502154d1c5ac0bb37614ef00bed766e49635b519e8Brian /* There's both negate-all-components and per-component negation. 2512154d1c5ac0bb37614ef00bed766e49635b519e8Brian * Try to handle both here. 2522154d1c5ac0bb37614ef00bed766e49635b519e8Brian */ 2532154d1c5ac0bb37614ef00bed766e49635b519e8Brian { 25491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell int n = source->Register.Negate; 255da253319f9e5d37d9c55b975ef9328545a3ac9b4Keith Whitwell src = negate(src, n, n, n, n); 2562154d1c5ac0bb37614ef00bed766e49635b519e8Brian } 2572154d1c5ac0bb37614ef00bed766e49635b519e8Brian 25856ee132f9671f70ff2b3ee04659beac0dfc6126dKeith Whitwell /* no abs() */ 25937cf13ed9a429c755f121daa1776b1b30a985ab3Brian#if 0 26037cf13ed9a429c755f121daa1776b1b30a985ab3Brian /* XXX assertions disabled to allow arbfplight.c to run */ 26137cf13ed9a429c755f121daa1776b1b30a985ab3Brian /* XXX enable these assertions, or fix things */ 26291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell assert(!source->Register.Absolute); 26337cf13ed9a429c755f121daa1776b1b30a985ab3Brian#endif 2643af1f3b9220733f5e3a76fe38fbc397974678234Brian return src; 2653af1f3b9220733f5e3a76fe38fbc397974678234Brian} 2663af1f3b9220733f5e3a76fe38fbc397974678234Brian 2673af1f3b9220733f5e3a76fe38fbc397974678234Brian 2680d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/** 2690d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Construct a ureg for a destination register. 2700d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 2713af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 2723af1f3b9220733f5e3a76fe38fbc397974678234Brianget_result_vector(struct i915_fp_compile *p, 2733af1f3b9220733f5e3a76fe38fbc397974678234Brian const struct tgsi_full_dst_register *dest) 2743af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 2755b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch (dest->Register.File) { 2763af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_OUTPUT: 277d0bca086ab6d032909e9a429720fea297c536f97Brian { 2785b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell uint sem_name = p->shader->info.output_semantic_name[dest->Register.Index]; 279d0bca086ab6d032909e9a429720fea297c536f97Brian switch (sem_name) { 280d0bca086ab6d032909e9a429720fea297c536f97Brian case TGSI_SEMANTIC_POSITION: 281d0bca086ab6d032909e9a429720fea297c536f97Brian return UREG(REG_TYPE_OD, 0); 282d0bca086ab6d032909e9a429720fea297c536f97Brian case TGSI_SEMANTIC_COLOR: 283d0bca086ab6d032909e9a429720fea297c536f97Brian return UREG(REG_TYPE_OC, 0); 284d0bca086ab6d032909e9a429720fea297c536f97Brian default: 285d0bca086ab6d032909e9a429720fea297c536f97Brian i915_program_error(p, "Bad inst->DstReg.Index/semantics"); 286d0bca086ab6d032909e9a429720fea297c536f97Brian return 0; 287d0bca086ab6d032909e9a429720fea297c536f97Brian } 2883af1f3b9220733f5e3a76fe38fbc397974678234Brian } 2893af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_FILE_TEMPORARY: 2905b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell return UREG(REG_TYPE_R, dest->Register.Index); 2913af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 2923af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "Bad inst->DstReg.File"); 2933af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 2943af1f3b9220733f5e3a76fe38fbc397974678234Brian } 2953af1f3b9220733f5e3a76fe38fbc397974678234Brian} 2963af1f3b9220733f5e3a76fe38fbc397974678234Brian 2973af1f3b9220733f5e3a76fe38fbc397974678234Brian 2983af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 2993af1f3b9220733f5e3a76fe38fbc397974678234Brian * Compute flags for saturation and writemask. 3003af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 3013af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 3023af1f3b9220733f5e3a76fe38fbc397974678234Brianget_result_flags(const struct tgsi_full_instruction *inst) 3033af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3043af1f3b9220733f5e3a76fe38fbc397974678234Brian const uint writeMask 3055b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell = inst->Dst[0].Register.WriteMask; 3063af1f3b9220733f5e3a76fe38fbc397974678234Brian uint flags = 0x0; 3073af1f3b9220733f5e3a76fe38fbc397974678234Brian 3083af1f3b9220733f5e3a76fe38fbc397974678234Brian if (inst->Instruction.Saturate == TGSI_SAT_ZERO_ONE) 3093af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_SATURATE; 3103af1f3b9220733f5e3a76fe38fbc397974678234Brian 3113af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_X) 3123af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_X; 3133af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_Y) 3143af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_Y; 3153af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_Z) 3163af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_Z; 3173af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writeMask & TGSI_WRITEMASK_W) 3183af1f3b9220733f5e3a76fe38fbc397974678234Brian flags |= A0_DEST_CHANNEL_W; 3193af1f3b9220733f5e3a76fe38fbc397974678234Brian 3203af1f3b9220733f5e3a76fe38fbc397974678234Brian return flags; 3213af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3223af1f3b9220733f5e3a76fe38fbc397974678234Brian 3233af1f3b9220733f5e3a76fe38fbc397974678234Brian 3243af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 3253af1f3b9220733f5e3a76fe38fbc397974678234Brian * Convert TGSI_TEXTURE_x token to DO_SAMPLE_TYPE_x token 3263af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 3273af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic uint 3283af1f3b9220733f5e3a76fe38fbc397974678234Briantranslate_tex_src_target(struct i915_fp_compile *p, uint tex) 3293af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3303af1f3b9220733f5e3a76fe38fbc397974678234Brian switch (tex) { 331776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul case TGSI_TEXTURE_SHADOW1D: 332776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul /* fall-through */ 3333af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_1D: 3343af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_2D; 335776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 336776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul case TGSI_TEXTURE_SHADOW2D: 337776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul /* fall-through */ 3383af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_2D: 3393af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_2D; 340776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 341776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul case TGSI_TEXTURE_SHADOWRECT: 342776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul /* fall-through */ 3433af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_RECT: 3443af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_2D; 345776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3463af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_3D: 3473af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_VOLUME; 348776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3493af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TEXTURE_CUBE: 3503af1f3b9220733f5e3a76fe38fbc397974678234Brian return D0_SAMPLE_TYPE_CUBE; 351776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3523af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 3533af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_program_error(p, "TexSrc type"); 3543af1f3b9220733f5e3a76fe38fbc397974678234Brian return 0; 3553af1f3b9220733f5e3a76fe38fbc397974678234Brian } 3563af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3573af1f3b9220733f5e3a76fe38fbc397974678234Brian 3583af1f3b9220733f5e3a76fe38fbc397974678234Brian 3593af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 3603af1f3b9220733f5e3a76fe38fbc397974678234Brian * Generate texel lookup instruction. 3613af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 3623af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void 3633af1f3b9220733f5e3a76fe38fbc397974678234Brianemit_tex(struct i915_fp_compile *p, 3643af1f3b9220733f5e3a76fe38fbc397974678234Brian const struct tgsi_full_instruction *inst, 365abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint opcode, 366abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 3673af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3687d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell uint texture = inst->Texture.Texture; 36991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell uint unit = inst->Src[1].Register.Index; 3703af1f3b9220733f5e3a76fe38fbc397974678234Brian uint tex = translate_tex_src_target( p, texture ); 3713af1f3b9220733f5e3a76fe38fbc397974678234Brian uint sampler = i915_emit_decl(p, REG_TYPE_S, unit, tex); 372abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint coord = src_vector( p, &inst->Src[0], fs); 3733af1f3b9220733f5e3a76fe38fbc397974678234Brian 3743af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_texld( p, 3757d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector( p, &inst->Dst[0] ), 3763af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags( inst ), 3773af1f3b9220733f5e3a76fe38fbc397974678234Brian sampler, 3783af1f3b9220733f5e3a76fe38fbc397974678234Brian coord, 3793af1f3b9220733f5e3a76fe38fbc397974678234Brian opcode); 3803af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3813af1f3b9220733f5e3a76fe38fbc397974678234Brian 3823af1f3b9220733f5e3a76fe38fbc397974678234Brian 3833af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 3843af1f3b9220733f5e3a76fe38fbc397974678234Brian * Generate a simple arithmetic instruction 3853af1f3b9220733f5e3a76fe38fbc397974678234Brian * \param opcode the i915 opcode 3863af1f3b9220733f5e3a76fe38fbc397974678234Brian * \param numArgs the number of input/src arguments 3873af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 3883af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void 3893af1f3b9220733f5e3a76fe38fbc397974678234Brianemit_simple_arith(struct i915_fp_compile *p, 3903af1f3b9220733f5e3a76fe38fbc397974678234Brian const struct tgsi_full_instruction *inst, 391abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint opcode, uint numArgs, 392abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 3933af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3943af1f3b9220733f5e3a76fe38fbc397974678234Brian uint arg1, arg2, arg3; 3953af1f3b9220733f5e3a76fe38fbc397974678234Brian 3963af1f3b9220733f5e3a76fe38fbc397974678234Brian assert(numArgs <= 3); 3973af1f3b9220733f5e3a76fe38fbc397974678234Brian 398abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin arg1 = (numArgs < 1) ? 0 : src_vector( p, &inst->Src[0], fs ); 399abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin arg2 = (numArgs < 2) ? 0 : src_vector( p, &inst->Src[1], fs ); 400abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin arg3 = (numArgs < 3) ? 0 : src_vector( p, &inst->Src[2], fs ); 4013af1f3b9220733f5e3a76fe38fbc397974678234Brian 4023af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith( p, 4033af1f3b9220733f5e3a76fe38fbc397974678234Brian opcode, 4047d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector( p, &inst->Dst[0]), 4053af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags( inst ), 0, 4063af1f3b9220733f5e3a76fe38fbc397974678234Brian arg1, 4073af1f3b9220733f5e3a76fe38fbc397974678234Brian arg2, 4083af1f3b9220733f5e3a76fe38fbc397974678234Brian arg3 ); 4093af1f3b9220733f5e3a76fe38fbc397974678234Brian} 4103af1f3b9220733f5e3a76fe38fbc397974678234Brian 41120839b37ed61b044d6224c0e373ce10d74be4f3dBrian 41220839b37ed61b044d6224c0e373ce10d74be4f3dBrian/** As above, but swap the first two src regs */ 41320839b37ed61b044d6224c0e373ce10d74be4f3dBrianstatic void 41420839b37ed61b044d6224c0e373ce10d74be4f3dBrianemit_simple_arith_swap2(struct i915_fp_compile *p, 41520839b37ed61b044d6224c0e373ce10d74be4f3dBrian const struct tgsi_full_instruction *inst, 416abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin uint opcode, uint numArgs, 417abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader* fs) 41820839b37ed61b044d6224c0e373ce10d74be4f3dBrian{ 41920839b37ed61b044d6224c0e373ce10d74be4f3dBrian struct tgsi_full_instruction inst2; 42020839b37ed61b044d6224c0e373ce10d74be4f3dBrian 42120839b37ed61b044d6224c0e373ce10d74be4f3dBrian assert(numArgs == 2); 42220839b37ed61b044d6224c0e373ce10d74be4f3dBrian 42320839b37ed61b044d6224c0e373ce10d74be4f3dBrian /* transpose first two registers */ 42420839b37ed61b044d6224c0e373ce10d74be4f3dBrian inst2 = *inst; 4257d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell inst2.Src[0] = inst->Src[1]; 4267d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell inst2.Src[1] = inst->Src[0]; 42720839b37ed61b044d6224c0e373ce10d74be4f3dBrian 428abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, &inst2, opcode, numArgs, fs); 42920839b37ed61b044d6224c0e373ce10d74be4f3dBrian} 43020839b37ed61b044d6224c0e373ce10d74be4f3dBrian 43120839b37ed61b044d6224c0e373ce10d74be4f3dBrian 4320e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal#ifndef M_PI 4330e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal#define M_PI 3.14159265358979323846 4340e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal#endif 4353af1f3b9220733f5e3a76fe38fbc397974678234Brian 4360d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/* 4370d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Translate TGSI instruction to i915 instruction. 4380d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * 4390d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Possible concerns: 4400d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * 4410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * SIN, COS -- could use another taylor step? 4420d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * LIT -- results seem a little different to sw mesa 4430d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * LOG -- different to mesa on negative numbers, but this is conformant. 4440d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 4453af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void 4463af1f3b9220733f5e3a76fe38fbc397974678234Briani915_translate_instruction(struct i915_fp_compile *p, 447abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin const struct tgsi_full_instruction *inst, 448abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader *fs) 4493af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 4503af1f3b9220733f5e3a76fe38fbc397974678234Brian uint writemask; 4513af1f3b9220733f5e3a76fe38fbc397974678234Brian uint src0, src1, src2, flags; 4523af1f3b9220733f5e3a76fe38fbc397974678234Brian uint tmp = 0; 4533af1f3b9220733f5e3a76fe38fbc397974678234Brian 4543af1f3b9220733f5e3a76fe38fbc397974678234Brian switch (inst->Instruction.Opcode) { 4553af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_ABS: 456abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 4573af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 4583af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MAX, 4597d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 4603af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 4613af1f3b9220733f5e3a76fe38fbc397974678234Brian src0, negate(src0, 1, 1, 1, 1), 0); 4623af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 4633af1f3b9220733f5e3a76fe38fbc397974678234Brian 4643af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_ADD: 465abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_ADD, 2, fs); 4663af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 4673af1f3b9220733f5e3a76fe38fbc397974678234Brian 4683af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_CMP: 469abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 470abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 471abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src2 = src_vector(p, &inst->Src[2], fs); 4723af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_CMP, 4737d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 4743af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 4753af1f3b9220733f5e3a76fe38fbc397974678234Brian 0, src0, src2, src1); /* NOTE: order of src2, src1 */ 4763af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 4773af1f3b9220733f5e3a76fe38fbc397974678234Brian 4783af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_COS: 479abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 4803af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 4813af1f3b9220733f5e3a76fe38fbc397974678234Brian 4823af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 4833af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 4843af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 4850e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal src0, i915_emit_const1f(p, 1.0f / (float) (M_PI * 2.0)), 0); 4863af1f3b9220733f5e3a76fe38fbc397974678234Brian 4873af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MOD, tmp, A0_DEST_CHANNEL_X, 0, tmp, 0, 0); 4883af1f3b9220733f5e3a76fe38fbc397974678234Brian 4893af1f3b9220733f5e3a76fe38fbc397974678234Brian /* By choosing different taylor constants, could get rid of this mul: 4903af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 4913af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 4923af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 4933af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 4940e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal tmp, i915_emit_const1f(p, (float) (M_PI * 2.0)), 0); 4953af1f3b9220733f5e3a76fe38fbc397974678234Brian 4963af1f3b9220733f5e3a76fe38fbc397974678234Brian /* 4973af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 4983af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, 1 4993af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xxz1 t0.z111 ; x^6 x^4 x^2 1 5003af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = DP4 t0, cos_constants 5013af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 5023af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5033af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5043af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XY, 0, 5053af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 5063af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, ONE, ONE, ONE), 0); 5073af1f3b9220733f5e3a76fe38fbc397974678234Brian 5083af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5093af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5103af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XYZ, 0, 5113af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, X, ONE), 5123af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 0); 5133af1f3b9220733f5e3a76fe38fbc397974678234Brian 5143af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5153af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5163af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XYZ, 0, 5173af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, Z, ONE), 5183af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Z, ONE, ONE, ONE), 0); 5193af1f3b9220733f5e3a76fe38fbc397974678234Brian 5203af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5213af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 5227d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5233af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 5243af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, Z, Y, X), 5253af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_const4fv(p, cos_constants), 0); 5263af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5273af1f3b9220733f5e3a76fe38fbc397974678234Brian 528811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin case TGSI_OPCODE_DDX: 529811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin case TGSI_OPCODE_DDY: 530811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin /* XXX We just output 0 here */ 531811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin debug_printf("Punting DDX/DDX\n"); 532811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin src0 = get_result_vector(p, &inst->Dst[0]); 533811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin i915_emit_arith(p, 534811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin A0_MOV, 535811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 536811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin get_result_flags(inst), 0, 537811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin swizzle(src0, ZERO, ZERO, ZERO, ZERO), 0, 0); 538811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin break; 539811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin 5402292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_DP2: 541abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 542abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 5432292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 5442292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 5452292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DP3, 5462292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 5472292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_flags(inst), 0, 5482292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin swizzle(src0, X, Y, ZERO, ZERO), src1, 0); 5492292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 5502292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 5513af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DP3: 552abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_DP3, 2, fs); 5533af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5543af1f3b9220733f5e3a76fe38fbc397974678234Brian 5553af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DP4: 556abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_DP4, 2, fs); 5573af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5583af1f3b9220733f5e3a76fe38fbc397974678234Brian 5593af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DPH: 560abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 561abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 5623af1f3b9220733f5e3a76fe38fbc397974678234Brian 5633af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5643af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 5657d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5663af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 5673af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, Y, Z, ONE), src1, 0); 5683af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5693af1f3b9220733f5e3a76fe38fbc397974678234Brian 5703af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_DST: 571abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 572abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 5733af1f3b9220733f5e3a76fe38fbc397974678234Brian 5743af1f3b9220733f5e3a76fe38fbc397974678234Brian /* result[0] = 1 * 1; 5753af1f3b9220733f5e3a76fe38fbc397974678234Brian * result[1] = a[1] * b[1]; 5763af1f3b9220733f5e3a76fe38fbc397974678234Brian * result[2] = a[2] * 1; 5773af1f3b9220733f5e3a76fe38fbc397974678234Brian * result[3] = 1 * b[3]; 5783af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 5793af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5803af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 5817d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5823af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 5833af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, ONE, Y, Z, ONE), 5843af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src1, ONE, Y, ONE, W), 0); 5853af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5863af1f3b9220733f5e3a76fe38fbc397974678234Brian 5875e49ec339df1d23b1f1790c49c9f102098f42c0dBrian case TGSI_OPCODE_END: 5885e49ec339df1d23b1f1790c49c9f102098f42c0dBrian /* no-op */ 5895e49ec339df1d23b1f1790c49c9f102098f42c0dBrian break; 5905e49ec339df1d23b1f1790c49c9f102098f42c0dBrian 5913af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_EX2: 592abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 5933af1f3b9220733f5e3a76fe38fbc397974678234Brian 5943af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 5953af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_EXP, 5967d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 5973af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 5983af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 5993af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6003af1f3b9220733f5e3a76fe38fbc397974678234Brian 6013af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_FLR: 602abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_FLR, 1, fs); 6033af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6043af1f3b9220733f5e3a76fe38fbc397974678234Brian 6053af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_FRC: 606abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_FRC, 1, fs); 6073af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6083af1f3b9220733f5e3a76fe38fbc397974678234Brian 6093af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_KIL: 61041b3fcbf0404bc4a4f6588c0feef553bb65d4440Brian /* kill if src[0].x < 0 || src[0].y < 0 ... */ 611abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 6123af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 6133af1f3b9220733f5e3a76fe38fbc397974678234Brian 6140235b3252100eda553babea42c014445358a2985Brian i915_emit_texld(p, 6150235b3252100eda553babea42c014445358a2985Brian tmp, /* dest reg: a dummy reg */ 6160235b3252100eda553babea42c014445358a2985Brian A0_DEST_CHANNEL_ALL, /* dest writemask */ 6170235b3252100eda553babea42c014445358a2985Brian 0, /* sampler */ 6180235b3252100eda553babea42c014445358a2985Brian src0, /* coord*/ 6190235b3252100eda553babea42c014445358a2985Brian T0_TEXKILL); /* opcode */ 6203af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6213af1f3b9220733f5e3a76fe38fbc397974678234Brian 622db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol case TGSI_OPCODE_KILP: 623db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol assert(0); /* not tested yet */ 624db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol break; 625db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol 6263af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_LG2: 627abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 6283af1f3b9220733f5e3a76fe38fbc397974678234Brian 6293af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 6303af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_LOG, 6317d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6323af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 6333af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 6343af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6353af1f3b9220733f5e3a76fe38fbc397974678234Brian 6363af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_LIT: 637abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 6383af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 6393af1f3b9220733f5e3a76fe38fbc397974678234Brian 6403af1f3b9220733f5e3a76fe38fbc397974678234Brian /* tmp = max( a.xyzw, a.00zw ) 6413af1f3b9220733f5e3a76fe38fbc397974678234Brian * XXX: Clamp tmp.w to -128..128 6423af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp.y = log(tmp.y) 6433af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp.y = tmp.w * tmp.y 6443af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp.y = exp(tmp.y) 6453af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = cmp (a.11-x1, a.1x01, a.1xy1 ) 6463af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 6473af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MAX, tmp, A0_DEST_CHANNEL_ALL, 0, 6483af1f3b9220733f5e3a76fe38fbc397974678234Brian src0, swizzle(src0, ZERO, ZERO, Z, W), 0); 6493af1f3b9220733f5e3a76fe38fbc397974678234Brian 6503af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_LOG, tmp, A0_DEST_CHANNEL_Y, 0, 6513af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Y, Y, Y, Y), 0, 0); 6523af1f3b9220733f5e3a76fe38fbc397974678234Brian 6533af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MUL, tmp, A0_DEST_CHANNEL_Y, 0, 6543af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ZERO, Y, ZERO, ZERO), 6553af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ZERO, W, ZERO, ZERO), 0); 6563af1f3b9220733f5e3a76fe38fbc397974678234Brian 6573af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_EXP, tmp, A0_DEST_CHANNEL_Y, 0, 6583af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Y, Y, Y, Y), 0, 0); 6593af1f3b9220733f5e3a76fe38fbc397974678234Brian 6603af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_CMP, 6617d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6623af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 6633af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(swizzle(tmp, ONE, ONE, X, ONE), 0, 0, 1, 0), 6643af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, X, ZERO, ONE), 6653af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, X, Y, ONE)); 6663af1f3b9220733f5e3a76fe38fbc397974678234Brian 6673af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6683af1f3b9220733f5e3a76fe38fbc397974678234Brian 6693af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_LRP: 670abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 671abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 672abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src2 = src_vector(p, &inst->Src[2], fs); 6733af1f3b9220733f5e3a76fe38fbc397974678234Brian flags = get_result_flags(inst); 6743af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 6753af1f3b9220733f5e3a76fe38fbc397974678234Brian 6763af1f3b9220733f5e3a76fe38fbc397974678234Brian /* b*a + c*(1-a) 6773af1f3b9220733f5e3a76fe38fbc397974678234Brian * 6783af1f3b9220733f5e3a76fe38fbc397974678234Brian * b*a + c - ca 6793af1f3b9220733f5e3a76fe38fbc397974678234Brian * 6803af1f3b9220733f5e3a76fe38fbc397974678234Brian * tmp = b*a + c, 6813af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = (-c)*a + tmp 6823af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 6833af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MAD, tmp, 6843af1f3b9220733f5e3a76fe38fbc397974678234Brian flags & A0_DEST_CHANNEL_ALL, 0, src1, src0, src2); 6853af1f3b9220733f5e3a76fe38fbc397974678234Brian 6863af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MAD, 6877d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 6883af1f3b9220733f5e3a76fe38fbc397974678234Brian flags, 0, negate(src2, 1, 1, 1, 1), src0, tmp); 6893af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6903af1f3b9220733f5e3a76fe38fbc397974678234Brian 6913af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MAD: 692abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MAD, 3, fs); 6933af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6943af1f3b9220733f5e3a76fe38fbc397974678234Brian 6953af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MAX: 696abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MAX, 2, fs); 6973af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 6983af1f3b9220733f5e3a76fe38fbc397974678234Brian 6993af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MIN: 700abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 701abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 7023af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 7033af1f3b9220733f5e3a76fe38fbc397974678234Brian flags = get_result_flags(inst); 7043af1f3b9220733f5e3a76fe38fbc397974678234Brian 7053af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7063af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MAX, 7073af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, flags & A0_DEST_CHANNEL_ALL, 0, 7083af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(src0, 1, 1, 1, 1), 7093af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(src1, 1, 1, 1, 1), 0); 7103af1f3b9220733f5e3a76fe38fbc397974678234Brian 7113af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7123af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MOV, 7137d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7143af1f3b9220733f5e3a76fe38fbc397974678234Brian flags, 0, negate(tmp, 1, 1, 1, 1), 0, 0); 7153af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7163af1f3b9220733f5e3a76fe38fbc397974678234Brian 7173af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MOV: 718abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MOV, 1, fs); 7193af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7203af1f3b9220733f5e3a76fe38fbc397974678234Brian 7213af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_MUL: 722abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_MUL, 2, fs); 7233af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7243af1f3b9220733f5e3a76fe38fbc397974678234Brian 7253af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_POW: 726abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 727abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 7283af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 7293af1f3b9220733f5e3a76fe38fbc397974678234Brian flags = get_result_flags(inst); 7303af1f3b9220733f5e3a76fe38fbc397974678234Brian 7313af1f3b9220733f5e3a76fe38fbc397974678234Brian /* XXX: masking on intermediate values, here and elsewhere. 7323af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 7333af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7343af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_LOG, 7353af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 7363af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 7373af1f3b9220733f5e3a76fe38fbc397974678234Brian 7383af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MUL, tmp, A0_DEST_CHANNEL_X, 0, tmp, src1, 0); 7393af1f3b9220733f5e3a76fe38fbc397974678234Brian 7403af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7413af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_EXP, 7427d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7433af1f3b9220733f5e3a76fe38fbc397974678234Brian flags, 0, swizzle(tmp, X, X, X, X), 0, 0); 7443af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7453af1f3b9220733f5e3a76fe38fbc397974678234Brian 74644e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca case TGSI_OPCODE_RET: 74744e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca /* XXX: no-op? */ 74844e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca break; 74944e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca 7503af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_RCP: 751abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 7523af1f3b9220733f5e3a76fe38fbc397974678234Brian 7533af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7543af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_RCP, 7557d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7562292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_flags(inst), 0, 7573af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 7583af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7593af1f3b9220733f5e3a76fe38fbc397974678234Brian 7603af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_RSQ: 761abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 7623af1f3b9220733f5e3a76fe38fbc397974678234Brian 7633af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7643af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_RSQ, 7657d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 7663af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 7673af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, X, X), 0, 0); 7683af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 7693af1f3b9220733f5e3a76fe38fbc397974678234Brian 7703af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SCS: 771abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 7723af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 7733af1f3b9220733f5e3a76fe38fbc397974678234Brian 7743af1f3b9220733f5e3a76fe38fbc397974678234Brian /* 7753af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 7763af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, x 7773af1f3b9220733f5e3a76fe38fbc397974678234Brian * t1 = MUL t0.xyyw t0.yz11 ; x^7 x^5 x^3 x 7783af1f3b9220733f5e3a76fe38fbc397974678234Brian * scs.x = DP4 t1, sin_constants 7793af1f3b9220733f5e3a76fe38fbc397974678234Brian * t1 = MUL t0.xxz1 t0.z111 ; x^6 x^4 x^2 1 7803af1f3b9220733f5e3a76fe38fbc397974678234Brian * scs.y = DP4 t1, cos_constants 7813af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 7823af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7833af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 7843af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XY, 0, 7853af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, X, ONE, ONE), 7863af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, X, ONE, ONE, ONE), 0); 7873af1f3b9220733f5e3a76fe38fbc397974678234Brian 7883af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 7893af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 7903af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 7913af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, X, Y), 7923af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 0); 7933af1f3b9220733f5e3a76fe38fbc397974678234Brian 7945b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell writemask = inst->Dst[0].Register.WriteMask; 7953af1f3b9220733f5e3a76fe38fbc397974678234Brian 7963af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writemask & TGSI_WRITEMASK_Y) { 7973af1f3b9220733f5e3a76fe38fbc397974678234Brian uint tmp1; 7983af1f3b9220733f5e3a76fe38fbc397974678234Brian 7993af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writemask & TGSI_WRITEMASK_X) 8003af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp1 = i915_get_utemp(p); 8013af1f3b9220733f5e3a76fe38fbc397974678234Brian else 8023af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp1 = tmp; 8033af1f3b9220733f5e3a76fe38fbc397974678234Brian 8043af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8053af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8063af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp1, A0_DEST_CHANNEL_ALL, 0, 8073af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, Y, W), 8083af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Z, ONE, ONE), 0); 8093af1f3b9220733f5e3a76fe38fbc397974678234Brian 8103af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8113af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 8127d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 8133af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DEST_CHANNEL_Y, 0, 8143af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp1, W, Z, Y, X), 8153af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_const4fv(p, sin_constants), 0); 8163af1f3b9220733f5e3a76fe38fbc397974678234Brian } 8173af1f3b9220733f5e3a76fe38fbc397974678234Brian 8183af1f3b9220733f5e3a76fe38fbc397974678234Brian if (writemask & TGSI_WRITEMASK_X) { 8193af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8203af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8213af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XYZ, 0, 8223af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, Z, ONE), 8233af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, Z, ONE, ONE, ONE), 0); 8243af1f3b9220733f5e3a76fe38fbc397974678234Brian 8253af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8263af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 8277d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 8283af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DEST_CHANNEL_X, 0, 8293af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, ONE, Z, Y, X), 8303af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_const4fv(p, cos_constants), 0); 8313af1f3b9220733f5e3a76fe38fbc397974678234Brian } 8323af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 8333af1f3b9220733f5e3a76fe38fbc397974678234Brian 8342292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SEQ: 8352292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* if we're both >= and <= then we're == */ 836abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 837abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 8382292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp = i915_get_utemp(p); 8392292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 8402292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 8412292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SGE, 8422292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, A0_DEST_CHANNEL_ALL, 0, 8432292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 8442292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src1, 0); 8452292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 8462292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 8472292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SGE, 8482292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 8492292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 8502292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src1, 8512292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 0); 8522292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 8532292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 8542292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_MUL, 8552292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 8562292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 8572292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 8582292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, 0); 8592292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 8603af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 8613af1f3b9220733f5e3a76fe38fbc397974678234Brian 8622292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SGE: 863abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_SGE, 2, fs); 86420839b37ed61b044d6224c0e373ce10d74be4f3dBrian break; 86520839b37ed61b044d6224c0e373ce10d74be4f3dBrian 8663af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SIN: 867abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 8683af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 8693af1f3b9220733f5e3a76fe38fbc397974678234Brian 8703af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8713af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8723af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 8730e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal src0, i915_emit_const1f(p, 1.0f / (float) (M_PI * 2.0)), 0); 8743af1f3b9220733f5e3a76fe38fbc397974678234Brian 8753af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, A0_MOD, tmp, A0_DEST_CHANNEL_X, 0, tmp, 0, 0); 8763af1f3b9220733f5e3a76fe38fbc397974678234Brian 8773af1f3b9220733f5e3a76fe38fbc397974678234Brian /* By choosing different taylor constants, could get rid of this mul: 8783af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 8793af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8803af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8813af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_X, 0, 8820e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal tmp, i915_emit_const1f(p, (float) (M_PI * 2.0)), 0); 8833af1f3b9220733f5e3a76fe38fbc397974678234Brian 8843af1f3b9220733f5e3a76fe38fbc397974678234Brian /* 8853af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 8863af1f3b9220733f5e3a76fe38fbc397974678234Brian * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, x 8873af1f3b9220733f5e3a76fe38fbc397974678234Brian * t1 = MUL t0.xyyw t0.yz11 ; x^7 x^5 x^3 x 8883af1f3b9220733f5e3a76fe38fbc397974678234Brian * result = DP4 t1.wzyx, sin_constants 8893af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 8903af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8913af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8923af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_XY, 0, 8933af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 8943af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, ONE, ONE, ONE), 0); 8953af1f3b9220733f5e3a76fe38fbc397974678234Brian 8963af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 8973af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 8983af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 8993af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, X, Y), 9003af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, X, ONE, ONE), 0); 9013af1f3b9220733f5e3a76fe38fbc397974678234Brian 9023af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9033af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 9043af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 9053af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Y, Y, W), 9063af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, X, Z, ONE, ONE), 0); 9073af1f3b9220733f5e3a76fe38fbc397974678234Brian 9083af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9093af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_DP4, 9107d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 9113af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 9123af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(tmp, W, Z, Y, X), 9133af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_const4fv(p, sin_constants), 0); 9143af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9153af1f3b9220733f5e3a76fe38fbc397974678234Brian 9162292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SLE: 9172292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* like SGE, but swap reg0, reg1 */ 918abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith_swap2(p, inst, A0_SGE, 2, fs); 9192292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 9202292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9213af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SLT: 922abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_SLT, 2, fs); 9233af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9243af1f3b9220733f5e3a76fe38fbc397974678234Brian 92520839b37ed61b044d6224c0e373ce10d74be4f3dBrian case TGSI_OPCODE_SGT: 92620839b37ed61b044d6224c0e373ce10d74be4f3dBrian /* like SLT, but swap reg0, reg1 */ 927abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith_swap2(p, inst, A0_SLT, 2, fs); 92820839b37ed61b044d6224c0e373ce10d74be4f3dBrian break; 92920839b37ed61b044d6224c0e373ce10d74be4f3dBrian 9302292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SNE: 931468c2c08414f0ad07e2c2c2a98506f6390124963Stéphane Marchesin /* if we're < or > then we're != */ 932abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 933abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 9340f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin tmp = i915_get_utemp(p); 9350f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9360f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin i915_emit_arith(p, 9372292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 9382292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, 9392292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9400f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src0, 9410f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src1, 0); 9420f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9430f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin i915_emit_arith(p, 9442292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 9450f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9460f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9470f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src1, 9480f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin src0, 0); 9490f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9500f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin i915_emit_arith(p, 9512292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_ADD, 9520f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9530f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9540f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9550f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin tmp, 0); 9562292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 9570f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9582292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_SSG: 9592292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* compute (src>0) - (src<0) */ 960abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 9612292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp = i915_get_utemp(p); 9622292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9632292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 9642292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 9652292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin tmp, 9662292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9672292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 9682292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin swizzle(src0, ZERO, ZERO, ZERO, ZERO), 0); 9692292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9702292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 9712292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_SLT, 9722292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9732292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9742292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin swizzle(src0, ZERO, ZERO, ZERO, ZERO), 9752292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin src0, 0); 9762292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9772292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin i915_emit_arith(p, 9782292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_ADD, 9792292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9802292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin A0_DEST_CHANNEL_ALL, 0, 9812292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin get_result_vector(p, &inst->Dst[0]), 9822292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin negate(tmp, 1, 1, 1, 1), 0); 9830f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin break; 9840f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 9853af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_SUB: 986abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 987abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 9883af1f3b9220733f5e3a76fe38fbc397974678234Brian 9893af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 9903af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_ADD, 9917d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 9923af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 9933af1f3b9220733f5e3a76fe38fbc397974678234Brian src0, negate(src1, 1, 1, 1, 1), 0); 9943af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9953af1f3b9220733f5e3a76fe38fbc397974678234Brian 9963af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_TEX: 997abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_tex(p, inst, T0_TEXLD, fs); 9983af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 9993af1f3b9220733f5e3a76fe38fbc397974678234Brian 10002292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin case TGSI_OPCODE_TRUNC: 1001abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_simple_arith(p, inst, A0_TRC, 1, fs); 10022292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin break; 10032292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10043af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_TXB: 1005abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_tex(p, inst, T0_TEXLDB, fs); 10063af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 10073af1f3b9220733f5e3a76fe38fbc397974678234Brian 1008ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol case TGSI_OPCODE_TXP: 1009abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin emit_tex(p, inst, T0_TEXLDP, fs); 1010ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol break; 1011ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol 10123af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_OPCODE_XPD: 10133af1f3b9220733f5e3a76fe38fbc397974678234Brian /* Cross product: 10143af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.x = src0.y * src1.z - src0.z * src1.y; 10153af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.y = src0.z * src1.x - src0.x * src1.z; 10163af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.z = src0.x * src1.y - src0.y * src1.x; 10173af1f3b9220733f5e3a76fe38fbc397974678234Brian * result.w = undef; 10183af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 1019abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src0 = src_vector(p, &inst->Src[0], fs); 1020abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin src1 = src_vector(p, &inst->Src[1], fs); 10213af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp = i915_get_utemp(p); 10223af1f3b9220733f5e3a76fe38fbc397974678234Brian 10233af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 10243af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MUL, 10253af1f3b9220733f5e3a76fe38fbc397974678234Brian tmp, A0_DEST_CHANNEL_ALL, 0, 10263af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, Z, X, Y, ONE), 10273af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src1, Y, Z, X, ONE), 0); 10283af1f3b9220733f5e3a76fe38fbc397974678234Brian 10293af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 10303af1f3b9220733f5e3a76fe38fbc397974678234Brian A0_MAD, 10317d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell get_result_vector(p, &inst->Dst[0]), 10323af1f3b9220733f5e3a76fe38fbc397974678234Brian get_result_flags(inst), 0, 10333af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src0, Y, Z, X, ONE), 10343af1f3b9220733f5e3a76fe38fbc397974678234Brian swizzle(src1, Z, X, Y, ONE), 10353af1f3b9220733f5e3a76fe38fbc397974678234Brian negate(tmp, 1, 1, 1, 0)); 10363af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 10373af1f3b9220733f5e3a76fe38fbc397974678234Brian 10383af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 1039af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca i915_program_error(p, "bad opcode %d", inst->Instruction.Opcode); 104020839b37ed61b044d6224c0e373ce10d74be4f3dBrian p->error = 1; 10413af1f3b9220733f5e3a76fe38fbc397974678234Brian return; 10423af1f3b9220733f5e3a76fe38fbc397974678234Brian } 10433af1f3b9220733f5e3a76fe38fbc397974678234Brian 10443af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_release_utemps(p); 10453af1f3b9220733f5e3a76fe38fbc397974678234Brian} 10463af1f3b9220733f5e3a76fe38fbc397974678234Brian 10473af1f3b9220733f5e3a76fe38fbc397974678234Brian 10483af1f3b9220733f5e3a76fe38fbc397974678234Brian/** 10493af1f3b9220733f5e3a76fe38fbc397974678234Brian * Translate TGSI fragment shader into i915 hardware instructions. 10500d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * \param p the translation state 10510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * \param tokens the TGSI token array 10523af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 10530d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 10540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Briani915_translate_instructions(struct i915_fp_compile *p, 1055abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin const struct tgsi_token *tokens, 1056abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin struct i915_fragment_shader *fs) 10573af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 1058c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs = p->shader; 10593af1f3b9220733f5e3a76fe38fbc397974678234Brian struct tgsi_parse_context parse; 10603af1f3b9220733f5e3a76fe38fbc397974678234Brian 10613af1f3b9220733f5e3a76fe38fbc397974678234Brian tgsi_parse_init( &parse, tokens ); 10623af1f3b9220733f5e3a76fe38fbc397974678234Brian 10633af1f3b9220733f5e3a76fe38fbc397974678234Brian while( !tgsi_parse_end_of_tokens( &parse ) ) { 10643af1f3b9220733f5e3a76fe38fbc397974678234Brian 10653af1f3b9220733f5e3a76fe38fbc397974678234Brian tgsi_parse_token( &parse ); 10663af1f3b9220733f5e3a76fe38fbc397974678234Brian 10673af1f3b9220733f5e3a76fe38fbc397974678234Brian switch( parse.FullToken.Token.Type ) { 1068b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz case TGSI_TOKEN_TYPE_PROPERTY: 1069b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz /* 1070b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz * We only support one cbuf, but we still need to ignore the property 1071b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz * correctly so we don't hit the assert at the end of the switch case. 1072b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz */ 1073b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz assert(parse.FullToken.FullProperty.Property.PropertyName == 1074b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS); 1075b7a73c72a68dc102ef8522eda8eadf583fd420a5Jakob Bornecrantz break; 10763af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TOKEN_TYPE_DECLARATION: 107737cf13ed9a429c755f121daa1776b1b30a985ab3Brian if (parse.FullToken.FullDeclaration.Declaration.File 1078c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian == TGSI_FILE_CONSTANT) { 1079c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian uint i; 1080fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell for (i = parse.FullToken.FullDeclaration.Range.First; 1081fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell i <= parse.FullToken.FullDeclaration.Range.Last; 1082c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian i++) { 1083c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian assert(ifs->constant_flags[i] == 0x0); 1084c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->constant_flags[i] = I915_CONSTFLAG_USER; 1085c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->num_constants = MAX2(ifs->num_constants, i + 1); 1086c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1087c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 10880235b3252100eda553babea42c014445358a2985Brian else if (parse.FullToken.FullDeclaration.Declaration.File 10890235b3252100eda553babea42c014445358a2985Brian == TGSI_FILE_TEMPORARY) { 10900235b3252100eda553babea42c014445358a2985Brian uint i; 1091fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell for (i = parse.FullToken.FullDeclaration.Range.First; 1092fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell i <= parse.FullToken.FullDeclaration.Range.Last; 10930235b3252100eda553babea42c014445358a2985Brian i++) { 10940235b3252100eda553babea42c014445358a2985Brian assert(i < I915_MAX_TEMPORARY); 10954901410293b35ac6bb4759142b50fcc0be8a1b25Brian /* XXX just use shader->info->file_mask[TGSI_FILE_TEMPORARY] */ 10960235b3252100eda553babea42c014445358a2985Brian p->temp_flag |= (1 << i); /* mark temp as used */ 10970235b3252100eda553babea42c014445358a2985Brian } 10980235b3252100eda553babea42c014445358a2985Brian } 10993af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 11003af1f3b9220733f5e3a76fe38fbc397974678234Brian 11013af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TOKEN_TYPE_IMMEDIATE: 1102c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian { 1103c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian const struct tgsi_full_immediate *imm 1104c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian = &parse.FullToken.FullImmediate; 1105c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian const uint pos = p->num_immediates++; 1106c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian uint j; 1107fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell assert( imm->Immediate.NrTokens <= 4 + 1 ); 11080020e1d10870e0d24c62e3060a7efb9a6472666dMichal Krol for (j = 0; j < imm->Immediate.NrTokens - 1; j++) { 1109fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell p->immediates[pos][j] = imm->u[j].Float; 1110c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1111c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 11123af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 11133af1f3b9220733f5e3a76fe38fbc397974678234Brian 11143af1f3b9220733f5e3a76fe38fbc397974678234Brian case TGSI_TOKEN_TYPE_INSTRUCTION: 1115c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian if (p->first_instruction) { 1116c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /* resolve location of immediates */ 1117c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian uint i, j; 1118c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian for (i = 0; i < p->num_immediates; i++) { 1119c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /* find constant slot for this immediate */ 1120c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian for (j = 0; j < I915_MAX_CONSTANT; j++) { 1121c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian if (ifs->constant_flags[j] == 0x0) { 1122c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memcpy(ifs->constants[j], 1123c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->immediates[i], 1124c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 4 * sizeof(float)); 1125c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /*printf("immediate %d maps to const %d\n", i, j);*/ 1126c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->constant_flags[j] = 0xf; /* all four comps used */ 1127c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->immediates_map[i] = j; 1128c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->num_constants = MAX2(ifs->num_constants, j + 1); 1129c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian break; 1130c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1131c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1132c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1133c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 1134c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->first_instruction = FALSE; 1135c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1136c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 1137abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin i915_translate_instruction(p, &parse.FullToken.FullInstruction, fs); 11383af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 11393af1f3b9220733f5e3a76fe38fbc397974678234Brian 11403af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 11413af1f3b9220733f5e3a76fe38fbc397974678234Brian assert( 0 ); 11423af1f3b9220733f5e3a76fe38fbc397974678234Brian } 11433af1f3b9220733f5e3a76fe38fbc397974678234Brian 11443af1f3b9220733f5e3a76fe38fbc397974678234Brian } /* while */ 11453af1f3b9220733f5e3a76fe38fbc397974678234Brian 11463af1f3b9220733f5e3a76fe38fbc397974678234Brian tgsi_parse_free (&parse); 11473af1f3b9220733f5e3a76fe38fbc397974678234Brian} 11483af1f3b9220733f5e3a76fe38fbc397974678234Brian 11493af1f3b9220733f5e3a76fe38fbc397974678234Brian 11500d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic struct i915_fp_compile * 11510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Briani915_init_compile(struct i915_context *i915, 1152c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs) 11530d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 11540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian struct i915_fp_compile *p = CALLOC_STRUCT(i915_fp_compile); 1155abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin int i; 11560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1157c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->shader = ifs; 11580d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1159c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /* Put new constants at end of const buffer, growing downward. 1160c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * The problem is we don't know how many user-defined constants might 1161c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * be specified with pipe->set_constant_buffer(). 1162c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * Should pre-scan the user's program to determine the highest-numbered 1163c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian * constant referenced. 1164c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian */ 1165c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->num_constants = 0; 1166c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memset(ifs->constant_flags, 0, sizeof(ifs->constant_flags)); 1167c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 1168abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin for (i = 0; i < I915_TEX_UNITS; i++) 1169abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin ifs->generic_mapping[i] = -1; 1170abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 1171c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian p->first_instruction = TRUE; 11720d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11730d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_tex_indirect = 1; /* correct? */ 11740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_tex_insn = 0; 11750d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_alu_insn = 0; 11760d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->nr_decl_insn = 0; 11770d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11780d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->csr = p->program; 11790d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->decl = p->declarations; 11800d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->decl_s = 0; 11810d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->decl_t = 0; 11820235b3252100eda553babea42c014445358a2985Brian p->temp_flag = ~0x0 << I915_MAX_TEMPORARY; 11830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->utemp_flag = ~0x7; 11840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* initialize the first program word */ 11860d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian *(p->decl++) = _3DSTATE_PIXEL_SHADER_PROGRAM; 11870d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11880d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian return p; 11890d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 11900d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 11915ac22877c98f4934cced4d42b9ec87245f266967Brian 11920d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/* Copy compile results to the fragment program struct and destroy the 11930d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * compilation context. 11940d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 11950d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 11960d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Briani915_fini_compile(struct i915_context *i915, struct i915_fp_compile *p) 11970d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 1198c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs = p->shader; 11995961732c1b59403b4e736fa354a64d4a0e5d8af2Michal unsigned long program_size = (unsigned long) (p->csr - p->program); 12005961732c1b59403b4e736fa354a64d4a0e5d8af2Michal unsigned long decl_size = (unsigned long) (p->decl - p->declarations); 12010d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12020d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_tex_indirect > I915_MAX_TEX_INDIRECT) 12030d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max nr indirect texture lookups"); 12040d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12050d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_tex_insn > I915_MAX_TEX_INSN) 12060d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max TEX instructions"); 12070d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12080d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_alu_insn > I915_MAX_ALU_INSN) 12090d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max ALU instructions"); 12100d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12110d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->nr_decl_insn > I915_MAX_DECL_INSN) 12120d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_program_error(p, "Exceeded max DECL instructions"); 12130d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12140d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (p->error) { 12150d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeInstructions = 0; 12160d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeAluInstructions = 0; 12170d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexInstructions = 0; 12180d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexIndirections = 0; 12190d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1220c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian i915_use_passthrough_shader(ifs); 12210d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12220d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian else { 12235ac22877c98f4934cced4d42b9ec87245f266967Brian p->NumNativeInstructions 12245ac22877c98f4934cced4d42b9ec87245f266967Brian = p->nr_alu_insn + p->nr_tex_insn + p->nr_decl_insn; 12250d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeAluInstructions = p->nr_alu_insn; 12260d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexInstructions = p->nr_tex_insn; 12270d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->NumNativeTexIndirections = p->nr_tex_indirect; 12280d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12290d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* patch in the program length */ 12300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian p->declarations[0] |= program_size + decl_size - 2; 12310d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12320d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* Copy compilation results to fragment program struct: 12330d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 1234c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian assert(!ifs->program); 1235c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->program 12365961732c1b59403b4e736fa354a64d4a0e5d8af2Michal = (uint *) MALLOC((program_size + decl_size) * sizeof(uint)); 1237c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian if (ifs->program) { 1238c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->program_len = program_size + decl_size; 12390d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1240c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memcpy(ifs->program, 12415ac22877c98f4934cced4d42b9ec87245f266967Brian p->declarations, 12425ac22877c98f4934cced4d42b9ec87245f266967Brian decl_size * sizeof(uint)); 12433af1f3b9220733f5e3a76fe38fbc397974678234Brian 1244c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian memcpy(ifs->program + decl_size, 12455ac22877c98f4934cced4d42b9ec87245f266967Brian p->program, 12465ac22877c98f4934cced4d42b9ec87245f266967Brian program_size * sizeof(uint)); 12475ac22877c98f4934cced4d42b9ec87245f266967Brian } 12480d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12490d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12500d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* Release the compilation struct: 12510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 12525961732c1b59403b4e736fa354a64d4a0e5d8af2Michal FREE(p); 12530d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 12540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12550d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12580d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12590d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/** 12600d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Rather than trying to intercept and jiggle depth writes during 12613af1f3b9220733f5e3a76fe38fbc397974678234Brian * emit, just move the value into its correct position at the end of 12623af1f3b9220733f5e3a76fe38fbc397974678234Brian * the program: 12633af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 12640d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianstatic void 12653af1f3b9220733f5e3a76fe38fbc397974678234Briani915_fixup_depth_write(struct i915_fp_compile *p) 12663af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 1267f69b5c56feb60791bad27d491ee9592238d4efb0Brian /* XXX assuming pos/depth is always in output[0] */ 12684901410293b35ac6bb4759142b50fcc0be8a1b25Brian if (p->shader->info.output_semantic_name[0] == TGSI_SEMANTIC_POSITION) { 126937cf13ed9a429c755f121daa1776b1b30a985ab3Brian const uint depth = UREG(REG_TYPE_OD, 0); 12703af1f3b9220733f5e3a76fe38fbc397974678234Brian 12713af1f3b9220733f5e3a76fe38fbc397974678234Brian i915_emit_arith(p, 127237cf13ed9a429c755f121daa1776b1b30a985ab3Brian A0_MOV, /* opcode */ 127337cf13ed9a429c755f121daa1776b1b30a985ab3Brian depth, /* dest reg */ 127437cf13ed9a429c755f121daa1776b1b30a985ab3Brian A0_DEST_CHANNEL_W, /* write mask */ 127537cf13ed9a429c755f121daa1776b1b30a985ab3Brian 0, /* saturate? */ 127637cf13ed9a429c755f121daa1776b1b30a985ab3Brian swizzle(depth, X, Y, Z, Z), /* src0 */ 127737cf13ed9a429c755f121daa1776b1b30a985ab3Brian 0, 0 /* src1, src2 */); 12783af1f3b9220733f5e3a76fe38fbc397974678234Brian } 12793af1f3b9220733f5e3a76fe38fbc397974678234Brian} 12803af1f3b9220733f5e3a76fe38fbc397974678234Brian 12813af1f3b9220733f5e3a76fe38fbc397974678234Brian 12820d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brianvoid 1283c74900ee5d80c7c2b7cbe4ed87395526a742a13eBriani915_translate_fragment_program( struct i915_context *i915, 1284c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *fs) 12850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 128698b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter struct i915_fp_compile *p; 1287c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian const struct tgsi_token *tokens = fs->state.tokens; 12883af1f3b9220733f5e3a76fe38fbc397974678234Brian 1289c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian#if 0 1290c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian tgsi_dump(tokens, 0); 1291c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian#endif 1292c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 129398b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter /* hw doesn't seem to like empty frag programs, even when the depth write 129498b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter * fixup gets emitted below - may that one is fishy, too? */ 12959f0acfe1384d3236ac30ffca4be96e9531d2e876Jakob Bornecrantz if (fs->info.num_instructions == 1) { 129698b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter i915_use_passthrough_shader(fs); 129798b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter 129898b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter return; 129998b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter } 130098b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter 130198b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter p = i915_init_compile(i915, fs); 130298b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter 1303abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin i915_translate_instructions(p, tokens, fs); 13040d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_fixup_depth_write(p); 13050d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13060d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian i915_fini_compile(i915, p); 13070d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian} 1308