r600_shader.c revision 094d66f45992830929d620782c70836b4b9b4a37
172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/* 272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a 572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"), 672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation 772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub 872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom 972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions: 1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next 1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the 1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software. 1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE. 2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */ 23de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "pipe/p_shader_tokens.h" 24de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_parse.h" 25de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_scan.h" 2633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse#include "tgsi/tgsi_dump.h" 27de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h" 2872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_screen.h" 2972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_context.h" 30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_shader.h" 31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h" 32de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h" 3372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h" 34de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h> 35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h> 36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 372b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 382b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 392b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 402b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 412b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 432b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 442b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 452b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 462b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_bc *bc; 492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse u32 value[4]; 512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 522b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 532b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 542b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 562b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 572b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 582b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 592b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 602b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[]; 61de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader); 62de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 63de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_shader *shader) 64de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 65de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 66de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct util_format_description *desc; 67de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse enum pipe_format resource_format[160]; 68de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i, nresources = 0; 69de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc *bc = &shader->bc; 70de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_cf *cf; 71de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx *vtx; 72de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 73de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->processor_type != TGSI_PROCESSOR_VERTEX) 74de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 75de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < rctx->vertex_elements->count; i++) { 76de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format; 77de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 78de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) { 79de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (cf->inst) { 80de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX: 81de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC: 82de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) { 83de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse desc = util_format_description(resource_format[vtx->buffer_id]); 84de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (desc == NULL) { 85de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]); 86de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 87de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 88de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_x = desc->swizzle[0]; 89de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_y = desc->swizzle[1]; 90de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_z = desc->swizzle[2]; 91de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_w = desc->swizzle[3]; 92de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 93de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 94de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 95de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 96de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 97de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 98de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_bc_build(&shader->bc); 99de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1016f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_create(struct pipe_context *ctx, 1026f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rpshader, 1036f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct tgsi_token *tokens) 104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_screen *rscreen = r600_screen(ctx->screen); 106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissefprintf(stderr, "--------------------------------------------------------------\n"); 109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissetgsi_dump(tokens, 0); 110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rpshader == NULL) 1116f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return -ENOMEM; 112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rpshader->shader.family = radeon_get_family(rscreen->rw); 113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_from_tgsi(tokens, &rpshader->shader); 114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) { 115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("translation from TGSI failed !\n"); 1166f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return r; 117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_build(&rpshader->shader.bc); 119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) { 120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("building bytecode failed !\n"); 1216f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return r; 122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissefprintf(stderr, "______________________________________________________________\n"); 1246f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return 0; 125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 12672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1276f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_context_state *rpshader) 12872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 129ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 13072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 13172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i, j, tmp; 13372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1346f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rpshader->rstate = radeon_state_decref(rpshader->rstate); 13572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state = radeon_state(rscreen->rw, R600_VS_SHADER_TYPE, R600_VS_SHADER); 13672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (state == NULL) 13772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -ENOMEM; 138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 10; i++) { 139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i] = 0; 140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1416c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse /* so far never got proper semantic id from tgsi */ 1426c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse for (i = 0; i < 32; i++) { 1436c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tmp = i << ((i & 3) * 8); 1446c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i / 4] |= tmp; 145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_VS_SHADER__SPI_VS_OUT_CONFIG] = S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2); 147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_VS_SHADER__SQ_PGM_RESOURCES_VS] = S_028868_NUM_GPRS(rshader->bc.ngpr); 1486f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rpshader->rstate = state; 1496f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo); 1506f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rpshader->rstate->bo[1] = radeon_bo_incref(rscreen->rw, rpshader->bo); 1516f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rpshader->rstate->nbo = 2; 1526f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT; 15372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return radeon_state_pm4(state); 15472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 15572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1566f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_context_state *rpshader) 15772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 158ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 15972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 16072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 16172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse unsigned i, tmp; 16272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1636f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rpshader->rstate = radeon_state_decref(rpshader->rstate); 16472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state = radeon_state(rscreen->rw, R600_PS_SHADER_TYPE, R600_PS_SHADER); 16572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (state == NULL) 16672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -ENOMEM; 16772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse for (i = 0; i < rshader->ninput; i++) { 1686c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tmp = S_028644_SEMANTIC(i); 16972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse tmp |= S_028644_SEL_CENTROID(1); 17035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_COLOR || 17135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse rshader->input[i].name == TGSI_SEMANTIC_BCOLOR) { 17235e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse tmp |= S_028644_FLAT_SHADE(rshader->flat_shade); 17335e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse } 17472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_INPUT_CNTL_0 + i] = tmp; 17572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 17672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_0] = S_0286CC_NUM_INTERP(rshader->ninput) | 17772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse S_0286CC_PERSP_GRADIENT_ENA(1); 17872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_1] = 0x00000000; 179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_PS_SHADER__SQ_PGM_RESOURCES_PS] = S_028868_NUM_GPRS(rshader->bc.ngpr); 18072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SQ_PGM_EXPORTS_PS] = 0x00000002; 1816f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rpshader->rstate = state; 1826f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo); 1836f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rpshader->rstate->nbo = 1; 1846f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT; 18572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return radeon_state_pm4(state); 18672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 18772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1886f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader) 18972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 190ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 191ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_context *rctx = r600_context(ctx); 19272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 19372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 19472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 19572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* copy new shader */ 19672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_decref(rscreen->rw, rpshader->bo); 19772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->bo = NULL; 198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4, 19972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 4096, NULL); 20072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader->bo == NULL) { 20172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -ENOMEM; 20272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 20372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_map(rscreen->rw, rpshader->bo); 204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4); 20572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_unmap(rscreen->rw, rpshader->bo); 20672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* build state */ 20772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rshader->flat_shade = rctx->flat_shade; 208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (rshader->processor_type) { 209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 21072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_vs(ctx, rpshader); 21172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 21372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_ps(ctx, rpshader); 21472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 21572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse default: 21672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = -EINVAL; 21772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 21972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return r; 22072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 22172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 2226f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader) 22372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 22572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 22672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader == NULL) 228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* there should be enough input */ 230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) { 231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d resources provided, expecting %d\n", 232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rctx->vertex_elements->count, rpshader->shader.bc.nresource); 233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 23472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_update(ctx, &rpshader->shader); 236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_pipe_shader(ctx, rpshader); 239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 24972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 253c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 25772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Src[j].Register.Indirect || 260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Dimension || 261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Absolute) { 262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported src (indirect|dimension|absolute)\n"); 263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Dst[j].Register.Indirect || i->Dst[j].Register.Dimension) { 268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported dst (indirect|dimension)\n"); 269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 27372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 27472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 27672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx vtx; 279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 28172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 28735e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx->type == TGSI_PROCESSOR_VERTEX) { 290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* turn input into fetch */ 291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&vtx, 0, sizeof(struct r600_bc_vtx)); 292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.inst = 0; 293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.fetch_type = 0; 294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.buffer_id = i; 295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register containing the index into the buffer */ 296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_gpr = 0; 297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_sel_x = 0; 298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.mega_fetch_count = 0x1F; 299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_gpr = ctx->shader->input[i].gpr; 300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_x = 0; 301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_y = 1; 302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_z = 2; 303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_w = 3; 304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_vtx(ctx->bc, &vtx); 305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 31435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 31833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 32572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 32672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 32872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_output output; 332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 33472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* Values [0,127] correspond to GPR[0..127]. 348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Values [256,511] correspond to cfile constants c[0..255]. 349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_CONSTANT] = 256; 370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253; 371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 3792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse ctx.value[0] = immediate->u[0].Uint; 3802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse ctx.value[1] = immediate->u[1].Uint; 3812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse ctx.value[2] = immediate->u[2].Uint; 3822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse ctx.value[3] = immediate->u[3].Uint; 383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 3982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse r = r600_bc_add_literal(ctx.bc, ctx.value); 399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0, pos0 = 0; i < shader->noutput; i++) { 410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&output, 0, sizeof(struct r600_bc_output)); 411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.gpr = shader->output[i].gpr; 412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.elem_size = 3; 413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.swizzle_x = 0; 414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.swizzle_y = 1; 415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.swizzle_z = 2; 416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.swizzle_w = 3; 417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.barrier = 1; 418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.array_base = i - pos0; 420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE; 421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.type == TGSI_PROCESSOR_VERTEX) { 422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.array_base = 60; 425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse pos0 = 1; 428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.array_base = 0; 433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 44472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == (shader->noutput - 1)) { 446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.end_of_program = 1; 447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_output(ctx.bc, &output); 449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 472de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = tgsi_src->Register.Index; 476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = 0; 478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (swizzle) { 481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case 0: 482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->chan = tgsi_src->Register.SwizzleX; 48372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case 1: 485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->chan = tgsi_src->Register.SwizzleY; 48672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case 2: 488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->chan = tgsi_src->Register.SwizzleZ; 489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case 3: 491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->chan = tgsi_src->Register.SwizzleW; 492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 49472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -EINVAL; 495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 501de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 5047a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5057a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 5107a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 5117a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 5127a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op2(struct r600_shader_ctx *ctx) 517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 5266c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]); 531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 5437a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 5447a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 5457a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 559094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 560094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 561094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 562094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 563094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 564094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 565094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 566094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 567094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 568094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 569094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.src[0].sel = 248; 570094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[1]); 571094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 572094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 573094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 574094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 575094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 576094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 577094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 578094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 579094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 580094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 581094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 582094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_slt(struct r600_shader_ctx *ctx) 584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r; 588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 5936c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[1]); 597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], i, &alu.src[0]); 600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 61472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 6160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 6170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 6180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 6200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 6210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 6220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 0)) 6230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 6240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.x, <- 1.0 */ 6250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 6260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 6270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = 249; /*1.0*/ 6280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 6290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 6300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 6310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 6320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if ((inst->Dst[0].Register.WriteMask & 0xe) == 0) 6330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 6340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 6350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 6360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 6370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 6380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 6390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 6400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 1)) 6410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 6420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.y = max(src.x, 0.0) */ 6430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 6440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX; 6450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_src(ctx, &inst->Src[0], 0, &alu.src[0]); 6460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 6470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 6480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = 248; /*0.0*/ 6490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = 0; 6500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 6510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 6520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 6530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if ((inst->Dst[0].Register.WriteMask & 0xa) == 0) 6540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 6550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 6560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 6570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 6580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 6590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 6600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 3)) 6610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 6620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.w, <- 1.0 */ 6630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 6640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 6650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = 249; 6660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 6670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 6680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 6690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 6700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if ((inst->Dst[0].Register.WriteMask & 0x4) == 0) 6710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 6720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 6730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 6740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 6750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 6760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 6770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 6780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 6796a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 6806a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 6816a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 6820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 6830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 6840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED; 6850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_src(ctx, &inst->Src[0], 1, &alu.src[0]); 6860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 6870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 6880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 6890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 6900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 6910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 6920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 6930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 6940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 6950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 6966a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 6976a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 6980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 6990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 7000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 7010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT; 7020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_src(ctx, &inst->Src[0], 3, &alu.src[0]); 7030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 7040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 7050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 7060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 7070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_src(ctx, &inst->Src[0], 0, &alu.src[2]); 7080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 7090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 7100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 7110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 7120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 7130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 7140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 7150bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 7160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 7170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 7180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 7190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 7200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 7210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE; 7220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 7230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 7240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 7250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 7260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 7270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 7280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 7290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 7300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 7310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 7320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 7330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 7340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 7355cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx) 7365cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{ 7375cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 7385cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct r600_bc_alu alu; 7395cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse int i, j, r; 7405cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 7415cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (i = 0; i < 4; i++) { 7425cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 7435cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (inst->Dst[0].Register.WriteMask & (1 << i)) { 7445cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 7455cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 7465cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]); 7475cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 7485cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 7495cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 7505cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 7515cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 7525cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 7535cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.last = 1; 7545cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 7555cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 7565cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 7575cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 7585cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 7595cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return 0; 7605cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse} 7615cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 762cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 763cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 764cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 765cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 766cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 7679961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 7689961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse if (r) 7699961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse return r; 770cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 771cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 772cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 773cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 7746c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 775cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 776cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 777cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 778cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 779cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 780cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 781cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 782cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 783cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 784cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 785cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 786cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 787cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 788cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 789cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 790cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 791cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 792cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 793de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 794de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 796de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* do it in 2 step as op3 doesn't support writemask */ 800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]); 805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 807de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.sel = ctx->temp_reg; 809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 810cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 819cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 820cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 821cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 822cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 823cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 824cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 825cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 826cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 827cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 830cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 831cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 832cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]); 833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 835cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 836cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.sel = ctx->temp_reg; 837cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 838cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 839cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 840cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 841cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 842cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 843cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = alu.src[1].sel = 248; 844cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 845cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 846cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 847cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 848cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 849cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = alu.src[1].sel = 248; 850cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 851cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 852cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 853cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 854cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 863cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 86633241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 86733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 86833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 86933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 870641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 871641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 872641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse int r; 873641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 874641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 875641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 876641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse /* Add perspective divide */ 877641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_TXP) { 878641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 879641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE; 880641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[0].sel = src_gpr; 881641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[0].chan = 3; 882641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.sel = ctx->temp_reg; 883641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.chan = 3; 884641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.last = 1; 885641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.write = 1; 886641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 887641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse if (r) 888641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse return r; 889641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 890641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 891641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL; 892641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[0].sel = ctx->temp_reg; 893641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[0].chan = 3; 894641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[1].sel = src_gpr; 895641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[1].chan = 0; 896641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.sel = ctx->temp_reg; 897641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.chan = 0; 898641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.write = 1; 899641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 900641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse if (r) 901641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse return r; 902641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 903641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL; 904641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[0].sel = ctx->temp_reg; 905641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[0].chan = 3; 906641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[1].sel = src_gpr; 907641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[1].chan = 1; 908641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.sel = ctx->temp_reg; 909641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.chan = 1; 910641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.write = 1; 911641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 912641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse if (r) 913641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse return r; 914641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 915641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL; 916641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[0].sel = ctx->temp_reg; 917641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[0].chan = 3; 918641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[1].sel = src_gpr; 919641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[1].chan = 2; 920641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.sel = ctx->temp_reg; 921641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.chan = 2; 922641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.write = 1; 923641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 924641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse if (r) 925641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse return r; 926641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 927641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 928641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[0].sel = 249; 929641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.src[0].chan = 0; 930641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.sel = ctx->temp_reg; 931641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.chan = 3; 932641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.last = 1; 933641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse alu.dst.write = 1; 934641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 935641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse if (r) 936641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse return r; 937641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->temp_reg; 938641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse } 93933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 940641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse /* TODO use temp if src_gpr is not a temporary reg (File != TEMPORARY) */ 94133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 94233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.inst = ctx->inst_info->r600_opcode; 94333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 94433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.sampler_id = tex.resource_id; 945641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 9466c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 94733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_x = 0; 94833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_y = 1; 94933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_z = 2; 95033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_w = 3; 95133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 95233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 95333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 95433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 955641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.coord_type_x = 1; 956641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.coord_type_y = 1; 957641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.coord_type_z = 1; 958641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.coord_type_w = 1; 95933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse return r600_bc_add_tex(ctx->bc, &tex); 96033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 96133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 962b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 963b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 964b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 965b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 966b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 967b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 968b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 969b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 970b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 971b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 972b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD; 973b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = 249; 974b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 975b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[1]); 976b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 977b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 978b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 979b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 980b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 981b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 982b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 983b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 984b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 985b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 986b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 987b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 988b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 989b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 990b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 991b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 992b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 993b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 994b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 995b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 996b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL; 997b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 998b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 999b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = tgsi_src(ctx, &inst->Src[2], i, &alu.src[1]); 1000b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1001b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1002b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1003b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1004b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1005b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1006b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1007b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1008b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1009b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1010b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1011b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1012b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1013b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1014b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1015b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1016b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 1017b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1018b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1019b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD; 1020b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 1021b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[0]); 1022b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1023b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1024b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], i, &alu.src[1]); 1025b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1026b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1027b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 1028b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 1029b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1030b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1031b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1032b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1033b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1034b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1035b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1036b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1037b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1038b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return tgsi_helper_copy(ctx, inst); 1039b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 1040b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1041de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 1042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1043de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 10440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 1045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 10465cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans}, 1047de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 1050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 1051cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 1052cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 1053de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1054de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1055de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 1056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_slt}, 1057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1058de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 1059de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 1060b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 1061de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1062de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1063de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1064de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1065de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1066de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1069de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1071de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 10727a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans}, 1073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1074de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 10787a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 1079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DDX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1083de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DDY, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* predicated kill */ 1085de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1090de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1096de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1097641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse {TGSI_OPCODE_TEX, 0, 0x10, tgsi_tex}, 1098de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 109933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse {TGSI_OPCODE_TXP, 0, 0x10, tgsi_tex}, 1100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* SGN */ 1111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1116cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 1117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRK, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CONT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1148de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1150de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1151de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1152de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1153de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1155de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1156de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1157de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1160de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1161de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1162de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1163de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1166094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 1167de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 1168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1169de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1186de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1187de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 1198