r600_shader.c revision b777db32541b360516203865a0fa41f4b8cebf7c
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 108457378e031ffb89a2011604c7798a6f5f2142207Jerome Glissefprintf(stderr, "--------------------------------------------------------------\n"); 109457378e031ffb89a2011604c7798a6f5f2142207Jerome 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 } 123457378e031ffb89a2011604c7798a6f5f2142207Jerome 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; 132313df4156279f84ebc5b98a7540820b994762650Jerome Glisse unsigned i, tmp; 13372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1346e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate = radeon_state_decref(rpshader->rstate); 1356e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse state = radeon_state(rscreen->rw, R600_VS_SHADER_TYPE, R600_VS_SHADER); 1366e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse if (state == NULL) 1376e6103004c9c737297b842a4aff298da920e7c33Jerome 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); 1486e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate = state; 1496e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo); 1506e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->bo[1] = radeon_bo_incref(rscreen->rw, rpshader->bo); 1516e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->nbo = 2; 1526e6103004c9c737297b842a4aff298da920e7c33Jerome 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{ 158457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse const struct pipe_rasterizer_state *rasterizer; 159ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 16072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 161457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse struct r600_context *rctx = r600_context(ctx); 16272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 1635f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie unsigned i, tmp, exports_ps, num_cout; 16472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 165457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse rasterizer = &rctx->rasterizer->state.rasterizer; 1666e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate = radeon_state_decref(rpshader->rstate); 1676e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse state = radeon_state(rscreen->rw, R600_PS_SHADER_TYPE, R600_PS_SHADER); 1686e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse if (state == NULL) 1696e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse return -ENOMEM; 17072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse for (i = 0; i < rshader->ninput; i++) { 1716c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tmp = S_028644_SEMANTIC(i); 17272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse tmp |= S_028644_SEL_CENTROID(1); 17335e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_COLOR || 17435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse rshader->input[i].name == TGSI_SEMANTIC_BCOLOR) { 17535e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse tmp |= S_028644_FLAT_SHADE(rshader->flat_shade); 17635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse } 177457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (rasterizer->sprite_coord_enable & (1 << i)) { 178457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse tmp |= S_028644_PT_SPRITE_TEX(1); 179457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 18072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_INPUT_CNTL_0 + i] = tmp; 18172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 1825f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie 1835f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie exports_ps = 0; 1845f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie num_cout = 0; 1855f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie for (i = 0; i < rshader->noutput; i++) { 1865f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie if (rshader->output[i].name == TGSI_SEMANTIC_POSITION) 1875f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie exports_ps |= 1; 1885f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) { 1895f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie exports_ps |= (1 << (num_cout+1)); 1905f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie num_cout++; 1915f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } 1925f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } 19372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_0] = S_0286CC_NUM_INTERP(rshader->ninput) | 19472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse S_0286CC_PERSP_GRADIENT_ENA(1); 19572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_1] = 0x00000000; 196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_PS_SHADER__SQ_PGM_RESOURCES_PS] = S_028868_NUM_GPRS(rshader->bc.ngpr); 1975f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie state->states[R600_PS_SHADER__SQ_PGM_EXPORTS_PS] = exports_ps; 1986e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate = state; 1996e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo); 2006e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->nbo = 1; 2016e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT; 20272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return radeon_state_pm4(state); 20372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 20472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 2056f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader) 20672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 207ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 208ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_context *rctx = r600_context(ctx); 20972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 21072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 21172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 21272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* copy new shader */ 21372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_decref(rscreen->rw, rpshader->bo); 21472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->bo = NULL; 215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4, 21672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 4096, NULL); 21772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader->bo == NULL) { 21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -ENOMEM; 21972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 22072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_map(rscreen->rw, rpshader->bo); 221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4); 22272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_unmap(rscreen->rw, rpshader->bo); 22372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* build state */ 22472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rshader->flat_shade = rctx->flat_shade; 225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (rshader->processor_type) { 226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_vs(ctx, rpshader); 22872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 23072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_ps(ctx, rpshader); 23172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 23272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse default: 23372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = -EINVAL; 23472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 23572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 23672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return r; 23772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 23872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 2396f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader) 24072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 24272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 24472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader == NULL) 245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* there should be enough input */ 247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) { 248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d resources provided, expecting %d\n", 249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rctx->vertex_elements->count, rpshader->shader.bc.nresource); 250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 25172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_update(ctx, &rpshader->shader); 253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_pipe_shader(ctx, rpshader); 256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 26672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 270c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 27472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Src[j].Register.Indirect || 277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Dimension || 278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Absolute) { 279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported src (indirect|dimension|absolute)\n"); 280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Dst[j].Register.Indirect || i->Dst[j].Register.Dimension) { 285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported dst (indirect|dimension)\n"); 286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 29072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 29172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 29372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx vtx; 296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 29872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 30435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx->type == TGSI_PROCESSOR_VERTEX) { 307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* turn input into fetch */ 308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&vtx, 0, sizeof(struct r600_bc_vtx)); 309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.inst = 0; 310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.fetch_type = 0; 311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.buffer_id = i; 312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register containing the index into the buffer */ 313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_gpr = 0; 314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_sel_x = 0; 315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.mega_fetch_count = 0x1F; 316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_gpr = ctx->shader->input[i].gpr; 317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_x = 0; 318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_y = 1; 319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_z = 2; 320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_w = 3; 321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_vtx(ctx->bc, &vtx); 322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 33135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 33533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 34272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 34372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 34572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 348c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 349457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 35272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* Values [0,127] correspond to GPR[0..127]. 366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Values [256,511] correspond to cfile constants c[0..255]. 367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 379de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_CONSTANT] = 256; 388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253; 389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 3972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse ctx.value[0] = immediate->u[0].Uint; 3982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse ctx.value[1] = immediate->u[1].Uint; 3992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse ctx.value[2] = immediate->u[2].Uint; 4002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse ctx.value[3] = immediate->u[3].Uint; 401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 4162b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse r = r600_bc_add_literal(ctx.bc, ctx.value); 417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 427457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 428457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 429c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 430c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 431c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 432c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 433c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 434c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 435c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 436c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 437c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 438c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 439c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT; 440457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 443c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 444c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 446457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 447457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 448457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 449457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 450457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 451457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 452457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 457b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 458c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 4595f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 460c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 461c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 47272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 473457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 474457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 475457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 476457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 477457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 478457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 479457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 480457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 481457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 482457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 483457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 484457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 485457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 486457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 487457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 488457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 489457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 490457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 491457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 492457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 493457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT; 494457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 496c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 497481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 498481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 499481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 500481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 501481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 502481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 503481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 504481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 505481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 506481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 507608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 508481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 509481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT; 510481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 511481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 512457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 513457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 514457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (i == (noutput - 1)) { 515457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].end_of_program = 1; 516457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 517b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 518b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 519c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE; 520c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 521c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 522457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 523457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 524c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 5507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(r600_src, 0, sizeof(struct r600_bc_alu_src)); 551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = tgsi_src->Register.Index; 552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = 0; 554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 5551bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse r600_src->neg = tgsi_src->Register.Negate; 556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 5657a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5667a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 5717a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 5727a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 5737a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 5777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle) 5787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 5797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse switch (swizzle) { 5807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 0: 5817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleX; 5827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 1: 5837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleY; 5847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 2: 5857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleZ; 5867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 3: 5877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleW; 5887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse default: 5897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 5907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 5917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 5927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 5937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 5947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 5957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 5977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, k, nconst, r; 5987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 5997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 6007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 6017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse nconst++; 6027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]); 6047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) { 6057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 6067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 6097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[j].Register.File == TGSI_FILE_CONSTANT && j > 0) { 6107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (k = 0; k < 4; k++) { 6117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 6127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 6137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = r600_src[0].sel; 6147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = k; 6157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.sel = ctx->temp_reg + j; 6167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = k; 6177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 6187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (k == 3) 6197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 6207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 6217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 6227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 6237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r600_src[0].sel = ctx->temp_reg + j; 6257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse j--; 6267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 6297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 6307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op2(struct r600_shader_ctx *ctx) 632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 6387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 6397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 6407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 6456c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 6497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 6507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 6617a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 6627a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 6637a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 677094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 678094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 679094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 680094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 681094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 682094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 683094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 684094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 685094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 686094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 687094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.src[0].sel = 248; 6887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 689094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 690094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 6917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 692094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 693094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 694094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 695094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 696094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 697094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 698094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 699094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 700094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 701094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_slt(struct r600_shader_ctx *ctx) 703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 7057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r; 708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 7097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 7107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 7117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 7166c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 7197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 7207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 7217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[1]; 7227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[1], i); 723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 73572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 7370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 7380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 7390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 7400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 7410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 7420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 7437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.x, <- 1.0 */ 7447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 7457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 7467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = 249; /*1.0*/ 7477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 7487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 7497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 7507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 7517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 7527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 7537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 7547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 7550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 7567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.y = max(src.x, 0.0) */ 7577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 7587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX; 7597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 7607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 7617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 7627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].sel = 248; /*0.0*/ 7637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], 0); 7647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 7657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 7667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 7677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 7687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 7697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 7707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 7710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 7727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.z = NOP - fill Z slot */ 7737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 7747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 7757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = 2; 7767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 7777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 7787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 7790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 7807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.w, <- 1.0 */ 7817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 7827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 7837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = 249; 7847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 7857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 7867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 7877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 7887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 7897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 7907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 7917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 7927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 7930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 7940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 7950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 7966a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 7976a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 7986a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 7990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 8000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 8010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED; 8027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 8030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 8040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 8057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 8060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 8070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 8080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 8090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 8100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 8110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 8120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 8130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 8146a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 8156a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 8160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 8170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 8180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 8190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT; 8207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 8210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 8227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 8240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 8250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 8267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[2]); 8270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 8280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 8297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[2].chan = tgsi_chan(&inst->Src[0], 0); 8300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 8310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 8320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 8330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 8340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 8350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 8360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 8370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 8380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 8390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 8400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 8410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE; 8420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 8430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 8440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 8450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 8460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 8470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 8480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 8490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 8500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 8510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 8520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 8530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 8540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 8555cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx) 8565cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{ 8575cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8585cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct r600_bc_alu alu; 8595cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse int i, j, r; 8605cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 8615cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (i = 0; i < 4; i++) { 8625cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 8635cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (inst->Dst[0].Register.WriteMask & (1 << i)) { 8645cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 8655cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 8667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]); 8675cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 8685cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 8697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 8705cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 8715cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 8725cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 8735cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 8745cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.last = 1; 8755cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 8765cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 8775cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 8785cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 8795cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 8805cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return 0; 8815cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse} 8825cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 8837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 8847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 8857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 8877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, r; 8887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 8897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 8907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 8917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 8927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]); 8937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], 0); 8967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.sel = ctx->temp_reg; 8987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 8997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 9007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 9017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* replicate result */ 9047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 9057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 9067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 9077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 9087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 9097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 9107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 9137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 9147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 9157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 9167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 9197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 9207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 9217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 922cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 923cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 924cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 925cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 926cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 9279961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 9289961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse if (r) 9299961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse return r; 930cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 931cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 932cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 933cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 9346c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 935cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 936cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 937cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 938cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 939cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 940cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 941cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 942cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 943cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 944cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 945cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 946cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 947cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 948cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 949cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 950cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 951cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 952cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 9567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 9607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 9617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* do it in 2 step as op3 doesn't support writemask */ 964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 9687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 9697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 970de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.sel = ctx->temp_reg; 972de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 973cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 974de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 975de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 976de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 977de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 978de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 979de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 980de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 982cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 983cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 984cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 985cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 986cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 987cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 9887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 989cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 990cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 991cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 9927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 9937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 995de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 997cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 998cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 9997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 10007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1001cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1002cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.sel = ctx->temp_reg; 1003cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1004cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1005cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1006cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1007cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1008cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1009cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = alu.src[1].sel = 248; 1010cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1011cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1012cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1013cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1014cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1015cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = alu.src[1].sel = 248; 1016cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1017cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1018cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1019cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1020cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1021de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1024de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1025de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1027de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1028de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1029cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1030de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1031de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 103233241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 103333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 103433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 103533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1036641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1037641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 1038b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie int r, i; 1039641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1040641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 1041641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1042b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1043b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 1044b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1045b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE; 1046b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 1047b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 1048b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1049b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1050b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1051b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1052b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1053b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1054b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1055b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie 1056b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1057b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1058b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL; 1059b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 1060b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 3; 1061b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].sel = src_gpr; 1062b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1063b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1064b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1065b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1066b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1067b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1068b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1069b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1070b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1071b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 1072b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = 249; 1073b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1074b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1075b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1076b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1077b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1078b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1079b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1080b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1081b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1082b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } else if (inst->Src[0].Register.File != TGSI_FILE_TEMPORARY) { 1083b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 1084b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1085b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 1086b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 1087b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = i; 1088b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1089b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1090b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 1091b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1092b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1093b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1094b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1095b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1096b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1097b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1098b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 109933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 110033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 110133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.inst = ctx->inst_info->r600_opcode; 110233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 110333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.sampler_id = tex.resource_id; 1104641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 11056c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 110633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_x = 0; 110733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_y = 1; 110833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_z = 2; 110933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_w = 3; 111033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 111133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 111233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 111333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 11149a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 111501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 111601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 111701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 11187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 111901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 112001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 112133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse return r600_bc_add_tex(ctx->bc, &tex); 112233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 112333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 1124b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 1125b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 1126b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 11277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1128b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 1129b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 1130b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 1131b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 11327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 11337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 11347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1135b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 1136b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1137b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1138b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD; 1139b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = 249; 1140b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 11417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 11427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1143b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 1144b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1145b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1146b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1147b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1148b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1149b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1150b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1151b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1152b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1153b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1154b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1155b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1156b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1157b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1158b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 1159b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1160b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1161b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL; 1162b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1163b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 11647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[2]; 11657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 1166b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1167b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1168b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1169b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1170b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1171b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1172b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1173b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1174b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1175b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1176b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1177b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1178b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1179b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1180b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 1181b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1182b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1183b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD; 1184b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 11857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[0]; 11867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 11877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[1]; 11887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 1189b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 1190b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 1191b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1192b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1193b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1194b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1195b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1196b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1197b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1198b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1199b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1200b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return tgsi_helper_copy(ctx, inst); 1201b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 1202b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 1204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 12060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 12077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 12087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate}, 1209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 1212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 1213cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 1214cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 1215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1216dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 1217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_slt}, 1219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 1222b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 1223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 12347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 12354558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 1236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 12407a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 1241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DDX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DDY, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* predicated kill */ 1247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1259b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 1260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1261b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 1262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* SGN */ 1273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1278cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 1279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRK, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 12954558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 1296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CONT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1328094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 1329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 1330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 1360