1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdarg.h> 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "i915_reg.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "i915_context.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "i915_fpc.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_string.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_parse.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_dump.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_vertex.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef M_PI 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define M_PI 3.14159265358979323846 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Simple pass-through fragment shader to use when we don't have 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a real shader (or it fails to compile for some reason). 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned passthrough_decl[] = 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _3DSTATE_PIXEL_SHADER_PROGRAM | ((2*3)-1), 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* declare input color: 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (D0_DCL | 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (REG_TYPE_T << D0_TYPE_SHIFT) | 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (T_DIFFUSE << D0_NR_SHIFT) | 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D0_CHANNEL_ALL), 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned passthrough_program[] = 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* move to output color: 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (A0_MOV | 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (REG_TYPE_OC << A0_DEST_TYPE_SHIFT) | 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_ALL | 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (REG_TYPE_T << A0_SRC0_TYPE_SHIFT) | 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (T_DIFFUSE << A0_SRC0_NR_SHIFT)), 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0x01230000, /* .xyzw */ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1, -1/3!, 1/5!, -1/7! */ 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const float scs_sin_constants[4] = { 1.0, 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org -1.0f / (3 * 2 * 1), 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1.0f / (5 * 4 * 3 * 2 * 1), 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org -1.0f / (7 * 6 * 5 * 4 * 3 * 2 * 1) 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1, -1/2!, 1/4!, -1/6! */ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const float scs_cos_constants[4] = { 1.0, 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org -1.0f / (2 * 1), 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1.0f / (4 * 3 * 2 * 1), 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org -1.0f / (6 * 5 * 4 * 3 * 2 * 1) 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2*pi, -(2*pi)^3/3!, (2*pi)^5/5!, -(2*pi)^7/7! */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const float sin_constants[4] = { 2.0 * M_PI, 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org -8.0f * M_PI * M_PI * M_PI / (3 * 2 * 1), 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32.0f * M_PI * M_PI * M_PI * M_PI * M_PI / (5 * 4 * 3 * 2 * 1), 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org -128.0f * M_PI * M_PI * M_PI * M_PI * M_PI * M_PI * M_PI / (7 * 6 * 5 * 4 * 3 * 2 * 1) 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1, -(2*pi)^2/2!, (2*pi)^4/4!, -(2*pi)^6/6! */ 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const float cos_constants[4] = { 1.0, 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org -4.0f * M_PI * M_PI / (2 * 1), 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 16.0f * M_PI * M_PI * M_PI * M_PI / (4 * 3 * 2 * 1), 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org -64.0f * M_PI * M_PI * M_PI * M_PI * M_PI * M_PI / (6 * 5 * 4 * 3 * 2 * 1) 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * component-wise negation of ureg 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnegate(int reg, int x, int y, int z, int w) 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Another neat thing about the UREG representation */ 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return reg ^ (((x & 1) << UREG_CHANNEL_X_NEGATE_SHIFT) | 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((y & 1) << UREG_CHANNEL_Y_NEGATE_SHIFT) | 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((z & 1) << UREG_CHANNEL_Z_NEGATE_SHIFT) | 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((w & 1) << UREG_CHANNEL_W_NEGATE_SHIFT)); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In the event of a translation failure, we'll generate a simple color 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pass-through program. 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_use_passthrough_shader(struct i915_fragment_shader *fs) 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fs->program = (uint *) MALLOC(sizeof(passthrough_program)); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fs->decl = (uint *) MALLOC(sizeof(passthrough_decl)); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs->program) { 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(fs->program, passthrough_program, sizeof(passthrough_program)); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(fs->decl, passthrough_decl, sizeof(passthrough_decl)); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fs->program_len = Elements(passthrough_program); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fs->decl_len = Elements(passthrough_decl); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fs->num_constants = 0; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_program_error(struct i915_fp_compile *p, const char *msg, ...) 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_list args; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char buffer[1024]; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("i915_program_error: "); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_start( args, msg ); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_vsnprintf( buffer, sizeof(buffer), msg, args ); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_end( args ); 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("%s", buffer); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("\n"); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->error = 1; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint get_mapping(struct i915_fragment_shader* fs, int unit) 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < I915_TEX_UNITS; i++) 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs->generic_mapping[i] == -1) { 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fs->generic_mapping[i] = unit; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs->generic_mapping[i] == unit) 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Exceeded max generics\n"); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Construct a ureg for the given source register. Will emit 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * constants, apply swizzling and negation as needed. 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsrc_vector(struct i915_fp_compile *p, 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct i915_full_src_register *source, 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fragment_shader* fs) 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint index = source->Register.Index; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint src = 0, sem_name, sem_ind; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (source->Register.File) { 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_TEMPORARY: 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (source->Register.Index >= I915_MAX_TEMPORARY) { 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_program_error(p, "Exceeded max temporary reg"); 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = UREG(REG_TYPE_R, index); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_INPUT: 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: Packing COL1, FOGC into a single attribute works for 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texenv programs, but will fail for real fragment programs 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that use these attributes and expect them to be a full 4 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * components wide. Could use a texcoord to pass these 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * attributes if necessary, but that won't work in the general 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * case. 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We also use a texture coordinate to pass wpos when possible. 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sem_name = p->shader->info.input_semantic_name[index]; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sem_ind = p->shader->info.input_semantic_index[index]; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (sem_name) { 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_POSITION: 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* for fragcoord */ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int real_tex_unit = get_mapping(fs, I915_SEMANTIC_POS); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_ALL); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_COLOR: 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sem_ind == 0) { 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = i915_emit_decl(p, REG_TYPE_T, T_DIFFUSE, D0_CHANNEL_ALL); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* secondary color */ 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sem_ind == 1); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = i915_emit_decl(p, REG_TYPE_T, T_SPECULAR, D0_CHANNEL_XYZ); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = swizzle(src, X, Y, Z, ONE); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_FOG: 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = i915_emit_decl(p, REG_TYPE_T, T_FOG_W, D0_CHANNEL_W); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = swizzle(src, W, W, W, W); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_GENERIC: 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int real_tex_unit = get_mapping(fs, sem_ind); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_ALL); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_FACE: 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* for back/front faces */ 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int real_tex_unit = get_mapping(fs, I915_SEMANTIC_FACE); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_X); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_program_error(p, "Bad source->Index"); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_IMMEDIATE: 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(index < p->num_immediates); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index = p->immediates_map[index]; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_CONSTANT: 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = UREG(REG_TYPE_CONST, index); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_program_error(p, "Bad source->File"); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = swizzle(src, 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org source->Register.SwizzleX, 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org source->Register.SwizzleY, 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org source->Register.SwizzleZ, 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org source->Register.SwizzleW); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* There's both negate-all-components and per-component negation. 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Try to handle both here. 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int n = source->Register.Negate; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = negate(src, n, n, n, n); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no abs() */ 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX assertions disabled to allow arbfplight.c to run */ 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX enable these assertions, or fix things */ 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!source->Register.Absolute); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (source->Register.Absolute) 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Unhandled absolute value\n"); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return src; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Construct a ureg for a destination register. 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_result_vector(struct i915_fp_compile *p, 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct i915_full_dst_register *dest) 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dest->Register.File) { 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_OUTPUT: 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint sem_name = p->shader->info.output_semantic_name[dest->Register.Index]; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (sem_name) { 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_POSITION: 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return UREG(REG_TYPE_OD, 0); 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_COLOR: 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return UREG(REG_TYPE_OC, 0); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_program_error(p, "Bad inst->DstReg.Index/semantics"); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_TEMPORARY: 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return UREG(REG_TYPE_R, dest->Register.Index); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_program_error(p, "Bad inst->DstReg.File"); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute flags for saturation and writemask. 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_result_flags(const struct i915_full_instruction *inst) 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint writeMask 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = inst->Dst[0].Register.WriteMask; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint flags = 0x0; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Instruction.Saturate == TGSI_SAT_ZERO_ONE) 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags |= A0_DEST_SATURATE; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writeMask & TGSI_WRITEMASK_X) 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags |= A0_DEST_CHANNEL_X; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writeMask & TGSI_WRITEMASK_Y) 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags |= A0_DEST_CHANNEL_Y; 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writeMask & TGSI_WRITEMASK_Z) 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags |= A0_DEST_CHANNEL_Z; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writeMask & TGSI_WRITEMASK_W) 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags |= A0_DEST_CHANNEL_W; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return flags; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert TGSI_TEXTURE_x token to DO_SAMPLE_TYPE_x token 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtranslate_tex_src_target(struct i915_fp_compile *p, uint tex) 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (tex) { 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW1D: 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_1D: 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return D0_SAMPLE_TYPE_2D; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW2D: 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_2D: 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return D0_SAMPLE_TYPE_2D; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOWRECT: 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_RECT: 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return D0_SAMPLE_TYPE_2D; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_3D: 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return D0_SAMPLE_TYPE_VOLUME; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_CUBE: 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return D0_SAMPLE_TYPE_CUBE; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_program_error(p, "TexSrc type"); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the number of coords needed to access a given TGSI_TEXTURE_* 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtexture_num_coords(struct i915_fp_compile *p, uint tex) 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (tex) { 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW1D: 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_1D: 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW2D: 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_2D: 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOWRECT: 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_RECT: 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 2; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_3D: 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_CUBE: 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 3; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_program_error(p, "Num coords"); 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 2; 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Generate texel lookup instruction. 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_tex(struct i915_fp_compile *p, 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct i915_full_instruction *inst, 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint opcode, 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fragment_shader* fs) 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint texture = inst->Texture.Texture; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint unit = inst->Src[1].Register.Index; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint tex = translate_tex_src_target( p, texture ); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint sampler = i915_emit_decl(p, REG_TYPE_S, unit, tex); 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint coord = src_vector( p, &inst->Src[0], fs); 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_texld( p, 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector( p, &inst->Dst[0] ), 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags( inst ), 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler, 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord, 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode, 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texture_num_coords(p, texture) ); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Generate a simple arithmetic instruction 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param opcode the i915 opcode 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param numArgs the number of input/src arguments 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_simple_arith(struct i915_fp_compile *p, 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct i915_full_instruction *inst, 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint opcode, uint numArgs, 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fragment_shader* fs) 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint arg1, arg2, arg3; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(numArgs <= 3); 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arg1 = (numArgs < 1) ? 0 : src_vector( p, &inst->Src[0], fs ); 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arg2 = (numArgs < 2) ? 0 : src_vector( p, &inst->Src[1], fs ); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arg3 = (numArgs < 3) ? 0 : src_vector( p, &inst->Src[2], fs ); 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith( p, 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode, 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector( p, &inst->Dst[0]), 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags( inst ), 0, 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arg1, 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arg2, 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arg3 ); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** As above, but swap the first two src regs */ 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_simple_arith_swap2(struct i915_fp_compile *p, 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct i915_full_instruction *inst, 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint opcode, uint numArgs, 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fragment_shader* fs) 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_full_instruction inst2; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(numArgs == 2); 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* transpose first two registers */ 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst2 = *inst; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst2.Src[0] = inst->Src[1]; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst2.Src[1] = inst->Src[0]; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, &inst2, opcode, numArgs, fs); 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Translate TGSI instruction to i915 instruction. 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Possible concerns: 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DDX, DDY -- return 0 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SIN, COS -- could use another taylor step? 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIT -- results seem a little different to sw mesa 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LOG -- different to mesa on negative numbers, but this is conformant. 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_translate_instruction(struct i915_fp_compile *p, 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct i915_full_instruction *inst, 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fragment_shader *fs) 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint writemask; 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint src0, src1, src2, flags; 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint tmp = 0; 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (inst->Instruction.Opcode) { 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ABS: 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MAX, 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0, negate(src0, 1, 1, 1, 1), 0); 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ADD: 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, inst, A0_ADD, 2, fs); 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_CEIL: 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags = get_result_flags(inst); 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_FLR, 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags & A0_DEST_CHANNEL_ALL, 0, 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org negate(src0, 1, 1, 1, 1), 0, 0); 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MOV, 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags, 0, 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org negate(tmp, 1, 1, 1, 1), 0, 0); 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_CMP: 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = src_vector(p, &inst->Src[1], fs); 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src2 = src_vector(p, &inst->Src[2], fs); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, A0_CMP, 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, src0, src2, src1); /* NOTE: order of src2, src1 */ 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_COS: 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_X, 0, 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0, i915_emit_const1f(p, 1.0f / (float) (M_PI * 2.0)), 0); 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, A0_MOD, tmp, A0_DEST_CHANNEL_X, 0, tmp, 0, 0); 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * t0.xy = MUL x.xx11, x.x111 ; x^2, x, 1, 1 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, 1 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * t0 = MUL t0.xxz1 t0.z111 ; x^6 x^4 x^2 1 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * result = DP4 t0, cos_constants 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_XY, 0, 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, X, ONE, ONE), 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, ONE, ONE, ONE), 0); 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_XYZ, 0, 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, Y, X, ONE), 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, X, ONE, ONE), 0); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_XYZ, 0, 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, X, Z, ONE), 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, Z, ONE, ONE, ONE), 0); 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DP4, 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, ONE, Z, Y, X), 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_const4fv(p, cos_constants), 0); 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DDX: 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DDY: 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX We just output 0 here */ 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Punting DDX/DDX\n"); 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = get_result_vector(p, &inst->Dst[0]); 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MOV, 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, ZERO, ZERO, ZERO, ZERO), 0, 0); 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DP2: 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = src_vector(p, &inst->Src[1], fs); 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DP3, 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, X, Y, ZERO, ZERO), src1, 0); 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DP3: 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, inst, A0_DP3, 2, fs); 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DP4: 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, inst, A0_DP4, 2, fs); 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DPH: 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = src_vector(p, &inst->Src[1], fs); 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DP4, 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, X, Y, Z, ONE), src1, 0); 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DST: 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = src_vector(p, &inst->Src[1], fs); 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* result[0] = 1 * 1; 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * result[1] = a[1] * b[1]; 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * result[2] = a[2] * 1; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * result[3] = 1 * b[3]; 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, ONE, Y, Z, ONE), 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src1, ONE, Y, ONE, W), 0); 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_END: 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no-op */ 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_EX2: 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_EXP, 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, X, X, X, X), 0, 0); 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_FLR: 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, inst, A0_FLR, 1, fs); 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_FRC: 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, inst, A0_FRC, 1, fs); 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_KIL: 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* kill if src[0].x < 0 || src[0].y < 0 ... */ 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_texld(p, 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, /* dest reg: a dummy reg */ 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_ALL, /* dest writemask */ 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* sampler */ 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0, /* coord*/ 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org T0_TEXKILL, /* opcode */ 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1); /* num_coord */ 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_KILP: 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We emit an unconditional kill; we may want to revisit 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if we ever implement conditionals. 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_texld(p, 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, /* dest reg: a dummy reg */ 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_ALL, /* dest writemask */ 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* sampler */ 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org negate(swizzle(0, ONE, ONE, ONE, ONE), 1, 1, 1, 1), /* coord */ 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org T0_TEXKILL, /* opcode */ 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1); /* num_coord */ 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_LG2: 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_LOG, 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, X, X, X, X), 0, 0); 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_LIT: 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp = max( a.xyzw, a.00zw ) 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX: Clamp tmp.w to -128..128 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tmp.y = log(tmp.y) 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tmp.y = tmp.w * tmp.y 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tmp.y = exp(tmp.y) 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * result = cmp (a.11-x1, a.1x01, a.1xy1 ) 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, A0_MAX, tmp, A0_DEST_CHANNEL_ALL, 0, 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0, swizzle(src0, ZERO, ZERO, Z, W), 0); 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, A0_LOG, tmp, A0_DEST_CHANNEL_Y, 0, 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, Y, Y, Y, Y), 0, 0); 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, A0_MUL, tmp, A0_DEST_CHANNEL_Y, 0, 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, ZERO, Y, ZERO, ZERO), 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, ZERO, W, ZERO, ZERO), 0); 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, A0_EXP, tmp, A0_DEST_CHANNEL_Y, 0, 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, Y, Y, Y, Y), 0, 0); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, A0_CMP, 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org negate(swizzle(tmp, ONE, ONE, X, ONE), 0, 0, 1, 0), 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, ONE, X, ZERO, ONE), 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, ONE, X, Y, ONE)); 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_LRP: 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = src_vector(p, &inst->Src[1], fs); 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src2 = src_vector(p, &inst->Src[2], fs); 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags = get_result_flags(inst); 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* b*a + c*(1-a) 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * b*a + c - ca 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tmp = b*a + c, 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * result = (-c)*a + tmp 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, A0_MAD, tmp, 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags & A0_DEST_CHANNEL_ALL, 0, src1, src0, src2); 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, A0_MAD, 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags, 0, negate(src2, 1, 1, 1, 1), src0, tmp); 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_MAD: 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, inst, A0_MAD, 3, fs); 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_MAX: 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, inst, A0_MAX, 2, fs); 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_MIN: 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = src_vector(p, &inst->Src[1], fs); 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags = get_result_flags(inst); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MAX, 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, flags & A0_DEST_CHANNEL_ALL, 0, 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org negate(src0, 1, 1, 1, 1), 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org negate(src1, 1, 1, 1, 1), 0); 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MOV, 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags, 0, negate(tmp, 1, 1, 1, 1), 0, 0); 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_MOV: 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, inst, A0_MOV, 1, fs); 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_MUL: 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, inst, A0_MUL, 2, fs); 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_NOP: 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_POW: 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = src_vector(p, &inst->Src[1], fs); 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags = get_result_flags(inst); 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: masking on intermediate values, here and elsewhere. 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_LOG, 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_X, 0, 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, X, X, X, X), 0, 0); 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, A0_MUL, tmp, A0_DEST_CHANNEL_X, 0, tmp, src1, 0); 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_EXP, 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags, 0, swizzle(tmp, X, X, X, X), 0, 0); 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_RET: 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: no-op? */ 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_RCP: 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_RCP, 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, X, X, X, X), 0, 0); 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_RSQ: 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_RSQ, 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, X, X, X, X), 0, 0); 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SCS: 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, x 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * t1 = MUL t0.xyyw t0.yz11 ; x^7 x^5 x^3 x 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * scs.x = DP4 t1, scs_sin_constants 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * t1 = MUL t0.xxz1 t0.z111 ; x^6 x^4 x^2 1 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * scs.y = DP4 t1, scs_cos_constants 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_XY, 0, 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, X, X, ONE, ONE), 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, X, ONE, ONE, ONE), 0); 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_ALL, 0, 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, Y, X, Y), 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, X, ONE, ONE), 0); 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org writemask = inst->Dst[0].Register.WriteMask; 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writemask & TGSI_WRITEMASK_Y) { 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint tmp1; 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writemask & TGSI_WRITEMASK_X) 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp1 = i915_get_utemp(p); 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp1 = tmp; 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp1, A0_DEST_CHANNEL_ALL, 0, 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, Y, Y, W), 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, Z, ONE, ONE), 0); 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DP4, 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_Y, 0, 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp1, W, Z, Y, X), 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_const4fv(p, scs_sin_constants), 0); 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writemask & TGSI_WRITEMASK_X) { 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_XYZ, 0, 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, X, Z, ONE), 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, Z, ONE, ONE, ONE), 0); 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DP4, 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_X, 0, 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, ONE, Z, Y, X), 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_const4fv(p, scs_cos_constants), 0); 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SEQ: 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if we're both >= and <= then we're == */ 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = src_vector(p, &inst->Src[1], fs); 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_SGE, 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_ALL, 0, 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0, 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1, 0); 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_SGE, 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_ALL, 0, 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1, 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0, 0); 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_ALL, 0, 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, 0); 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SGE: 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, inst, A0_SGE, 2, fs); 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SIN: 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_X, 0, 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0, i915_emit_const1f(p, 1.0f / (float) (M_PI * 2.0)), 0); 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, A0_MOD, tmp, A0_DEST_CHANNEL_X, 0, tmp, 0, 0); 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, x 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * t1 = MUL t0.xyyw t0.yz11 ; x^7 x^5 x^3 x 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * result = DP4 t1.wzyx, sin_constants 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_XY, 0, 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, X, ONE, ONE), 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, ONE, ONE, ONE), 0); 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_ALL, 0, 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, Y, X, Y), 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, X, ONE, ONE), 0); 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_ALL, 0, 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, Y, Y, W), 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, X, Z, ONE, ONE), 0); 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DP4, 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(tmp, W, Z, Y, X), 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_const4fv(p, sin_constants), 0); 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SLE: 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* like SGE, but swap reg0, reg1 */ 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith_swap2(p, inst, A0_SGE, 2, fs); 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SLT: 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, inst, A0_SLT, 2, fs); 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SGT: 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* like SLT, but swap reg0, reg1 */ 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith_swap2(p, inst, A0_SLT, 2, fs); 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SNE: 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if we're < or > then we're != */ 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = src_vector(p, &inst->Src[1], fs); 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_SLT, 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_ALL, 0, 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0, 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1, 0); 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_SLT, 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_ALL, 0, 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1, 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0, 0); 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_ADD, 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_ALL, 0, 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, 0); 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SSG: 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* compute (src>0) - (src<0) */ 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_SLT, 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_ALL, 0, 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0, 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, ZERO, ZERO, ZERO, ZERO), 0); 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_SLT, 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_ALL, 0, 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, ZERO, ZERO, ZERO, ZERO), 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0, 0); 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_ADD, 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_ALL, 0, 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org negate(tmp, 1, 1, 1, 1), 0); 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SUB: 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = src_vector(p, &inst->Src[1], fs); 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_ADD, 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0, negate(src1, 1, 1, 1, 1), 0); 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TEX: 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_tex(p, inst, T0_TEXLD, fs); 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TRUNC: 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_simple_arith(p, inst, A0_TRC, 1, fs); 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TXB: 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_tex(p, inst, T0_TEXLDB, fs); 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TXP: 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_tex(p, inst, T0_TEXLDP, fs); 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_XPD: 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Cross product: 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * result.x = src0.y * src1.z - src0.z * src1.y; 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * result.y = src0.z * src1.x - src0.x * src1.z; 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * result.z = src0.x * src1.y - src0.y * src1.x; 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * result.w = undef; 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = src_vector(p, &inst->Src[0], fs); 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = src_vector(p, &inst->Src[1], fs); 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = i915_get_utemp(p); 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MUL, 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, A0_DEST_CHANNEL_ALL, 0, 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, Z, X, Y, ONE), 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src1, Y, Z, X, ONE), 0); 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MAD, 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_vector(p, &inst->Dst[0]), 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_result_flags(inst), 0, 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src0, Y, Z, X, ONE), 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(src1, Z, X, Y, ONE), 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org negate(tmp, 1, 1, 1, 0)); 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_program_error(p, "bad opcode %d", inst->Instruction.Opcode); 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->error = 1; 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_release_utemps(p); 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void i915_translate_token(struct i915_fp_compile *p, 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union i915_full_token* token, 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fragment_shader *fs) 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fragment_shader *ifs = p->shader; 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch( token->Token.Type ) { 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_PROPERTY: 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We only support one cbuf, but we still need to ignore the property 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * correctly so we don't hit the assert at the end of the switch case. 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(token->FullProperty.Property.PropertyName == 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS); 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_DECLARATION: 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (token->FullDeclaration.Declaration.File 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org == TGSI_FILE_CONSTANT) { 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = token->FullDeclaration.Range.First; 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i <= token->FullDeclaration.Range.Last; 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i++) { 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ifs->constant_flags[i] == 0x0); 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ifs->constant_flags[i] = I915_CONSTFLAG_USER; 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ifs->num_constants = MAX2(ifs->num_constants, i + 1); 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (token->FullDeclaration.Declaration.File 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org == TGSI_FILE_TEMPORARY) { 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = token->FullDeclaration.Range.First; 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i <= token->FullDeclaration.Range.Last; 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i++) { 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i >= I915_MAX_TEMPORARY) 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Too many temps (%d)\n",i); 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX just use shader->info->file_mask[TGSI_FILE_TEMPORARY] */ 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->temp_flag |= (1 << i); /* mark temp as used */ 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_IMMEDIATE: 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_immediate *imm 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = &token->FullImmediate; 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint pos = p->num_immediates++; 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint j; 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert( imm->Immediate.NrTokens <= 4 + 1 ); 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < imm->Immediate.NrTokens - 1; j++) { 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->immediates[pos][j] = imm->u[j].Float; 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_INSTRUCTION: 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->first_instruction) { 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* resolve location of immediates */ 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i, j; 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < p->num_immediates; i++) { 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* find constant slot for this immediate */ 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < I915_MAX_CONSTANT; j++) { 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ifs->constant_flags[j] == 0x0) { 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(ifs->constants[j], 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->immediates[i], 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4 * sizeof(float)); 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*printf("immediate %d maps to const %d\n", i, j);*/ 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ifs->constant_flags[j] = 0xf; /* all four comps used */ 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->immediates_map[i] = j; 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ifs->num_constants = MAX2(ifs->num_constants, j + 1); 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->first_instruction = FALSE; 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_translate_instruction(p, &token->FullInstruction, fs); 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert( 0 ); 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Translate TGSI fragment shader into i915 hardware instructions. 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param p the translation state 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param tokens the TGSI token array 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_translate_instructions(struct i915_fp_compile *p, 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct i915_token_list *tokens, 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fragment_shader *fs) 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(i = 0; i<tokens->NumTokens; i++) { 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_translate_token(p, &tokens->Tokens[i], fs); 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct i915_fp_compile * 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_init_compile(struct i915_context *i915, 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fragment_shader *ifs) 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fp_compile *p = CALLOC_STRUCT(i915_fp_compile); 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->shader = ifs; 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Put new constants at end of const buffer, growing downward. 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The problem is we don't know how many user-defined constants might 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be specified with pipe->set_constant_buffer(). 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Should pre-scan the user's program to determine the highest-numbered 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * constant referenced. 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ifs->num_constants = 0; 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(ifs->constant_flags, 0, sizeof(ifs->constant_flags)); 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&p->register_phases, 0, sizeof(p->register_phases)); 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < I915_TEX_UNITS; i++) 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ifs->generic_mapping[i] = -1; 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->first_instruction = TRUE; 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->nr_tex_indirect = 1; /* correct? */ 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->nr_tex_insn = 0; 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->nr_alu_insn = 0; 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->nr_decl_insn = 0; 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->csr = p->program; 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->decl = p->declarations; 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->decl_s = 0; 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->decl_t = 0; 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->temp_flag = ~0x0 << I915_MAX_TEMPORARY; 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->utemp_flag = ~0x7; 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* initialize the first program word */ 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *(p->decl++) = _3DSTATE_PIXEL_SHADER_PROGRAM; 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return p; 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Copy compile results to the fragment program struct and destroy the 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * compilation context. 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_fini_compile(struct i915_context *i915, struct i915_fp_compile *p) 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fragment_shader *ifs = p->shader; 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long program_size = (unsigned long) (p->csr - p->program); 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long decl_size = (unsigned long) (p->decl - p->declarations); 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->nr_tex_indirect > I915_MAX_TEX_INDIRECT) 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Exceeded max nr indirect texture lookups\n"); 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->nr_tex_insn > I915_MAX_TEX_INSN) 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_program_error(p, "Exceeded max TEX instructions"); 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->nr_alu_insn > I915_MAX_ALU_INSN) 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_program_error(p, "Exceeded max ALU instructions"); 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->nr_decl_insn > I915_MAX_DECL_INSN) 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_program_error(p, "Exceeded max DECL instructions"); 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->error) { 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->NumNativeInstructions = 0; 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->NumNativeAluInstructions = 0; 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->NumNativeTexInstructions = 0; 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->NumNativeTexIndirections = 0; 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_use_passthrough_shader(ifs); 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->NumNativeInstructions 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = p->nr_alu_insn + p->nr_tex_insn + p->nr_decl_insn; 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->NumNativeAluInstructions = p->nr_alu_insn; 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->NumNativeTexInstructions = p->nr_tex_insn; 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->NumNativeTexIndirections = p->nr_tex_indirect; 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* patch in the program length */ 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->declarations[0] |= program_size + decl_size - 2; 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Copy compilation results to fragment program struct: 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ifs->decl); 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ifs->program); 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ifs->decl 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = (uint *) MALLOC(decl_size * sizeof(uint)); 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ifs->program 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = (uint *) MALLOC(program_size * sizeof(uint)); 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ifs->decl) { 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ifs->decl_len = decl_size; 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(ifs->decl, 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->declarations, 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl_size * sizeof(uint)); 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ifs->program) { 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ifs->program_len = program_size; 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(ifs->program, 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->program, 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program_size * sizeof(uint)); 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Release the compilation struct: 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(p); 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Rather than trying to intercept and jiggle depth writes during 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * emit, just move the value into its correct position at the end of 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the program: 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_fixup_depth_write(struct i915_fp_compile *p) 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX assuming pos/depth is always in output[0] */ 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->shader->info.output_semantic_name[0] == TGSI_SEMANTIC_POSITION) { 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint depth = UREG(REG_TYPE_OD, 0); 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_emit_arith(p, 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_MOV, /* opcode */ 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth, /* dest reg */ 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org A0_DEST_CHANNEL_W, /* write mask */ 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* saturate? */ 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle(depth, X, Y, Z, Z), /* src0 */ 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0 /* src1, src2 */); 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_translate_fragment_program( struct i915_context *i915, 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fragment_shader *fs) 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_fp_compile *p; 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_token *tokens = fs->state.tokens; 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct i915_token_list* i_tokens; 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dump(tokens, 0); 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* hw doesn't seem to like empty frag programs, even when the depth write 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fixup gets emitted below - may that one is fishy, too? */ 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs->info.num_instructions == 1) { 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_use_passthrough_shader(fs); 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = i915_init_compile(i915, fs); 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i_tokens = i915_optimize(tokens); 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_translate_instructions(p, i_tokens, fs); 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_fixup_depth_write(p); 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_fini_compile(i915, p); 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_optimize_free(i_tokens); 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i915_disassemble_program(NULL, fs->program, fs->program_len); 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1392