r600_shader.c revision fc6caef4cb67fb13642c5ebccee53019d1764df6
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; 1101e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie unsigned i, tmp, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z, spi_ps_in_control_1; 1111e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie int pos_index = -1, face_index = -1; 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)); 1188a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie if (rshader->input[i].centroid) 1198a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie tmp |= S_028644_SEL_CENTROID(1); 12068014c8d19559576d368e158932278df05fe659bDave Airlie if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR) 12168014c8d19559576d368e158932278df05fe659bDave Airlie tmp |= S_028644_SEL_LINEAR(1); 12268014c8d19559576d368e158932278df05fe659bDave Airlie 1231235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_POSITION) 1241e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie pos_index = i; 1251235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_COLOR || 1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->input[i].name == TGSI_SEMANTIC_BCOLOR || 1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->input[i].name == TGSI_SEMANTIC_POSITION) { 1281235becaa1cf7e29f580900592563c3329d326deJerome Glisse tmp |= S_028644_FLAT_SHADE(rshader->flat_shade); 1291235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1301235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_FACE) 1311e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie face_index = i; 1321235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC && 1331235becaa1cf7e29f580900592563c3329d326deJerome Glisse rctx->sprite_coord_enable & (1 << rshader->input[i].sid)) { 1341235becaa1cf7e29f580900592563c3329d326deJerome Glisse tmp |= S_028644_PT_SPRITE_TEX(1); 1351235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1361235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, tmp, 0xFFFFFFFF, NULL); 1371235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1381235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rshader->noutput; i++) { 13951f9cc4759c23b74a2e4d9c79b0a5df27d403f54Dave Airlie if (rshader->output[i].name == TGSI_SEMANTIC_POSITION) 1407777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie r600_pipe_state_add_reg(rstate, 1417777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie R_02880C_DB_SHADER_CONTROL, 1427777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie S_02880C_Z_EXPORT_ENABLE(1), 1437777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie S_02880C_Z_EXPORT_ENABLE(1), NULL); 14439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL) 14539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie r600_pipe_state_add_reg(rstate, 14639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie R_02880C_DB_SHADER_CONTROL, 14739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie S_02880C_STENCIL_REF_EXPORT_ENABLE(1), 14839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie S_02880C_STENCIL_REF_EXPORT_ENABLE(1), NULL); 1491235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1501235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1511235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps = 0; 1521235becaa1cf7e29f580900592563c3329d326deJerome Glisse num_cout = 0; 1531235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rshader->noutput; i++) { 15439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie if (rshader->output[i].name == TGSI_SEMANTIC_POSITION || rshader->output[i].name == TGSI_SEMANTIC_STENCIL) 1551235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps |= 1; 1561235becaa1cf7e29f580900592563c3329d326deJerome Glisse else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) { 1571235becaa1cf7e29f580900592563c3329d326deJerome Glisse num_cout++; 1581235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1591235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1601235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps |= S_028854_EXPORT_COLORS(num_cout); 1611235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (!exports_ps) { 1621235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* always at least export 1 component per pixel */ 1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps = 2; 1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1651235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1661235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_ps_in_control_0 = S_0286CC_NUM_INTERP(rshader->ninput) | 1671235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_0286CC_PERSP_GRADIENT_ENA(1); 1681235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_input_z = 0; 1691e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie if (pos_index != -1) { 1701e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie spi_ps_in_control_0 |= (S_0286CC_POSITION_ENA(1) | 1711e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie S_0286CC_POSITION_CENTROID(rshader->input[pos_index].centroid) | 1721e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie S_0286CC_POSITION_ADDR(rshader->input[pos_index].gpr) | 1731e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie S_0286CC_BARYC_SAMPLE_CNTL(1)); 1741235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_input_z |= 1; 1751235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1761e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie 1771e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie spi_ps_in_control_1 = 0; 1781e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie if (face_index != -1) { 1791e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie spi_ps_in_control_1 |= S_0286D0_FRONT_FACE_ENA(1) | 1800637044add50b3a4aee8e915b84c18813c9130f3Dave Airlie S_0286D0_FRONT_FACE_ADDR(rshader->input[face_index].gpr); 1811e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie } 1821e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie 1831235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0, spi_ps_in_control_0, 0xFFFFFFFF, NULL); 1841e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1, spi_ps_in_control_1, 0xFFFFFFFF, NULL); 1851235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z, 0xFFFFFFFF, NULL); 1861235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1871235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028840_SQ_PGM_START_PS, 188d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo); 1891235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1901235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028850_SQ_PGM_RESOURCES_PS, 1911235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_NUM_GPRS(rshader->bc.ngpr) | 1921235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_STACK_SIZE(rshader->bc.nstack), 1931235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0xFFFFFFFF, NULL); 1941235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1951235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028854_SQ_PGM_EXPORTS_PS, 1961235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps, 0xFFFFFFFF, NULL); 1971235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1981235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0288CC_SQ_PGM_CF_OFFSET_PS, 1991235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0x00000000, 0xFFFFFFFF, NULL); 2001235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2011235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->uses_kill) { 2021235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* only set some bits here, the other bits are set in the dsa state */ 2031235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 2041235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_02880C_DB_SHADER_CONTROL, 2051235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_02880C_KILL_ENABLE(1), 2061235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_02880C_KILL_ENABLE(1), NULL); 2071235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 208738aa29289296512959cbb37d8602131dae44dabDave Airlie r600_pipe_state_add_reg(rstate, 209738aa29289296512959cbb37d8602131dae44dabDave Airlie R_03E200_SQ_LOOP_CONST_0, 0x01000FFF, 210738aa29289296512959cbb37d8602131dae44dabDave Airlie 0xFFFFFFFF, NULL); 2111235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2121235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2131235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader) 2141235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 2151235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 2161235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 2171235becaa1cf7e29f580900592563c3329d326deJerome Glisse void *ptr; 2181235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2191235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* copy new shader */ 2201235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 221294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0); 2221235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 2231235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -ENOMEM; 2241235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 225294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse ptr = r600_bo_map(rctx->radeon, shader->bo, 0, NULL); 2261235becaa1cf7e29f580900592563c3329d326deJerome Glisse memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * 4); 227294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse r600_bo_unmap(rctx->radeon, shader->bo); 2281235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2291235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* build state */ 2301235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->flat_shade = rctx->flatshade; 2311235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (rshader->processor_type) { 2321235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_VERTEX: 2331235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 2341235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_vs(ctx, shader); 2351235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 2361235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_vs(ctx, shader); 2371235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2381235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2391235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_FRAGMENT: 2401235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 2411235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_ps(ctx, shader); 2421235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 2431235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_ps(ctx, shader); 2441235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2451235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2461235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 2471235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2481235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2491235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_context_pipe_state_set(&rctx->ctx, &shader->rstate); 2501235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2511235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2521235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2531235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *rshader) 2541235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 2551235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 2561235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *shader = &rshader->shader; 2571235becaa1cf7e29f580900592563c3329d326deJerome Glisse const struct util_format_description *desc; 2581235becaa1cf7e29f580900592563c3329d326deJerome Glisse enum pipe_format resource_format[160]; 2591235becaa1cf7e29f580900592563c3329d326deJerome Glisse unsigned i, nresources = 0; 2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_bc *bc = &shader->bc; 2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_bc_cf *cf; 2621235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_bc_vtx *vtx; 2631235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2641235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->processor_type != TGSI_PROCESSOR_VERTEX) 2651235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2666dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie /* doing a full memcmp fell over the refcount */ 2676dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie if ((rshader->vertex_elements.count == rctx->vertex_elements->count) && 2686dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie (!memcmp(&rshader->vertex_elements.elements, &rctx->vertex_elements->elements, 32 * sizeof(struct pipe_vertex_element)))) { 2691235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2701235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2711235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->vertex_elements = *rctx->vertex_elements; 2721235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rctx->vertex_elements->count; i++) { 2731235becaa1cf7e29f580900592563c3329d326deJerome Glisse resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format; 2741235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 275294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse r600_bo_reference(rctx->radeon, &rshader->bo, NULL); 2761235becaa1cf7e29f580900592563c3329d326deJerome Glisse LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) { 2771235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (cf->inst) { 2781235becaa1cf7e29f580900592563c3329d326deJerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX: 2791235becaa1cf7e29f580900592563c3329d326deJerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC: 2801235becaa1cf7e29f580900592563c3329d326deJerome Glisse LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) { 2811235becaa1cf7e29f580900592563c3329d326deJerome Glisse desc = util_format_description(resource_format[vtx->buffer_id]); 2821235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (desc == NULL) { 2831235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]); 2841235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2851235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2861235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_x = desc->swizzle[0]; 2871235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_y = desc->swizzle[1]; 2881235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_z = desc->swizzle[2]; 2891235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_w = desc->swizzle[3]; 2901235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2911235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2921235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 2931235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2941235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2951235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2961235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r600_bc_build(&shader->bc); 2971235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2981235becaa1cf7e29f580900592563c3329d326deJerome Glisse 299dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *shader) 3001235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 3011235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 3021235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 3031235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3041235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader == NULL) 3051235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 3061235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* there should be enough input */ 3071235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rctx->vertex_elements->count < shader->shader.bc.nresource) { 3081235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("%d resources provided, expecting %d\n", 3091235becaa1cf7e29f580900592563c3329d326deJerome Glisse rctx->vertex_elements->count, shader->shader.bc.nresource); 3101235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 3111235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 3121235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_shader_update(ctx, shader); 3131235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) 3141235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 3151235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r600_pipe_shader(ctx, shader); 3161235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 3171235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3181235becaa1cf7e29f580900592563c3329d326deJerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader); 319dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens) 3201235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 3211235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 3221235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 3231235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3241235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n"); 3251235becaa1cf7e29f580900592563c3329d326deJerome Glisse//tgsi_dump(tokens, 0); 3261235becaa1cf7e29f580900592563c3329d326deJerome Glisse shader->shader.family = r600_get_family(rctx->radeon); 3271235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_shader_from_tgsi(tokens, &shader->shader); 3281235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 3291235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("translation from TGSI failed !\n"); 3301235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 3311235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 3321235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_bc_build(&shader->shader.bc); 3331235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 3341235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("building bytecode failed !\n"); 3351235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 3361235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 3371235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "______________________________________________________________\n"); 3381235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 3391235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 3401235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3411235becaa1cf7e29f580900592563c3329d326deJerome Glisse/* 3421235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader 3431235becaa1cf7e29f580900592563c3329d326deJerome Glisse */ 3442b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 3452b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 3462b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 3472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 3482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 3492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 3502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 3512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 3522b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 3532b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 3542b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_bc *bc; 3552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 3562b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse u32 value[4]; 357cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 358cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 359e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe u32 max_driver_temp_used; 360fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* needed for evergreen interpolation */ 361fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_centroid; 362fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_linear; 363fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_perspective; 364fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_interp_gpr; 3652b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 3662b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 3672b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 3682b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 3692b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 3702b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 3712b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 3722b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 3732b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 37450526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[]; 37542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 379de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 38572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 389c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 390a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 39472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 395a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 3978260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 3988260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 3998260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 40447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 40547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 41072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 41172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 412fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 41350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 41450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 41550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie struct r600_bc_alu alu; 416fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 417fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 418fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 419fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 420fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 421fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 422fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 423fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 424fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 425fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 426fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 427fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 428fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 429fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 430fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 431fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 432fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 433fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 434fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 435fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 436fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 437fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 438fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 43950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 44050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 44150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 44250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 44350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 44450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 44550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 44650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 44750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 44850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 449fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 45050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 45150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 45250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 45350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 454fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 455fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 456fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 457fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 458fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 45950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 46050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 46150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 46250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 46350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 46450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 46550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 46650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 46750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 46850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie} 46950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 47050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 47272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx vtx; 475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 47772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 48335e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 4848a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie ctx->shader->input[i].centroid = d->Declaration.Centroid; 485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx->type == TGSI_PROCESSOR_VERTEX) { 487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* turn input into fetch */ 488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&vtx, 0, sizeof(struct r600_bc_vtx)); 489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.inst = 0; 490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.fetch_type = 0; 491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.buffer_id = i; 492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register containing the index into the buffer */ 493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_gpr = 0; 494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_sel_x = 0; 495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.mega_fetch_count = 0x1F; 496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_gpr = ctx->shader->input[i].gpr; 497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_x = 0; 498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_y = 1; 499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_z = 2; 500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_w = 3; 501e973221538d5edfad62abedf5b37a4fb774d71fcDave Airlie vtx.use_const_fields = 1; 502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_vtx(ctx->bc, &vtx); 503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 50650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == 2) { 50750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 508fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) { 509fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].interpolate > 0) { 510fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->shader->input[i].lds_pos = ctx->shader->nlds++; 511fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie evergreen_interp_alu(ctx, i); 512fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 513fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 51450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 52135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 52533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 52647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 53372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 53472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 535be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 536be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 537be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 538be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 539be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 540fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie/* 541fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 542fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 543fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 544fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 545fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 546fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 547fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 548fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 549fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 550fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 551fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 552fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 553fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 554fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 555fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 556fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 557fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 558fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 559fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 560fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 561fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 562fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 563fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 564fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 565fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 566fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 567fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 568fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 569fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 570fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 571fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 572fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 573fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 574fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 575fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 576fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 577fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 578fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 579fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 580fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 581fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 582fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 583fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */ 584fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 585fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 586fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 58872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 591c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 592457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 59572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 608076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 609076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 610076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 611076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [256,511] correspond to cfile constants c[0..255]. 612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 613076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 614076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 615076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 616076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 63284457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == 2) { 633fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 63484457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 639d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 640d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie ctx.file_offset[TGSI_FILE_CONSTANT] = 128; 641d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253; 643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 646cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 647cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 648cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen 649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 654cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 655cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 656cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 657cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 658cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 659cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 660cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 661cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 662cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 663cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 674be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 675be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 676be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 67850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (ctx.bc->chiprev == 2) 67950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 68050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 68150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 6852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse r = r600_bc_add_literal(ctx.bc, ctx.value); 686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 696457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 697457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 698c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 699c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 700c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 701c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 702c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 703c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 704c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 705c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 706c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 707c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 708a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 709457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 712c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 713c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 715457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 716457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 717457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 718457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 719457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 720457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 721457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 726b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 727c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 7285f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 729c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 730b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_x = 2; 73139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 7; 73239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 73339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 73439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 73539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].array_base = 61; 73639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_x = 7; 73739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 1; 73839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 739c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 75072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 751457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 752457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 753457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 754457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 755457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 756457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 757457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 758457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 759457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 760457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 761457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 762457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 763457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 764457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 765457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 766457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 767457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 768457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 769457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 770457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 7717e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 772457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 773de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 774c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 775481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 776481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 777481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 778481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 779481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 780481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 781481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 782481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 783481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 784481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 785608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 786481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 787a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 788481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 789481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 790457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 791457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 792457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (i == (noutput - 1)) { 793457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].end_of_program = 1; 794457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 795b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 796b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 797a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 798c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 799c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 800457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 801457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 802c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 806cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 807de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 810cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 825de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 827de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 830cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen int index; 8317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(r600_src, 0, sizeof(struct r600_bc_alu_src)); 832de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = tgsi_src->Register.Index; 833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = 0; 835cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen index = tgsi_src->Register.Index; 836cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[0] = ctx->literals[index * 4 + 0]; 837cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[1] = ctx->literals[index * 4 + 1]; 838cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[2] = ctx->literals[index * 4 + 2]; 839cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[3] = ctx->literals[index * 4 + 3]; 840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 84147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_src->Register.Indirect) 84247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_src->rel = V_SQ_REL_RELATIVE; 8431bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse r600_src->neg = tgsi_src->Register.Negate; 8448260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell r600_src->abs = tgsi_src->Register.Absolute; 845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 847de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 8547a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8557a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 86047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 86147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 8627a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 8637a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 8647a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 8687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle) 8697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 8707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse switch (swizzle) { 8717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 0: 8727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleX; 8737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 1: 8747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleY; 8757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 2: 8767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleZ; 8777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 3: 8787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleW; 8797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse default: 8807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 8817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 8837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 8847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 8857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 8867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 8887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, k, nconst, r; 8897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 8907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 8917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 8927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse nconst++; 8937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]); 8957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) { 8967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 9009d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 901be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 9027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (k = 0; k < 4; k++) { 9037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 904a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 9059d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 9067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = k; 90740cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid alu.src[0].rel = r600_src[i].rel; 908be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 9097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = k; 9107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 9117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (k == 3) 9127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 9137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 9147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 9179d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 91840cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid r600_src[i].rel =0; 9197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse j--; 9207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 9217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 9227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 9237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 9247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 925be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 926be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 927be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 928be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 929be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct r600_bc_alu alu; 93020846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee int i, j, k, nliteral, r; 931be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 932be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 933be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) { 934be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie nliteral++; 935be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 936be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 9379d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 9389d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) { 939be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 940be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (k = 0; k < 4; k++) { 941be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 942a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 9439d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 944be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].chan = k; 945be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 946be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.chan = k; 947be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.write = 1; 948be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (k == 3) 949be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.last = 1; 950be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 951be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 952be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 953be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 9549d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = r600_bc_add_literal(ctx->bc, &ctx->literals[inst->Src[i].Register.Index * 4]); 955be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 956be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 9579d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 9589d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse j--; 959be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 960be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 961be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return 0; 962be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 963be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 964d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 9677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 968de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 969de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 970d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie int lasti = 0; 971d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 972d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 973d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) { 974d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 975d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 976d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 977de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 9787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 9797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9819d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 9829d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 9839d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 984d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 985d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 986d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 987d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 988de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 989d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 990d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (r) 991d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return r; 992d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 993d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 994d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 995de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 9967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 9977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 998de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 999d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 1000d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0] = r600_src[1]; 1001d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[1], i); 1002d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1003d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1] = r600_src[0]; 1004d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1005de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 1007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 1009de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 1010de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 10117a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 10127a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 10137a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 1014de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1017d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 1018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1021de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1024de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1025de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1027d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 1028d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 1029d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 1030d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1031d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1032d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 1033d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 1034d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 1035d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1036d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 103788f5976484842671ecb2cefcfa91838a43032359Dave Airlie/* 103888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 103988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 104088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 104188f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 104292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx, 104392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]) 104488f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 104588f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 104692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 104788f5976484842671ecb2cefcfa91838a43032359Dave Airlie uint32_t lit_vals[4]; 104892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 104992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 105088f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(lit_vals, 0, 4*4); 105188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_split_constant(ctx, r600_src); 105288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 105388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 10549d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 10559d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 10569d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1057be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1058be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 1059be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 1060be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 1061be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 106288f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0 /(3.1415926535 * 2)); 106388f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(0.5f); 106488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 106588f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1066a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 106788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 106888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 106988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 107088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 107188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 107288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 107388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0] = r600_src[0]; 107488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 107588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 1076921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 107788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1078921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 107988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 108088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 108188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 108288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 108388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 108488f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 108588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 108688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 108788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1089a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 109088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 109188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 109288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 109388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 109488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 109588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 109688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 109788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 109888f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 109988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 110088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 110188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 110288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (ctx->bc->chiprev == 0) { 110388f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(3.1415926535897f * 2.0f); 110488f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-3.1415926535897f); 110588f5976484842671ecb2cefcfa91838a43032359Dave Airlie } else { 110688f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0f); 110788f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-0.5f); 110888f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 110988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 111088f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1111a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 111288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 111388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 111488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 111588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 111688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 111788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 111888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 111988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 112088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 1121921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 112288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1123921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 112488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 112588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 112688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 112788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 112888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 112988f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 113088f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 113188f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 113292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 113392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 113492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 113592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 113692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 113792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 113892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 113992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 114092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1141be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int lasti = 0; 114292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 114392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = tgsi_setup_trig(ctx, r600_src); 114492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 114592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 114688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 114788f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 114888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 114988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 115088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 115188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 115288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 115388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 115488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 115588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 115688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 115788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 115888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 115988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 116088f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 116188f5976484842671ecb2cefcfa91838a43032359Dave Airlie for (i = 0; i < 4; i++) { 1162be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) 1163be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie lasti = i; 1164be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 1165be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1166be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1167be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1168be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 116988f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1170a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1171be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1172be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 117388f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 117488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 117588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 1176be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 117788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 117888f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 117988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 118088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 118188f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 118288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 118388f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 118488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 118592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 118692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 118792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 118892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 118992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 119092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 119192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 119257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 119357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 119457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 119557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 119657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_setup_trig(ctx, r600_src); 119757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 119857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 119957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 120092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 120192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 120257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 120357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 120457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 120557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 120657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 120757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 120892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 120957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 121057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 121157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 121257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 121357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 121457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 121557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 121692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 121792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 121857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 121957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 122057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 122157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 122257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 122357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 122457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 122557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 122657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 122757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 122857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 122957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 123057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 123157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 123292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1233ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1234ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 1235ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1236ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1237ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1238ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1239ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1240ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1241ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1242ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1243ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1244ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1245ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1246ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1247ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1248ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1249ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1250ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1251ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1252ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 1253ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1254ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1255ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1256ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1257ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1258ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 1259ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1260ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1261ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1262ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1263ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1264ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1265ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1266ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1267ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1268ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1269ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1270ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1271ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1272ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1273ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1274ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1275ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1276ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 1277ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1278ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1279ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1280ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 128192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 128292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 128392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1284094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1285094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 1286094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1287094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 1288094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1289094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1290094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 1291094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1292094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 12934502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1294094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 12954502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1296921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 12974502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 12984502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 12994502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 13004502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 13014502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 13024502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 13034502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 13044502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 13054502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 13064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1307094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1308094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1309094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 1310094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1311094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1312094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1313094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 13144502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 13154502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 13164502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 13174502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 13184502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 13194502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 13204502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1321094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1322094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1323094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 13240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 13250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 13260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 1328ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie struct r600_bc_alu_src r600_src[3]; 13290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 13300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1331ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie r = tgsi_split_constant(ctx, r600_src); 1332ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie if (r) 1333ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie return r; 1334d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 1335d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie if (r) 1336d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie return r; 1337ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 13387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.x, <- 1.0 */ 13397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1340a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1341921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 13427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 13437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 13447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 13477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 13487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.y = max(src.x, 0.0) */ 13527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1353a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 1354ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1355921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 135685e401d8bfd80450a31eac234e13008e33e64227Dave Airlie alu.src[1].chan = 0; 13577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 13587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 13617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 13627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.w, <- 1.0 */ 13667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1367a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1368921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 13697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 13707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 13717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 13747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 13757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 13767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13795ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 13805ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 13815ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 13825ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 13830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 13840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 13856a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 13866a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 13876a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 13880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 13890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1390a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1391ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1392ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 13930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 13940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 14000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 14015ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 14025ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 14035ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 140485e401d8bfd80450a31eac234e13008e33e64227Dave Airlie 14056a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 14066a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 14070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 14080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 14090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1410a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 1411ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 14127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 14130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 14140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 1415ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 1416ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[2] = r600_src[0]; 14177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[2].chan = tgsi_chan(&inst->Src[0], 0); 14180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 14190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 14200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 14210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 14220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 14230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 14240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 14250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 14260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 14275ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 14285ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 14295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 14300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 14310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1432a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 14330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 14340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 14350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 14360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 14370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 14380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 14390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 14400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 14410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 14420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 14430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 14440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 14450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 144642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 144742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 144842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 144942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct r600_bc_alu alu; 145042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 145142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 145242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1453df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1454df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1455df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1456df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1457df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1458df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1459df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 146042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 146142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 146242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 146342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 146442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 146542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].abs = 1; 146642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 146742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 146842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 146942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 147042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 147142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 147242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 147342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 147442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 147542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 147642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 147742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 147842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 147942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1480a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 14817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 14827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 1484a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 14857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 14867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 14877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 14887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1489a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 14907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 14917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 14927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 14947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 14957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 14967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 14977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 14987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 15007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 15017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 15027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 15037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1504a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1505a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1506a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1507a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1508a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1509a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1510a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1511a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1512a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 1513a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 1514a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1515a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1516a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 1517a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1518a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1519a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1520a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1521a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1522a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1523a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 15245ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 15255ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 15265ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 1527a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1528a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1529a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1530a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1531a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1532a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1533a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1534a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1535a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1536a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1537a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 1538a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1539a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 1540a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1541a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1542a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1543a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 1544a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1545a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1546a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1547a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1548a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1549a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1550e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1551e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1552e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1553a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 1554a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1555a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE); 1556a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]); 1557a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1558a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1559a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[1], 0); 1560a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1561a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1562a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1563a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1564a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1565a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1566a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1567e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1568e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1569e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1570a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 1571a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1572a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1573a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1574a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1575a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1576a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1577a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1578a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1579a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1580e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1581e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1582e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1583a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1584a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1585a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 15860d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 15870d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 15880d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15890d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu alu; 15900d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu_src r600_src[3]; 1591921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 15920d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15930d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_split_constant(ctx, r600_src); 15940d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15950d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15969d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 15979d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 15989d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 15990d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16000d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 16010d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 16020d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1603a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 16040d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1605cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 16060d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1607cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 16080d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16090d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0] = r600_src[0]; 16100d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 16110d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1612921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 16130d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16140d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2] = r600_src[0]; 16150d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[0], i); 16160d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 16170d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 16180d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 16190d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 16200d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 16210d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 1622cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 1623cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie if (r) 1624cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie return r; 16250d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16260d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 16270d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 16280d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1629a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 16300d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 16310d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16320d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 16330d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 16340d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16350d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1636cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 16370d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 16380d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1639921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 16400d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 16410d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16420d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1643cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 16440d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16450d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 16460d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 16470d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 16480d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 16490d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 16500d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 16510d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 16520d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 16530d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1655cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1656cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1657cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1658cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 16599961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 16609961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse if (r) 16619961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse return r; 1662cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 1663cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1664cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1665a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 16666c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1667cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1668a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1669cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1670cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1671cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1672cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1673cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1674cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1675cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1676cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1677cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1678cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1679cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1680cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1681cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1682cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1683cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1684cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 16927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 16937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 16947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 16959d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 16969d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 16979d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* do it in 2 step as op3 doesn't support writemask */ 1699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 17037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 17047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.sel = ctx->temp_reg; 1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1708cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 1710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1717cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1718cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1719cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1720cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1721cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1722cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1724cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1725cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1726cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 17277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 17287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 17297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 17309d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 17319d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 17329d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1735cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1736cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 17377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 17387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1739cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1740cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.sel = ctx->temp_reg; 1741cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1742cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1743cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1744cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1745cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1746cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1747921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1748cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1749cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1750cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1751cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1752cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1753921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1754cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1755cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1756cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1757e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1758e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1759e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1760e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1761e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1762e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1763e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1764cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1765cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1773de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1774cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 177733241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 177833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 177933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 178033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1781641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1782641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 1783b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie int r, i; 1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie boolean src_not_temp = inst->Src[0].Register.File != TGSI_FILE_TEMPORARY; 1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie uint32_t lit_vals[4]; 1787641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1788641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 1789641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1790b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1791b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 1792b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1793a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1794bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1795bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1796bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1797bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1798b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 1799b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1800b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1801b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1802b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1803b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1804b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1805b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 18069d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 1807b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1808b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1809a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1810b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 1811b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 3; 1812bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1813bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1814bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1815b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1816b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1817b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1818b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1819b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1820b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1821b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1822b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1823b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1824a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1825921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1826b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1827b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1828b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1829b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1830b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1831b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1832b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1833b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 183407b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1835b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1836bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1837bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1838bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int src_chan, src2_chan; 1840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 1842bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 1843bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1844a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 1845bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie switch (i) { 1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 0: 1847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1848bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 1; 1849bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1850bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 1: 1851bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 0; 1853bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1854bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 2: 1855bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 0; 1856bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1857bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1858bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 3: 1859bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 1; 1860bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1861bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 186284b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee default: 186384b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee assert(0); 186484b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src_chan = 0; 186584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src2_chan = 0; 186684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee break; 1867bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1868bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1869bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1870bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1871bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan); 1872bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1873bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1874bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1875bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan); 1876bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1877bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 1878bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 1879bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1880bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1881bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1882bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1883bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1884bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1885bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1886bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 1887bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1888a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1889bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1890bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 2; 1891bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].abs = 1; 1892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1893bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 2; 1894bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 1901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 1902bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * muladd has no writemask, have to use another temp 1903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 1904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1905a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1908bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1909bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 1910bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 1912bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1913bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1914bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 1918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1920bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1922bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1923bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1924bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1925a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1926bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1927bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1928bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1929bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 1930bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1931bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 1932bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1933bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1934bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1935bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1936bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1937bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 1938bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1939bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1940bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1941bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1942bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1943bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1944bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1945bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie lit_vals[0] = fui(1.5f); 1946bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1947bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 1948bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1949bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 195007b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 1952bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1953bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (src_not_temp) { 1955b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 1956b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1957a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1958b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 1959a21a2748beb1f42d21e14858eee9a1323d85a00fFredrik Höglund alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 1960b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1961b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1962b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 1963b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1964b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1965b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1966b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1967b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1968b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1969b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1970b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1971bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1972bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 1973bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (opcode == SQ_TEX_INST_SAMPLE && 1974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)) 1975bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = SQ_TEX_INST_SAMPLE_C; 197633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 197733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 1978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 1979ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 1980ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.resource_id = tex.sampler_id; 1981ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie if (ctx->shader->processor_type == TGSI_PROCESSOR_VERTEX) 1982ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.resource_id += PIPE_MAX_ATTRIBS; 1983641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 19846c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 19859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 19869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 19879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 19889d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 198933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 199033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 199133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 199233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 19939a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 1994bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1995bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 1996bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 1997bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 1998bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 1999bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2000bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 200101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 200201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 200301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 20047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 200501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 200601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 2007bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2008bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) 20095d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie tex.src_sel_w = 2; 2010bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2011bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_tex(ctx->bc, &tex); 2012bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2013bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2014bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2015bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 2016bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 2017bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 201833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 201933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 2020b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 2021b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 2022b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 2024b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 2025b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 2026b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 2027b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 20287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 20297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 20307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 20319d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 20329d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 20339d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 2034b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 2035b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 2036b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 2037a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 2038921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2039b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 20407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 20417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 2042b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 2043b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2044b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2045b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 2046b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2047b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2048b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 2049b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2050b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2051b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2052b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2053b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 2054b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2055b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2056b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2057b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 2058b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 2059b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 2060a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2061b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2062b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 20637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[2]; 20647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 2065b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2066b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2067b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 2068b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2069b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2070b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 2071b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2072b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2073b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2074b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2075b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 2076b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2077b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2078b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2079b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 2080b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 2081b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 2082a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2083b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 20847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[0]; 20857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 20867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[1]; 20877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 2088b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 2089b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 2090b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2091b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2092b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 2093b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2094b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2095b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2096b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2097b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2098b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2099b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return tgsi_helper_copy(ctx, inst); 2100b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 2101b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 210287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 210387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 210487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 210587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu_src r600_src[3]; 210687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu alu; 210787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int use_temp = 0; 210887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 210987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 211087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_split_constant(ctx, r600_src); 211187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 211287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 21139d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 21149d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 21159d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 211687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 211787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 211887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie use_temp = 1; 211987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 212087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie for (i = 0; i < 4; i++) { 212187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2122a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 212387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0] = r600_src[0]; 212487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 212587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 212687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1] = r600_src[2]; 212787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 212887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 212987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2] = r600_src[1]; 213087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[1], i); 213187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 213287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 213387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.sel = ctx->temp_reg; 213487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie else { 213587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 213687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 213787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 213887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 213987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 214087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 214187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 214287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (i == 3) 214387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 214487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 214587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 214687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 214787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 214887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 214987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return tgsi_helper_copy(ctx, inst); 215087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 215187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 215287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 21530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 21540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 21550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 21560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu_src r600_src[3]; 21570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu alu; 21580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 21590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 21600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 21620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 21630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_split_constant(ctx, r600_src); 21650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 21660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 21679d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 21689d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 21699d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 21709d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 21710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 21720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2173a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 21740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 21760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 21790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 21820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 21850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 21880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 21890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 21920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 21950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 21980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 22000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 22010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 22030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 22040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 22050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 22080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 22090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 22100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 22120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 22130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 22140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 22150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 22161e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck 22171e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 22181e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck if (r) 22191e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck return r; 22200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 22230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2224a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 22250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 22270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 22280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 22290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 22300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 22320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 22330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 22350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 22360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 22380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 22390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 22400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 22430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 22440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 22450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 22460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 22480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 22490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 22510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 22520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 22540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 22550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 22560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 22590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 22600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 22610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 22630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 22640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie else { 22650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 22660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 22670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 22680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 22700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 22710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 22720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 22730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 22740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 22750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 22760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 22771e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck 22781e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 22791e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck if (r) 22801e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck return r; 22810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 22830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 22840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 22850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 22860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 228736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 228836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 228936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 229036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu_src r600_src[3]; 229136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu alu; 229209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 229336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 229436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 229536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 229636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 229736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2298a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 229936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 230036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 230136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 230236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 230336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 230436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 230536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 230636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 230736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 230836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 230936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 231036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 231136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 231236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 23135ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 23145ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 23155ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 23165ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 2317a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 231836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = ctx->temp_reg; 231936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 232036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 232136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 232236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 232336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 232436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 232536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 232636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 232736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 23285ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 23295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 23305ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 23315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 233236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 233336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 233436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 233536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 233636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 233736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2338a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 233936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0] = r600_src[0]; 234036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 234136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 234236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 234336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 234436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 234536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 234636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 234736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// if (r) 234836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// return r; 234936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 235036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 235136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 235236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 235336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 235436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 235536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 235636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 23575ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 23585ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 23595ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 236036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 236136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 236236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 236336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 236436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2365a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 236636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 236736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 236836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 236936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 237036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 237136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 237236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 237336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 2; 237436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 237536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 237636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 237736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 237836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 237936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 23805ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 23815ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 23825ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 238336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 238436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 238536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 238636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 238736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 238836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2389a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 239036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 239136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 239236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 239336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 239436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 239536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 239636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 239736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 239836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 239936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 24005ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 24015ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 24025ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 240336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 240436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 240536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 240687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2407460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2408460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2409460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2410460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct r600_bc_alu alu; 2411460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 2412460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2413460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.x = floor(log2(src)); */ 2414460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 2415460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2416460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2417460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2418460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2419460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2420460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2421460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2422460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2423460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2424460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2425460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2426460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2427460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2428460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2429460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2430460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2431460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2432460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2433460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2434460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2435460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2436460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2437460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2438460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2439460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2440460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2441460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2442460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2443460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2444460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2445460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2446460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2447460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2448460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2449460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2450460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2451460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2452460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2453460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 245496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck /* result.y = src.x / (2 ^ floor(log2(src.x))); */ 2455460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2456460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2457460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 245896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 245996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 246096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 246196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 246296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 246396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 246496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 246596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 246696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 246796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 246896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 246996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 247096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 247196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 247296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 247396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 247496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 247596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 247696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 247796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 247896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 247996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 248096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 248196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 248296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 248396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 248496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 248596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 248696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 248796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 248896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 248996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 249096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 249196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 249296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 249396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 249496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 249596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 249696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 249796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 249896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 249996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 250096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 250196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 250296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 250396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 250496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 250596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 250696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 250796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 250896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 250996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 251096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 251196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 251296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 251396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 251496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 251596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 251696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 251796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 251896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 251996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 252096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 252196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 252296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 252396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 252496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 252596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 252696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 252796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 252896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 252996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 253096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 253196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 253296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 253396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 253496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 253596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 253696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 253796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 253896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 253996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 254096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 254196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 254296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 254396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 254496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 254596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 254696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2547460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2548460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2549460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2550460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2551460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2552460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2553460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2554460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2555460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2556460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2557460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2558460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2559460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2560460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2561460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2562460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.z = log2(src);*/ 2563460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 2564460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2565460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2566460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2567460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2568460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2569460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2570460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2571460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2572460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2573460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2574460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2575460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 2; 2576460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2577460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2578460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2579460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2580460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2581460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2582460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2583460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2584460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2585460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2586460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2587460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2588460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 2589460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2590460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2591460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2592460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2593460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2594460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2595460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2596460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2597460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2598460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2599460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2600460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2601460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2602460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2603460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2604460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2605460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2606460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2607460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2608460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2609460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2610460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2611460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 261250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie/* r6/7 only for now */ 261347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airliestatic int tgsi_arl(struct r600_shader_ctx *ctx) 261447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 261547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie /* TODO from r600c, ar values don't persist between clauses */ 261647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 261747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct r600_bc_alu alu; 261847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 261947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 262047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 262147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR; 262247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 262347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 262447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 262547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 262647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 262747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 262847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.last = 1; 262947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 2630a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)); 263147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 263247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 2633c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie ctx->bc->cf_last->r6xx_uses_waterfall = 1; 263447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 263547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 263647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 263757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 263857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 263957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 264057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct r600_bc_alu alu; 264157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 264257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 264357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 264457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 264557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2646a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 264757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 264857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 264957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 265057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 265157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 3) { 265257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 265357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 265457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 265557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 265657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 265757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 265857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 265957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 266057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 2) { 266157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 266257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 266357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]); 266457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 266557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 266657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 266757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 266857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 266957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 267057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 267157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 267257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 267357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 267457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 267557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 267657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2677a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 2678a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2679a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 268009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_bc_alu alu; 2681a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 2682a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2683a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2684a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 2685a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 2686a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2687a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 2688a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 2689a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 2690a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2691a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2692a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2693a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2694a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2695a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 2696a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 2697a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2698a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 2699a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2700a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 2701a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2702a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2703a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2704a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2705a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2706a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 2707a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2708a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 2709a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = pops; 2710a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2711a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2712a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 271309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 2714a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 271509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 271609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 271709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 271809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 271909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 272009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 272109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 272209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 272309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 272409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 272509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 272609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 272709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 272809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2729a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 273009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 273109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 273209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 273309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 273509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 273609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 273709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 273809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 273909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 274009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 2741a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 2742a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 2743a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 274409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 274509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 274609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 274709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 274809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 274909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 275009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 275109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 275209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 275309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 275409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 275509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 275609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 275709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 275809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 275909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 276009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 276109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 276209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 276309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 276409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 276509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 276609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 276709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 276809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 276909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 277009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 277109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 277209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 277309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 277409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 277509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 277609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid, 277709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sizeof(struct r600_bc_cf *) * (sp->num_mid + 1)); 277809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 277909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 278009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2781a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 278209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 278309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2784a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 278509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 278609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 278709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 278809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 278909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 279009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 279109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 279209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 279309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 279409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 279509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 279609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 279709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 279809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 279909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 280009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 280109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 280209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 280309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 280409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 280509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 280609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 280709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 280809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 280909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 281009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 281109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2812a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 281309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 281409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 281509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 281609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2817a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 281809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 281909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 282009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 282109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 282209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 282309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 282409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 282509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 282609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 282809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 283109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 283309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 283609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 284209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 284309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 284409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 284509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 284609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 284709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 284809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 284909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 285009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 285109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2852a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 285309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2854a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 285509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 285609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 285709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 285809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 2859a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2860a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2861a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2862a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 2863a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2864a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 2865a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 2866a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 286709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 2868a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 2869a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2870a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2871a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2872a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 2873a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2874a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 2875a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 2876a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 2877a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 2878a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 2879a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2880a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 2881a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 2882a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 2883a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 288409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 2885a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 288609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 288709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 288809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 288909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 289009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 289109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 289209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 289309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2894a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 289509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 289609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 2897a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 289809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 289909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 290009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 290109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 290209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 290309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 290409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 290509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 290609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2907a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 290809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 290909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 291009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 291109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 291209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 291309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 291409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 291509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 291609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 291709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 291809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 291909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 292009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 292109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 292209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 292309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 292409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 292509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 292609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 292709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 292809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 292909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 293009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 293109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 293209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 293309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 293409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 293509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 293609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 293709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 293809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 293909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 294009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 294109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 294209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 294309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 294409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 294509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 294609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 294709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 294809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 294909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 295009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 295109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 295209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 295309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 2954a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2955a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2956a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 295847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_arl}, 2959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 29600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 2961df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 2962df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 2963df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 2964df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 2965df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 2966df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 2967df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 296842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 296936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 2970460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 2971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 2972de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2973cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2974cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 297557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 2976dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 2977de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 2978d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 2979be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 2980de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 2981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2982b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 2983de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2984de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2985de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2986de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2987de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2988de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2989de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29903af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 2991de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29923af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 2993de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 29954558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 2996a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 29970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 2998de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30007a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 3001de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3002e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 300388f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 30043af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 30053af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 30064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 3007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3009de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3010de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3011de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30120d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 3013de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30140d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 301588f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 3016d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 30170d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 3018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3019b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 3020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3021b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 3022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3024de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3025de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3027de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3028de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3029de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3030de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3031de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30320d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 303387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 303492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3035d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 3036de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3037de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3038cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3039ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 304009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 3041a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 3042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3043de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3044de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3045a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 3046a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 3047de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3051de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3052de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3053de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3054de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30554558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 3056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3058de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3059de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3060de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3061de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3062de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3063de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3064de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3065de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 3067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 3070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 3072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3074de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3083de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3085de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3088094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 3089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 3090de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3096de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3097de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3098de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3099de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 312050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 312150526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 312250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 312450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 312550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 312650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate}, 312750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 312850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 313050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 313150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 313250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 313350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 313450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 313550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 313650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 313750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 313850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 313950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 314050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 314150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 314350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 314650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 314950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 315150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 315350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 315450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 315550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 315650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 315750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 315950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 316150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 316250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 316350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 316450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 316550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 317150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 317350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 317450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 317550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 317650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 317850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 318050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 319150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 319250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 319350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 319450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3197ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 319850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 319950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 320050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 320150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 320450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 320550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 320650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 321450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 321650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 322550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 322850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 323050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 323250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 323850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 324750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 324850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 324950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 3278