r600_shader.c revision a6a710cbe7425819e1cd5ad5f2085311c092f2e7
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 */ 47afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse /* FIXME better to move this in config things so they get emited 48afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse * only one time per cs 49afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse */ 501235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < 10; i++) { 511235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_vs_out_id[i] = 0; 521235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 531235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < 32; i++) { 541235becaa1cf7e29f580900592563c3329d326deJerome Glisse tmp = i << ((i & 3) * 8); 551235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_vs_out_id[i / 4] |= tmp; 561235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 571235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < 10; i++) { 581235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 591235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028614_SPI_VS_OUT_ID_0 + i * 4, 601235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_vs_out_id[i], 0xFFFFFFFF, NULL); 611235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 621235becaa1cf7e29f580900592563c3329d326deJerome Glisse 631235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 641235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0286C4_SPI_VS_OUT_CONFIG, 651235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2), 661235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0xFFFFFFFF, NULL); 671235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 681235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028868_SQ_PGM_RESOURCES_VS, 691235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_NUM_GPRS(rshader->bc.ngpr) | 701235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_STACK_SIZE(rshader->bc.nstack), 711235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0xFFFFFFFF, NULL); 721235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 73fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse R_0288D0_SQ_PGM_CF_OFFSET_VS, 741235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0x00000000, 0xFFFFFFFF, NULL); 751235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 76fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse R_028858_SQ_PGM_START_VS, 77fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo); 78fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse 79738aa29289296512959cbb37d8602131dae44dabDave Airlie r600_pipe_state_add_reg(rstate, 80738aa29289296512959cbb37d8602131dae44dabDave Airlie R_03E200_SQ_LOOP_CONST_0 + (32 * 4), 0x01000FFF, 81738aa29289296512959cbb37d8602131dae44dabDave Airlie 0xFFFFFFFF, NULL); 82738aa29289296512959cbb37d8602131dae44dabDave Airlie 831235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 841235becaa1cf7e29f580900592563c3329d326deJerome Glisse 85dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_find_vs_semantic_index(struct r600_shader *vs, 861235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *ps, int id) 871235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 881235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader_io *input = &ps->input[id]; 891235becaa1cf7e29f580900592563c3329d326deJerome Glisse 901235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (int i = 0; i < vs->noutput; i++) { 911235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (input->name == vs->output[i].name && 921235becaa1cf7e29f580900592563c3329d326deJerome Glisse input->sid == vs->output[i].sid) { 931235becaa1cf7e29f580900592563c3329d326deJerome Glisse return i - 1; 941235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 951235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 961235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 971235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 981235becaa1cf7e29f580900592563c3329d326deJerome Glisse 991235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic void r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader) 1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_state *rstate = &shader->rstate; 1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 10369251fc4cd5f71be403e08398bc43d19052a640dJerome Glisse unsigned i, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z, spi_ps_in_control_1; 1041e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie int pos_index = -1, face_index = -1; 1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1061235becaa1cf7e29f580900592563c3329d326deJerome Glisse rstate->nregs = 0; 1071235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1081235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rshader->ninput; i++) { 1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_POSITION) 1101e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie pos_index = i; 1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_FACE) 1121e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie face_index = i; 1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 114afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse 1151235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rshader->noutput; i++) { 11651f9cc4759c23b74a2e4d9c79b0a5df27d403f54Dave Airlie if (rshader->output[i].name == TGSI_SEMANTIC_POSITION) 1177777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie r600_pipe_state_add_reg(rstate, 1187777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie R_02880C_DB_SHADER_CONTROL, 1197777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie S_02880C_Z_EXPORT_ENABLE(1), 1207777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie S_02880C_Z_EXPORT_ENABLE(1), NULL); 12139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL) 12239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie r600_pipe_state_add_reg(rstate, 12339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie R_02880C_DB_SHADER_CONTROL, 12439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie S_02880C_STENCIL_REF_EXPORT_ENABLE(1), 12539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie S_02880C_STENCIL_REF_EXPORT_ENABLE(1), NULL); 1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1281235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps = 0; 1291235becaa1cf7e29f580900592563c3329d326deJerome Glisse num_cout = 0; 1301235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rshader->noutput; i++) { 13139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie if (rshader->output[i].name == TGSI_SEMANTIC_POSITION || rshader->output[i].name == TGSI_SEMANTIC_STENCIL) 1321235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps |= 1; 1331235becaa1cf7e29f580900592563c3329d326deJerome Glisse else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) { 1341235becaa1cf7e29f580900592563c3329d326deJerome Glisse num_cout++; 1351235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1361235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1371235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps |= S_028854_EXPORT_COLORS(num_cout); 1381235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (!exports_ps) { 1391235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* always at least export 1 component per pixel */ 1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps = 2; 1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1431235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_ps_in_control_0 = S_0286CC_NUM_INTERP(rshader->ninput) | 1441235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_0286CC_PERSP_GRADIENT_ENA(1); 1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_input_z = 0; 1461e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie if (pos_index != -1) { 1471e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie spi_ps_in_control_0 |= (S_0286CC_POSITION_ENA(1) | 1481e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie S_0286CC_POSITION_CENTROID(rshader->input[pos_index].centroid) | 1491e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie S_0286CC_POSITION_ADDR(rshader->input[pos_index].gpr) | 1501e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie S_0286CC_BARYC_SAMPLE_CNTL(1)); 1511235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_input_z |= 1; 1521235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1531e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie 1541e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie spi_ps_in_control_1 = 0; 1551e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie if (face_index != -1) { 1561e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie spi_ps_in_control_1 |= S_0286D0_FRONT_FACE_ENA(1) | 1570637044add50b3a4aee8e915b84c18813c9130f3Dave Airlie S_0286D0_FRONT_FACE_ADDR(rshader->input[face_index].gpr); 1581e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie } 1591e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie 1601235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0, spi_ps_in_control_0, 0xFFFFFFFF, NULL); 1611e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1, spi_ps_in_control_1, 0xFFFFFFFF, NULL); 1621235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z, 0xFFFFFFFF, NULL); 1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028840_SQ_PGM_START_PS, 165d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo); 1661235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1671235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028850_SQ_PGM_RESOURCES_PS, 1681235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_NUM_GPRS(rshader->bc.ngpr) | 1691235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_STACK_SIZE(rshader->bc.nstack), 1701235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0xFFFFFFFF, NULL); 1711235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1721235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028854_SQ_PGM_EXPORTS_PS, 1731235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps, 0xFFFFFFFF, NULL); 1741235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1751235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0288CC_SQ_PGM_CF_OFFSET_PS, 1761235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0x00000000, 0xFFFFFFFF, NULL); 1771235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1785555cd776b970bce020be59193054474a2a63317Dave Airlie if (rshader->fs_write_all) { 1795555cd776b970bce020be59193054474a2a63317Dave Airlie r600_pipe_state_add_reg(rstate, R_028808_CB_COLOR_CONTROL, 1805555cd776b970bce020be59193054474a2a63317Dave Airlie S_028808_MULTIWRITE_ENABLE(1), 1815555cd776b970bce020be59193054474a2a63317Dave Airlie S_028808_MULTIWRITE_ENABLE(1), 1825555cd776b970bce020be59193054474a2a63317Dave Airlie NULL); 1835555cd776b970bce020be59193054474a2a63317Dave Airlie } 1845555cd776b970bce020be59193054474a2a63317Dave Airlie 1851235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->uses_kill) { 1861235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* only set some bits here, the other bits are set in the dsa state */ 1871235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1881235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_02880C_DB_SHADER_CONTROL, 1891235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_02880C_KILL_ENABLE(1), 1901235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_02880C_KILL_ENABLE(1), NULL); 1911235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 192738aa29289296512959cbb37d8602131dae44dabDave Airlie r600_pipe_state_add_reg(rstate, 193738aa29289296512959cbb37d8602131dae44dabDave Airlie R_03E200_SQ_LOOP_CONST_0, 0x01000FFF, 194738aa29289296512959cbb37d8602131dae44dabDave Airlie 0xFFFFFFFF, NULL); 1951235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1961235becaa1cf7e29f580900592563c3329d326deJerome Glisse 197a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader) 1981235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 1991235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 2001235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 2011235becaa1cf7e29f580900592563c3329d326deJerome Glisse void *ptr; 2021235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2031235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* copy new shader */ 2041235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 20529c4a15bf61a76cd71ffa5b8f09706d0eab84281Keith Whitwell shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0, 0); 2061235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 2071235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -ENOMEM; 2081235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 209294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse ptr = r600_bo_map(rctx->radeon, shader->bo, 0, NULL); 2101235becaa1cf7e29f580900592563c3329d326deJerome Glisse memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * 4); 211294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse r600_bo_unmap(rctx->radeon, shader->bo); 2121235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2131235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* build state */ 2141235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (rshader->processor_type) { 2151235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_VERTEX: 2161235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 2171235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_vs(ctx, shader); 2181235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 2191235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_vs(ctx, shader); 2201235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2211235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2221235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_FRAGMENT: 2231235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 2241235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_ps(ctx, shader); 2251235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 2261235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_ps(ctx, shader); 2271235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2281235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2291235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 2301235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2311235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2321235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2331235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2341235becaa1cf7e29f580900592563c3329d326deJerome Glisse 23596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian Königint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader, u32 **literals); 236dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens) 2371235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 238052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König static int dump_shaders = -1; 2391235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 24096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König u32 *literals; 2411235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 2421235becaa1cf7e29f580900592563c3329d326deJerome Glisse 243052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König /* Would like some magic "get_bool_option_once" routine. 244052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König */ 245052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders == -1) 246052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE); 247052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König 248052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 249052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "--------------------------------------------------------------\n"); 250052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König tgsi_dump(tokens, 0); 251052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 2521235becaa1cf7e29f580900592563c3329d326deJerome Glisse shader->shader.family = r600_get_family(rctx->radeon); 25396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König r = r600_shader_from_tgsi(tokens, &shader->shader, &literals); 2541235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 2551235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("translation from TGSI failed !\n"); 2561235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 2571235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2581235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_bc_build(&shader->shader.bc); 25996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König free(literals); 2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("building bytecode failed !\n"); 2621235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 2631235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 264052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 265052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König r600_bc_dump(&shader->shader.bc); 266052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "______________________________________________________________\n"); 267052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 268afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse return r600_pipe_shader(ctx, shader); 2691235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2701235becaa1cf7e29f580900592563c3329d326deJerome Glisse 27169251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader) 272ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{ 273ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 274ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 275ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck r600_bo_reference(rctx->radeon, &shader->bo, NULL); 276f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck r600_bc_clear(&shader->shader.bc); 277ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck} 278ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 2791235becaa1cf7e29f580900592563c3329d326deJerome Glisse/* 2801235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader 2811235becaa1cf7e29f580900592563c3329d326deJerome Glisse */ 2822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 2832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 2842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 2852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 2862b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 2872b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 2882b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 2892b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 2902b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 2912b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 2922b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_bc *bc; 2932b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 294cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 295cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 296e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe u32 max_driver_temp_used; 297fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* needed for evergreen interpolation */ 298fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_centroid; 299fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_linear; 300fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_perspective; 301fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_interp_gpr; 3022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 3032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 3042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 3052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 3062b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 3072b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 3082b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 3092b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 3102b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 31150526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[]; 31242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 32272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 326c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 327a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 33172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 332a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 3348260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 3358260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 3368260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 34147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 34247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 34772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 34872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 349fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 35050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 35150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 35250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie struct r600_bc_alu alu; 353fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 354fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 355fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 356fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 357fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 358fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 359fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 360fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 361fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 362fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 363fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 364fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 365fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 366fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 367fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 368fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 369fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 370fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 371fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 3727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 373fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 374fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 375fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 37650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 37750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 37850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 37950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 38050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 38150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 38250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 38350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 38450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 38550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 386fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 38750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 38850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 38950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 39050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 391fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 392fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 393fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 394fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 395fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 39650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 39750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 39850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 39950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 40050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 40150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 40250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 40350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 40450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 4057ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse} 4067ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 4077ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 40972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 41272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 41835e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 4198a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie ctx->shader->input[i].centroid = d->Declaration.Centroid; 420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 4214afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == CHIPREV_EVERGREEN) { 42250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 423fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) { 424fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].interpolate > 0) { 425fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->shader->input[i].lds_pos = ctx->shader->nlds++; 426fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie evergreen_interp_alu(ctx, i); 427fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 428fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 42950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 43635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 44033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 44147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 44872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 44972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 450be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 451be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 452be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 453be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 454be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 4557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 456fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 457fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 458fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 459fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 460fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 461fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 462fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 463fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 464fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 465fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 466fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 467fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 468fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 469fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 470fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 471fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 472fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 473fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 474fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 475fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 476fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 477fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 478fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 479fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 480fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 481fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 482fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 483fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 484fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 485fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 486fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 487fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 488fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 489fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 490fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 491fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 492fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 493fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 494fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 495fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 496fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 497fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 498fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */ 499fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 500fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 501fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 50296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian Königint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader, u32 **literals) 50372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 5055555cd776b970bce020be59193054474a2a63317Dave Airlie struct tgsi_full_property *property; 506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 507c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 508457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 51172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 522f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 525076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 526076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 527076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 528f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 529f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,287] correspond to constant buffer bank 2 (EG) 530f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [288,319] correspond to constant buffer bank 3 (EG) 531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 532076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 533076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 534076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 535076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 5504afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.bc->chiprev == CHIPREV_EVERGREEN) { 551f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bc_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 552f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 553f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bc_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 554f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 5564afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == CHIPREV_EVERGREEN) { 557fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 55884457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 563d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 56497e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet /* Outside the GPR range. This will be translated to one of the 56597e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet * kcache banks later. */ 56697e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 567d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 5687728bef29097c8406d35c6dd969544382abdf935Christian König ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL; 569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 572cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 573cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 5745555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = FALSE; 575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 580cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 581cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 582cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 583cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 584cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 585cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 586cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 587cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 588cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 589cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 600be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 601be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 602be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 6044afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.bc->chiprev == CHIPREV_EVERGREEN) 60550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 60650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 60750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 612876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie case TGSI_TOKEN_TYPE_PROPERTY: 6135555cd776b970bce020be59193054474a2a63317Dave Airlie property = &ctx.parse.FullToken.FullProperty; 6145555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) { 6155555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->u[0].Data == 1) 6165555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = TRUE; 6175555cd776b970bce020be59193054474a2a63317Dave Airlie } 618876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie break; 619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 626457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 627457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 628c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 629c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 630c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 631c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 632c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 633c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 634c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 6358ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[i].burst_count = 1; 636c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 637c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 638c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 639a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 640457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 643c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 644c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 646457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 647457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 648457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 649457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 650457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 651457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 652457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 657b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 658c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 6595f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 660c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 661b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_x = 2; 66239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 7; 66339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 66439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 66539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 66639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].array_base = 61; 66739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_x = 7; 66839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 1; 66939d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 670c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 68172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 682457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 683457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 684457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 685457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 686457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 687457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 688457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 689457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 690457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 691457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 692457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 693457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 694457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 695457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 696457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 697457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 698457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 6998ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[i].burst_count = 1; 700457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 701457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 702457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 7037e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 704457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 706c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 707481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 708481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 709481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 710481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 711481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 712481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 713481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 714481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 715481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 7168ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[0].burst_count = 1; 717481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 718608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 719481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 720a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 721481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 722481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 723457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 724457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 725457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (i == (noutput - 1)) { 726457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].end_of_program = 1; 727457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 728b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 729b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 730a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 731c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 732c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 733457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 734457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 735c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 73996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König *literals = ctx.literals; 740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 743cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 7637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(r600_src, 0, sizeof(struct r600_bc_alu_src)); 7647728bef29097c8406d35c6dd969544382abdf935Christian König r600_src->neg = tgsi_src->Register.Negate; 7657728bef29097c8406d35c6dd969544382abdf935Christian König r600_src->abs = tgsi_src->Register.Absolute; 7669e964baaf34fedec385a750b97fd6684fc52584aHenri Verbeet if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 7677728bef29097c8406d35c6dd969544382abdf935Christian König int index; 7687728bef29097c8406d35c6dd969544382abdf935Christian König if((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) && 7697728bef29097c8406d35c6dd969544382abdf935Christian König (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) && 7707728bef29097c8406d35c6dd969544382abdf935Christian König (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) { 7717728bef29097c8406d35c6dd969544382abdf935Christian König 7727728bef29097c8406d35c6dd969544382abdf935Christian König index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX; 77396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König r600_bc_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg); 77496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König if (r600_src->sel != V_SQ_ALU_SRC_LITERAL) 7757728bef29097c8406d35c6dd969544382abdf935Christian König return 0; 7767728bef29097c8406d35c6dd969544382abdf935Christian König } 777cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen index = tgsi_src->Register.Index; 7787728bef29097c8406d35c6dd969544382abdf935Christian König r600_src->sel = V_SQ_ALU_SRC_LITERAL; 77996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König r600_src->value = ctx->literals + index * 4; 7807728bef29097c8406d35c6dd969544382abdf935Christian König } else { 7817728bef29097c8406d35c6dd969544382abdf935Christian König if (tgsi_src->Register.Indirect) 7827728bef29097c8406d35c6dd969544382abdf935Christian König r600_src->rel = V_SQ_REL_RELATIVE; 7837728bef29097c8406d35c6dd969544382abdf935Christian König r600_src->sel = tgsi_src->Register.Index; 7847728bef29097c8406d35c6dd969544382abdf935Christian König r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 789de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 791de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 792de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 793de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 7947a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 7957a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 796de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 80047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 80147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 8027a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 8037a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 8047a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 807de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 8087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle) 8097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 8107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse switch (swizzle) { 8117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 0: 8127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleX; 8137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 1: 8147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleY; 8157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 2: 8167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleZ; 8177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 3: 8187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleW; 8197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse default: 8207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 8217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 8237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 8247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 8257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 8267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 8287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, k, nconst, r; 8297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 8307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 8317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 8327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse nconst++; 8337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]); 8357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) { 8367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 8409d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 841be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 8427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (k = 0; k < 4; k++) { 8437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 844a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 8459d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 8467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = k; 84740cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid alu.src[0].rel = r600_src[i].rel; 848be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 8497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = k; 8507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 8517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (k == 3) 8527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 8537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 8547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8579d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 85840cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid r600_src[i].rel =0; 8597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse j--; 8607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 8637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 8647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 865be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 866be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 867be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 868be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 869be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct r600_bc_alu alu; 87020846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee int i, j, k, nliteral, r; 871be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 872be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 8737728bef29097c8406d35c6dd969544382abdf935Christian König if (r600_src[i].sel == V_SQ_ALU_SRC_LITERAL) { 874be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie nliteral++; 875be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 876be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 8779d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 8787728bef29097c8406d35c6dd969544382abdf935Christian König if (j > 0 && r600_src[i].sel == V_SQ_ALU_SRC_LITERAL) { 879be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 880be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (k = 0; k < 4; k++) { 881be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 882a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 8839d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 884be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].chan = k; 88596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[0].value = r600_src[i].value; 886be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 887be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.chan = k; 888be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.write = 1; 889be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (k == 3) 890be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.last = 1; 891be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 892be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 893be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 894be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 8959d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 8969d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse j--; 897be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 898be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 899be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return 0; 900be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 901be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 902dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask) 903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 904dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, lasti = 0; 905d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 906d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 907dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (writemask & (1 << i)) { 908d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 909d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 910d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 911dffad730df17983cfaef0808555a8c26cad0aa15Christian König return lasti; 912dffad730df17983cfaef0808555a8c26cad0aa15Christian König} 913dffad730df17983cfaef0808555a8c26cad0aa15Christian König 914dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 915dffad730df17983cfaef0808555a8c26cad0aa15Christian König{ 916dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 917dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct r600_bc_alu_src r600_src[3]; 918dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct r600_bc_alu alu; 919dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, j, r; 920dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 921de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 9227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 9237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9259d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 9269d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 9279d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 928d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 929d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 930d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 931d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 933d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 934d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (r) 935d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return r; 9367ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 937d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 938d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 939de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 9407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 9417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 942de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 943d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 944d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0] = r600_src[1]; 945d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[1], i); 946d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 947d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1] = r600_src[0]; 948d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 9557a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 9567a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 9577a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 960de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 961d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 968de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 969de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 970de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 971d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 972d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 973d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 974d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 975d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 976d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 977d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 978d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 979d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 980d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 9817ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 98288f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 98388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 98488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 98588f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 98692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx, 98792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]) 98888f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 98996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float half_inv_pi = 1.0 /(3.1415926535 * 2); 99096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float double_pi = 3.1415926535 * 2; 99196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float neg_pi = -3.1415926535; 99296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 99388f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 99496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König int r; 99592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 9967ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 99788f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_split_constant(ctx, r600_src); 99888f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 99988f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 10009d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 10019d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 10029d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1003be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 100488f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1005a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 100688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 100788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 100888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 100988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 101088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 101188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 101288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0] = r600_src[0]; 101396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 10147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1015921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 101688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 101796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].value = (uint32_t *)&half_inv_pi; 101896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1019ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 102088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 102188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 102288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 102388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 102488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 102588f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1026a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 10277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 102888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 102988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 103088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 103188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 103288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 103388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 103488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 103588f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 103688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 103788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 103888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 103988f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1040a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 104188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 104288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 104388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 104488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 104588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 104688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 104788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 104888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 10497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1050921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 105188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1052921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1053ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 105496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 105596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König if (ctx->bc->chiprev == CHIPREV_R600) { 105696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].value = (uint32_t *)&double_pi; 105796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].value = (uint32_t *)&neg_pi; 105896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } else { 105996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].sel = V_SQ_ALU_SRC_1; 106096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 106196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].neg = 1; 106296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } 106396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 106488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 106588f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 106688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 106788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 106892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 106992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 107092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 107192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 107292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 107392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 107492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 107592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 107692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1077dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 107892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 107992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = tgsi_setup_trig(ctx, r600_src); 108092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 108192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 108288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 108388f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 108488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 108588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 108688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 108788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 108988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 109088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 109188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 109288f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 109388f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 109488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 109588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 109688f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 1097be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1098be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1099be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1100be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 110188f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1102a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1103be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1104be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 110588f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 110688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 110788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 1108be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 110988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 111088f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 111188f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 111288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 111388f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 111488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 111588f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 111688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 111792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 111892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 111992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 112092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 112192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 112292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 112392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 112457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 112557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 112657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 112757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 112857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_setup_trig(ctx, r600_src); 112957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 113057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 113157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 113292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 113392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 113457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 113557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 113657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 113757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 113857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 113957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 114092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 114157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 114257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 114357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 114457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 114557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 114657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 114757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 114892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 114992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 115057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 115157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 115257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 115357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 115457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 115557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 115657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 115757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 115857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 115957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 116057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 116157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 116257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 116357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 116492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1165ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 1167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1171ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1176ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1178ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1182ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1183ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1184ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1185ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1186ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 1187ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1188ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1189ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1190ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1191ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1192ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1193ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1194ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1195ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1196ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1197ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1198ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1199ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1200ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1201ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1202ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1203ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1204ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 120592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 120692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 120792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1208094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1209094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 1210094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1211094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 1212094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1213094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1214094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 1215094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1216094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 12174502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1218094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 12194502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1220921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 12214502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 12224502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 12234502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 12244502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 12254502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 12264502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 12274502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 12284502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 12294502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 12304502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1231094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1232094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1233094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 1234094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1235094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1236094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1237094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 12384502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 12394502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 12404502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 12414502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1242094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1243094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1244094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 12450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 12460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 12470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 1249ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie struct r600_bc_alu_src r600_src[3]; 12500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 12510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1252ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie r = tgsi_split_constant(ctx, r600_src); 1253ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie if (r) 1254ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie return r; 1255d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 1256d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie if (r) 1257d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie return r; 1258ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 12597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.x, <- 1.0 */ 12607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1261a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1262921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 12637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 12647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 12657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 12687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.y = max(src.x, 0.0) */ 12737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1274a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 1275ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1276921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 127785e401d8bfd80450a31eac234e13008e33e64227Dave Airlie alu.src[1].chan = 0; 12787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 12797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 12827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.w, <- 1.0 */ 12877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1288a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1289921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 12907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 12917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 12927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 12957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 12967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 13010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 13026a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 13036a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 13046a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 13050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 13060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1307a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1308ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1309ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 13100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 13110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13150bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13186a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 13196a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 13200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 13220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1323a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 1324ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 13257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 13260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 13270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 1328ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 1329ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[2] = r600_src[0]; 13307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[2].chan = tgsi_chan(&inst->Src[0], 0); 13310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 13320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 13330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 13340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 13350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 13410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1342a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 13430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 13440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 13450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 13460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 13530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 13540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 13550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 135642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 135742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 135842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 135942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct r600_bc_alu alu; 136042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 136142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 136242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1363df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1364df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1365df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1366df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1367df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1368df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1369df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 137042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 137142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 137242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 137342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 137442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 137542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].abs = 1; 137642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 137742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 137842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 137942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 138042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 138142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 138242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 138342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 138442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 138542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 138642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1387a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 13887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 13897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 1391a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 13927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 13937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 13947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 13957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1396a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 13977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 13987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 14017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 14027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 14037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 14047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 14057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 14077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 14087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 14097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 14107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1411a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1412a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1413a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1414a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1415a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1416a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1417a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1418a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1419a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 1420a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 1421a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1422a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1423a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 1424a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1425a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1426a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1427a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1428a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1429a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1430a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1431a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1432a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1433a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1434a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1436a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1440a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1441a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 1442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1443a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 1444a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1447a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 1448a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1449a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1450a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1451a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1452a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1453a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1454a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 1455a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 145666f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1457a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]); 1458a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1459a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1460a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[1], 0); 1461a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1462a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1463a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1464a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1465a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1466a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1467a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1468a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 1469a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1470a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1471a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1472a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1473a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1474a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1475a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1476a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1477a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1478a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1479a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1480a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 14810d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 14820d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 14830d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14840d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu alu; 14850d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu_src r600_src[3]; 1486921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 14870d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14880d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_split_constant(ctx, r600_src); 14890d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 14900d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 14919d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 14929d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 14939d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 14940d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14950d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 14960d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 14970d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1498a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 14990d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1500cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 15010d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1502cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 15030d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15040d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0] = r600_src[0]; 15050d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 15060d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1507921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 15080d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15090d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2] = r600_src[0]; 15100d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[0], i); 15110d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 15120d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 15130d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15140d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15150d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15160d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 15170d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15180d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 15190d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 15200d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1521a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 15220d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 15230d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 15240d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15250d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15260d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15270d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1528cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 15290d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 15300d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1531921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 15320d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 15330d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15340d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1535cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 15360d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15370d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 15380d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 15390d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15400d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15410d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15420d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 15430d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 15440d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 15450d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1546cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1547cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1548cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1549cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1550cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1551cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 1552cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1553cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1554a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 15556c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1556cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1557a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1558cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1559cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1560cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1561cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1562cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1563cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1564cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1565cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1566cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1567cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1568cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1569cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1570cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1571cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1572cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1573cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1580dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 15827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 15837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 15847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 15859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 15869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 15879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 15887be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 15897be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 15907be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 15917be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 1592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 15957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 15967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 15987be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 15997be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16007be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (r) 16017be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return r; 16027be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 1603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1604cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 16067be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 1607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 16137be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1614cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1615cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1616cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1617cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1618cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1620cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1621cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1622cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 16237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 16247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 16257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 16269d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 16279d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 16289d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1632cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 16337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 16347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1635cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1636a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 1637a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1638a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König if (r) 1639a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König return r; 1640a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 1641cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1642a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 1643cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1647921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1648cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1649cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1650cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1651cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1652cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1653921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1655cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1656cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1657e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1658e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1659e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1660e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1661e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1662e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1663e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1664cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1665cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 16747be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 167733241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 167833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 167996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float one_point_five = 1.5f; 168033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 168133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1682641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1683641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 1684b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie int r, i; 1685bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 168693a95ad8ff1d543f886f123029d1329513729c4bChristian König boolean src_not_temp = 168793a95ad8ff1d543f886f123029d1329513729c4bChristian König inst->Src[0].Register.File != TGSI_FILE_TEMPORARY && 168893a95ad8ff1d543f886f123029d1329513729c4bChristian König inst->Src[0].Register.File != TGSI_FILE_INPUT; 1689641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1690641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 1691641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1692b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1693b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 1694b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1695a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1696bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1697bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1698bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1699bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1700b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 1701b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1702b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1703b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1704b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1705b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1706b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1707b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 17089d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 1709b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1710b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1711a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1712b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 1713b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 3; 1714bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1715bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1716bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1717b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1718b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1719b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1720b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1721b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1722b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1723b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1724b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1725b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1726a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1727921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1728b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1729b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1730b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1731b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1732b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1733b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1734b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1735b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 173607b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1737b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1738bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1739bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1740bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1741bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int src_chan, src2_chan; 1742bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1743bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 1744bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 1745bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1746a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 1747bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie switch (i) { 1748bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 0: 1749bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1750bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 1; 1751bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1752bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 1: 1753bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1754bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 0; 1755bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1756bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 2: 1757bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 0; 1758bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1759bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1760bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 3: 1761bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 1; 1762bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1763bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 176484b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee default: 176584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee assert(0); 176684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src_chan = 0; 176784b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src2_chan = 0; 176884b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee break; 1769bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1770bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1771bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1772bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1773bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan); 1774bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1775bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1776bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1777bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan); 1778bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1779bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 1780bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 1781bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1782bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1783bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1787bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1788bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 1789bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1790a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1791bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1792bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 2; 1793bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].abs = 1; 1794bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1795bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 2; 1796bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1797bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1798bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1799bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1800bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 18017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1802bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 1803bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 18047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 1805bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 1806bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1807a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1808bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1809bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1810bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1811bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 1812bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1813bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 18147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1815bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1816bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 181796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].value = (u32*)&one_point_five; 1818bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1819bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1820bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 1821bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1822bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1823bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1824bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1825bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1826bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1827bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1828a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1829bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1830bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1831bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1832bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 1833bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1834bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 18357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1836bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1837bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 183896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].value = (u32*)&one_point_five; 1839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 1842bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1843bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1845bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1848bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 184907b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1850bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 1851bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1853bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (src_not_temp) { 1854b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 1855b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1856a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1857a124490262a29d2e873fe50ca57974f246946b85Christian König r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1858a124490262a29d2e873fe50ca57974f246946b85Christian König if (r) 1859a124490262a29d2e873fe50ca57974f246946b85Christian König return r; 1860a21a2748beb1f42d21e14858eee9a1323d85a00fFredrik Höglund alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 1861b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1862b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1863b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 1864b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1865b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1866b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1867b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1868b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1869b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1870b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 18727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1873bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 1874bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (opcode == SQ_TEX_INST_SAMPLE && 1875bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)) 1876bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = SQ_TEX_INST_SAMPLE_C; 187733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 187833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 1879bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 1880ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 1881ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.resource_id = tex.sampler_id; 1882641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 18836c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 18849d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 18859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 18869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 18879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 188833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 188933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 189033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 189133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 18929a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 1893bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1894bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 1895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 1896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 1897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 1898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 190001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 190101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 190201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 19037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 190401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 190501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 1906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) 19085d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie tex.src_sel_w = 2; 1909bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1910bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_tex(ctx->bc, &tex); 1911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1912bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1913bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1914bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 1915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 191633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 191733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 1918b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 1919b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 1920b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1922b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 1923dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1924b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 1925b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 1926b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 19277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 19287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 19297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 19309d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 19319d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 19329d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1933c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 1934c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König /* optimize if it's just an equal balance */ 1935c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if(r600_src[0].sel == V_SQ_ALU_SRC_0_5) { 1936c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König for (i = 0; i < lasti + 1; i++) { 1937c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1938c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König continue; 1939c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 1940c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König memset(&alu, 0, sizeof(struct r600_bc_alu)); 1941c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 1942c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.src[0] = r600_src[1]; 1943c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.src[0].chan = tgsi_chan(&inst->Src[1], i); 1944c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.src[1] = r600_src[2]; 1945c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 1946c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.omod = 3; 1947c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1948c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 1949c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 1950c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 1951c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.dst.chan = i; 1952c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (i == lasti) { 1953c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.last = 1; 1954c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 1955c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König r = r600_bc_add_alu(ctx->bc, &alu); 1956c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 1957c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 1958c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 1959c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return 0; 1960c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 1961c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 1962b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 1963dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 1964dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1965dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 1966dffad730df17983cfaef0808555a8c26cad0aa15Christian König 1967b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1968a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 1969921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1970b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 19717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 19727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1973b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 1974b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1975b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1976dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 1977b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1978b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1979b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1980b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1981b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1982b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1983b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1984b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1985b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 1986dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 1987dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1988dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 1989dffad730df17983cfaef0808555a8c26cad0aa15Christian König 1990b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1991a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1992b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1993b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 19947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[2]; 19957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 1996b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1997b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1998dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 1999b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2000b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2001b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 2002b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2003b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2004b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2005b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2006b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2007b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 2008dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2009dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2010dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2011dffad730df17983cfaef0808555a8c26cad0aa15Christian König 2012b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 2013a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2014b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 20157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[0]; 20167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 20177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[1]; 20187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 2019b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 2020b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 2021dffad730df17983cfaef0808555a8c26cad0aa15Christian König 2022dffad730df17983cfaef0808555a8c26cad0aa15Christian König r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2023dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (r) 2024dffad730df17983cfaef0808555a8c26cad0aa15Christian König return r; 2025dffad730df17983cfaef0808555a8c26cad0aa15Christian König 2026b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2027dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2028b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2029b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2030b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2031b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2032b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2033b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2034dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 2035b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 2036b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 203787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 203887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 203987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 204087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu_src r600_src[3]; 204187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu alu; 204287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 2043dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 204487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 204587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_split_constant(ctx, r600_src); 204687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 204787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 20489d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 20499d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 20509d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 205187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 20527be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 20537be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 20547be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 205587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 205687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2057a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 205887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0] = r600_src[0]; 205987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 206087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 206187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1] = r600_src[2]; 206287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 206387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 206487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2] = r600_src[1]; 206587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[1], i); 206687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 20677be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 20687be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (r) 20697be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return r; 20707be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 207187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 207287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 207387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 20747be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 207587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 207687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 207787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 207887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 20797ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 208087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 208187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 208287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 20830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 20840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 20850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu_src r600_src[3]; 20870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu alu; 20880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 20890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 20900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 20920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 20930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_split_constant(ctx, r600_src); 20950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 20960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 20979d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 20989d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 20999d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 21009d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 21010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 21020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2103a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 21040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 21060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 21090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 21120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 21150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 21180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 21190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 21220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 21250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 21280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 21310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 21340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 21350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 21380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 21390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 21400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 21420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 21430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 21440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 21450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 21460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 21490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2150a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 21510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 21530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 21560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 21590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 21620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 21650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 21660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 21690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 21720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 21750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 21780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 21810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 21820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 21850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 21860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 21870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 21890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 21900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie else { 21910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 21920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 21930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 21940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 21960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 21970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 21980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 21990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 22000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 22010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 22020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 22030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 22050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 22060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 22070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 22080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 220936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 221036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 221136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 221289c26866f05dcf8fbb716e38d4780cebcae71653Vinson Lee struct r600_bc_alu_src r600_src[3] = { { 0 } }; 221336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu alu; 221409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 221536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 221636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 221736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 221836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 221936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2220a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 222136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 222236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 222336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 222436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 222536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 222636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 222736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 222836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 222936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 223036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 223136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 223236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 223336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 223436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2235a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 223636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = ctx->temp_reg; 223736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 223836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 223936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 224036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 224136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 224236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 224336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 224436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 224536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 224636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 22477ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 224836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 224936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 225036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 225136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2252a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 225336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0] = r600_src[0]; 225436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 225536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 225636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 225736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 225836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 225936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 226036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 226136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// if (r) 226236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// return r; 226336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 226436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 226536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 226636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 226736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 226836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 226936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 227036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 227136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 227236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 227336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 227436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 227536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2276a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 227736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 227836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 227936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 228036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 228136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 228236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 228336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 228436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 2; 228536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 228636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 228736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 228836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 228936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 229036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 229136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 229236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 229336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 229436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 229536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 229636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2297a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 229836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 229936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 230036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 230136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 230236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 230336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 230436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 230536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 230636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 230736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 230836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 230936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 231036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 231187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2312460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2313460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2314460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2315460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct r600_bc_alu alu; 2316460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 2317460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2318460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.x = floor(log2(src)); */ 2319460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 2320460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2321460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2322460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2323460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2324460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2325460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2326460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2327460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2328460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2329460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2330460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2331460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2332460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2333460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2334460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2335460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2336460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2337460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2338460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2339460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2340460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2341460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2342460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2343460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2344460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2345460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2346460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2347460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2348460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2349460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2350460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 235196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck /* result.y = src.x / (2 ^ floor(log2(src.x))); */ 2352460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2353460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2354460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 235596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 235696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 235796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 235896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 235996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 236096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 236196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 236296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 236396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 236496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 236596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 236696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 236796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 236896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 236996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 237096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 237196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 237296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 237396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 237496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 237596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 237696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 237796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 237896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 237996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 238096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 238196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 238296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 238396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 238496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 238596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 238696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 238796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 238896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 238996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 239096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 239196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 239296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 239396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 239496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 239596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 239696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 239796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 239896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 239996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 240096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 240196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 240296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 240396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 240496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 240596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 240696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 240796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 240896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 240996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 241096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 241196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 241296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 241396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 241496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 241596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 241696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 241796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 241896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 241996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 242096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 242196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 242296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 242396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 242496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 242596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 242696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 242796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2428460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2429460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2430460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2431460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2432460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2433460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2434460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2435460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2436460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2437460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2438460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2439460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.z = log2(src);*/ 2440460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 2441460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2442460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2443460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2444460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2445460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2446460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2447460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2448460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2449460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2450460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2451460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2452460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 2; 2453460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2454460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2455460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2456460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2457460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2458460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2459460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2460460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2461460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 2462460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2463460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2464460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2465460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2467460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2469460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2470460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2471460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2472460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2473460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2474460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2475460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2476460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2477460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2478460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2479460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2480460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 248198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 248298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 248398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 248498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct r600_bc_alu alu; 248598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 248698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 248798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 248852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 248952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 249052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 249152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 249252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 249352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 249452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 249552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 249652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 249752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 249852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 249952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 250098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 250198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 250298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 250398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 250498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 250598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.chan = 0; 250698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.sel = ctx->temp_reg; 250798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.write = 1; 2508495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet r = r600_bc_add_alu(ctx->bc, &alu); 250998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 251098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 251198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 251298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT; 251398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 251498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 251598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 251698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].sel = ctx->temp_reg; 251798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].chan = 0; 251898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 2519495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet r = r600_bc_add_alu(ctx->bc, &alu); 252098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 252198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 252298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 252398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 252498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 252547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 252647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie /* TODO from r600c, ar values don't persist between clauses */ 252747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 252847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct r600_bc_alu alu; 252947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 253047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 253147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 25327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 25337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 25347ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR; 25357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 25367ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 25377ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA; 25387ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 25397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 25407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 25417ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 25427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 25437ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 254447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 254547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 254647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 254747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 254847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 254947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 255047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.last = 1; 255147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 2552495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet r = r600_bc_add_alu(ctx->bc, &alu); 255347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 255447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 2555c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie ctx->bc->cf_last->r6xx_uses_waterfall = 1; 255647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 255747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 255847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 255957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 256057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 256157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 256257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct r600_bc_alu alu; 256357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 256457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 256557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 256657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 256757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2568a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 256957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 257057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 257157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 25727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 25737ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 257457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 257557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 257657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 257757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 257857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 257957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 258057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 258157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 258257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 2) { 258357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 258457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 258557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]); 258657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 258757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 258857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 258957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 259057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 259157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 259257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 259357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 259457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 259557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 259657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 259757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 259857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2599a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 2600a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2601a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 260209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_bc_alu alu; 2603a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 2604a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2605a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2606a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 2607a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 2608a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2609a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 2610a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 2611a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 2612a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2613a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2614a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2615a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2616a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2617a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 2618a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 26197ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2620a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 2621a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2622a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 2623a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2624a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2625a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2626a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2627a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2628a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 2629a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 26308813842121d46d1be476807c98b0ba0b771f0c91Christian König int alu_pop = 3; 26318813842121d46d1be476807c98b0ba0b771f0c91Christian König if (ctx->bc->cf_last) { 26328813842121d46d1be476807c98b0ba0b771f0c91Christian König if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3) 26338813842121d46d1be476807c98b0ba0b771f0c91Christian König alu_pop = 0; 26348813842121d46d1be476807c98b0ba0b771f0c91Christian König else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3) 26358813842121d46d1be476807c98b0ba0b771f0c91Christian König alu_pop = 1; 26368813842121d46d1be476807c98b0ba0b771f0c91Christian König } 26378813842121d46d1be476807c98b0ba0b771f0c91Christian König alu_pop += pops; 26388813842121d46d1be476807c98b0ba0b771f0c91Christian König if (alu_pop == 1) { 26398813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3; 26408813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->force_add_cf = 1; 26418813842121d46d1be476807c98b0ba0b771f0c91Christian König } else if (alu_pop == 2) { 26428813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3; 26438813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->force_add_cf = 1; 26448813842121d46d1be476807c98b0ba0b771f0c91Christian König } else { 26458813842121d46d1be476807c98b0ba0b771f0c91Christian König r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 26468813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 26478813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 26488813842121d46d1be476807c98b0ba0b771f0c91Christian König } 2649a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2650a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2651a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 265209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 2653a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 265409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 265509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 265609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 265709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 265809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 265909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 266009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 266109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 266209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 266309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 266409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 266509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 266609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 266709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2668a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 266909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 267009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 267109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 267209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 267309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 267409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 267509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 267609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 267709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 267809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 267909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 2680a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 2681a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 2682a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 268309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 268409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 268509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 268609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 268709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 268809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 268909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 26907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 269109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 269209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 269309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 269409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 269509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 269609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 269709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 269809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 269909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 270009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 270109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 270209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 270309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 270409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 270509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 270609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 270709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 270809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 270909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 271009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 271109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 271209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 271309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 271409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 271509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid, 271609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sizeof(struct r600_bc_cf *) * (sp->num_mid + 1)); 271709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 271809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 271909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2720a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 272109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 272209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2723a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 272409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 272509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 272609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 272709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 272809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 272909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 273009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 273109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 273209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 273309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 273509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 273609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 273709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 273809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 273909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 274009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 274109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 274209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 274309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 274409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 274509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 274609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 274709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 274809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 274909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 275009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2751a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 275209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 275309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 275409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 275509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2756a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 275709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 275809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 275909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 276009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 276109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 276209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 276309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 27647ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 276509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 276609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 276709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 276809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 276909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 277009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 277109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 277209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 277309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 277409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 277509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 277609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 277709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 277809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 277909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 278009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 278109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 278209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 278309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 278409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 278509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 278609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 278709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 278809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 278909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 279009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2791a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 279209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2793a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 279409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 279509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 279609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 279709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 2798a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2799a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2800a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2801a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 2802a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2803a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 2804a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 2805a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 280609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 2807a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 2808a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2809a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2810a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2811a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 2812a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2813a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 2814a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 2815a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 2816a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 2817a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 2818a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2819a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 2820a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 2821a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 2822a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 282309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 2824a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 282509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 282609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 282809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 283109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2833a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 2836a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 284209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 284309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 284409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 284509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2846a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 284709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 284809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 284909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 285009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 285109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 285209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 285309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 285409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 285509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 285609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 285709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 285809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 285909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 286009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 286109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 286209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 286309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 286409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 286509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 286609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 286709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 286809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 286909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 287009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 287109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 287209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 287309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 287409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 287509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 287609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 287709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 287809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 287909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 288009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 288109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 288209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 288309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 288409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 288509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 288609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 288709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 288809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 288909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 289009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 289109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 289209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 2893a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2894a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2895a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 289798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 2898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 28990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 2900df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 2901df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 2902df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 2903df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 2904df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 2905df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 2906df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 290742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 290836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 2909460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 2910de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 2911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2912cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2913cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 291457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 2915dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 2916de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 2917d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 2918be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 2919de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 2920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2921b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 2922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2923de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2925de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2926de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2928de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29293af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 2930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29313af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 2932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 29344558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 2935a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 29360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 2937de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2938de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29397a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 2940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2941e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 294288f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 29433af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 29443af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 29454502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 2946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29510d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 2952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29530d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 295488f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 2955d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 29560d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 2957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2958b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2960b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29679f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 2968de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2969de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2970de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29710d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 297287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 297392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 2974d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 2975de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2976de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2977cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2978ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 297909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 2980a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 2981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2982de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2983de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2984a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 2985a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 2986de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2987de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2988de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2989de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2990de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2991de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2992de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2993de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29944558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 2995de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2997de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2998de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3000de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3001de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3003de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3004de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 3006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 3009de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 3011de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3012de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3013de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3014de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3017de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3021de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3024de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3025de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3027094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 3028de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 3029de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3030de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3031de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3032de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3033de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3034de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3035de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3036de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3037de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3038de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3039de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3040de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3041de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3043de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3044de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3046de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3047de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3051de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3052de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3053de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3054de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3055de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3058de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 305950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 306050526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 306198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 306250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 306350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 306450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 306550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate}, 306650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 306750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 306950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 307050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 307150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 307250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 307350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 307450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 307550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 307650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 307750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 307850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 307950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 308050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 308250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 308550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 308850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 309050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 309250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 309350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 309450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 309550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 309650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 309850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 310050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 310150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 310250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 310350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 310450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 311050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 311250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 311350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 311450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 311550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 311750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 311950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 312650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 313050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 313150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 313250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 313350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3136ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 313750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 313850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 313950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 314050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 314350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 314450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 314550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 315350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 315550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 316450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 316750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 316950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 317150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 317750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 318650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 318750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 318850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 3217