r600_shader.c revision dffad730df17983cfaef0808555a8c26cad0aa15
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 1781235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->uses_kill) { 1791235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* only set some bits here, the other bits are set in the dsa state */ 1801235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1811235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_02880C_DB_SHADER_CONTROL, 1821235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_02880C_KILL_ENABLE(1), 1831235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_02880C_KILL_ENABLE(1), NULL); 1841235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 185738aa29289296512959cbb37d8602131dae44dabDave Airlie r600_pipe_state_add_reg(rstate, 186738aa29289296512959cbb37d8602131dae44dabDave Airlie R_03E200_SQ_LOOP_CONST_0, 0x01000FFF, 187738aa29289296512959cbb37d8602131dae44dabDave Airlie 0xFFFFFFFF, NULL); 1881235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1891235becaa1cf7e29f580900592563c3329d326deJerome Glisse 19069251fc4cd5f71be403e08398bc43d19052a640dJerome Glisseint r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader) 1911235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 1921235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 1931235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 1941235becaa1cf7e29f580900592563c3329d326deJerome Glisse void *ptr; 1951235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1961235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* copy new shader */ 1971235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 19829c4a15bf61a76cd71ffa5b8f09706d0eab84281Keith Whitwell shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0, 0); 1991235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 2001235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -ENOMEM; 2011235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 202294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse ptr = r600_bo_map(rctx->radeon, shader->bo, 0, NULL); 2031235becaa1cf7e29f580900592563c3329d326deJerome Glisse memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * 4); 204294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse r600_bo_unmap(rctx->radeon, shader->bo); 2051235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2061235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* build state */ 2071235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (rshader->processor_type) { 2081235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_VERTEX: 2091235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 2101235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_vs(ctx, shader); 2111235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 2121235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_vs(ctx, shader); 2131235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2141235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2151235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_FRAGMENT: 2161235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 2171235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_ps(ctx, shader); 2181235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 2191235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_ps(ctx, shader); 2201235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2211235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2221235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 2231235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2241235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2251235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2261235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2271235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2281235becaa1cf7e29f580900592563c3329d326deJerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader); 229dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens) 2301235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 231052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König static int dump_shaders = -1; 2321235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 2331235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 2341235becaa1cf7e29f580900592563c3329d326deJerome Glisse 235052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König /* Would like some magic "get_bool_option_once" routine. 236052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König */ 237052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders == -1) 238052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE); 239052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König 240052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 241052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "--------------------------------------------------------------\n"); 242052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König tgsi_dump(tokens, 0); 243052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 2441235becaa1cf7e29f580900592563c3329d326deJerome Glisse shader->shader.family = r600_get_family(rctx->radeon); 2451235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_shader_from_tgsi(tokens, &shader->shader); 2461235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 2471235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("translation from TGSI failed !\n"); 2481235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 2491235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2501235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_bc_build(&shader->shader.bc); 2511235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 2521235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("building bytecode failed !\n"); 2531235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 2541235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 255052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 256052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König r600_bc_dump(&shader->shader.bc); 257052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "______________________________________________________________\n"); 258052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 259afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse return r600_pipe_shader(ctx, shader); 2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse 26269251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader) 263ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{ 264ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 265ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 266ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck r600_bo_reference(rctx->radeon, &shader->bo, NULL); 267f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck r600_bc_clear(&shader->shader.bc); 268ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck} 269ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 2701235becaa1cf7e29f580900592563c3329d326deJerome Glisse/* 2711235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader 2721235becaa1cf7e29f580900592563c3329d326deJerome Glisse */ 2732b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 2742b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 2752b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 2762b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 2772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 2782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 2792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 2802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 2812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 2822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 2832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_bc *bc; 2842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 2852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse u32 value[4]; 286cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 287cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 288e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe u32 max_driver_temp_used; 289fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* needed for evergreen interpolation */ 290fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_centroid; 291fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_linear; 292fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_perspective; 293fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_interp_gpr; 2942b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 2952b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 2962b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 2972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 2982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 2992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 3002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 3012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 3022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 30350526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[]; 30442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 31472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 318c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 319a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 32372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 324a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 3268260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 3278260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 3288260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 33347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 33447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 33972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 34072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 341fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 34250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 34350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 34450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie struct r600_bc_alu alu; 345fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 346fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 347fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 348fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 349fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 350fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 351fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 352fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 353fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 354fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 355fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 356fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 357fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 358fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 359fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 360fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 361fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 362fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 363fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 3647ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 365fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 366fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 367fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 36850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 36950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 37050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 37150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 37250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 37350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 37450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 37550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 37650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 37750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 378fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 37950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 38050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 38150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 38250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 383fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 384fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 385fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 386fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 387fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 38850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 38950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 39050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 39150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 39250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 39350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 39450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 39550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 39650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 3977ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse} 3987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 40172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 40472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 41035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 4118a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie ctx->shader->input[i].centroid = d->Declaration.Centroid; 412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 4134afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == CHIPREV_EVERGREEN) { 41450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 415fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) { 416fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].interpolate > 0) { 417fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->shader->input[i].lds_pos = ctx->shader->nlds++; 418fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie evergreen_interp_alu(ctx, i); 419fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 420fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 42150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 42835e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 43233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 43347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 44072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 44172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 442be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 443be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 444be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 445be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 446be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 4477ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 448fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 449fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 450fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 451fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 452fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 453fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 454fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 455fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 456fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 457fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 458fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 459fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 460fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 461fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 462fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 463fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 464fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 465fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 466fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 467fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 468fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 469fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 470fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 471fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 472fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 473fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 474fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 475fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 476fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 477fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 478fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 479fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 480fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 481fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 482fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 483fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 484fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 485fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 486fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 487fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 488fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 489fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 490fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */ 491fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 492fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 493fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 49572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 498c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 499457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 501de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 50272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 513f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 516076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 517076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 518076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 519f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 520f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,287] correspond to constant buffer bank 2 (EG) 521f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [288,319] correspond to constant buffer bank 3 (EG) 522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 523076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 524076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 525076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 526076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 5414afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.bc->chiprev == CHIPREV_EVERGREEN) { 542f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bc_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 543f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 544f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bc_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 545f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 5474afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == CHIPREV_EVERGREEN) { 548fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 54984457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 554d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 55597e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet /* Outside the GPR range. This will be translated to one of the 55697e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet * kcache banks later. */ 55797e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 558d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253; 560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 563cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 564cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 565cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen 566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 571cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 572cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 573cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 574cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 575cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 576cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 577cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 578cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 579cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 580cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 591be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 592be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 593be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 5954afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx.bc->chiprev == CHIPREV_EVERGREEN) 59650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 59750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 59850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 6022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse r = r600_bc_add_literal(ctx.bc, ctx.value); 603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 606876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie case TGSI_TOKEN_TYPE_PROPERTY: 607876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie break; 608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 615457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 616457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 617c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 618c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 619c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 620c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 621c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 622c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 623c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 624c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 625c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 626c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 627a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 628457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 631c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 632c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 634457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 635457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 636457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 637457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 638457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 639457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 640457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 645b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 646c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 6475f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 648c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 649b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_x = 2; 65039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 7; 65139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 65239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 65339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 65439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].array_base = 61; 65539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_x = 7; 65639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 1; 65739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 658c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 66972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 670457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 671457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 672457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 673457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 674457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 675457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 676457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 677457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 678457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 679457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 680457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 681457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 682457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 683457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 684457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 685457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 686457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 687457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 688457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 689457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 6907e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 691457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 693c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 694481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 695481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 696481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 697481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 698481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 699481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 700481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 701481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 702481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 703481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 704608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 705481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 706a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 707481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 708481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 709457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 710457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 711457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (i == (noutput - 1)) { 712457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].end_of_program = 1; 713457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 714b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 715b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 716a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 717c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 718c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 719457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 720457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 721c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 725cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 729cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 749cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen int index; 7507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(r600_src, 0, sizeof(struct r600_bc_alu_src)); 751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = tgsi_src->Register.Index; 752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = 0; 754cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen index = tgsi_src->Register.Index; 755cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[0] = ctx->literals[index * 4 + 0]; 756cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[1] = ctx->literals[index * 4 + 1]; 757cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[2] = ctx->literals[index * 4 + 2]; 758cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[3] = ctx->literals[index * 4 + 3]; 759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 76047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_src->Register.Indirect) 76147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_src->rel = V_SQ_REL_RELATIVE; 7621bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse r600_src->neg = tgsi_src->Register.Negate; 7638260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell r600_src->abs = tgsi_src->Register.Absolute; 764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 7737a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 7747a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 77947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 78047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 7817a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 7827a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 7837a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 7877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle) 7887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 7897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse switch (swizzle) { 7907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 0: 7917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleX; 7927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 1: 7937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleY; 7947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 2: 7957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleZ; 7967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 3: 7977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleW; 7987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse default: 7997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 8007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 8027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 8037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 8047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 8057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 8077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, k, nconst, r; 8087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 8097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 8107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 8117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse nconst++; 8127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]); 8147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) { 8157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 8199d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 820be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 8217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (k = 0; k < 4; k++) { 8227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 823a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 8249d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 8257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = k; 82640cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid alu.src[0].rel = r600_src[i].rel; 827be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 8287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = k; 8297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 8307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (k == 3) 8317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 8327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 8337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8369d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 83740cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid r600_src[i].rel =0; 8387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse j--; 8397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 8427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 8437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 844be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 845be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 846be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 847be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 848be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct r600_bc_alu alu; 84920846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee int i, j, k, nliteral, r; 850be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 851be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 852be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) { 853be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie nliteral++; 854be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 855be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 8569d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 8579d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) { 858be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 859be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (k = 0; k < 4; k++) { 860be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 861a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 8629d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 863be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].chan = k; 864be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 865be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.chan = k; 866be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.write = 1; 867be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (k == 3) 868be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.last = 1; 869be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 870be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 871be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 872be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 8739d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = r600_bc_add_literal(ctx->bc, &ctx->literals[inst->Src[i].Register.Index * 4]); 874be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 875be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 8769d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 8779d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse j--; 878be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 879be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 880be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return 0; 881be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 882be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 883dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask) 884de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 885dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, lasti = 0; 886d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 887d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 888dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (writemask & (1 << i)) { 889d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 890d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 891d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 892dffad730df17983cfaef0808555a8c26cad0aa15Christian König return lasti; 893dffad730df17983cfaef0808555a8c26cad0aa15Christian König} 894dffad730df17983cfaef0808555a8c26cad0aa15Christian König 895dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 896dffad730df17983cfaef0808555a8c26cad0aa15Christian König{ 897dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 898dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct r600_bc_alu_src r600_src[3]; 899dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct r600_bc_alu alu; 900dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, j, r; 901dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 902de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 9037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 9047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9069d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 9079d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 9089d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 909d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 910d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 911d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 912d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 914d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 915d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (r) 916d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return r; 9177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 918d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 919d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 9217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 9227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 923de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 924d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 925d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0] = r600_src[1]; 926d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[1], i); 927d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 928d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1] = r600_src[0]; 929d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 931de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 933de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 934de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 9367a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 9377a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 9387a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 939de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 941de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 942d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 943de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 952d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 953d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 954d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 955d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 956d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 957d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 958d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 959d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 960d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 961d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 9627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 96388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 96488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 96588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 96688f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 96792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx, 96892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]) 96988f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 97088f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 971242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck int r, src0_chan; 97288f5976484842671ecb2cefcfa91838a43032359Dave Airlie uint32_t lit_vals[4]; 97392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 9747ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 97588f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(lit_vals, 0, 4*4); 97688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_split_constant(ctx, r600_src); 97788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 97888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 9799d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 9809d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 9819d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 982be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 983242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck src0_chan = tgsi_chan(&inst->Src[0], 0); 984242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck 985242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck /* We are going to feed two literals to the MAD below, 986242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck * which means that if the first operand is a literal as well, 987242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck * we need to copy its value manually. 988242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck */ 989242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck if (r600_src[0].sel == V_SQ_ALU_SRC_LITERAL) { 990242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck unsigned index = inst->Src[0].Register.Index; 991242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck 992242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck lit_vals[2] = ctx->literals[index * 4 + src0_chan]; 993242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck src0_chan = 2; 994242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck } 995242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck 99688f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0 /(3.1415926535 * 2)); 99788f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(0.5f); 99888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 99988f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1000a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 100188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 100288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 100388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 100488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 100588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 100688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 100788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0] = r600_src[0]; 1008242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck alu.src[0].chan = src0_chan; 10097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1010921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 101188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1012921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 101388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 101488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 101588f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 101688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 101788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 101888f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 101988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 102088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 102188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 102288f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1023a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 10247ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 102588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 102688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 102788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 102888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 102988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 103088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 103188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 103288f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 103388f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 103488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 103588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 10364afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher if (ctx->bc->chiprev == CHIPREV_R600) { 103788f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(3.1415926535897f * 2.0f); 103888f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-3.1415926535897f); 103988f5976484842671ecb2cefcfa91838a43032359Dave Airlie } else { 104088f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0f); 104188f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-0.5f); 104288f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 104388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 104488f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1045a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 104688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 104788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 104888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 104988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 105088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 105188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 105288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 105388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 10547ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1055921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 105688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1057921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 105888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 105988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 106088f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 106188f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 106288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 106388f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 106488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 106588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 106692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 106792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 106892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 106992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 107092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 107192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 107292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 107392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 107492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1075dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 107692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 107792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = tgsi_setup_trig(ctx, r600_src); 107892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 107992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 108088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 108188f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 108288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 108388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 108488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 108588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 108688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 108788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 108988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 109088f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 109188f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 109288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 109388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 109488f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 1095be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1096be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1097be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1098be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 109988f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1100a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1101be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1102be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 110388f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 110488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 110588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 1106be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 110788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 110888f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 110988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 111088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 111188f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 111288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 111388f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 111488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 111592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 111692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 111792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 111892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 111992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 112092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 112192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 112257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 112357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 112457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 112557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 112657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_setup_trig(ctx, r600_src); 112757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 112857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 112957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 113092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 113192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 113257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 113357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 113457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 113557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 113657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 113757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 113892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 113957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 114057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 114157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 114257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 114357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 114457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 114557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 114692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 114792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 114857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 114957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 115057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 115157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 115257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 115357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 115457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 115557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 115657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 115757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 115857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 115957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 116057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 116157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 116292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1164ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 1165ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1171ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1176ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1178ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1182ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 1183ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1184ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1185ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1186ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1187ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1188ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 1189ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1190ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1191ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1192ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1193ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1194ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1195ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1196ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1197ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1198ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1199ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1200ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1201ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1202ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1203ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1204ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1205ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1206ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 1207ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1208ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1209ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1210ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 121192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 121292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 121392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1214094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1215094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 1216094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1217094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 1218094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1219094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1220094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 1221094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1222094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 12234502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1224094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 12254502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1226921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 12274502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 12284502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 12294502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 12304502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 12314502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 12324502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 12334502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 12344502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 12354502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 12364502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1237094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1238094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1239094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 1240094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1241094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1242094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1243094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 12444502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 12454502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 12464502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 12474502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 12484502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 12494502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 12504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1251094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1252094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1253094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 12540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 12550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 12560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 1258ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie struct r600_bc_alu_src r600_src[3]; 12590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 12600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1261ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie r = tgsi_split_constant(ctx, r600_src); 1262ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie if (r) 1263ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie return r; 1264d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 1265d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie if (r) 1266d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie return r; 1267ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 12687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.x, <- 1.0 */ 12697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1270a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1271921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 12727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 12737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 12747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 12777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.y = max(src.x, 0.0) */ 12827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1283a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 1284ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1285921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 128685e401d8bfd80450a31eac234e13008e33e64227Dave Airlie alu.src[1].chan = 0; 12877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 12887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 12917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.w, <- 1.0 */ 12967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1297a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1298921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 12997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 13007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 13017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 13047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 13057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 13067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13095ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 13105ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 13115ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 13125ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 13130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 13140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 13156a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 13166a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 13176a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 13180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 13190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1320a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1321ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1322ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 13230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 13240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 13325ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 13335ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 133485e401d8bfd80450a31eac234e13008e33e64227Dave Airlie 13356a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 13366a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 13370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 13390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1340a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 1341ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 13427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 13430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 13440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 1345ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 1346ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[2] = r600_src[0]; 13477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[2].chan = tgsi_chan(&inst->Src[0], 0); 13480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 13490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 13500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 13510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 13520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13575ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 13585ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 13595ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 13600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 13610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1362a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 13630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 13640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 13650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 13660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 13730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 13740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 13750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 137642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 137742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 137842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 137942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct r600_bc_alu alu; 138042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 138142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 138242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1383df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1384df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1385df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1386df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1387df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1388df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1389df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 139042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 139142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 139242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 139342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 139442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 139542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].abs = 1; 139642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 139742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 139842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 139942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 140042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 140142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 140242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 140342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 140442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 140542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 140642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 140742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 140842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 140942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1410a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 14117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 14127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 1414a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 14157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 14167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 14177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 14187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1419a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 14207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 14217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 14227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 14247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 14257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 14267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 14277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 14287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 14307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 14317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 14327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 14337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1434a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1436a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1440a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1441a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 1443a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 1444a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 1447a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1448a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1449a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1450a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1451a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1452a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1453a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 14545ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 14555ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 14565ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 1457a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1458a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1459a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1460a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1461a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1462a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1463a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1464a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1465a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1466a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1467a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 1468a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1469a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 1470a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1471a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1472a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1473a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 1474a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1475a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1476a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1477a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1478a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1479a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1480e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1481e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1482e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1483a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 1484a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 148566f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1486a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]); 1487a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1488a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1489a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[1], 0); 1490a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1491a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1492a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1493a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1494a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1495a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1496a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1497e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1498e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1499e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1500a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 1501a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1502a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1503a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1504a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1505a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1506a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1507a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1508a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1509a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1510e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1511e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1512e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1513a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1514a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1515a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 15160d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 15170d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 15180d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15190d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu alu; 15200d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu_src r600_src[3]; 1521921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 15220d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15230d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_split_constant(ctx, r600_src); 15240d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15250d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15269d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 15279d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 15289d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 15290d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15300d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 15310d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 15320d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1533a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 15340d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1535cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 15360d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1537cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 15380d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15390d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0] = r600_src[0]; 15400d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 15410d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1542921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 15430d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15440d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2] = r600_src[0]; 15450d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[0], i); 15460d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 15470d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 15480d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15490d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15500d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15510d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 1552cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 1553cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie if (r) 1554cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie return r; 15550d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15560d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 15570d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 15580d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1559a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 15600d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 15610d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 15620d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15630d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15640d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15650d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1566cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 15670d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 15680d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1569921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 15700d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 15710d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15720d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1573cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 15740d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15750d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 15760d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 15770d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15780d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15790d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15800d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 15810d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 15820d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 15830d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1584cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1585cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1586cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1587cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1588cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 15899961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 15909961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse if (r) 15919961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse return r; 1592cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 1593cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1594cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1595a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 15966c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1597cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1598a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1599cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1600cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1601cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1602cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1603cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1604cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1605cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1606cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1607cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1608cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1609cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1610cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1611cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1612cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1613cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1614cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1621dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 16237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 16247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 16257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 16269d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 16279d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 16289d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 16297be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 16307be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 16317be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 16327be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 1633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1634de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 16367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 16377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 16397be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 16407be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16417be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (r) 16427be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return r; 16437be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 1644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 16477be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 1648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 16547be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1655cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1656cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1657cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1658cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1659cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1661cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1662cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1663cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 16647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 16657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 16667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 16679d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 16689d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 16699d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1672cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1673cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 16747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 16757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1676cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1677a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 1678a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1679a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König if (r) 1680a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König return r; 1681a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 1682cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1683a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 1684cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1685cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1686cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1687cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1688921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1689cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1690cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1691cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1692cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1693cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1694921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1695cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1696cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1697cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1698e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1699e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1700e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1701e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1702e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1703e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1704e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1705cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1706cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 17157be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 171833241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 171933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 172033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 172133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1722641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1723641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 1724b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie int r, i; 1725bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 172693a95ad8ff1d543f886f123029d1329513729c4bChristian König boolean src_not_temp = 172793a95ad8ff1d543f886f123029d1329513729c4bChristian König inst->Src[0].Register.File != TGSI_FILE_TEMPORARY && 172893a95ad8ff1d543f886f123029d1329513729c4bChristian König inst->Src[0].Register.File != TGSI_FILE_INPUT; 1729bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie uint32_t lit_vals[4]; 1730641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1731641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 1732641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1733b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1734b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 1735b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1736a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1737bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1738bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1739bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1740bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1741b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 1742b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1743b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1744b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1745b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1746b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1747b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1748b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 17499d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 1750b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1751b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1752a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1753b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 1754b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 3; 1755bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1756bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1757bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1758b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1759b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1760b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1761b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1762b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1763b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1764b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1765b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1766b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1767a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1768921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1769b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1770b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1771b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1772b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1773b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1774b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1775b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1776b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 177707b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1778b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1779bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1780bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1781bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1782bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int src_chan, src2_chan; 1783bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1787a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 1788bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie switch (i) { 1789bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 0: 1790bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1791bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 1; 1792bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1793bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 1: 1794bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1795bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 0; 1796bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1797bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 2: 1798bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 0; 1799bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1800bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1801bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 3: 1802bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 1; 1803bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1804bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 180584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee default: 180684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee assert(0); 180784b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src_chan = 0; 180884b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src2_chan = 0; 180984b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee break; 1810bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1811bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1812bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1813bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1814bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan); 1815bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1816bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1817bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1818bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan); 1819bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1820bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 1821bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 1822bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1823bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1824bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1825bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1826bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1827bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1828bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1829bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 1830bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1831a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1832bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1833bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 2; 1834bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].abs = 1; 1835bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1836bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 2; 1837bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1838bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 18427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1843bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 1844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 18457ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 1847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1848a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1849bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1850bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1851bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 1853bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1854bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 18557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1856bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1857bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1858bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1859bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1860bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 1861bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1862bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1863bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1864bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1865bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1866bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1867bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1868a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1869bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1870bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1871bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1872bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 1873bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1874bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 18757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1876bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1877bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1878bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1879bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1880bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 1881bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1882bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1883bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1884bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1885bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1886bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1887bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1888bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie lit_vals[0] = fui(1.5f); 1889bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1890bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 1891bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 189307b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1894bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 1895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (src_not_temp) { 1898b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 1899b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1900a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1901b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 1902a21a2748beb1f42d21e14858eee9a1323d85a00fFredrik Höglund alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 1903b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1904b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1905b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 1906b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1907b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1908b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1909b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1910b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1911b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1912b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1913b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 19147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 1916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (opcode == SQ_TEX_INST_SAMPLE && 1917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)) 1918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = SQ_TEX_INST_SAMPLE_C; 191933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 192033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 1922ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 1923ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.resource_id = tex.sampler_id; 1924641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 19256c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 19269d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 19279d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 19289d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 19299d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 193033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 193133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 193233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 193333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 19349a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 1935bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1936bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 1937bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 1938bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 1939bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 1940bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1941bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 194201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 194301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 194401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 19457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 194601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 194701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 1948bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1949bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) 19505d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie tex.src_sel_w = 2; 1951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1952bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_tex(ctx->bc, &tex); 1953bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1955bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1956bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 1957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 195833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 195933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 1960b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 1961b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 1962b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1964b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 1965dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1966b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 1967b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 1968b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 19697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 19707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 19717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 19729d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 19739d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 19749d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1975b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 1976dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 1977dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1978dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 1979dffad730df17983cfaef0808555a8c26cad0aa15Christian König 1980b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1981a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 1982921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1983b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 19847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 19857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1986b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 1987b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1988b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1989dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 1990b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1991b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1992b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1993b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1994b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1995b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1996b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1997b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1998b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1999b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2000b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2001b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 2002dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2003dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2004dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2005dffad730df17983cfaef0808555a8c26cad0aa15Christian König 2006b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 2007a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2008b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2009b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 20107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[2]; 20117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 2012b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2013b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2014dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2015b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2016b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2017b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 2018b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2019b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2020b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2021b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2022b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 2023b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2024b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2025b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2026b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 2027dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2028dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2029dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2030dffad730df17983cfaef0808555a8c26cad0aa15Christian König 2031b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 2032a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2033b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 20347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[0]; 20357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 20367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[1]; 20377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 2038b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 2039b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 2040dffad730df17983cfaef0808555a8c26cad0aa15Christian König 2041dffad730df17983cfaef0808555a8c26cad0aa15Christian König r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2042dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (r) 2043dffad730df17983cfaef0808555a8c26cad0aa15Christian König return r; 2044dffad730df17983cfaef0808555a8c26cad0aa15Christian König 2045b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2046dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2047b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2048b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2049b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2050b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2051b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2052b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2053dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 2054b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 2055b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 205687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 205787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 205887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 205987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu_src r600_src[3]; 206087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu alu; 206187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 2062dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 206387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 206487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_split_constant(ctx, r600_src); 206587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 206687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 20679d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 20689d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 20699d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 207087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 20717be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 20727be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 20737be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 207487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 207587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2076a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 207787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0] = r600_src[0]; 207887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 207987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 208087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1] = r600_src[2]; 208187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 208287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 208387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2] = r600_src[1]; 208487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[1], i); 208587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 20867be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 20877be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (r) 20887be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return r; 20897be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 209087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 209187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 209287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 20937be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 209487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 209587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 209687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 209787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 20987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 209987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 210087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 210187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 21020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 21030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 21040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 21050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu_src r600_src[3]; 21060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu alu; 21070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 21080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 21090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 21110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 21120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_split_constant(ctx, r600_src); 21140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 21150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 21169d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 21179d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 21189d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 21199d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 21200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 21210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2122a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 21230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 21250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 21280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 21310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 21340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 21370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 21380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 21410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 21440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 21470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 21500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 21530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 21540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 21570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 21580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 21590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 21610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 21620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 21630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 21640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 21651e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck 21661e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 21671e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck if (r) 21681e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck return r; 21690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 21720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2173a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 21740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 21760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 21790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 21820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 21850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 21880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 21890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 21920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 21950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 21980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 22000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 22010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 22020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 22030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 22040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 22050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 22080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 22090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 22100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 22120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 22130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie else { 22140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 22150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 22160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 22170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 22190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 22200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 22210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 22220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 22230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 22240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 22250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 22261e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck 22271e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 22281e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck if (r) 22291e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck return r; 22300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 22320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 22330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 22340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 22350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 223636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 223736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 223836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 223989c26866f05dcf8fbb716e38d4780cebcae71653Vinson Lee struct r600_bc_alu_src r600_src[3] = { { 0 } }; 224036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu alu; 224109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 224236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 224336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 224436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 224536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 224636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2247a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 224836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 224936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 225036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 225136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 225236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 225336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 225436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 225536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 225636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 225736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 225836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 225936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 226036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 226136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 22625ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 22635ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 22645ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 22655ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 2266a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 226736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = ctx->temp_reg; 226836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 226936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 227036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 227136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 227236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 227336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 227436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 227536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 227636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 22775ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 22785ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 22795ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 22805ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 228136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 22827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 228336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 228436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 228536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 228636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2287a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 228836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0] = r600_src[0]; 228936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 229036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 229136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 229236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 229336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 229436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 229536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 229636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// if (r) 229736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// return r; 229836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 229936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 230036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 230136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 230236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 230336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 230436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 230536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 23065ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 23075ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 23085ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 230936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 231036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 231136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 231236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 231336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2314a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 231536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 231636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 231736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 231836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 231936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 232036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 232136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 232236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 2; 232336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 232436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 232536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 232636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 232736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 232836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 23295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 23305ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 23315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 233236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 233336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 233436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 233536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 233636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 233736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2338a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 233936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 234036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 234136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 234236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 234336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 234436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 234536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 234636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 234736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 234836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 23495ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 23505ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 23515ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 235236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 235336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 235436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 235587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2356460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2357460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2358460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2359460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct r600_bc_alu alu; 2360460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 2361460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2362460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.x = floor(log2(src)); */ 2363460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 2364460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2365460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2366460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2367460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2368460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2369460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2370460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2371460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2372460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2373460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2374460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2375460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2376460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2377460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2378460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2379460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2380460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2381460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2382460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2383460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2384460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2385460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2386460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2387460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2388460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2389460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2390460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2391460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2392460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2393460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2394460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2395460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2396460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2397460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2398460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2399460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2400460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2401460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2402460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 240396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck /* result.y = src.x / (2 ^ floor(log2(src.x))); */ 2404460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2405460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2406460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 240796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 240896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 240996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 241096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 241196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 241296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 241396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 241496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 241596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 241696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 241796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 241896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 241996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 242096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 242196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 242296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 242396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 242496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 242596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 242696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 242796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 242896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 242996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 243096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 243196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 243296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 243396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 243496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 243596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 243696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 243796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 243896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 243996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 244096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 244196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 244296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 244396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 244496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 244596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 244696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 244796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 244896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 244996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 245096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 245196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 245296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 245396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 245496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 245596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 245696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 245796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 245896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 245996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 246096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 246196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 246296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 246396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 246496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 246596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 246696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 246796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 246896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 246996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 247096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 247196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 247296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 247396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 247496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 247596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 247696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 247796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 247896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 247996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 248096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 248196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 248296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 248396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 248496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 248596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 248696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 248796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 248896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 248996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 249096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 249196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 249296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 249396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 249496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 249596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2496460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2497460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2498460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2499460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2500460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2501460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2502460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2503460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2504460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2505460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2506460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2507460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2508460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2509460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2510460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2511460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.z = log2(src);*/ 2512460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 2513460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2514460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2515460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2516460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2517460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2518460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2519460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2520460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2521460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2522460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2523460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2524460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 2; 2525460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2526460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2527460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2528460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2529460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2530460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2531460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2532460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2533460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2534460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2535460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2536460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2537460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 2538460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2539460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2540460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2541460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2542460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2543460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2544460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2545460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2546460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2547460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2548460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2549460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2550460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2551460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2552460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2553460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2554460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2555460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2556460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2557460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2558460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2559460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2560460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 256198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 256298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 256398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 256498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct r600_bc_alu alu; 256598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 256698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 256798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 256852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 256952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 257052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 257152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 257252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 257352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 257452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 257552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 257652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 257752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 257852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 257952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 258098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 258198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 258298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 258398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 258498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 258598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.chan = 0; 258698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.sel = ctx->temp_reg; 258798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.write = 1; 258898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)); 258998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 259098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 259198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 259298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT; 259398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 259498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 259598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 259698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].sel = ctx->temp_reg; 259798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].chan = 0; 259898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 259998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)); 260098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 260198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 260298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 260398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 260498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 260547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 260647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie /* TODO from r600c, ar values don't persist between clauses */ 260747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 260847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct r600_bc_alu alu; 260947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 261047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 261147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 26127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 26137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 26147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR; 26157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 26167ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 26177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA; 26187ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 26197ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 26207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 26217ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 26227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 26237ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 262447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 262547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 262647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 262747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 262847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 262947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 263047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.last = 1; 263147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 2632a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)); 263347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 263447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 2635c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie ctx->bc->cf_last->r6xx_uses_waterfall = 1; 263647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 263747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 263847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 263957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 264057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 264157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 264257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct r600_bc_alu alu; 264357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 264457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 264557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 264657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 264757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2648a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 264957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 265057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 265157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 26527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 26537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 265457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 265557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 265657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 265757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 265857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 265957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 266057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 266157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 266257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 2) { 266357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 266457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 266557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]); 266657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 266757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 266857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 266957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 267057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 267157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 267257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 267357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 267457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 267557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 267657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 267757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 267857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2679a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 2680a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2681a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 268209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_bc_alu alu; 2683a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 2684a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2685a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2686a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 2687a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 2688a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2689a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 2690a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 2691a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 2692a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2693a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2694a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2695a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2696a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2697a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 2698a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 26997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2700a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 2701a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2702a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 2703a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2704a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2705a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2706a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2707a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2708a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 2709a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 27108813842121d46d1be476807c98b0ba0b771f0c91Christian König int alu_pop = 3; 27118813842121d46d1be476807c98b0ba0b771f0c91Christian König if (ctx->bc->cf_last) { 27128813842121d46d1be476807c98b0ba0b771f0c91Christian König if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3) 27138813842121d46d1be476807c98b0ba0b771f0c91Christian König alu_pop = 0; 27148813842121d46d1be476807c98b0ba0b771f0c91Christian König else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3) 27158813842121d46d1be476807c98b0ba0b771f0c91Christian König alu_pop = 1; 27168813842121d46d1be476807c98b0ba0b771f0c91Christian König } 27178813842121d46d1be476807c98b0ba0b771f0c91Christian König alu_pop += pops; 27188813842121d46d1be476807c98b0ba0b771f0c91Christian König if (alu_pop == 1) { 27198813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3; 27208813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->force_add_cf = 1; 27218813842121d46d1be476807c98b0ba0b771f0c91Christian König } else if (alu_pop == 2) { 27228813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3; 27238813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->force_add_cf = 1; 27248813842121d46d1be476807c98b0ba0b771f0c91Christian König } else { 27258813842121d46d1be476807c98b0ba0b771f0c91Christian König r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 27268813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 27278813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 27288813842121d46d1be476807c98b0ba0b771f0c91Christian König } 2729a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2730a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2731a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 273209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 2733a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 273509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 273609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 273709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 273809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 273909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 274009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 274109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 274209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 274309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 274409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 274509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 274609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 274709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2748a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 274909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 275009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 275109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 275209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 275309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 275409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 275509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 275609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 275709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 275809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 275909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 2760a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 2761a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 2762a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 276309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 276409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 276509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 276609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 276709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 276809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 276909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 27707ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 277109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 277209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 277309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 277409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 277509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 277609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 277709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 277809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 277909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 278009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 278109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 278209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 278309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 278409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 278509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 278609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 278709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 278809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 278909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 279009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 279109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 279209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 279309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 279409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 279509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid, 279609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sizeof(struct r600_bc_cf *) * (sp->num_mid + 1)); 279709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 279809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 279909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2800a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 280109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 280209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2803a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 280409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 280509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 280609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 280709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 280809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 280909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 281009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 281109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 281209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 281309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 281409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 281509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 281609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 281709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 281809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 281909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 282009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 282109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 282209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 282309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 282409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 282509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 282609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 282809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2831a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 283309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2836a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 284209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 284309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 28447ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 284509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 284609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 284709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 284809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 284909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 285009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 285109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 285209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 285309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 285409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 285509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 285609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 285709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 285809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 285909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 286009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 286109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 286209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 286309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 286409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 286509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 286609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 286709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 286809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 286909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 287009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2871a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 287209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2873a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 287409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 287509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 287609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 287709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 2878a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2879a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2880a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2881a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 2882a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2883a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 2884a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 2885a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 288609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 2887a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 2888a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2889a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2890a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2891a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 2892a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2893a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 2894a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 2895a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 2896a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 2897a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 2898a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2899a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 2900a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 2901a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 2902a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 290309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 2904a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 290509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 290609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 290709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 290809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 290909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 291009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 291109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 291209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2913a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 291409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 291509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 2916a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 291709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 291809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 291909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 292009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 292109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 292209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 292309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 292409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 292509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2926a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 292709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 292809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 292909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 293009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 293109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 293209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 293309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 293409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 293509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 293609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 293709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 293809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 293909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 294009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 294109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 294209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 294309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 294409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 294509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 294609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 294709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 294809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 294909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 295009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 295109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 295209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 295309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 295409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 295509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 295609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 295709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 295809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 295909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 296009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 296109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 296209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 296309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 296409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 296509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 296609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 296709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 296809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 296909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 297009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 297109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 297209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 2973a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2974a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2975a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2976de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 297798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 2978de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 29790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 2980df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 2981df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 2982df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 2983df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 2984df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 2985df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 2986df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 298742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 298836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 2989460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 2990de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 2991de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2992cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2993cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 299457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 2995dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 2996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 2997d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 2998be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 2999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 3000de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3001b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 3002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3003de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3004de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3005de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30093af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 3010de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30113af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3012de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 30144558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 3015a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 30160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 3017de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30197a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 3020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3021e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 302288f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 30233af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 30243af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 30254502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 3026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3027de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3028de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3029de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3030de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30310d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 3032de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30330d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 303488f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 3035d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 30360d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 3037de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3038b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 3039de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3040b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 3041de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3043de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3044de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3046de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30479f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30510d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 305287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 305392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3054d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 3055de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3057cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3058ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 305909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 3060a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 3061de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3062de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3063de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3064a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 3065a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 3066de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3069de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3071de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 30744558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 3075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3083de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 3086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 3089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 3091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3096de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3097de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3098de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3099de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3107094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 3108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 3109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 313950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 314050526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 314198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 314250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 314350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 314450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 314550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate}, 314650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 314750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 314950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 315050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 315150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 315250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 315350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 315450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 315550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 315650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 315750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 315850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 315950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 316050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 316250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 316550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 316850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 317050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 317250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 317350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 317450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 317550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 317650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 317850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 318050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 318150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 318250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 318350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 318450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 319050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 319250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 319350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 319450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 319550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 319750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 319850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 319950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 320650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 320950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 321050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 321150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 321250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 321350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3216ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 321750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 321850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 321950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 322050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 322350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 322450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 322550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 322950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 323350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 323550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 323950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 324450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 324750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 324850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 324950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 325150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 325750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 325950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 326650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 326750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 326850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 326950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 327950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 3297