r600_shader.c revision a77e813de32643ae2dfffd7ad12abed596172cab
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 2353b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeetstatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader); 2363b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet 237dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens) 2381235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 239052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König static int dump_shaders = -1; 2401235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 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); 2533b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet r = r600_shader_from_tgsi(tokens, &shader->shader); 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); 2591235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("building bytecode failed !\n"); 2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 2621235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 263052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 264052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König r600_bc_dump(&shader->shader.bc); 265052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "______________________________________________________________\n"); 266052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 267afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse return r600_pipe_shader(ctx, shader); 2681235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2691235becaa1cf7e29f580900592563c3329d326deJerome Glisse 27069251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader) 271ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{ 272ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 273ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 274ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck r600_bo_reference(rctx->radeon, &shader->bo, NULL); 275f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck r600_bc_clear(&shader->shader.bc); 276ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck} 277ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 2781235becaa1cf7e29f580900592563c3329d326deJerome Glisse/* 2791235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader 2801235becaa1cf7e29f580900592563c3329d326deJerome Glisse */ 2812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 2822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 283a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src { 284a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned sel; 285a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned swizzle[4]; 286a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned neg; 287a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned abs; 288a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned rel; 289a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet uint32_t value[4]; 290a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}; 291a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 2922b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 2932b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 2942b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 2952b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 2962b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 2972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 2982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 2992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 3002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_bc *bc; 3012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 302cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 303cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 304e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe u32 max_driver_temp_used; 305fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* needed for evergreen interpolation */ 306fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_centroid; 307fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_linear; 308fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_perspective; 309fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_interp_gpr; 3102b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 3112b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 3122b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 3132b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 3142b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 3152b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 3162b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 3172b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 3182b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 31950526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[]; 32042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 33072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 334c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 335a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 33972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 340a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 3428260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 3438260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 3448260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 34947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 35047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 35572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 35672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 357fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 35850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 35950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 36050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie struct r600_bc_alu alu; 361fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 362fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 363fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 364fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 365fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 366fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 367fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 368fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 369fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 370fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 371fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 372fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 373fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 374fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 375fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 376fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 377fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 378fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 379fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 3807ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 381fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 382fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 383fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 38450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 38550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 38650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 38750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 38850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 38950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 39050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 39150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 39250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 39350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 394fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 39550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 39650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 39750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 39850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 399fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 400fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 401fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 402fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 403fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 40450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 40550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 40650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 40750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 40850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 40950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 41050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 41150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 41250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 4137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse} 4147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 4157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 41772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 42072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 42635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 4278a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie ctx->shader->input[i].centroid = d->Declaration.Centroid; 428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 4294afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == CHIPREV_EVERGREEN) { 43050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 431fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) { 432fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].interpolate > 0) { 433fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->shader->input[i].lds_pos = ctx->shader->nlds++; 434fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie evergreen_interp_alu(ctx, i); 435fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 436fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 43750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 44435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 44833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 44947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 45672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 45772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 458be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 459be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 460be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 461be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 462be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 4637ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 464fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 465fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 466fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 467fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 468fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 469fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 470fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 471fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 472fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 473fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 474fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 475fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 476fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 477fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 478fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 479fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 480fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 481fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 482fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 483fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 484fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 485fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 486fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 487fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 488fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 489fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 490fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 491fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 492fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 493fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 494fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 495fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 496fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 497fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 498fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 499fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 500fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 501fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 502fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 503fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 504fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 505fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 506fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */ 507fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 508fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 509fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 5103b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeetstatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 51172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 5135555cd776b970bce020be59193054474a2a63317Dave Airlie struct tgsi_full_property *property; 514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 515c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 516457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 51972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 530f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 533076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 534076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 535076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 536f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 537f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,287] correspond to constant buffer bank 2 (EG) 538f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [288,319] correspond to constant buffer bank 3 (EG) 539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 540076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 541076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 542076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 543076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 5584afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.bc->chiprev == CHIPREV_EVERGREEN) { 559f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bc_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 560f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 561f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bc_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 562f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 5644afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == CHIPREV_EVERGREEN) { 565fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 56684457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 571d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 57297e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet /* Outside the GPR range. This will be translated to one of the 57397e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet * kcache banks later. */ 57497e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 575d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 5767728bef29097c8406d35c6dd969544382abdf935Christian König ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL; 577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 580cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 581cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 5825555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = FALSE; 583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 588cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 589cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 590cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 591cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 592cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 593cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 594cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 595cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 596cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 597cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 608be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 609be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 610be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 6124afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.bc->chiprev == CHIPREV_EVERGREEN) 61350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 61450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 61550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 620876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie case TGSI_TOKEN_TYPE_PROPERTY: 6215555cd776b970bce020be59193054474a2a63317Dave Airlie property = &ctx.parse.FullToken.FullProperty; 6225555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) { 6235555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->u[0].Data == 1) 6245555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = TRUE; 6255555cd776b970bce020be59193054474a2a63317Dave Airlie } 626876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie break; 627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 634457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 635457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 636c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 637c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 638c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 639c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 640c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 641c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 642c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 6438ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[i].burst_count = 1; 644c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 645c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 646c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 647a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 648457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 651c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 652c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 654457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 655457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 656457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 657457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 658457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 659457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 660457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 665b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 666c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 6675f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 668c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 669b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_x = 2; 67039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 7; 67139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 67239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 67339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 67439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].array_base = 61; 67539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_x = 7; 67639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 1; 67739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 678c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 68972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 690457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 691457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 692457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 693457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 694457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 695457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 696457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 697457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 698457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 699457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 700457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 701457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 702457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 703457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 704457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 705457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 706457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 7078ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[i].burst_count = 1; 708457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 709457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 710457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 7117e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 712457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 714c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 715481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 716481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 717481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 718481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 719481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 720481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 721481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 722481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 723481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 7248ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[0].burst_count = 1; 725481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 726608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 727481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 728a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 729481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 730481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 731457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 732457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 733457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (i == (noutput - 1)) { 734457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].end_of_program = 1; 735457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 736b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 737b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 738a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 739c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 740c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 741457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 742457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 743c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 7473b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet free(ctx.literals); 748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 751cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 767a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstatic void r600_bc_src(struct r600_bc_alu_src *bc_src, 768a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet const struct r600_shader_src *shader_src, 769a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned chan) 770a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{ 771a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->sel = shader_src->sel; 772a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->chan = shader_src->swizzle[chan]; 773a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->neg = shader_src->neg; 774a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->abs = shader_src->abs; 775a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->rel = shader_src->rel; 776a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->value = shader_src->value[bc_src->chan]; 777a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet} 778a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 779d0f2ffad76f58a14d0e85f2b7961f2dbff0d8eebHenri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx, 780d0f2ffad76f58a14d0e85f2b7961f2dbff0d8eebHenri Verbeet const struct tgsi_full_src_register *tgsi_src, 781a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src *r600_src) 782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 783a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet memset(r600_src, 0, sizeof(*r600_src)); 784a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_src->swizzle[0] = tgsi_src->Register.SwizzleX; 785a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_src->swizzle[1] = tgsi_src->Register.SwizzleY; 786a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ; 787a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_src->swizzle[3] = tgsi_src->Register.SwizzleW; 7887728bef29097c8406d35c6dd969544382abdf935Christian König r600_src->neg = tgsi_src->Register.Negate; 7897728bef29097c8406d35c6dd969544382abdf935Christian König r600_src->abs = tgsi_src->Register.Absolute; 7909e964baaf34fedec385a750b97fd6684fc52584aHenri Verbeet if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 7917728bef29097c8406d35c6dd969544382abdf935Christian König int index; 7927728bef29097c8406d35c6dd969544382abdf935Christian König if((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) && 7937728bef29097c8406d35c6dd969544382abdf935Christian König (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) && 7947728bef29097c8406d35c6dd969544382abdf935Christian König (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) { 7957728bef29097c8406d35c6dd969544382abdf935Christian König 7967728bef29097c8406d35c6dd969544382abdf935Christian König index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX; 79796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König r600_bc_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg); 79896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König if (r600_src->sel != V_SQ_ALU_SRC_LITERAL) 799d0f2ffad76f58a14d0e85f2b7961f2dbff0d8eebHenri Verbeet return; 8007728bef29097c8406d35c6dd969544382abdf935Christian König } 801cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen index = tgsi_src->Register.Index; 8027728bef29097c8406d35c6dd969544382abdf935Christian König r600_src->sel = V_SQ_ALU_SRC_LITERAL; 8033b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value)); 8047728bef29097c8406d35c6dd969544382abdf935Christian König } else { 8057728bef29097c8406d35c6dd969544382abdf935Christian König if (tgsi_src->Register.Indirect) 8067728bef29097c8406d35c6dd969544382abdf935Christian König r600_src->rel = V_SQ_REL_RELATIVE; 8077728bef29097c8406d35c6dd969544382abdf935Christian König r600_src->sel = tgsi_src->Register.Index; 8087728bef29097c8406d35c6dd969544382abdf935Christian König r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 81280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx, 81380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet const struct tgsi_full_dst_register *tgsi_dst, 81480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet unsigned swizzle, 81580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet struct r600_bc_alu_dst *r600_dst) 816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 8177a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8187a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 82347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 82447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 8257a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 8267a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 8277a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 830a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_shader_src r600_src[3]) 8317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 8327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 8347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, k, nconst, r; 8357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 8367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 8377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 8387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse nconst++; 8397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 840d0f2ffad76f58a14d0e85f2b7961f2dbff0d8eebHenri Verbeet tgsi_src(ctx, &inst->Src[i], &r600_src[i]); 8417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 8439d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 844be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 8457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (k = 0; k < 4; k++) { 8467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 847a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 8489d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 8497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = k; 85040cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid alu.src[0].rel = r600_src[i].rel; 851be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 8527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = k; 8537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 8547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (k == 3) 8557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 8567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 8577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8609d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 86140cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid r600_src[i].rel =0; 8627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse j--; 8637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 8667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 8677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 868be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 869a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_shader_src r600_src[3]) 870be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 871be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 872be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct r600_bc_alu alu; 87320846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee int i, j, k, nliteral, r; 874be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 875be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 8767728bef29097c8406d35c6dd969544382abdf935Christian König if (r600_src[i].sel == V_SQ_ALU_SRC_LITERAL) { 877be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie nliteral++; 878be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 879be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 8809d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 8817728bef29097c8406d35c6dd969544382abdf935Christian König if (j > 0 && r600_src[i].sel == V_SQ_ALU_SRC_LITERAL) { 882be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 883be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (k = 0; k < 4; k++) { 884be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 885a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 8869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 887be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].chan = k; 888a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[0].value = r600_src[i].value[k]; 889be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 890be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.chan = k; 891be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.write = 1; 892be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (k == 3) 893be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.last = 1; 894be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 895be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 896be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 897be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 8989d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 8999d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse j--; 900be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 901be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 902be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return 0; 903be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 904be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 905dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask) 906de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 907dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, lasti = 0; 908d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 909d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 910dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (writemask & (1 << i)) { 911d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 912d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 913d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 914dffad730df17983cfaef0808555a8c26cad0aa15Christian König return lasti; 915dffad730df17983cfaef0808555a8c26cad0aa15Christian König} 916dffad730df17983cfaef0808555a8c26cad0aa15Christian König 917dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 918dffad730df17983cfaef0808555a8c26cad0aa15Christian König{ 919dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 920a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[3]; 921dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct r600_bc_alu alu; 922dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, j, r; 923dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 9257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 9267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9289d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 9299d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 9309d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 931d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 932d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 933d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 934d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 93680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 9377ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 938d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 939d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 941a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[j], &r600_src[j], i); 942de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 943d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 944a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[1], i); 945a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[0], i); 946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 9527a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 9537a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 9547a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 958d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 960de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 968d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 969d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 970d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 971d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 972d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 973d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 974d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 975d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 976d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 977d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 9787ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 97988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 98088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 98188f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 98288f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 98392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx, 984a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[3]) 98588f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 98696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float half_inv_pi = 1.0 /(3.1415926535 * 2); 98796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float double_pi = 3.1415926535 * 2; 98896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float neg_pi = -3.1415926535; 98996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 99096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König int r; 99192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 9927ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 99388f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_split_constant(ctx, r600_src); 99488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 99588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 9969d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 9979d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 9989d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 999be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 100088f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1001a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 100288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 100388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 100488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 100588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 100688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 100788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 1008a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], 0); 10097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1010921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 101188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1012a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&half_inv_pi; 101396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1014ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 101588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 101688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 101788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 101888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 101988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 102088f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1021a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 10227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 102388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 102488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 102588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 102688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 102788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 102888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 102988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 103088f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 103188f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 103288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 103388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 103488f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1035a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 103688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 103788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 103888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 103988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 104088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 104188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 104288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 104388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 10447ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1045921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 104688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1047921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1048ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 104996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 105096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König if (ctx->bc->chiprev == CHIPREV_R600) { 1051a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&double_pi; 1052a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&neg_pi; 105396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } else { 105496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].sel = V_SQ_ALU_SRC_1; 105596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 105696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].neg = 1; 105796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } 105896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 105988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 106088f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 106188f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 106288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 106392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 106492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 106592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 106692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 106792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 106892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1069a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[3]; 107092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 107192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1072dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 107392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 107492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = tgsi_setup_trig(ctx, r600_src); 107592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 107692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 107788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 107888f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 107988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 108088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 108188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 108288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 108388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 108488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 108588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 108688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 108788f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 108988f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 109088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 109188f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 1092be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1093be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1094be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1095be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 109688f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1097a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1098be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1099be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 110080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1101be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 110288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 110388f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 110488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 110588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 110688f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 110788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 110888f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 110988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 111092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 111192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 111292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1113a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[3]; 111492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 111592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 111692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 111757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 111857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 111957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 112057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 112157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_setup_trig(ctx, r600_src); 112257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 112357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 112457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 112592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 112692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 112757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 112857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 112957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 113080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 113192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 113257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 113357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 113457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 113557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 113657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 113757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 113857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 113992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 114092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 114157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 114257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 114357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 114480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 114557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 114657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 114757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 114857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 114957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 115057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 115157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 115257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 115392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1154ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1155ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 1156ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1157ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1158ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1159ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 116080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1161ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1162ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1164ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1165ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1171ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 1174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1176ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 117880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1182ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1183ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1184ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1185ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1186ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1187ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1188ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1189ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 119092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 119192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 119292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1193094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1194094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 1195094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1196094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 1197094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1198094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1199094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 1200094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1201094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 12024502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1203094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 12044502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1205921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 12064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 12074502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 12084502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 12094502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 12104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 1211a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src; 1212a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[0], &r600_src); 1213a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src, i); 12144502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1215094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1216094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1217094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 1218094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1219094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1220094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1221094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 12224502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 12234502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 12244502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 12254502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1226094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1227094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1228094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 12290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 12300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 12310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1232a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[3]; 12330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 12340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 12350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1236ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie r = tgsi_split_constant(ctx, r600_src); 1237ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie if (r) 1238ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie return r; 1239d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 1240d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie if (r) 1241d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie return r; 1242ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 12437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.x, <- 1.0 */ 12447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1245a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1246921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 12477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 124880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 12497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 12507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.y = max(src.x, 0.0) */ 12557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1256a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 1257a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], 0); 1258921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 125985e401d8bfd80450a31eac234e13008e33e64227Dave Airlie alu.src[1].chan = 0; 126080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 12617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 12627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.w, <- 1.0 */ 12677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1268a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1269921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 12707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 127180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 12727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 12737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 12747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 12790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 12806a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 12816a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 12826a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 12830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 12840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1285a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1286a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], 1); 128780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 12880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 12890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 12900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 12910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 12920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12936a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 12946a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 12950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 12970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1298a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 1299a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], 3); 13000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 13010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 1302ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 1303a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[2], &r600_src[0], 0); 13040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 13050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 13060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 13070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 13080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 13140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1315a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 13160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 13170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 131880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 13190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 13240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 13250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 13260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 132742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 132842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 132942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 133042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct r600_bc_alu alu; 133142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 133242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 133342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1334df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1335df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1336df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1337df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1338df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1339df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1340df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 134142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 1342a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src; 1343a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 1344a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[i], &r600_src); 1345a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[i], &r600_src, 0); 134642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].abs = 1; 134742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 134842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 134942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 135042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 135142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 135242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 135342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 135442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 135542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 135642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 135742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1358a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 13597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 13607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 1362a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 13637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 13647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 13657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 13667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1367a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 13687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 136980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 13717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 13727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 13737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 13747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 13777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 13787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 13797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1380a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1381a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1382a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1383a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src; 1384a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1385a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1386a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1387a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1388a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1389a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 1390a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[i], &r600_src); 1391a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[i], &r600_src, 0); 1392a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1393a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1394a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1395a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1396a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1397a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1398a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1399a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1400a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1401a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1402a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1403a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1404a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1405a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1406a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[2]; 1407a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1408a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1409a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1410a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[0], &r600_src[0]); 1411a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[1], &r600_src[1]); 1412a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 1413a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 1414a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1415a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 1416a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], 0); 1417a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1418a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1419a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1420a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1421a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1422a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1423a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 1424a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 142566f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1426a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[1], 0); 1427a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1428a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1429a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1430a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1431a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1432a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1433a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1434a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 1435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1436a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1440a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1441a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1443a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1444a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 14470d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 14480d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 14490d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1450a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[3]; 14510d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu alu; 1452921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 14530d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14540d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_split_constant(ctx, r600_src); 14550d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 14560d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 14579d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 14589d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 14599d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 14600d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14610d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 14620d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 14630d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1464a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 14650d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1466cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 14670d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1468cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 14690d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1470a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], i); 1471921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 1472a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[2], &r600_src[0], i); 14730d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14740d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 14750d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 14760d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 14770d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 14780d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 14790d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 14800d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14810d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 14820d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 14830d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1484a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 14850d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 148680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 14870d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14880d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1489cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 14900d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 14910d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1492921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 14930d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 14940d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14950d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1496cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 14970d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14980d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 14990d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 15000d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15010d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15020d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15030d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 15040d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 15050d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 15060d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1507cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1508cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1509cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1510cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1511cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1512cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 1513cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1514cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1515a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 15166c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1517cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1518a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 151980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1520cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1521cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1522cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1523cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1524cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1525cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1526cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1527cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1528cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1529cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1530cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1531cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1532cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1536a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[3]; 1537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1539dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 15417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 15427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 15437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 15449d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 15459d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 15469d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 15477be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 15487be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 15497be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 15507be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 1551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 1554a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[j], &r600_src[j], i); 1555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 15567be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 155780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1559cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 15617be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 1562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 15687be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1569cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1570cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1571cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1572cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1573cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1574a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[3]; 1575cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1576cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1577cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 15787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 15797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 15807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 15819d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 15829d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 15839d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1586cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1587cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 1588a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[j], &r600_src[j], i); 1589cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1590a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 159180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1592cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1593a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 1594cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1595cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1596cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1597cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1598921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1599cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1600cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1601cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1602cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1603cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1604921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1605cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1606cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1607cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1608e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1609e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1610e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1611e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1612e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1613e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1614e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1615cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1616cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 16257be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 162833241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 162933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 163096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float one_point_five = 1.5f; 163133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 163233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1633641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1634641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 1635b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie int r, i; 1636bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 163793a95ad8ff1d543f886f123029d1329513729c4bChristian König boolean src_not_temp = 163893a95ad8ff1d543f886f123029d1329513729c4bChristian König inst->Src[0].Register.File != TGSI_FILE_TEMPORARY && 163993a95ad8ff1d543f886f123029d1329513729c4bChristian König inst->Src[0].Register.File != TGSI_FILE_INPUT; 1640641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1641641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 1642641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1643b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1644a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src; 1645a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 1646b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 1647b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1648a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1649a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[0], &r600_src); 1650a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, 3); 1651bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1652b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1653b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1654b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1655b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1656b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1657b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1658b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 16599d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 1660b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1661b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1662a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1663b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 1664b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 3; 1665a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src, i); 1666b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1667b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1668b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1669b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1670b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1671b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1672b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1673b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1674a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1675921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1676b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1677b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1678b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1679b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1680b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1681b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1682b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1683b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 168407b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1685b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1686bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1687bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1688bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1689a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src; 1690bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int src_chan, src2_chan; 1691bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1692a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[0], &r600_src); 1693a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 1694bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 1695bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 1696bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1697a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 1698bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie switch (i) { 1699bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 0: 1700bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1701bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 1; 1702bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1703bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 1: 1704bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1705bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 0; 1706bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1707bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 2: 1708bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 0; 1709bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1710bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1711bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 3: 1712bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 1; 1713bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1714bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 171584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee default: 171684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee assert(0); 171784b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src_chan = 0; 171884b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src2_chan = 0; 171984b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee break; 1720bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1721a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, src_chan); 1722a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src, src2_chan); 1723bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1724bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 1725bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 1726bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1727bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1728bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1729bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1730bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1731bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1732bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1733bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 1734bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1735a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1736bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1737bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 2; 1738bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].abs = 1; 1739bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1740bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 2; 1741bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1742bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1743bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1744bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1745bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 17467ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1747bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 1748bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 17497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 1750bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 1751bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1752a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1753bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1754bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1755bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1756bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 1757bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1758bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 17597ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1760bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1761bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1762a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 1763bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1764bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1765bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 1766bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1767bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1768bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1769bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1770bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1771bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1772bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1773a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1774bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1775bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1776bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1777bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 1778bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1779bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 17807ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1781bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1782bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1783a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 1787bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1788bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1789bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1790bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1791bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1792bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1793bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 179407b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1795bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 1796bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1797bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1798bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (src_not_temp) { 1799a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src; 1800a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 1801a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[0], &r600_src); 1802b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 1803b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1804a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1805a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, i); 1806b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1807b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1808b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 1809b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1810b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1811b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1812b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1813b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1814b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1815b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1816b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 18177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1818bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 1819bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (opcode == SQ_TEX_INST_SAMPLE && 1820bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)) 1821bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = SQ_TEX_INST_SAMPLE_C; 182233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 182333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 1824bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 1825ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 1826ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.resource_id = tex.sampler_id; 1827641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 18286c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 18299d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 18309d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 18319d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 18329d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 183333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 183433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 183533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 183633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 18379a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 1838bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 1840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 1841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 1842bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 1843bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 184501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 184601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 184701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 18487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 184901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 185001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 1851bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) 18535d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie tex.src_sel_w = 2; 1854bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1855bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_tex(ctx->bc, &tex); 1856bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1857bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1858bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1859bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 1860bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 186133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 186233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 1863b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 1864b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 1865b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1866a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[3]; 1867b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 1868dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1869b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 1870b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 1871b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 18727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 18737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 18747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 18759d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 18769d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 18779d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1878c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 1879c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König /* optimize if it's just an equal balance */ 1880c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if(r600_src[0].sel == V_SQ_ALU_SRC_0_5) { 1881c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König for (i = 0; i < lasti + 1; i++) { 1882c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1883c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König continue; 1884c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 1885c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König memset(&alu, 0, sizeof(struct r600_bc_alu)); 1886c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 1887a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[1], i); 1888a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[2], i); 1889c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.omod = 3; 189080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1891c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.dst.chan = i; 1892c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (i == lasti) { 1893c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.last = 1; 1894c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 1895c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König r = r600_bc_add_alu(ctx->bc, &alu); 1896c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 1897c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 1898c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 1899c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return 0; 1900c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 1901c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 1902b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 1903dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 1904dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1905dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 1906dffad730df17983cfaef0808555a8c26cad0aa15Christian König 1907b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1908a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 1909921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1910b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 1911a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[0], i); 1912b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 1913b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1914b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1915dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 1916b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1917b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1918b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1919b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1920b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1921b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1922b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1923b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1924b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 1925dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 1926dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1927dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 1928dffad730df17983cfaef0808555a8c26cad0aa15Christian König 1929b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1930a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1931b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1932b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 1933a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[2], i); 1934b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1935b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1936dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 1937b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1938b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1939b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1940b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1941b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1942b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1943b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1944b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1945b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 1946dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 1947dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1948dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 1949dffad730df17983cfaef0808555a8c26cad0aa15Christian König 1950b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1951a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1952b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 1953a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], i); 1954a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[1], i); 1955b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 1956b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 1957dffad730df17983cfaef0808555a8c26cad0aa15Christian König 195880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1959b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1960dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 1961b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1962b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1963b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1964b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1965b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1966b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1967dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 1968b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 1969b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 197087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 197187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 197287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1973a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[3]; 197487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu alu; 197587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 1976dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 197787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 197887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_split_constant(ctx, r600_src); 197987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 198087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 19819d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 19829d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 19839d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 198487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 19857be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 19867be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 19877be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 198887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 198987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1990a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 1991a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], i); 1992a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[2], i); 1993a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[2], &r600_src[1], i); 199480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 199587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 199687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 199787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 19987be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 199987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 200087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 200187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 200287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 20037ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 200487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 200587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 200687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 20070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 20080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 20090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2010a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[3]; 20110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu alu; 20120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 20130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 20140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 20160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 20170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_split_constant(ctx, r600_src); 20190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 20200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 20219d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 20229d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 20239d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 20249d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 20250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 20260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2027a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 20280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 20300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 2031a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], 2); 20320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 2034a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], 0); 20350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 2037a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], 1); 20380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 20400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 20410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 20420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 20430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 20450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 2046a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[1], 1); 20470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 2049a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[1], 2); 20500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 2052a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[1], 0); 20530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 20550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 20560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 20570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 20580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 20600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 20610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 20620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 20640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 20650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 20660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 20670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 20680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 20690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 20710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2072a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 20730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 20750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 2076a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], 1); 20770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 2079a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], 2); 20800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 2082a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], 0); 20830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 20850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 20860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 20870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 20880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 20900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 2091a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[1], 2); 20920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 2094a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[1], 0); 20950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 2097a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[1], 1); 20980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 21010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 21020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 21050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 21060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 21070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 21090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 211080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet else 211180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 21120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 21130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 21140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 21150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 21160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 21170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 21180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 21190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 21200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 21220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 21230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 21240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 21250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 212636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 212736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 212836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2129a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src; 213036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu alu; 213109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 213236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2133a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[0], &r600_src); 2134a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 213536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 213636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 213736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 213836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2139a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2140a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, 0); 214136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 214236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 214336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 214436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 214536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 214636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 214736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 214836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 214936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2150a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 215136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = ctx->temp_reg; 215236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 215336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 215436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 215536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 215636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 215736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 215836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 215936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 216036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 216136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 21627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 216336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 216436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 216536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 216636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2167a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 2168a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, 0); 216936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 217036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 217136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 217236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// if (r) 217336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// return r; 217436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 217536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 217636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 217736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 217836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 217936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 218036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 218136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 218236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 218336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 218436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 218536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 218636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2187a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 2188a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, 0); 218936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 219036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 219136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 219236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 2; 219336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 219436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 219536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 219636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 219736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 219836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 219936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 220036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 220136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 220236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 220336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 220436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2205a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 220636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 220736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 220836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 220936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 221036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 221136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 221236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 221336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 221436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 221536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 221636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 221736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 221836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 221987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2220460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2221460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2222460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2223a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src; 2224460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct r600_bc_alu alu; 2225460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 2226460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2227a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[0], &r600_src); 2228a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 2229460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.x = floor(log2(src)); */ 2230460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 2231460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2232460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2233460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2234a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, 0); 2235460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2236460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2237460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2238460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2239460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2240460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2241460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2242460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2243460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2244460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2245460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2246460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2247460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2248460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2249460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2250460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2251460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2252460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2253460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2254460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2255460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2256460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2257460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 225896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck /* result.y = src.x / (2 ^ floor(log2(src.x))); */ 2259460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2260460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2261460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 226296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2263a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, 0); 226496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 226596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 226696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 226796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 226896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 226996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 227096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 227196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 227296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 227396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 227496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 227596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 227696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 227796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 227896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 227996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 228096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 228196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 228296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 228396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 228496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 228596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 228696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 228796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 228896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 228996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 229096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 229196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 229296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 229396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 229496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 229596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 229696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 229796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 229896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 229996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 230096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 230196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 230296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 230396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 230496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 230596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 230696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 230796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 230896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 230996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 231096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 231196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 231296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 231396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 231496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 231596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 231696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 231796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 231896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 231996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 232096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 232196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 232296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 2323a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, 0); 232496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 232596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 232696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2327460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2328460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2329460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2330460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2331460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2332460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2333460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2334460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2335460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2336460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2337460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2338460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.z = log2(src);*/ 2339460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 2340460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2341460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2342460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2343a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, 0); 2344460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2345460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2346460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2347460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 2; 2348460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2349460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2350460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2351460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2352460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2353460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2354460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2355460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2356460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 2357460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2358460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2359460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2360460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2361460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2362460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2363460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2364460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2365460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2366460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2367460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2368460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2369460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2370460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2371460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2372460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2373460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2374460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2375460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 237698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 237798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 237898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2379a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src; 238098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct r600_bc_alu alu; 238198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 2382a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 2383a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[0], &r600_src); 2384a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 238598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 238698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 238752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 238852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 238952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 239052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 239152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 239252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 239352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 239452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 239552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 239652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 239752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 239852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 2399a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, 0); 240098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 240198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.chan = 0; 240298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.sel = ctx->temp_reg; 240398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.write = 1; 2404495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet r = r600_bc_add_alu(ctx->bc, &alu); 240598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 240698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 240798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 240898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT; 240998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].sel = ctx->temp_reg; 241098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].chan = 0; 241198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 2412495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet r = r600_bc_add_alu(ctx->bc, &alu); 241398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 241498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 241598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 241698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 241798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 241847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 241947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie /* TODO from r600c, ar values don't persist between clauses */ 242047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2421a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src; 242247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct r600_bc_alu alu; 242347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 2424a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 2425a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[0], &r600_src); 2426a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 242747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 242847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 24297ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 24307ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 24317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR; 24327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 24337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 24347ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA; 24357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 24367ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 24377ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 24387ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 24397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 24407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2441a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, 0); 244247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 244347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.last = 1; 244447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 2445495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet r = r600_bc_add_alu(ctx->bc, &alu); 244647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 244747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 2448c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie ctx->bc->cf_last->r6xx_uses_waterfall = 1; 244947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 245047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 245147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 245257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 245357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 245457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2455a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src[2]; 245657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct r600_bc_alu alu; 245757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 245857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2459a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[0], &r600_src[0]); 2460a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[1], &r600_src[1]); 2461a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 246257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 246357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 246457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2465a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 246680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 24677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 24687ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 246957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 247057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 2471a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src[0], i); 247257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 247357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2474a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet if (i == 0 || i == 2) { 247557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 247657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 2477a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[1], &r600_src[1], i); 247857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 247957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 248057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 248157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 248257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 248357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 248457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 248557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 248657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 248757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2488a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 2489a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2490a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2491a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet struct r600_shader_src r600_src; 249209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_bc_alu alu; 2493a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 2494a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2495a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet tgsi_src(ctx, &inst->Src[0], &r600_src); 2496a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 2497a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2498a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 2499a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 2500a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2501a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 2502a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 2503a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 2504a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2505a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet r600_bc_src(&alu.src[0], &r600_src, 0); 2506a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 2507a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 25087ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2509a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 2510a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2511a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 2512a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2513a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2514a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2515a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2516a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2517a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 2518a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 25198813842121d46d1be476807c98b0ba0b771f0c91Christian König int alu_pop = 3; 25208813842121d46d1be476807c98b0ba0b771f0c91Christian König if (ctx->bc->cf_last) { 25218813842121d46d1be476807c98b0ba0b771f0c91Christian König if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3) 25228813842121d46d1be476807c98b0ba0b771f0c91Christian König alu_pop = 0; 25238813842121d46d1be476807c98b0ba0b771f0c91Christian König else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3) 25248813842121d46d1be476807c98b0ba0b771f0c91Christian König alu_pop = 1; 25258813842121d46d1be476807c98b0ba0b771f0c91Christian König } 25268813842121d46d1be476807c98b0ba0b771f0c91Christian König alu_pop += pops; 25278813842121d46d1be476807c98b0ba0b771f0c91Christian König if (alu_pop == 1) { 25288813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3; 25298813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->force_add_cf = 1; 25308813842121d46d1be476807c98b0ba0b771f0c91Christian König } else if (alu_pop == 2) { 25318813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3; 25328813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->force_add_cf = 1; 25338813842121d46d1be476807c98b0ba0b771f0c91Christian König } else { 25348813842121d46d1be476807c98b0ba0b771f0c91Christian König r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 25358813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 25368813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 25378813842121d46d1be476807c98b0ba0b771f0c91Christian König } 2538a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2539a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2540a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 254109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 2542a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 254309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 254409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 254509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 254609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 254709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 254809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 254909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 255009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 255109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 255209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 255309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 255409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 255509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 255609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2557a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 255809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 255909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 256009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 256109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 256209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 256309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 256409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 256509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 256609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 256709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 256809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 2569a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 2570a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 2571a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 257209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 257309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 257409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 257509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 257609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 257709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 257809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 25797ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 258009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 258109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 258209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 258309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 258409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 258509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 258609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 258709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 258809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 258909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 259009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 259109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 259209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 259309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 259409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 259509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 259609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 259709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 259809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 259909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 260009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 260109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 260209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 260309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 260409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid, 260509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sizeof(struct r600_bc_cf *) * (sp->num_mid + 1)); 260609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 260709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 260809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2609a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 261009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 261109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2612a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 261309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 261409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 261509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 261609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 261709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 261809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 261909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 262009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 262109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 262209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 262309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 262409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 262509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 262609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 262709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 262809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 262909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 263009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 263109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 263209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 263309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 263409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 263509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 263609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 263709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 263809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 263909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2640a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 264109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 264209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 264309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 264409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2645a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 264609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 264709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 264809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 264909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 265009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 265109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 265209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 26537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 265409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 265509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 265609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 265709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 265809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 265909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 266009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 266109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 266209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 266309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 266409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 266509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 266609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 266709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 266809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 266909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 267009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 267109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 267209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 267309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 267409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 267509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 267609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 267709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 267809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 267909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2680a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 268109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2682a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 268309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 268409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 268509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 268609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 2687a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2688a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2689a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2690a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 2691a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2692a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 2693a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 2694a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 269509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 2696a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 2697a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2698a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2699a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2700a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 2701a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2702a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 2703a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 2704a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 2705a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 2706a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 2707a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2708a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 2709a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 2710a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 2711a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 271209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 2713a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 271409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 271509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 271609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 271709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 271809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 271909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 272009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 272109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2722a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 272309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 272409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 2725a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 272609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 272709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 272809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 272909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 273009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 273109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 273209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 273309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2735a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 273609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 273709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 273809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 273909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 274009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 274109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 274209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 274309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 274409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 274509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 274609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 274709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 274809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 274909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 275009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 275109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 275209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 275309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 275409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 275509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 275609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 275709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 275809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 275909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 276009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 276109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 276209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 276309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 276409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 276509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 276609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 276709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 276809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 276909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 277009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 277109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 277209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 277309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 277409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 277509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 277609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 277709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 277809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 277909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 278009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 278109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 2782a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2783a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2784a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 278698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 2787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 27880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 2789df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 2790df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 2791df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 2792df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 2793df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 2794df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 2795df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 279642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 279736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 2798460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 2799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 2800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2801cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2802cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 280357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 2804dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 2805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 2806d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 2807be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 2808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 2809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2810b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 2811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28183af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 2819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28203af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 2821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 28234558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 2824a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 28250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 2826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2827de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28287a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 2829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2830e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 283188f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 28323af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 28333af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 28344502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 2835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28400d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 2841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28420d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 284388f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 2844d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 28450d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 2846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2847b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2849b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28569f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 2857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28600d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 286187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 286292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 2863d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 2864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2866cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2867ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 286809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 2869a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 2870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2873a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 2874a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 2875de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2876de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2877de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2882de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28834558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 2884de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2885de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2886de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2887de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2889de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2890de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2892de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2893de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 289409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 2895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 289709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 2898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 289909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 2900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2901de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2902de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2904de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2905de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2906de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2907de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2908de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2909de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2910de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2912de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2914de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2916094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 2917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 2918de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2919de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2921de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2923de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2925de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2926de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2928de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2929de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2931de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2933de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2934de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2936de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2937de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2938de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2939de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2941de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2942de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2943de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 294850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 294950526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 295098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 295150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 295250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 295350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 295450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate}, 295550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 295650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 295750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 295850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 295950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 296050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 296150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 296250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 296350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 296450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 296550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 296650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 296750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 296850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 296950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 297150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 297450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 297750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 297950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 298050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 298150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 298250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 298350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 298450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 298550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 298650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 298750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 298850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 298950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 299050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 299150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 299250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 299350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 299450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 299550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 299650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 299750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 299850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 299950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 300150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 300250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 300350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 300450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 300650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 300850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 301550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 301950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 302050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 302150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 302250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3025ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 302650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 302750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 302850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 302950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 303250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 303350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 303450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 304250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 304450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 305350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 305650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 305850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 306050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 306650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 307550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 307650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 307750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 3106