r600_shader.c revision d22a1247d8a709cf433a6dd99b2f87a224c27d88
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" 289c284b5cae916a083d17d1039d2f2da128b47882Jerome Glisse#include "r600_pipe.h" 29de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h" 30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h" 31a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h" 3272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h" 33de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h> 34de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h> 35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 361235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic void r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader) 371235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 381235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_state *rstate = &shader->rstate; 391235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 401235becaa1cf7e29f580900592563c3329d326deJerome Glisse unsigned spi_vs_out_id[10]; 411235becaa1cf7e29f580900592563c3329d326deJerome Glisse unsigned i, tmp; 422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 431235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* clear previous register */ 441235becaa1cf7e29f580900592563c3329d326deJerome Glisse rstate->nregs = 0; 451235becaa1cf7e29f580900592563c3329d326deJerome Glisse 461235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* so far never got proper semantic id from tgsi */ 471235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < 10; i++) { 481235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_vs_out_id[i] = 0; 491235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 501235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < 32; i++) { 511235becaa1cf7e29f580900592563c3329d326deJerome Glisse tmp = i << ((i & 3) * 8); 521235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_vs_out_id[i / 4] |= tmp; 531235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 541235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < 10; i++) { 551235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 561235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028614_SPI_VS_OUT_ID_0 + i * 4, 571235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_vs_out_id[i], 0xFFFFFFFF, NULL); 581235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 591235becaa1cf7e29f580900592563c3329d326deJerome Glisse 601235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 611235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0286C4_SPI_VS_OUT_CONFIG, 621235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2), 631235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0xFFFFFFFF, NULL); 641235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 651235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028868_SQ_PGM_RESOURCES_VS, 661235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_NUM_GPRS(rshader->bc.ngpr) | 671235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_STACK_SIZE(rshader->bc.nstack), 681235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0xFFFFFFFF, NULL); 691235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 701235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0288A4_SQ_PGM_RESOURCES_FS, 711235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0x00000000, 0xFFFFFFFF, NULL); 721235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 731235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0288D0_SQ_PGM_CF_OFFSET_VS, 741235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0x00000000, 0xFFFFFFFF, NULL); 751235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 761235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0288DC_SQ_PGM_CF_OFFSET_FS, 771235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0x00000000, 0xFFFFFFFF, NULL); 781235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 791235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028858_SQ_PGM_START_VS, 80d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo); 811235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 821235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028894_SQ_PGM_START_FS, 83d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo); 84738aa29289296512959cbb37d8602131dae44dabDave Airlie 85738aa29289296512959cbb37d8602131dae44dabDave Airlie r600_pipe_state_add_reg(rstate, 86738aa29289296512959cbb37d8602131dae44dabDave Airlie R_03E200_SQ_LOOP_CONST_0 + (32 * 4), 0x01000FFF, 87738aa29289296512959cbb37d8602131dae44dabDave Airlie 0xFFFFFFFF, NULL); 88738aa29289296512959cbb37d8602131dae44dabDave Airlie 891235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 901235becaa1cf7e29f580900592563c3329d326deJerome Glisse 91dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_find_vs_semantic_index(struct r600_shader *vs, 921235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *ps, int id) 931235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 941235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader_io *input = &ps->input[id]; 951235becaa1cf7e29f580900592563c3329d326deJerome Glisse 961235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (int i = 0; i < vs->noutput; i++) { 971235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (input->name == vs->output[i].name && 981235becaa1cf7e29f580900592563c3329d326deJerome Glisse input->sid == vs->output[i].sid) { 991235becaa1cf7e29f580900592563c3329d326deJerome Glisse return i - 1; 1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1051235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic void r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader) 1061235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 1071235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 1081235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_state *rstate = &shader->rstate; 1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 1101235becaa1cf7e29f580900592563c3329d326deJerome Glisse unsigned i, tmp, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z; 1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse boolean have_pos = FALSE, have_face = FALSE; 1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* clear previous register */ 1141235becaa1cf7e29f580900592563c3329d326deJerome Glisse rstate->nregs = 0; 1151235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1161235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rshader->ninput; i++) { 117dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlie tmp = S_028644_SEMANTIC(r600_find_vs_semantic_index(&rctx->vs_shader->shader, rshader, i)); 1181235becaa1cf7e29f580900592563c3329d326deJerome Glisse tmp |= S_028644_SEL_CENTROID(1); 1191235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_POSITION) 1201235becaa1cf7e29f580900592563c3329d326deJerome Glisse have_pos = TRUE; 1211235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_COLOR || 1221235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->input[i].name == TGSI_SEMANTIC_BCOLOR || 1231235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->input[i].name == TGSI_SEMANTIC_POSITION) { 1241235becaa1cf7e29f580900592563c3329d326deJerome Glisse tmp |= S_028644_FLAT_SHADE(rshader->flat_shade); 1251235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_FACE) 1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse have_face = TRUE; 1281235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC && 1291235becaa1cf7e29f580900592563c3329d326deJerome Glisse rctx->sprite_coord_enable & (1 << rshader->input[i].sid)) { 1301235becaa1cf7e29f580900592563c3329d326deJerome Glisse tmp |= S_028644_PT_SPRITE_TEX(1); 1311235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1321235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, tmp, 0xFFFFFFFF, NULL); 1331235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1341235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rshader->noutput; i++) { 1357777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie if (rshader->input[i].name == TGSI_SEMANTIC_POSITION) 1367777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie r600_pipe_state_add_reg(rstate, 1377777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie R_02880C_DB_SHADER_CONTROL, 1387777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie S_02880C_Z_EXPORT_ENABLE(1), 1397777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie S_02880C_Z_EXPORT_ENABLE(1), NULL); 1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps = 0; 1431235becaa1cf7e29f580900592563c3329d326deJerome Glisse num_cout = 0; 1441235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rshader->noutput; i++) { 1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->output[i].name == TGSI_SEMANTIC_POSITION) 1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps |= 1; 1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) { 1481235becaa1cf7e29f580900592563c3329d326deJerome Glisse num_cout++; 1491235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1501235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1511235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps |= S_028854_EXPORT_COLORS(num_cout); 1521235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (!exports_ps) { 1531235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* always at least export 1 component per pixel */ 1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps = 2; 1551235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1561235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1571235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_ps_in_control_0 = S_0286CC_NUM_INTERP(rshader->ninput) | 1581235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_0286CC_PERSP_GRADIENT_ENA(1); 1591235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_input_z = 0; 1601235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (have_pos) { 1611235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_ps_in_control_0 |= S_0286CC_POSITION_ENA(1) | 1621235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_0286CC_BARYC_SAMPLE_CNTL(1); 1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_input_z |= 1; 1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1651235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0, spi_ps_in_control_0, 0xFFFFFFFF, NULL); 1661235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1, S_0286D0_FRONT_FACE_ENA(have_face), 0xFFFFFFFF, NULL); 1671235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z, 0xFFFFFFFF, NULL); 1681235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1691235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028840_SQ_PGM_START_PS, 170d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo); 1711235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1721235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028850_SQ_PGM_RESOURCES_PS, 1731235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_NUM_GPRS(rshader->bc.ngpr) | 1741235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_STACK_SIZE(rshader->bc.nstack), 1751235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0xFFFFFFFF, NULL); 1761235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1771235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028854_SQ_PGM_EXPORTS_PS, 1781235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps, 0xFFFFFFFF, NULL); 1791235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1801235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0288CC_SQ_PGM_CF_OFFSET_PS, 1811235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0x00000000, 0xFFFFFFFF, NULL); 1821235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1831235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->uses_kill) { 1841235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* only set some bits here, the other bits are set in the dsa state */ 1851235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1861235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_02880C_DB_SHADER_CONTROL, 1871235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_02880C_KILL_ENABLE(1), 1881235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_02880C_KILL_ENABLE(1), NULL); 1891235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 190738aa29289296512959cbb37d8602131dae44dabDave Airlie r600_pipe_state_add_reg(rstate, 191738aa29289296512959cbb37d8602131dae44dabDave Airlie R_03E200_SQ_LOOP_CONST_0, 0x01000FFF, 192738aa29289296512959cbb37d8602131dae44dabDave Airlie 0xFFFFFFFF, NULL); 1931235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1941235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1951235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader) 1961235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 1971235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 1981235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 1991235becaa1cf7e29f580900592563c3329d326deJerome Glisse void *ptr; 2001235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2011235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* copy new shader */ 2021235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 203294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0); 2041235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 2051235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -ENOMEM; 2061235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 207294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse ptr = r600_bo_map(rctx->radeon, shader->bo, 0, NULL); 2081235becaa1cf7e29f580900592563c3329d326deJerome Glisse memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * 4); 209294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse r600_bo_unmap(rctx->radeon, shader->bo); 2101235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2111235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* build state */ 2121235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->flat_shade = rctx->flatshade; 2131235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (rshader->processor_type) { 2141235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_VERTEX: 2151235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 2161235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_vs(ctx, shader); 2171235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 2181235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_vs(ctx, shader); 2191235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2201235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2211235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_FRAGMENT: 2221235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 2231235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_ps(ctx, shader); 2241235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 2251235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_ps(ctx, shader); 2261235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2271235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2281235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 2291235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2301235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2311235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_context_pipe_state_set(&rctx->ctx, &shader->rstate); 2321235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2331235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2341235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2351235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *rshader) 2361235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 2371235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 2381235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *shader = &rshader->shader; 2391235becaa1cf7e29f580900592563c3329d326deJerome Glisse const struct util_format_description *desc; 2401235becaa1cf7e29f580900592563c3329d326deJerome Glisse enum pipe_format resource_format[160]; 2411235becaa1cf7e29f580900592563c3329d326deJerome Glisse unsigned i, nresources = 0; 2421235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_bc *bc = &shader->bc; 2431235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_bc_cf *cf; 2441235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_bc_vtx *vtx; 2451235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2461235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->processor_type != TGSI_PROCESSOR_VERTEX) 2471235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2486dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie /* doing a full memcmp fell over the refcount */ 2496dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie if ((rshader->vertex_elements.count == rctx->vertex_elements->count) && 2506dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie (!memcmp(&rshader->vertex_elements.elements, &rctx->vertex_elements->elements, 32 * sizeof(struct pipe_vertex_element)))) { 2511235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2521235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2531235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->vertex_elements = *rctx->vertex_elements; 2541235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rctx->vertex_elements->count; i++) { 2551235becaa1cf7e29f580900592563c3329d326deJerome Glisse resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format; 2561235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 257294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse r600_bo_reference(rctx->radeon, &rshader->bo, NULL); 2581235becaa1cf7e29f580900592563c3329d326deJerome Glisse LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) { 2591235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (cf->inst) { 2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX: 2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC: 2621235becaa1cf7e29f580900592563c3329d326deJerome Glisse LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) { 2631235becaa1cf7e29f580900592563c3329d326deJerome Glisse desc = util_format_description(resource_format[vtx->buffer_id]); 2641235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (desc == NULL) { 2651235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]); 2661235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2671235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2681235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_x = desc->swizzle[0]; 2691235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_y = desc->swizzle[1]; 2701235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_z = desc->swizzle[2]; 2711235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_w = desc->swizzle[3]; 2721235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2731235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2741235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 2751235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2761235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2771235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2781235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r600_bc_build(&shader->bc); 2791235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2801235becaa1cf7e29f580900592563c3329d326deJerome Glisse 281dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *shader) 2821235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 2831235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 2841235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 2851235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2861235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader == NULL) 2871235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2881235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* there should be enough input */ 2891235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rctx->vertex_elements->count < shader->shader.bc.nresource) { 2901235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("%d resources provided, expecting %d\n", 2911235becaa1cf7e29f580900592563c3329d326deJerome Glisse rctx->vertex_elements->count, shader->shader.bc.nresource); 2921235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2931235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2941235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_shader_update(ctx, shader); 2951235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) 2961235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 2971235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r600_pipe_shader(ctx, shader); 2981235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2991235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3001235becaa1cf7e29f580900592563c3329d326deJerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader); 301dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens) 3021235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 3031235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 3041235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 3051235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3061235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n"); 3071235becaa1cf7e29f580900592563c3329d326deJerome Glisse//tgsi_dump(tokens, 0); 3081235becaa1cf7e29f580900592563c3329d326deJerome Glisse shader->shader.family = r600_get_family(rctx->radeon); 3091235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_shader_from_tgsi(tokens, &shader->shader); 3101235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 3111235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("translation from TGSI failed !\n"); 3121235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 3131235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 3141235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_bc_build(&shader->shader.bc); 3151235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 3161235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("building bytecode failed !\n"); 3171235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 3181235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 3191235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "______________________________________________________________\n"); 3201235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 3211235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 3221235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3231235becaa1cf7e29f580900592563c3329d326deJerome Glisse/* 3241235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader 3251235becaa1cf7e29f580900592563c3329d326deJerome Glisse */ 3262b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 3272b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 3282b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 3292b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 3302b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 3312b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 3322b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 3332b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 3342b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 3352b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 3362b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_bc *bc; 3372b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 3382b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse u32 value[4]; 339cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 340cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 341e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe u32 max_driver_temp_used; 3422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 3432b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 3442b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 3452b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 3462b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 3472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 3482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 3492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 3502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 35150526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[]; 35242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 36272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 366c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 367a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 37172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 372a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 37447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Src[j].Register.Dimension || 375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Absolute) { 37647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported src %d (dimension %d|absolute %d)\n", j, 37747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie i->Src[j].Register.Dimension, 37847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie i->Src[j].Register.Absolute); 379de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 38347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 38447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 38972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 39072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 39150526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int gpr) 39250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 39350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 39450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie struct r600_bc_alu alu; 39550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 39650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 39750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 39850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 39950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 40050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 40150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 40250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 40350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 40450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 40550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.sel = ctx->shader->input[gpr].gpr; 40650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 40750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 40850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 40950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 41050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.src[0].chan = (1 - (i % 2)); 41150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + gpr; 41250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 41350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 41450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 41550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 41650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 41750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 41850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 41950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 42050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 42150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie} 42250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 42350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 42572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx vtx; 428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 43072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 43635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx->type == TGSI_PROCESSOR_VERTEX) { 439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* turn input into fetch */ 440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&vtx, 0, sizeof(struct r600_bc_vtx)); 441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.inst = 0; 442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.fetch_type = 0; 443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.buffer_id = i; 444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register containing the index into the buffer */ 445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_gpr = 0; 446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_sel_x = 0; 447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.mega_fetch_count = 0x1F; 448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_gpr = ctx->shader->input[i].gpr; 449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_x = 0; 450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_y = 1; 451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_z = 2; 452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_w = 3; 453e973221538d5edfad62abedf5b37a4fb774d71fcDave Airlie vtx.use_const_fields = 1; 454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_vtx(ctx->bc, &vtx); 455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 45850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == 2) { 45950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 46050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie evergreen_interp_alu(ctx, i); 46150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 46835e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 47233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 47347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 48072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 48172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 482be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 483be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 484be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 485be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 486be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 48872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 491c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 492457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 49572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 501d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie ctx.bc->use_mem_constant = shader->use_mem_constant; 502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 509076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 510076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 511076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 512076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [256,511] correspond to cfile constants c[0..255]. 513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 514076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 515076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 516076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 517076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 537d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie if (ctx.shader->use_mem_constant) 538d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie ctx.file_offset[TGSI_FILE_CONSTANT] = 128; 539d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie else 540d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie ctx.file_offset[TGSI_FILE_CONSTANT] = 256; 541d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253; 543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 546cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 547cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 548cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen 549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 554cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 555cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 556cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 557cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 558cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 559cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 560cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 561cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 562cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 563cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 574be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 575be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 576be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 57850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (ctx.bc->chiprev == 2) 57950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 58050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 58150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 5852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse r = r600_bc_add_literal(ctx.bc, ctx.value); 586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 596457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 597457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 598c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 599c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 600c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 601c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 602c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 603c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 604c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 605c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 606c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 607c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 608a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 609457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 612c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 613c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 615457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 616457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 617457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 618457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 619457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 620457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 621457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 626b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 627c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 6285f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 629c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 630b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_x = 2; 631b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_y = output[i].swizzle_z = output[i].swizzle_w = 7; 632c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 634de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 639de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 64372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 644457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 645457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 646457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 647457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 648457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 649457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 650457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 651457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 652457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 653457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 654457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 655457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 656457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 657457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 658457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 659457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 660457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 661457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 662457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 663457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 6647e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 665457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 667c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 668481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 669481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 670481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 671481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 672481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 673481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 674481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 675481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 676481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 677481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 678608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 679481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 680a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 681481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 682481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 683457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 684457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 685457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (i == (noutput - 1)) { 686457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].end_of_program = 1; 687457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 688b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 689b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 690a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 691c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 692c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 693457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 694457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 695c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 699cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 703cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 723cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen int index; 7247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(r600_src, 0, sizeof(struct r600_bc_alu_src)); 725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = tgsi_src->Register.Index; 726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = 0; 728cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen index = tgsi_src->Register.Index; 729cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[0] = ctx->literals[index * 4 + 0]; 730cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[1] = ctx->literals[index * 4 + 1]; 731cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[2] = ctx->literals[index * 4 + 2]; 732cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[3] = ctx->literals[index * 4 + 3]; 733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 73447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_src->Register.Indirect) 73547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_src->rel = V_SQ_REL_RELATIVE; 7361bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse r600_src->neg = tgsi_src->Register.Negate; 737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 7467a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 7477a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 75247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 75347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 7547a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 7557a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 7567a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 7607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle) 7617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 7627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse switch (swizzle) { 7637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 0: 7647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleX; 7657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 1: 7667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleY; 7677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 2: 7687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleZ; 7697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 3: 7707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleW; 7717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse default: 7727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 7737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 7747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 7757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 7767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 7777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 7787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 7797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 7807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, k, nconst, r; 7817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 7827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 7837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 7847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse nconst++; 7857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 7867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]); 7877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) { 7887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 7897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 7907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 7917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 7929d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 793be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 7947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (k = 0; k < 4; k++) { 7957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 796a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 7979d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 7987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = k; 799be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 8007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = k; 8017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 8027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (k == 3) 8037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 8047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 8057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8089d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 8097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse j--; 8107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 8137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 8147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 815be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 816be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 817be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 818be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 819be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct r600_bc_alu alu; 82020846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee int i, j, k, nliteral, r; 821be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 822be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 823be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) { 824be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie nliteral++; 825be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 826be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 8279d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 8289d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) { 829be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 830be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (k = 0; k < 4; k++) { 831be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 832a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 8339d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 834be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].chan = k; 835be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 836be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.chan = k; 837be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.write = 1; 838be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (k == 3) 839be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.last = 1; 840be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 841be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 842be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 843be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 8449d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = r600_bc_add_literal(ctx->bc, &ctx->literals[inst->Src[i].Register.Index * 4]); 845be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 846be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 8479d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 8489d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse j--; 849be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 850be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 851be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return 0; 852be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 853be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 854d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 860d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie int lasti = 0; 861d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 862d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 863d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) { 864d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 865d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 866d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 8687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 8697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8719d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 8729d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 8739d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 874d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 875d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 876d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 877d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 879d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 880d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (r) 881d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return r; 882d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 883d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 884d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 885de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 8867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 8877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 889d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 890d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0] = r600_src[1]; 891d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[1], i); 892d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 893d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1] = r600_src[0]; 894d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 897de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 9017a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 9027a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 9037a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 904de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 905de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 906de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 907d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 908de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 909de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 910de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 912de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 914de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 916de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 917d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 918d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 919d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 920d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 921d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 922d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 923d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 924d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 925d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 926d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 92788f5976484842671ecb2cefcfa91838a43032359Dave Airlie/* 92888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 92988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 93088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 93188f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 93292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx, 93392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]) 93488f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 93588f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 93692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 93788f5976484842671ecb2cefcfa91838a43032359Dave Airlie uint32_t lit_vals[4]; 93892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 93992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 94088f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(lit_vals, 0, 4*4); 94188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_split_constant(ctx, r600_src); 94288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 94388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 9449d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 9459d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 9469d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 947be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 948be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 949be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 950be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 951be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 95288f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0 /(3.1415926535 * 2)); 95388f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(0.5f); 95488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 95588f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 956a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 95788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 95888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 95988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 96088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 96188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 96288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 96388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0] = r600_src[0]; 96488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 96588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 966921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 96788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 968921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 96988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 97088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 97188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 97288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 97388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 97488f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 97588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 97688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 97788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 97888f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 979a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 98088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 98188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 98288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 98388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 98488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 98588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 98688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 98788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 98888f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 98988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 99088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 99188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 99288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (ctx->bc->chiprev == 0) { 99388f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(3.1415926535897f * 2.0f); 99488f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-3.1415926535897f); 99588f5976484842671ecb2cefcfa91838a43032359Dave Airlie } else { 99688f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0f); 99788f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-0.5f); 99888f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 99988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 100088f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1001a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 100288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 100388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 100488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 100588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 100688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 100788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 100888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 100988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 101088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 1011921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 101288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1013921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 101488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 101588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 101688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 101788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 101888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 101988f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 102088f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 102188f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 102292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 102392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 102492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 102592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 102692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 102792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 102892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 102992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 103092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1031be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int lasti = 0; 103292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 103392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = tgsi_setup_trig(ctx, r600_src); 103492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 103592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 103688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 103788f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 103888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 103988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 104088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 104188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 104288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 104388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 104488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 104588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 104688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 104788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 104888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 104988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 105088f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 105188f5976484842671ecb2cefcfa91838a43032359Dave Airlie for (i = 0; i < 4; i++) { 1052be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) 1053be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie lasti = i; 1054be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 1055be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1056be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1057be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1058be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 105988f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1060a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1061be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1062be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 106388f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 106488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 106588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 1066be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 106788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 106888f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 106988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 107088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 107188f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 107288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 107388f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 107488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 107592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 107692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 107792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 107892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 107992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 108092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 108192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 108257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 108357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 108457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 108557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 108657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_setup_trig(ctx, r600_src); 108757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 108857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 108957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 109092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 109192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 109257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 109357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 109457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 109557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 109657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 109757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 109892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 109957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 110057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 110157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 110257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 110357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 110457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 110557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 110692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 110792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 110857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 110957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 111057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 111157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 111257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 111357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 111457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 111557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 111657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 111757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 111857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 111957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 112057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 112157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 112292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1123ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1124ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 1125ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1126ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1127ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1128ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1129ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1130ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1131ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1132ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1133ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1134ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1135ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1136ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1137ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1138ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1139ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1140ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1141ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1142ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 1143ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1144ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1145ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1146ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1147ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1148ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 1149ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1150ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1151ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1152ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1153ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1154ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1155ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1156ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1157ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1158ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1159ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1160ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1161ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1162ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1164ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1165ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 1167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 117192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 117292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 117392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1174094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1175094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 1176094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1177094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 1178094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1179094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1180094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 1181094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1182094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 11834502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1184094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 11854502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1186921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 11874502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 11884502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 11894502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 11904502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 11914502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 11924502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 11934502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 11944502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 11954502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 11964502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1197094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1198094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1199094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 1200094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1201094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1202094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1203094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 12044502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 12054502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 12064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 12074502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 12084502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 12094502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 12104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1211094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1212094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1213094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 12140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 12150bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 12160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 1218ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie struct r600_bc_alu_src r600_src[3]; 12190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 12200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1221ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie r = tgsi_split_constant(ctx, r600_src); 1222ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie if (r) 1223ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie return r; 1224d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 1225d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie if (r) 1226d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie return r; 1227ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 12287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.x, <- 1.0 */ 12297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1230a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1231921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 12327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 12337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 12347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 12377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.y = max(src.x, 0.0) */ 12427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1243a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 1244ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1245921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 124685e401d8bfd80450a31eac234e13008e33e64227Dave Airlie alu.src[1].chan = 0; 12477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 12487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 12517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.w, <- 1.0 */ 12567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1257a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1258921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 12597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 12607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 12617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 12647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 12657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12695ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 12705ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 12715ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 12725ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 12730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 12740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 12756a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 12766a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 12776a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 12780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 12790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1280a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1281ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1282ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 12830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 12840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 12850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 12860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 12870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 12880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 12890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 12900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12915ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 12925ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 12935ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 129485e401d8bfd80450a31eac234e13008e33e64227Dave Airlie 12956a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 12966a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 12970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 12990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1300a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 1301ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 13027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 13030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 13040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 1305ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 1306ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[2] = r600_src[0]; 13077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[2].chan = tgsi_chan(&inst->Src[0], 0); 13080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 13090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 13100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 13110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 13120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13150bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13175ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 13185ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 13195ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 13200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 13210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1322a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 13230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 13240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 13250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 13260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 13330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 13340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 13350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 133642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 133742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 133842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 133942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct r600_bc_alu alu; 134042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 134142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 134242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1343df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1344df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1345df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1346df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1347df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1348df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1349df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 135042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 135142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 135242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 135342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 135442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 135542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].abs = 1; 135642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 135742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 135842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 135942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 136042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 136142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 136242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 136342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 136442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 136542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 136642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 136742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 136842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 136942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1370a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 13717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 13727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 1374a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 13757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 13767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 13777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 13787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1379a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 13807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 13817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 13857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 13867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 13877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 13887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 13917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 13927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 13937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1394a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1395a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1396a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1397a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1398a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1399a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1400a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1401a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1402a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 1403a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 1404a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1405a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1406a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 1407a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1408a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1409a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1410a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1411a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1412a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1413a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 14145ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 14155ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 14165ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 1417a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1418a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1419a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1420a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1421a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1422a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1423a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1424a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1425a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1426a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1427a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 1428a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1429a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 1430a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1431a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1432a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1433a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 1434a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1436a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1440e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1441e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1442e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1443a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 1444a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1445a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE); 1446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]); 1447a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1448a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1449a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[1], 0); 1450a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1451a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1452a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1453a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1454a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1455a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1456a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1457e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1458e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1459e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1460a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 1461a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1462a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1463a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1464a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1465a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1466a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1467a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1468a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1469a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1470e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1471e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1472e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1473a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1474a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1475a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 14760d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 14770d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 14780d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14790d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu alu; 14800d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu_src r600_src[3]; 1481921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 14820d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14830d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_split_constant(ctx, r600_src); 14840d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 14850d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 14869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 14879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 14889d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 14890d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14900d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 14910d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 14920d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1493a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 14940d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1495cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 14960d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1497cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 14980d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14990d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0] = r600_src[0]; 15000d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 15010d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1502921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 15030d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15040d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2] = r600_src[0]; 15050d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[0], i); 15060d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 15070d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 15080d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15090d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15100d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15110d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 1512cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 1513cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie if (r) 1514cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie return r; 15150d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15160d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 15170d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 15180d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1519a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 15200d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 15210d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 15220d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15230d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15240d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15250d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1526cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 15270d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 15280d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1529921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 15300d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 15310d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15320d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1533cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 15340d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15350d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 15360d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 15370d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15380d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15390d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15400d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 15410d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 15420d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 15430d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1544cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1545cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1546cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1547cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1548cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 15499961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 15509961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse if (r) 15519961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse return r; 1552cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 1553cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1554cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1555a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 15566c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1557cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1558a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1559cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1560cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1561cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1562cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1563cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1564cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1565cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1566cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1567cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1568cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1569cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1570cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1571cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1572cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1573cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1574cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 15827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 15837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 15847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 15859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 15869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 15879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* do it in 2 step as op3 doesn't support writemask */ 1589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 15937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 15947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.sel = ctx->temp_reg; 1597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1598cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 1600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1607cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1608cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1609cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1610cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1611cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1612cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1614cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1615cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1616cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 16177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 16187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 16197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 16209d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 16219d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 16229d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1625cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1626cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 16277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 16287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1629cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.sel = ctx->temp_reg; 1631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1632cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1633cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1634cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1635cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1636cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1637921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1638cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1639cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1640cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1641cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1642cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1643921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1647e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1648e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1649e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1650e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1651e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1652e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1653e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1655cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1664cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 166733241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 166833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 166933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 167033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1671641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1672641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 1673b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie int r, i; 1674bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 1675bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie boolean src_not_temp = inst->Src[0].Register.File != TGSI_FILE_TEMPORARY; 1676bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie uint32_t lit_vals[4]; 1677641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1678641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 1679641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1680b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1681b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 1682b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1683a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1684bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1685bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1686bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1687bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1688b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 1689b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1690b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1691b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1692b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1693b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1694b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1695b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 16969d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 1697b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1698b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1699a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1700b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 1701b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 3; 1702bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1703bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1704bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1705b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1706b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1707b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1708b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1709b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1710b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1711b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1712b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1713b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1714a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1715921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1716b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1717b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1718b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1719b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1720b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1721b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1722b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1723b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 172407b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1725b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1726bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1727bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1728bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1729bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int src_chan, src2_chan; 1730bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1731bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 1732bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 1733bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1734a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 1735bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie switch (i) { 1736bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 0: 1737bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1738bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 1; 1739bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1740bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 1: 1741bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1742bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 0; 1743bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1744bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 2: 1745bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 0; 1746bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1747bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1748bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 3: 1749bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 1; 1750bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1751bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 175284b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee default: 175384b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee assert(0); 175484b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src_chan = 0; 175584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src2_chan = 0; 175684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee break; 1757bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1758bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1759bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1760bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1761bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan); 1762bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1763bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1764bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1765bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan); 1766bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1767bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 1768bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 1769bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1770bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1771bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1772bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1773bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1774bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1775bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1776bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 1777bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1778a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1779bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1780bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 2; 1781bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].abs = 1; 1782bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1783bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 2; 1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1787bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1788bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1789bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1790bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 1791bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 1792bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * muladd has no writemask, have to use another temp 1793bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 1794bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1795a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1796bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1797bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1798bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1799bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 1800bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1801bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 1802bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1803bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1804bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1805bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1806bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1807bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 1808bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1809bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1810bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1811bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1812bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1813bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1814bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1815a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1816bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1817bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1818bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1819bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 1820bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1821bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 1822bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1823bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1824bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1825bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1826bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1827bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 1828bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1829bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1830bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1831bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1832bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1833bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1834bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1835bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie lit_vals[0] = fui(1.5f); 1836bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1837bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 1838bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 184007b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 1842bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1843bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (src_not_temp) { 1845b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 1846b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1847a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1848b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 1849b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = i; 1850b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1851b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1852b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 1853b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1854b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1855b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1856b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1857b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1858b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1859b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1860b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1861bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1862bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 1863bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (opcode == SQ_TEX_INST_SAMPLE && 1864bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)) 1865bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = SQ_TEX_INST_SAMPLE_C; 186633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 186733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 1868bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 186933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 187033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.sampler_id = tex.resource_id; 1871641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 18726c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 18739d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 18749d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 18759d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 18769d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 187733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 187833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 187933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 188033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 18819a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 1882bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1883bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 1884bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 1885bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 1886bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 1887bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1888bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 188901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 189001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 189101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 18927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 189301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 189401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 1895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) 18975d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie tex.src_sel_w = 2; 1898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_tex(ctx->bc, &tex); 1900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1902bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 1904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 1905bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 190633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 190733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 1908b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 1909b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 1910b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1912b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 1913b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 1914b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 1915b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 19167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 19177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 19187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 19199d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 19209d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 19219d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1922b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 1923b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1924b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1925a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 1926921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1927b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 19287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 19297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1930b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 1931b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1932b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1933b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1934b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1935b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1936b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1937b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1938b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1939b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1940b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1941b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1942b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1943b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1944b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1945b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 1946b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1947b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1948a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1949b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1950b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 19517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[2]; 19527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 1953b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1954b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1955b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1956b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1957b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1958b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1959b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1960b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1961b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1962b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1963b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1964b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1965b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1966b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1967b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 1968b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1969b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1970a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1971b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 19727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[0]; 19737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 19747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[1]; 19757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 1976b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 1977b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 1978b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1979b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1980b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1981b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1982b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1983b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1984b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1985b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1986b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1987b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return tgsi_helper_copy(ctx, inst); 1988b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 1989b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 199087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 199187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 199287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 199387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu_src r600_src[3]; 199487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu alu; 199587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int use_temp = 0; 199687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 199787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 199887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_split_constant(ctx, r600_src); 199987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 200087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 20019d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 20029d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 20039d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 200487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 200587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 200687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie use_temp = 1; 200787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 200887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie for (i = 0; i < 4; i++) { 200987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2010a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 201187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0] = r600_src[0]; 201287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 201387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 201487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1] = r600_src[2]; 201587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 201687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 201787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2] = r600_src[1]; 201887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[1], i); 201987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 202087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 202187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.sel = ctx->temp_reg; 202287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie else { 202387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 202487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 202587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 202687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 202787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 202887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 202987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 203087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (i == 3) 203187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 203287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 203387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 203487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 203587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 203687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 203787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return tgsi_helper_copy(ctx, inst); 203887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 203987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 204087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 20410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 20420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 20430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu_src r600_src[3]; 20450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu alu; 20460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 20470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 20480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 20500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 20510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_split_constant(ctx, r600_src); 20530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 20540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 20559d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 20569d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 20579d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 20589d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 20590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 20600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2061a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 20620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 20640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 20650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 20660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 20670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 20690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 20700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 20720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 20730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 20750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 20760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 20770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 20780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 20800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 20810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 20820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 20830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 20850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 20860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 20880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 20890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 20910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 20920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 20930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 20940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 20960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 20970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 20980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 21000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 21010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 21020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 21030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 21041e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck 21051e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 21061e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck if (r) 21071e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck return r; 21080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 21110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2112a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 21130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 21150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 21180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 21210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 21240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 21270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 21280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 21310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 21340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 21370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 21400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 21430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 21440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 21470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 21480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 21490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 21510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 21520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie else { 21530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 21540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 21550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 21560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 21580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 21590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 21600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 21610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 21620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 21630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 21640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 21651e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck 21661e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 21671e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck if (r) 21681e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck return r; 21690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 21710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 21720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 21730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 21740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 217536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 217636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 217736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 217836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu_src r600_src[3]; 217936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu alu; 218009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 218136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 218236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 218336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 218436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 218536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2186a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 218736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 218836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 218936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 219036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 219136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 219236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 219336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 219436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 219536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 219636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 219736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 219836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 219936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 220036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 22015ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 22025ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 22035ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 22045ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 2205a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 220636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = ctx->temp_reg; 220736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 220836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 220936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 221036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 221136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 221236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 221336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 221436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 221536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 22165ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 22175ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 22185ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 22195ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 222036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 222136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 222236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 222336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 222436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 222536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2226a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 222736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0] = r600_src[0]; 222836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 222936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 223036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 223136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 223236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 223336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 223436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 223536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// if (r) 223636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// return r; 223736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 223836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 223936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 224036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 224136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 224236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 224336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 224436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 22455ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 22465ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 22475ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 224836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 224936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 225036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 225136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 225236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2253a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 225436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 225536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 225636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 225736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 225836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 225936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 226036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 226136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 2; 226236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 226336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 226436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 226536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 226636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 226736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 22685ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 22695ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 22705ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 227136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 227236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 227336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 227436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 227536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 227636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2277a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 227836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 227936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 228036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 228136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 228236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 228336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 228436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 228536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 228636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 228736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 22885ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 22895ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 22905ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 229136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 229236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 229336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 229487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2295460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2296460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2297460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2298460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct r600_bc_alu alu; 2299460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 2300460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2301460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.x = floor(log2(src)); */ 2302460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 2303460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2304460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2305460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2306460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2307460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2308460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2309460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2310460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2311460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2312460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2313460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2314460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2315460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2316460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2317460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2318460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2319460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2320460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2321460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2322460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2323460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2324460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2325460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2326460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2327460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2328460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2329460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2330460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2331460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2332460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2333460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2334460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2335460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2336460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2337460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2338460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2339460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2340460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2341460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 234296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck /* result.y = src.x / (2 ^ floor(log2(src.x))); */ 2343460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2344460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2345460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 234696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 234796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 234896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 234996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 235096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 235196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 235296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 235396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 235496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 235596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 235696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 235796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 235896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 235996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 236096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 236196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 236296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 236396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 236496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 236596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 236696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 236796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 236896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 236996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 237096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 237196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 237296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 237396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 237496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 237596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 237696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 237796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 237896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 237996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 238096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 238196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 238296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 238396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 238496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 238596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 238696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 238796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 238896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 238996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 239096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 239196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 239296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 239396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 239496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 239596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 239696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 239796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 239896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 239996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 240096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 240196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 240296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 240396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 240496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 240596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 240696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 240796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 240896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 240996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 241096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 241196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 241296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 241396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 241496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 241596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 241696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 241796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 241896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 241996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 242096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 242196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 242296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 242396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 242496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 242596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 242696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 242796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 242896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 242996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 243096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 243196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 243296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 243396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 243496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2435460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2436460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2437460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2438460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2439460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2440460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2441460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2442460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2443460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2444460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2445460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2446460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2447460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2448460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2449460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2450460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.z = log2(src);*/ 2451460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 2452460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2453460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2454460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2455460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2456460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2457460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2458460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2459460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2460460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2461460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2462460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2463460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 2; 2464460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2465460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2467460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2469460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2470460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2471460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2472460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2473460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2474460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2475460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2476460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 2477460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2478460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2479460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2480460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2481460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2482460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2483460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2484460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2485460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2486460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2487460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2488460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2489460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2490460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2491460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2492460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2493460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2494460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2495460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2496460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2497460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2498460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2499460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 250050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie/* r6/7 only for now */ 250147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airliestatic int tgsi_arl(struct r600_shader_ctx *ctx) 250247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 250347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie /* TODO from r600c, ar values don't persist between clauses */ 250447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 250547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct r600_bc_alu alu; 250647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 250747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 250847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 250947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR; 251047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 251147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 251247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 251347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 251447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 251547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 251647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.last = 1; 251747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 2518a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)); 251947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 252047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 2521c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie ctx->bc->cf_last->r6xx_uses_waterfall = 1; 252247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 252347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 252447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 252557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 252657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 252757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 252857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct r600_bc_alu alu; 252957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 253057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 253157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 253257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 253357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2534a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 253557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 253657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 253757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 253857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 253957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 3) { 254057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 254157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 254257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 254357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 254457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 254557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 254657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 254757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 254857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 2) { 254957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 255057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 255157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]); 255257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 255357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 255457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 255557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 255657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 255757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 255857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 255957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 256057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 256157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 256257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 256357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 256457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2565a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 2566a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2567a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 256809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_bc_alu alu; 2569a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 2570a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2571a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2572a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 2573a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 2574a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2575a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 2576a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 2577a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 2578a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2579a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2580a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2581a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2582a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2583a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 2584a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 2585a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2586a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 2587a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2588a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 2589a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2590a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2591a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2592a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2593a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2594a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 2595a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2596a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 2597a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = pops; 2598a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2599a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2600a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 260109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 2602a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 260309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 260409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 260509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 260609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 260709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 260809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 260909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 261009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 261109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 261209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 261309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 261409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 261509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 261609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2617a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 261809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 261909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 262009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 262109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 262209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 262309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 262409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 262509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 262609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 262709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 262809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 2629a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 2630a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 2631a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 263209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 263309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 263409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 263509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 263609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 263709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 263809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 263909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 264009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 264109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 264209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 264309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 264409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 264509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 264609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 264709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 264809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 264909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 265009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 265109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 265209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 265309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 265409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 265509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 265609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 265709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 265809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 265909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 266009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 266109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 266209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 266309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 266409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid, 266509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sizeof(struct r600_bc_cf *) * (sp->num_mid + 1)); 266609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 266709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 266809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2669a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 267009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 267109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2672a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 267309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 267409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 267509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 267609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 267709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 267809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 267909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 268009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 268109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 268209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 268309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 268409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 268509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 268609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 268709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 268809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 268909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 269009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 269109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 269209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 269309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 269409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 269509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 269609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 269709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 269809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 269909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2700a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 270109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 270209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 270309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 270409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2705a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 270609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 270709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 270809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 270909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 271009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 271109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 271209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 271309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 271409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 271509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 271609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 271709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 271809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 271909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 272009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 272109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 272209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 272309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 272409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 272509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 272609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 272709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 272809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 272909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 273009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 273109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 273209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 273309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 273509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 273609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 273709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 273809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 273909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2740a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 274109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2742a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 274309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 274409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 274509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 274609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 2747a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2748a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2749a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2750a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 2751a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2752a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 2753a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 2754a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 275509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 2756a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 2757a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2758a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2759a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2760a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 2761a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2762a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 2763a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 2764a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 2765a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 2766a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 2767a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2768a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 2769a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 2770a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 2771a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 277209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 2773a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 277409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 277509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 277609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 277709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 277809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 277909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 278009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 278109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2782a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 278309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 278409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 2785a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 278609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 278709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 278809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 278909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 279009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 279109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 279209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 279309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 279409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2795a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 279609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 279709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 279809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 279909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 280009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 280109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 280209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 280309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 280409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 280509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 280609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 280709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 280809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 280909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 281009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 281109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 281209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 281309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 281409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 281509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 281609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 281709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 281809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 281909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 282009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 282109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 282209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 282309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 282409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 282509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 282609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 282809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 283109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 283309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 283609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 2842a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2843a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2844a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 284647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_arl}, 2847de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 28480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 2849df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 2850df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 2851df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 2852df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 2853df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 2854df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 2855df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 285642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 285736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 2858460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 2859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 2860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2861cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2862cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 286357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 2864dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 2865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 2866d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 2867be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 2868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 2869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2870b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 2871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2873de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2874de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2875de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2876de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2877de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28783af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 2879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28803af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 2881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 28834558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 2884a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 28850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 2886de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2887de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28887a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 2889de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2890e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 289188f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 28923af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 28933af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 28944502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 2895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2897de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29000d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 2901de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29020d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 290388f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 2904d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 29050d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 2906de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2907b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2908de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2909b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2910de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2912de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2914de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2916de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2918de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2919de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29200d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 292187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 292292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 2923d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 2924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2925de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2926cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 292809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 2929a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 2930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2931de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2933a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 2934a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 2935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2936de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2937de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2938de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2939de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2941de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2942de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29434558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 2944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 295409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 2955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 295709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 2958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 295909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 2960de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2968de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2969de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2970de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2972de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2973de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2974de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2975de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2976094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 2977de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 2978de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2979de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2980de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2982de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2983de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2984de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2985de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2986de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2987de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2988de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2989de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2990de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2991de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2992de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2993de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2994de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2995de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2997de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2998de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3000de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3001de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3003de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3004de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3005de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 300850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 300950526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 301050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 301250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 301350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 301450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate}, 301550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 301650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 301850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 301950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 302050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 302150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 302250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 302350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 302450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 302550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 302650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 302750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 302850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 302950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 303150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 303450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 303750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 303950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 304150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 304250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 304350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 304450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 304550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 304750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 304950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 305050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 305150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 305250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 305350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 305950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 306150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 306250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 306350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 306450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 306650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 306850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 307950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 308050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 308150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 308250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 308550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 308750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 308850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 308950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 309250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 309350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 309450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 310250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 310450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 311350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 311650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 311850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 312050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 312650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 313550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 313650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 313750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 3166