r600_shader.c revision 4afd0683854ac1cfbe7118232b5e344c83d4b0c2
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, 83f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bo_offset(shader->bo_fetch) >> 8, 0xFFFFFFFF, shader->bo_fetch); 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 */ 220f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse if (rshader->processor_type == TGSI_PROCESSOR_VERTEX && shader->bo_fetch == NULL) { 221f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse shader->bo_fetch = r600_bo(rctx->radeon, rshader->bc_fetch.ndw * 4, 4096, 0, 0); 222f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse if (shader->bo_fetch == NULL) { 223f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse return -ENOMEM; 224f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 225f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ptr = r600_bo_map(rctx->radeon, shader->bo_fetch, 0, NULL); 226f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse memcpy(ptr, rshader->bc_fetch.bytecode, rshader->bc_fetch.ndw * 4); 227f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bo_unmap(rctx->radeon, shader->bo_fetch); 228f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 2291235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 23029c4a15bf61a76cd71ffa5b8f09706d0eab84281Keith Whitwell shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0, 0); 2311235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 2321235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -ENOMEM; 2331235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 234294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse ptr = r600_bo_map(rctx->radeon, shader->bo, 0, NULL); 2351235becaa1cf7e29f580900592563c3329d326deJerome Glisse memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * 4); 236294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse r600_bo_unmap(rctx->radeon, shader->bo); 2371235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2381235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* build state */ 2391235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->flat_shade = rctx->flatshade; 2401235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (rshader->processor_type) { 2411235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_VERTEX: 2421235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 2431235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_vs(ctx, shader); 2441235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 2451235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_vs(ctx, shader); 2461235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2471235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2481235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_FRAGMENT: 2491235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 2501235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_ps(ctx, shader); 2511235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 2521235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_ps(ctx, shader); 2531235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2541235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2551235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 2561235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2571235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2581235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_context_pipe_state_set(&rctx->ctx, &shader->rstate); 2591235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2621235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *rshader) 2631235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 2641235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 2651235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *shader = &rshader->shader; 2661235becaa1cf7e29f580900592563c3329d326deJerome Glisse const struct util_format_description *desc; 2671235becaa1cf7e29f580900592563c3329d326deJerome Glisse enum pipe_format resource_format[160]; 2681235becaa1cf7e29f580900592563c3329d326deJerome Glisse unsigned i, nresources = 0; 269f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse struct r600_bc *bc = &shader->bc_fetch; 2701235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_bc_cf *cf; 2711235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_bc_vtx *vtx; 2721235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2731235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->processor_type != TGSI_PROCESSOR_VERTEX) 2741235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2756dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie /* doing a full memcmp fell over the refcount */ 2766dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie if ((rshader->vertex_elements.count == rctx->vertex_elements->count) && 2776dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie (!memcmp(&rshader->vertex_elements.elements, &rctx->vertex_elements->elements, 32 * sizeof(struct pipe_vertex_element)))) { 2781235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2791235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2801235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->vertex_elements = *rctx->vertex_elements; 2811235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rctx->vertex_elements->count; i++) { 282e68c83a5a01a8a659857310cfcc785c7e028d3f0Dave Airlie resource_format[nresources++] = rctx->vertex_elements->hw_format[i]; 2831235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 284f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bo_reference(rctx->radeon, &rshader->bo_fetch, NULL); 2851235becaa1cf7e29f580900592563c3329d326deJerome Glisse LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) { 2861235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (cf->inst) { 2871235becaa1cf7e29f580900592563c3329d326deJerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX: 2881235becaa1cf7e29f580900592563c3329d326deJerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC: 2891235becaa1cf7e29f580900592563c3329d326deJerome Glisse LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) { 2901235becaa1cf7e29f580900592563c3329d326deJerome Glisse desc = util_format_description(resource_format[vtx->buffer_id]); 2911235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (desc == NULL) { 2921235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]); 2931235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2941235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2951235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_x = desc->swizzle[0]; 2961235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_y = desc->swizzle[1]; 2971235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_z = desc->swizzle[2]; 2981235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_w = desc->swizzle[3]; 2991235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 3001235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 3011235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 3021235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 3031235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 3041235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 305f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse return r600_bc_build(&shader->bc_fetch); 3061235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 3071235becaa1cf7e29f580900592563c3329d326deJerome Glisse 308dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *shader) 3091235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 3101235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 3111235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 3121235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3131235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader == NULL) 3141235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 3151235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* there should be enough input */ 3161235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rctx->vertex_elements->count < shader->shader.bc.nresource) { 3171235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("%d resources provided, expecting %d\n", 3181235becaa1cf7e29f580900592563c3329d326deJerome Glisse rctx->vertex_elements->count, shader->shader.bc.nresource); 3191235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 3201235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 3211235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_shader_update(ctx, shader); 3221235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) 3231235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 3241235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r600_pipe_shader(ctx, shader); 3251235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 3261235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3271235becaa1cf7e29f580900592563c3329d326deJerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader); 328dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens) 3291235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 3301235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 3311235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 3321235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3331235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n"); 3341235becaa1cf7e29f580900592563c3329d326deJerome Glisse//tgsi_dump(tokens, 0); 3351235becaa1cf7e29f580900592563c3329d326deJerome Glisse shader->shader.family = r600_get_family(rctx->radeon); 3361235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_shader_from_tgsi(tokens, &shader->shader); 3371235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 3381235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("translation from TGSI failed !\n"); 3391235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 3401235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 3411235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_bc_build(&shader->shader.bc); 3421235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 3431235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("building bytecode failed !\n"); 3441235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 3451235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 346f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse if (shader->shader.processor_type == TGSI_PROCESSOR_VERTEX) { 347f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r = r600_bc_build(&shader->shader.bc_fetch); 348f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse if (r) { 349f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse R600_ERR("building bytecode failed !\n"); 350f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse return r; 351f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 352f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 3531235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "______________________________________________________________\n"); 3541235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 3551235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 3561235becaa1cf7e29f580900592563c3329d326deJerome Glisse 357ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeckvoid 358ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeckr600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader) 359ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{ 360ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 361ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 362ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck r600_bo_reference(rctx->radeon, &shader->bo, NULL); 363ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 364f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck r600_bc_clear(&shader->shader.bc); 365f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck 366ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck /* FIXME: is there more stuff to free? */ 367ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck} 368ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 3691235becaa1cf7e29f580900592563c3329d326deJerome Glisse/* 3701235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader 3711235becaa1cf7e29f580900592563c3329d326deJerome Glisse */ 3722b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 3732b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 3742b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 3752b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 3762b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 3772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 3782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 3792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 3802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 3812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 3822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_bc *bc; 383f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse struct r600_bc *bc_fetch; 3842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 3852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse u32 value[4]; 386cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 387cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 388e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe u32 max_driver_temp_used; 389fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* needed for evergreen interpolation */ 390fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_centroid; 391fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_linear; 392fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_perspective; 393fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_interp_gpr; 3942b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 3952b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 3962b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 3972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 3982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 3992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 4002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 4012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 4022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 40350526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[]; 40442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 41472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 418c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 419a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 42372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 424a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 4268260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 4278260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 4288260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 43347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 43447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 43972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 44072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 441fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 44250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 44350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 44450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie struct r600_bc_alu alu; 445fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 446fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 447fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 448fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 449fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 450fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 451fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 452fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 453fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 454fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 455fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 456fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 457fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 458fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 459fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 460fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 461fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 462fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 463fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 4647ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 465fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 466fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 467fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 46850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 46950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 47050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 47150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 47250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 47350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 47450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 47550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 47650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 47750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 478fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 47950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 48050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 48150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 48250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 483fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 484fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 485fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 486fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 487fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 48850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 48950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 49050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 49150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 49250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 49350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 49450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 49550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 49650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 4977ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse} 4987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 4997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 50172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx vtx; 504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 50672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 51235e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 5138a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie ctx->shader->input[i].centroid = d->Declaration.Centroid; 514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx->type == TGSI_PROCESSOR_VERTEX) { 516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* turn input into fetch */ 517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&vtx, 0, sizeof(struct r600_bc_vtx)); 518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.inst = 0; 519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.fetch_type = 0; 520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.buffer_id = i; 521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register containing the index into the buffer */ 522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_gpr = 0; 523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_sel_x = 0; 524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.mega_fetch_count = 0x1F; 525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_gpr = ctx->shader->input[i].gpr; 526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_x = 0; 527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_y = 1; 528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_z = 2; 529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_w = 3; 530e973221538d5edfad62abedf5b37a4fb774d71fcDave Airlie vtx.use_const_fields = 1; 531f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r = r600_bc_add_vtx(ctx->bc_fetch, &vtx); 532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 5354afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == CHIPREV_EVERGREEN) { 53650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 537fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) { 538fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].interpolate > 0) { 539fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->shader->input[i].lds_pos = ctx->shader->nlds++; 540fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie evergreen_interp_alu(ctx, i); 541fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 542fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 54350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 55035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 55433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 55547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 56272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 56372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 564be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 565be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 566be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 567be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 568be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 5697ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 570fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 571fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 572fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 573fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 574fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 575fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 576fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 577fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 578fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 579fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 580fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 581fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 582fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 583fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 584fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 585fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 586fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 587fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 588fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 589fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 590fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 591fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 592fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 593fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 594fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 595fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 596fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 597fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 598fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 599fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 600fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 601fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 602fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 603fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 604fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 605fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 606fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 607fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 608fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 609fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 610fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 611fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 612fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */ 613fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 614fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 615fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 61772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 620c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 621457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 62472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 626f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc_fetch = &shader->bc_fetch; 627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 634de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 636f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse if (shader->processor_type == TGSI_PROCESSOR_VERTEX) { 637f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r = r600_bc_init(ctx.bc_fetch, shader->family); 638f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse if (r) 639f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse return r; 640f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc_fetch->type = -1; 641f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 642f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 645076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 646076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 647076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 648076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [256,511] correspond to cfile constants c[0..255]. 649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 650076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 651076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 652076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 653076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 6684afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.bc->chiprev == CHIPREV_EVERGREEN) { 669f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bc_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 670f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 671f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bc_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 672f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 6744afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == CHIPREV_EVERGREEN) { 675fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 67684457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 681d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 682d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie ctx.file_offset[TGSI_FILE_CONSTANT] = 128; 683d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253; 685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 688cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 689cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 690cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen 691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 696cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 697cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 698cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 699cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 700cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 701cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 702cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 703cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 704cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 705cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 716be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 717be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 718be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 7204afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.bc->chiprev == CHIPREV_EVERGREEN) 72150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 72250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 72350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 7272b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse r = r600_bc_add_literal(ctx.bc, ctx.value); 728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 738457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 739457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 740c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 741c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 742c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 743c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 744c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 745c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 746c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 747c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 748c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 749c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 750a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 751457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 754c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 755c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 757457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 758457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 759457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 760457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 761457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 762457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 763457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 768b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 769c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 7705f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 771c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 772b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_x = 2; 77339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 7; 77439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 77539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 77639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 77739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].array_base = 61; 77839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_x = 7; 77939d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 1; 78039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 781c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 789de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 791de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 79272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 793457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 794457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 795457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 796457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 797457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 798457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 799457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 800457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 801457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 802457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 803457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 804457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 805457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 806457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 807457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 808457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 809457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 810457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 811457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 812457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 8137e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 814457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 816c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 817481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 818481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 819481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 820481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 821481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 822481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 823481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 824481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 825481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 826481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 827608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 828481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 829a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 830481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 831481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 832457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 833457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 834457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (i == (noutput - 1)) { 835457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].end_of_program = 1; 836457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 837b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 838b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 839a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 840c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 841c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 842f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse /* add return to fetch shader */ 843f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 8444afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.bc->chiprev == CHIPREV_EVERGREEN) { 845f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bc_add_cfinst(ctx.bc_fetch, EG_V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 846f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 847f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bc_add_cfinst(ctx.bc_fetch, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 848f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 849f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 850457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 851457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 852c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 856cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 860cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 873de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 874de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 875de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 876de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 877de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 880cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen int index; 8817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(r600_src, 0, sizeof(struct r600_bc_alu_src)); 882de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = tgsi_src->Register.Index; 883de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 884de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = 0; 885cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen index = tgsi_src->Register.Index; 886cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[0] = ctx->literals[index * 4 + 0]; 887cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[1] = ctx->literals[index * 4 + 1]; 888cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[2] = ctx->literals[index * 4 + 2]; 889cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[3] = ctx->literals[index * 4 + 3]; 890de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 89147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_src->Register.Indirect) 89247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_src->rel = V_SQ_REL_RELATIVE; 8931bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse r600_src->neg = tgsi_src->Register.Negate; 8948260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell r600_src->abs = tgsi_src->Register.Absolute; 895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 897de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 901de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 902de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 9047a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 9057a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 906de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 907de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 908de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 909de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 91047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 91147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 9127a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 9137a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 9147a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 916de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 9187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle) 9197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 9207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse switch (swizzle) { 9217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 0: 9227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleX; 9237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 1: 9247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleY; 9257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 2: 9267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleZ; 9277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 3: 9287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleW; 9297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse default: 9307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 9317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 9327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 9337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 9347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 9357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 9367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 9377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 9387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, k, nconst, r; 9397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 9407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 9417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 9427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse nconst++; 9437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 9447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]); 9457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) { 9467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 9487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 9497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 9509d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 951be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 9527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (k = 0; k < 4; k++) { 9537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 954a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 9559d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 9567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = k; 95740cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid alu.src[0].rel = r600_src[i].rel; 958be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 9597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = k; 9607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 9617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (k == 3) 9627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 9637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 9647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 9679d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 96840cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid r600_src[i].rel =0; 9697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse j--; 9707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 9717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 9727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 9737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 9747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 975be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 976be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 977be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 978be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 979be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct r600_bc_alu alu; 98020846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee int i, j, k, nliteral, r; 981be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 982be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 983be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) { 984be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie nliteral++; 985be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 986be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 9879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 9889d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) { 989be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 990be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (k = 0; k < 4; k++) { 991be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 992a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 9939d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 994be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].chan = k; 995be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 996be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.chan = k; 997be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.write = 1; 998be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (k == 3) 999be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.last = 1; 1000be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1001be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 1002be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 1003be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 10049d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = r600_bc_add_literal(ctx->bc, &ctx->literals[inst->Src[i].Register.Index * 4]); 1005be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 1006be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 10079d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 10089d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse j--; 1009be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 1010be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 1011be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return 0; 1012be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 1013be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1014d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 1015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1020d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie int lasti = 0; 1021d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1022d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 1023d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) { 1024d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 1025d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1026d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1027de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 10287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 10297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 10307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 10319d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 10329d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 10339d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1034d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 1035d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1036d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 1037d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1038de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1039d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1040d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (r) 1041d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return r; 10427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1043d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1044d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 1045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 10467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 10477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1049d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 1050d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0] = r600_src[1]; 1051d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[1], i); 1052d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1053d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1] = r600_src[0]; 1054d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1055de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 1057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1058de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 1059de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 1060de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 10617a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 10627a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 10637a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 1064de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1065de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1066de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1067d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 1068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1069de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1071de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1074de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1077d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 1078d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 1079d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 1080d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1081d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1082d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 1083d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 1084d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 1085d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1086d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 10877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 108988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 109088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 109188f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 109292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx, 109392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]) 109488f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 109588f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 109692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 109788f5976484842671ecb2cefcfa91838a43032359Dave Airlie uint32_t lit_vals[4]; 109892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 10997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 110088f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(lit_vals, 0, 4*4); 110188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_split_constant(ctx, r600_src); 110288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 110388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 11049d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 11059d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 11069d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1107be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1108be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 1109be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 1110be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 1111be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 111288f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0 /(3.1415926535 * 2)); 111388f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(0.5f); 111488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 111588f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1116a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 111788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 111888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 111988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 112088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 112188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 112288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 112388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0] = r600_src[0]; 112488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 11257ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1126921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 112788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1128921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 112988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 113088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 113188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 113288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 113388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 113488f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 113588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 113688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 113788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 113888f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1139a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 11407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 114188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 114288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 114388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 114488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 114588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 114688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 114788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 114888f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 114988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 115088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 115188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 11524afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx->bc->chiprev == CHIPREV_R600) { 115388f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(3.1415926535897f * 2.0f); 115488f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-3.1415926535897f); 115588f5976484842671ecb2cefcfa91838a43032359Dave Airlie } else { 115688f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0f); 115788f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-0.5f); 115888f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 115988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 116088f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1161a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 116288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 116388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 116488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 116588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 116688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 116788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 116888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 116988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 11707ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1171921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 117288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1173921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 117488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 117588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 117688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 117788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 117888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 117988f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 118088f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 118188f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 118292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 118392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 118492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 118592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(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 i, r; 1191be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int lasti = 0; 119292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 119392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = tgsi_setup_trig(ctx, r600_src); 119492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 119592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 119688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 119788f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 119888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 119988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 120088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 120188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 120288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 120388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 120488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 120588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 120688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 120788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 120888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 120988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 121088f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 121188f5976484842671ecb2cefcfa91838a43032359Dave Airlie for (i = 0; i < 4; i++) { 1212be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) 1213be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie lasti = i; 1214be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 1215be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1216be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1217be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1218be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 121988f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1220a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1221be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1222be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 122388f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 122488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 122588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 1226be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 122788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 122888f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 122988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 123088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 123188f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 123288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 123388f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 123488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 123592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 123692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 123792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 123892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 123992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 124092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 124192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 124257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 124357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 124457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 124557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 124657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_setup_trig(ctx, r600_src); 124757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 124857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 124957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 125092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 125192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 125257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 125357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 125457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 125557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 125657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 125757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 125892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 125957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 126057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 126157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 126257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 126357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 126457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 126557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 126692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 126792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 126857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 126957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 127057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 127157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 127257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 127357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 127457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 127557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 127657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 127757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 127857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 127957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 128057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 128157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 128292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1283ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1284ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 1285ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1286ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1287ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1288ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1289ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1290ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1291ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1292ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1293ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1294ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1295ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1296ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1297ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1298ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1299ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1300ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1301ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1302ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 1303ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1304ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1305ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1306ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1307ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1308ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 1309ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1310ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1311ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1312ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1313ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1314ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1315ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1316ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1317ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1318ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1319ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1320ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1321ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1322ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1323ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1324ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1325ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1326ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 1327ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1328ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1329ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1330ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 133192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 133292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 133392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1334094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1335094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 1336094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1337094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 1338094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1339094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1340094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 1341094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1342094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 13434502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1344094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 13454502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1346921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 13474502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 13484502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 13494502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 13504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 13514502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 13524502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 13534502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 13544502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 13554502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 13564502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1357094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1358094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1359094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 1360094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1361094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1362094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1363094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 13644502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 13654502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 13664502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 13674502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 13684502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 13694502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 13704502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1371094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1372094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1373094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 13740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 13750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 13760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 1378ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie struct r600_bc_alu_src r600_src[3]; 13790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 13800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1381ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie r = tgsi_split_constant(ctx, r600_src); 1382ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie if (r) 1383ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie return r; 1384d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 1385d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie if (r) 1386d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie return r; 1387ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 13887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.x, <- 1.0 */ 13897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1390a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1391921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 13927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 13937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 13947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 13977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 13987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 14000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 14017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.y = max(src.x, 0.0) */ 14027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1403a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 1404ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1405921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 140685e401d8bfd80450a31eac234e13008e33e64227Dave Airlie alu.src[1].chan = 0; 14077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 14087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 14107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 14117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 14127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 14140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 14157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.w, <- 1.0 */ 14167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1417a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1418921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 14197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 14207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 14217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 14237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 14247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 14257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 14267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 14280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 14295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 14305ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 14315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 14325ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 14330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 14340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 14356a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 14366a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 14376a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 14380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 14390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1440a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1441ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1442ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 14430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 14440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 14450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 14460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 14470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 14480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 14490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 14500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 14515ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 14525ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 14535ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 145485e401d8bfd80450a31eac234e13008e33e64227Dave Airlie 14556a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 14566a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 14570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 14580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 14590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1460a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 1461ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 14627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 14630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 14640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 1465ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 1466ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[2] = r600_src[0]; 14677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[2].chan = tgsi_chan(&inst->Src[0], 0); 14680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 14690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 14700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 14710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 14720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 14730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 14740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 14750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 14760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 14775ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 14785ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 14795ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 14800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 14810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1482a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 14830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 14840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 14850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 14860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 14870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 14880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 14890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 14900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 14910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 14920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 14930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 14940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 14950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 149642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 149742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 149842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 149942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct r600_bc_alu alu; 150042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 150142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 150242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1503df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1504df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1505df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1506df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1507df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1508df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1509df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 151042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 151142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 151242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 151342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 151442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 151542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].abs = 1; 151642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 151742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 151842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 151942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 152042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 152142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 152242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 152342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 152442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 152542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 152642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 152742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 152842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 152942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1530a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 15317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 15327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 1534a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 15357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 15367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 15377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 15387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1539a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 15407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 15417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 15427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 15437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 15447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 15457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 15467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 15477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 15487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 15497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 15507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 15517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 15527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 15537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1554a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1555a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1556a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1557a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1558a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1559a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1560a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1561a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1562a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 1563a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 1564a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1565a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1566a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 1567a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1568a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1569a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1570a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1571a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1572a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1573a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 15745ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 15755ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 15765ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 1577a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1578a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1579a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1580a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1581a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1582a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1583a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1584a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1585a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1586a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1587a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 1588a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1589a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 1590a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1591a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1592a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1593a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 1594a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1595a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1596a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1597a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1598a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1599a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1600e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1601e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1602e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1603a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 1604a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1605a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE); 1606a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]); 1607a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1608a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1609a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[1], 0); 1610a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1611a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1612a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1613a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1614a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1615a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1616a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1617e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1618e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1619e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1620a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 1621a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1622a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1623a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1624a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1625a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1626a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1627a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1628a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1629a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1630e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1631e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1632e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1633a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1634a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1635a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 16360d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 16370d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 16380d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16390d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu alu; 16400d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu_src r600_src[3]; 1641921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 16420d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16430d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_split_constant(ctx, r600_src); 16440d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 16450d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 16469d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 16479d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 16489d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 16490d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16500d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 16510d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 16520d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1653a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 16540d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1655cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 16560d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1657cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 16580d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16590d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0] = r600_src[0]; 16600d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 16610d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1662921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 16630d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16640d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2] = r600_src[0]; 16650d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[0], i); 16660d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 16670d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 16680d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 16690d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 16700d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 16710d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 1672cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 1673cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie if (r) 1674cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie return r; 16750d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16760d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 16770d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 16780d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1679a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 16800d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 16810d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16820d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 16830d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 16840d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16850d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1686cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 16870d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 16880d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1689921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 16900d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 16910d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16920d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1693cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 16940d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16950d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 16960d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 16970d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 16980d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 16990d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 17000d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 17010d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 17020d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 17030d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1704cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1705cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1706cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1707cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1708cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 17099961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 17109961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse if (r) 17119961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse return r; 1712cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 1713cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1714cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1715a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 17166c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1717cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1718a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1719cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1720cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1721cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1722cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1723cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1724cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1725cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1726cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1727cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1728cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1729cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1730cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1731cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1732cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1733cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1734cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 17427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 17437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 17447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 17459d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 17469d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 17479d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* do it in 2 step as op3 doesn't support writemask */ 1749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 17537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 17547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.sel = ctx->temp_reg; 1757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1758cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 1760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1767cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1768cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1769cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1770cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1771cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1772cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1774cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1775cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1776cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 17777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 17787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 17797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 17809d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 17819d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 17829d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1785cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1786cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 17877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 17887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1789cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1790cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.sel = ctx->temp_reg; 1791cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1792cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1793cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1794cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1795cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1796cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1797921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1798cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1799cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1800cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1801cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1802cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1803921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1804cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1805cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1806cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1807e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1808e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1809e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1810e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1811e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1812e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1813e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1814cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1815cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1824cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1825de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 182733241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 182833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 182933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 183033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1831641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1832641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 1833b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie int r, i; 1834bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 1835bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie boolean src_not_temp = inst->Src[0].Register.File != TGSI_FILE_TEMPORARY; 1836bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie uint32_t lit_vals[4]; 1837641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1838641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 1839641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1840b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1841b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 1842b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1843a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1845bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1848b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 1849b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1850b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1851b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1852b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1853b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1854b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1855b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 18569d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 1857b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1858b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1859a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1860b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 1861b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 3; 1862bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1863bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1864bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1865b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1866b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1867b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1868b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1869b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1870b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1872b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1873b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1874a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1875921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1876b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1877b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1878b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1879b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1880b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1881b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1882b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1883b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 188407b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1885b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1886bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1887bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1888bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1889bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int src_chan, src2_chan; 1890bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1891bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 1892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 1893bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1894a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 1895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie switch (i) { 1896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 0: 1897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 1; 1899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 1: 1901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1902bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 0; 1903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 2: 1905bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 0; 1906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1908bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 3: 1909bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 1; 1910bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 191284b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee default: 191384b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee assert(0); 191484b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src_chan = 0; 191584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src2_chan = 0; 191684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee break; 1917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1920bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan); 1922bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1923bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1924bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1925bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan); 1926bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1927bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 1928bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 1929bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1930bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1931bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1932bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1933bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1934bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1935bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1936bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 1937bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1938a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1939bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1940bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 2; 1941bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].abs = 1; 1942bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1943bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 2; 1944bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1945bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1946bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1947bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1948bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 19497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1950bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 1951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 19527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 1953bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 1954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1955a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1956bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1958bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1959bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 1960bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1961bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 19627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1963bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1964bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1965bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1966bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1967bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 1968bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1969bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1970bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1971bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1972bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1973bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1975a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1976bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1977bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1979bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 1980bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1981bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 19827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1983bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1984bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1985bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1986bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1987bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 1988bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1989bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1990bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1991bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1992bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1993bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1994bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1995bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie lit_vals[0] = fui(1.5f); 1996bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1997bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 1998bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1999bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 200007b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 2001bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 2002bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2003bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2004bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (src_not_temp) { 2005b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 2006b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2007a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2008b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 2009a21a2748beb1f42d21e14858eee9a1323d85a00fFredrik Höglund alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 2010b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2011b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 2012b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 2013b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 2014b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 2015b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 2016b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2017b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 2018b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 2019b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 2020b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 20217ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2022bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 2023bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (opcode == SQ_TEX_INST_SAMPLE && 2024bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)) 2025bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = SQ_TEX_INST_SAMPLE_C; 202633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 202733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 2028bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 2029ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 2030ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.resource_id = tex.sampler_id; 2031ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie if (ctx->shader->processor_type == TGSI_PROCESSOR_VERTEX) 2032ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.resource_id += PIPE_MAX_ATTRIBS; 2033641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 20346c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 20359d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 20369d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 20379d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 20389d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 203933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 204033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 204133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 204233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 20439a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 2044bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 2045bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 2046bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 2047bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 2048bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 2049bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2050bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 205101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 205201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 205301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 20547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 205501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 205601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 2057bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2058bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) 20595d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie tex.src_sel_w = 2; 2060bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2061bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_tex(ctx->bc, &tex); 2062bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2063bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2064bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2065bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 2066bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 206733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 206833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 2069b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 2070b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 2071b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 2073b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 2074b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 2075b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 2076b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 20777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 20787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 20797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 20809d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 20819d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 20829d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 2083b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 2084b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 2085b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 2086a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 2087921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2088b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 20897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 20907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 2091b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 2092b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2093b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2094b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 2095b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2096b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2097b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 2098b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2099b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2100b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2101b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2102b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 2103b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2104b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2105b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2106b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 2107b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 2108b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 2109a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2110b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2111b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 21127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[2]; 21137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 2114b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2115b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2116b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 2117b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2118b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2119b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 2120b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2121b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2122b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2123b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2124b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 2125b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2126b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2127b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2128b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 2129b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 2130b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 2131a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2132b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 21337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[0]; 21347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 21357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[1]; 21367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 2137b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 2138b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 2139b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2140b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2141b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 2142b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2143b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2144b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2145b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2146b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2147b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2148b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return tgsi_helper_copy(ctx, inst); 2149b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 2150b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 215187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 215287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 215387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 215487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu_src r600_src[3]; 215587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu alu; 215687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int use_temp = 0; 215787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 215887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 215987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_split_constant(ctx, r600_src); 216087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 216187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 21629d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 21639d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 21649d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 216587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 216687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 216787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie use_temp = 1; 216887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 216987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie for (i = 0; i < 4; i++) { 217087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2171a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 217287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0] = r600_src[0]; 217387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 217487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 217587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1] = r600_src[2]; 217687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 217787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 217887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2] = r600_src[1]; 217987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[1], i); 218087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 218187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 218287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.sel = ctx->temp_reg; 218387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie else { 218487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 218587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 218687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 218787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 218887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 218987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 219087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 219187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (i == 3) 219287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 219387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 219487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 219587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 21967ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 219787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 219887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return tgsi_helper_copy(ctx, inst); 219987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 220087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 220187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 22020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 22030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 22040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 22050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu_src r600_src[3]; 22060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu alu; 22070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 22080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 22090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 22110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 22120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_split_constant(ctx, r600_src); 22140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 22150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 22169d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 22179d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 22189d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 22199d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 22200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 22210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2222a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 22230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 22250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 22260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 22270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 22280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 22300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 22310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 22330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 22340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 22360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 22370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 22380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 22410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 22420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 22430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 22440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 22460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 22470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 22490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 22500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 22520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 22530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 22540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 22570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 22580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 22590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 22610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 22620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 22630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 22640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 22651e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck 22661e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 22671e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck if (r) 22681e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck return r; 22690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 22720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2273a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 22740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 22760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 22770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 22780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 22790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 22810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 22820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 22840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 22850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 22870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 22880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 22890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 22920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 22930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 22940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 22950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 22970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 22980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 23000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 23010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 23020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 23030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 23040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 23050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 23060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 23070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 23080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 23090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 23100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 23110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 23120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 23130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie else { 23140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 23150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 23160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 23170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 23180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 23190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 23200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 23210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 23220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 23230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 23240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 23250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 23261e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck 23271e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 23281e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck if (r) 23291e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck return r; 23300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 23310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 23320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 23330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 23340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 23350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 233636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 233736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 233836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 233989c26866f05dcf8fbb716e38d4780cebcae71653Vinson Lee struct r600_bc_alu_src r600_src[3] = { { 0 } }; 234036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu alu; 234109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 234236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 234336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 234436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 234536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 234636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2347a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 234836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 234936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 235036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 235136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 235236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 235336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 235436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 235536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 235636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 235736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 235836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 235936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 236036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 236136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 23625ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 23635ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 23645ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 23655ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 2366a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 236736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = ctx->temp_reg; 236836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 236936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 237036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 237136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 237236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 237336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 237436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 237536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 237636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 23775ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 23785ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 23795ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 23805ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 238136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 23827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 238336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 238436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 238536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 238636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2387a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 238836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0] = r600_src[0]; 238936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 239036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 239136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 239236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 239336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 239436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 239536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 239636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// if (r) 239736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// return r; 239836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 239936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 240036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 240136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 240236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 240336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 240436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 240536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 24065ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 24075ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 24085ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 240936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 241036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 241136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 241236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 241336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2414a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 241536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 241636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 241736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 241836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 241936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 242036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 242136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 242236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 2; 242336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 242436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 242536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 242636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 242736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 242836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 24295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 24305ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 24315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 243236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 243336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 243436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 243536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 243636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 243736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2438a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 243936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 244036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 244136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 244236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 244336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 244436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 244536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 244636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 244736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 244836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 24495ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 24505ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 24515ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 245236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 245336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 245436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 245587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2456460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2457460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2458460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2459460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct r600_bc_alu alu; 2460460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 2461460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2462460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.x = floor(log2(src)); */ 2463460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 2464460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2465460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2467460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2469460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2470460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2471460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2472460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2473460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2474460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2475460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2476460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2477460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2478460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2479460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2480460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2481460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2482460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2483460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2484460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2485460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2486460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2487460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2488460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2489460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2490460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2491460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2492460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2493460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2494460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2495460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2496460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2497460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2498460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2499460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2500460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2501460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2502460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 250396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck /* result.y = src.x / (2 ^ floor(log2(src.x))); */ 2504460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2505460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2506460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 250796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 250896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 250996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 251096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 251196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 251296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 251396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 251496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 251596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 251696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 251796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 251896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 251996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 252096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 252196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 252296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 252396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 252496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 252596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 252696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 252796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 252896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 252996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 253096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 253196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 253296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 253396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 253496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 253596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 253696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 253796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 253896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 253996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 254096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 254196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 254296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 254396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 254496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 254596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 254696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 254796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 254896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 254996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 255096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 255196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 255296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 255396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 255496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 255596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 255696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 255796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 255896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 255996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 256096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 256196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 256296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 256396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 256496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 256596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 256696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 256796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 256896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 256996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 257096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 257196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 257296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 257396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 257496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 257596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 257696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 257796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 257896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 257996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 258096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 258196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 258296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 258396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 258496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 258596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 258696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 258796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 258896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 258996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 259096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 259196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 259296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 259396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 259496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 259596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2596460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2597460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2598460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2599460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2600460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2601460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2602460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2603460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2604460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2605460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2606460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2607460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2608460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2609460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2610460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2611460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.z = log2(src);*/ 2612460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 2613460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2614460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2615460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2616460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2617460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2618460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2619460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2620460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2621460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2622460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2623460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2624460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 2; 2625460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2626460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2627460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2628460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2629460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2630460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2631460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2632460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2633460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2634460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2635460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2636460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2637460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 2638460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2639460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2640460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2641460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2642460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2643460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2644460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2645460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2646460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2647460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2648460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2649460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2650460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2651460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2652460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2653460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2654460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2655460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2656460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2657460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2658460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2659460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2660460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 266198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 266298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 266398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 266498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct r600_bc_alu alu; 266598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 266698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 266798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 266852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 266952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 267052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 267152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 267252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 267352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 267452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 267552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 267652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 267752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 267852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 267952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 268098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 268198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 268298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 268398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 268498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 268598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.chan = 0; 268698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.sel = ctx->temp_reg; 268798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.write = 1; 268898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)); 268998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 269098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 269198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 269298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT; 269398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 269498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 269598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 269698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].sel = ctx->temp_reg; 269798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].chan = 0; 269898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 269998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)); 270098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 270198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 270298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 270398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 270498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 270547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 270647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie /* TODO from r600c, ar values don't persist between clauses */ 270747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 270847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct r600_bc_alu alu; 270947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 271047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 271147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 27127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 27137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 27147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR; 27157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 27167ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 27177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA; 27187ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 27197ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 27207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 27217ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 27227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 27237ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 272447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 272547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 272647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 272747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 272847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 272947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 273047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.last = 1; 273147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 2732a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)); 273347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 273447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 2735c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie ctx->bc->cf_last->r6xx_uses_waterfall = 1; 273647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 273747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 273847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 273957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 274057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 274157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 274257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct r600_bc_alu alu; 274357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 274457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 274557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 274657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 274757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2748a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 274957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 275057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 275157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 27527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 27537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 275457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 275557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 275657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 275757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 275857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 275957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 276057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 276157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 276257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 2) { 276357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 276457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 276557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]); 276657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 276757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 276857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 276957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 277057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 277157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 277257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 277357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 277457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 277557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 277657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 277757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 277857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2779a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 2780a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2781a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 278209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_bc_alu alu; 2783a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 2784a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2785a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2786a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 2787a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 2788a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2789a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 2790a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 2791a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 2792a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2793a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2794a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2795a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2796a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2797a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 2798a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 27997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2800a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 2801a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2802a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 2803a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2804a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2805a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2806a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2807a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2808a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 2809a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2810a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 2811a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = pops; 2812a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2813a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2814a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 281509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 2816a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 281709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 281809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 281909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 282009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 282109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 282209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 282309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 282409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 282509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 282609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 282809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2831a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 283309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 283609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 284209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 2843a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 2844a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 2845a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 284609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 284709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 284809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 284909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 285009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 285109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 285209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 28537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 285409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 285509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 285609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 285709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 285809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 285909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 286009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 286109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 286209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 286309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 286409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 286509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 286609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 286709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 286809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 286909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 287009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 287109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 287209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 287309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 287409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 287509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 287609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 287709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 287809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid, 287909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sizeof(struct r600_bc_cf *) * (sp->num_mid + 1)); 288009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 288109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 288209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2883a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 288409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 288509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2886a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 288709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 288809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 288909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 289009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 289109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 289209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 289309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 289409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 289509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 289609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 289709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 289809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 289909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 290009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 290109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 290209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 290309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 290409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 290509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 290609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 290709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 290809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 290909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 291009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 291109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 291209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 291309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2914a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 291509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 291609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 291709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 291809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2919a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 292009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 292109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 292209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 292309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 292409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 292509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 292609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 29277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 292809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 292909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 293009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 293109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 293209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 293309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 293409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 293509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 293609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 293709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 293809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 293909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 294009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 294109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 294209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 294309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 294409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 294509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 294609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 294709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 294809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 294909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 295009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 295109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 295209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 295309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2954a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 295509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2956a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 295709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 295809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 295909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 296009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 2961a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2962a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2963a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2964a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 2965a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2966a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 2967a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 2968a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 296909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 2970a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 2971a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2972a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2973a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2974a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 2975a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2976a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 2977a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 2978a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 2979a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 2980a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 2981a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2982a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 2983a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 2984a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 2985a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 298609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 2987a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 298809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 298909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 299009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 299109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 299209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 299309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 299409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 299509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2996a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 299709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 299809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 2999a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 300009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 300109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 300209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 300309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 300409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 300509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 300609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 300709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 300809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 3009a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 301009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 301109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 301209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 301309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 301409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 301509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 301609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 301709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 301809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 301909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 302009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 302109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 302209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 302309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 302409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 302509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 302609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 302709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 302809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 302909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 303009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 303109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 303209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 303309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 303409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 303509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 303609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 303709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 303809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 303909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 304009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 304109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 304209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 304309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 304409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 304509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 304609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 304709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 304809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 304909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 305009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 305109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 305209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 305309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 305409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 305509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 3056a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3057a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3058a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3059de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 306098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3061de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 30620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 3063df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 3064df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 3065df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 3066df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 3067df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 3068df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 3069df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 307042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 307136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3072460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 3073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 3074de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3075cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3076cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 307757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 3078dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 3079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 3080d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 3081be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 3082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 3083de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3084b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 3085de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3090de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30923af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 3093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30943af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 30974558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 3098a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 30990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 3100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31027a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 3103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3104e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 310588f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 31063af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 31073af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 31084502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 3109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31140d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 3115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31160d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 311788f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 3118d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 31190d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 3120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3121b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 3122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3123b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 3124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31309f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31340d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 313587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 313692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3137d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 3138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3140cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3141ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 314209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 3143a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 3144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3147a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 3148a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 3149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3150de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3151de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3152de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3153de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3155de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3156de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31574558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 3158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3160de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3161de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3162de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3163de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3166de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3167de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 3169de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 3172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 3174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3186de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3187de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3190094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 3191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 3192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 322250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 322350526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 322498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 322550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 322650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 322750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 322850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate}, 322950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 323050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 323250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 323350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 323450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 323550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 323650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 323750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 323850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 323950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 324050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 324150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 324250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 324350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 324550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 324850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 325150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 325350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 325550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 325650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 325750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 325850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 325950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 326150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 326350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 326450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 326550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 326650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 326750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 327350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 327550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 327650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 327750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 327850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 328050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 328250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 328950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 329350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 329450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 329550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 329650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3299ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 330050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 330150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 330250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 330350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 330450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 330550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 330650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 330750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 330850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 330950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 331650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 331850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 332050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 332150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 332250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 332350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 332450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 332550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 332650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 332750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 332850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 332950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 333050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 333150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 333250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 333350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 333450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 333550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 333650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 333750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 333850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 333950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 334050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 334150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 334250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 334350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 334450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 334550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 334650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 334750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 334850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 334950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 335050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 335150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 335250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 335350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 335450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 335550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 335650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 335750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 335850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 335950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 336050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 336150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 336250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 336350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 336450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 336550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 336650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 336750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 336850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 336950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 337050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 337150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 337250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 337350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 337450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 337550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 337650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 337750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 337850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 337950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 3380