r600_shader.c revision a21a2748beb1f42d21e14858eee9a1323d85a00f
172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/* 272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a 572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"), 672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation 772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub 872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom 972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions: 1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next 1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the 1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software. 1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE. 2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */ 23de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "pipe/p_shader_tokens.h" 24de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_parse.h" 25de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_scan.h" 2633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse#include "tgsi/tgsi_dump.h" 27de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h" 289c284b5cae916a083d17d1039d2f2da128b47882Jerome Glisse#include "r600_pipe.h" 29de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h" 30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h" 31a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h" 3272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h" 33de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h> 34de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h> 35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 361235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic void r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader) 371235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 381235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_state *rstate = &shader->rstate; 391235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 401235becaa1cf7e29f580900592563c3329d326deJerome Glisse unsigned spi_vs_out_id[10]; 411235becaa1cf7e29f580900592563c3329d326deJerome Glisse unsigned i, tmp; 422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 431235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* clear previous register */ 441235becaa1cf7e29f580900592563c3329d326deJerome Glisse rstate->nregs = 0; 451235becaa1cf7e29f580900592563c3329d326deJerome Glisse 461235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* so far never got proper semantic id from tgsi */ 471235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < 10; i++) { 481235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_vs_out_id[i] = 0; 491235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 501235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < 32; i++) { 511235becaa1cf7e29f580900592563c3329d326deJerome Glisse tmp = i << ((i & 3) * 8); 521235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_vs_out_id[i / 4] |= tmp; 531235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 541235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < 10; i++) { 551235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 561235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028614_SPI_VS_OUT_ID_0 + i * 4, 571235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_vs_out_id[i], 0xFFFFFFFF, NULL); 581235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 591235becaa1cf7e29f580900592563c3329d326deJerome Glisse 601235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 611235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0286C4_SPI_VS_OUT_CONFIG, 621235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2), 631235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0xFFFFFFFF, NULL); 641235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 651235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028868_SQ_PGM_RESOURCES_VS, 661235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_NUM_GPRS(rshader->bc.ngpr) | 671235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_STACK_SIZE(rshader->bc.nstack), 681235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0xFFFFFFFF, NULL); 691235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 701235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0288A4_SQ_PGM_RESOURCES_FS, 711235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0x00000000, 0xFFFFFFFF, NULL); 721235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 731235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0288D0_SQ_PGM_CF_OFFSET_VS, 741235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0x00000000, 0xFFFFFFFF, NULL); 751235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 761235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0288DC_SQ_PGM_CF_OFFSET_FS, 771235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0x00000000, 0xFFFFFFFF, NULL); 781235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 791235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028858_SQ_PGM_START_VS, 80d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo); 811235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 821235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028894_SQ_PGM_START_FS, 83d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo); 84738aa29289296512959cbb37d8602131dae44dabDave Airlie 85738aa29289296512959cbb37d8602131dae44dabDave Airlie r600_pipe_state_add_reg(rstate, 86738aa29289296512959cbb37d8602131dae44dabDave Airlie R_03E200_SQ_LOOP_CONST_0 + (32 * 4), 0x01000FFF, 87738aa29289296512959cbb37d8602131dae44dabDave Airlie 0xFFFFFFFF, NULL); 88738aa29289296512959cbb37d8602131dae44dabDave Airlie 891235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 901235becaa1cf7e29f580900592563c3329d326deJerome Glisse 91dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_find_vs_semantic_index(struct r600_shader *vs, 921235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *ps, int id) 931235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 941235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader_io *input = &ps->input[id]; 951235becaa1cf7e29f580900592563c3329d326deJerome Glisse 961235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (int i = 0; i < vs->noutput; i++) { 971235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (input->name == vs->output[i].name && 981235becaa1cf7e29f580900592563c3329d326deJerome Glisse input->sid == vs->output[i].sid) { 991235becaa1cf7e29f580900592563c3329d326deJerome Glisse return i - 1; 1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1051235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic void r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader) 1061235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 1071235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 1081235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_state *rstate = &shader->rstate; 1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 1101235becaa1cf7e29f580900592563c3329d326deJerome Glisse unsigned i, tmp, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z; 1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse boolean have_pos = FALSE, have_face = FALSE; 1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* clear previous register */ 1141235becaa1cf7e29f580900592563c3329d326deJerome Glisse rstate->nregs = 0; 1151235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1161235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rshader->ninput; i++) { 117dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlie tmp = S_028644_SEMANTIC(r600_find_vs_semantic_index(&rctx->vs_shader->shader, rshader, i)); 1181235becaa1cf7e29f580900592563c3329d326deJerome Glisse tmp |= S_028644_SEL_CENTROID(1); 1191235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_POSITION) 1201235becaa1cf7e29f580900592563c3329d326deJerome Glisse have_pos = TRUE; 1211235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_COLOR || 1221235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->input[i].name == TGSI_SEMANTIC_BCOLOR || 1231235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->input[i].name == TGSI_SEMANTIC_POSITION) { 1241235becaa1cf7e29f580900592563c3329d326deJerome Glisse tmp |= S_028644_FLAT_SHADE(rshader->flat_shade); 1251235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_FACE) 1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse have_face = TRUE; 1281235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC && 1291235becaa1cf7e29f580900592563c3329d326deJerome Glisse rctx->sprite_coord_enable & (1 << rshader->input[i].sid)) { 1301235becaa1cf7e29f580900592563c3329d326deJerome Glisse tmp |= S_028644_PT_SPRITE_TEX(1); 1311235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1321235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, tmp, 0xFFFFFFFF, NULL); 1331235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1341235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rshader->noutput; i++) { 13551f9cc4759c23b74a2e4d9c79b0a5df27d403f54Dave Airlie if (rshader->output[i].name == TGSI_SEMANTIC_POSITION) 1367777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie r600_pipe_state_add_reg(rstate, 1377777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie R_02880C_DB_SHADER_CONTROL, 1387777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie S_02880C_Z_EXPORT_ENABLE(1), 1397777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie S_02880C_Z_EXPORT_ENABLE(1), NULL); 14039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL) 14139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie r600_pipe_state_add_reg(rstate, 14239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie R_02880C_DB_SHADER_CONTROL, 14339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie S_02880C_STENCIL_REF_EXPORT_ENABLE(1), 14439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie S_02880C_STENCIL_REF_EXPORT_ENABLE(1), NULL); 1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps = 0; 1481235becaa1cf7e29f580900592563c3329d326deJerome Glisse num_cout = 0; 1491235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rshader->noutput; i++) { 15039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie if (rshader->output[i].name == TGSI_SEMANTIC_POSITION || rshader->output[i].name == TGSI_SEMANTIC_STENCIL) 1511235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps |= 1; 1521235becaa1cf7e29f580900592563c3329d326deJerome Glisse else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) { 1531235becaa1cf7e29f580900592563c3329d326deJerome Glisse num_cout++; 1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1551235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1561235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps |= S_028854_EXPORT_COLORS(num_cout); 1571235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (!exports_ps) { 1581235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* always at least export 1 component per pixel */ 1591235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps = 2; 1601235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1611235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1621235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_ps_in_control_0 = S_0286CC_NUM_INTERP(rshader->ninput) | 1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_0286CC_PERSP_GRADIENT_ENA(1); 1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_input_z = 0; 1651235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (have_pos) { 1661235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_ps_in_control_0 |= S_0286CC_POSITION_ENA(1) | 1671235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_0286CC_BARYC_SAMPLE_CNTL(1); 1681235becaa1cf7e29f580900592563c3329d326deJerome Glisse spi_input_z |= 1; 1691235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1701235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0, spi_ps_in_control_0, 0xFFFFFFFF, NULL); 1711235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1, S_0286D0_FRONT_FACE_ENA(have_face), 0xFFFFFFFF, NULL); 1721235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z, 0xFFFFFFFF, NULL); 1731235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1741235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028840_SQ_PGM_START_PS, 175d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo); 1761235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1771235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028850_SQ_PGM_RESOURCES_PS, 1781235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_NUM_GPRS(rshader->bc.ngpr) | 1791235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_028868_STACK_SIZE(rshader->bc.nstack), 1801235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0xFFFFFFFF, NULL); 1811235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1821235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_028854_SQ_PGM_EXPORTS_PS, 1831235becaa1cf7e29f580900592563c3329d326deJerome Glisse exports_ps, 0xFFFFFFFF, NULL); 1841235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1851235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_0288CC_SQ_PGM_CF_OFFSET_PS, 1861235becaa1cf7e29f580900592563c3329d326deJerome Glisse 0x00000000, 0xFFFFFFFF, NULL); 1871235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1881235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->uses_kill) { 1891235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* only set some bits here, the other bits are set in the dsa state */ 1901235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_state_add_reg(rstate, 1911235becaa1cf7e29f580900592563c3329d326deJerome Glisse R_02880C_DB_SHADER_CONTROL, 1921235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_02880C_KILL_ENABLE(1), 1931235becaa1cf7e29f580900592563c3329d326deJerome Glisse S_02880C_KILL_ENABLE(1), NULL); 1941235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 195738aa29289296512959cbb37d8602131dae44dabDave Airlie r600_pipe_state_add_reg(rstate, 196738aa29289296512959cbb37d8602131dae44dabDave Airlie R_03E200_SQ_LOOP_CONST_0, 0x01000FFF, 197738aa29289296512959cbb37d8602131dae44dabDave Airlie 0xFFFFFFFF, NULL); 1981235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1991235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2001235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader) 2011235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 2021235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 2031235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 2041235becaa1cf7e29f580900592563c3329d326deJerome Glisse void *ptr; 2051235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2061235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* copy new shader */ 2071235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 208294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0); 2091235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 2101235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -ENOMEM; 2111235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 212294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse ptr = r600_bo_map(rctx->radeon, shader->bo, 0, NULL); 2131235becaa1cf7e29f580900592563c3329d326deJerome Glisse memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * 4); 214294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse r600_bo_unmap(rctx->radeon, shader->bo); 2151235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2161235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* build state */ 2171235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->flat_shade = rctx->flatshade; 2181235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (rshader->processor_type) { 2191235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_VERTEX: 2201235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 2211235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_vs(ctx, shader); 2221235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 2231235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_vs(ctx, shader); 2241235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2251235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2261235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_FRAGMENT: 2271235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 2281235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_ps(ctx, shader); 2291235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 2301235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_ps(ctx, shader); 2311235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2321235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2331235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 2341235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2351235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2361235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_context_pipe_state_set(&rctx->ctx, &shader->rstate); 2371235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2381235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2391235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2401235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *rshader) 2411235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 2421235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 2431235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *shader = &rshader->shader; 2441235becaa1cf7e29f580900592563c3329d326deJerome Glisse const struct util_format_description *desc; 2451235becaa1cf7e29f580900592563c3329d326deJerome Glisse enum pipe_format resource_format[160]; 2461235becaa1cf7e29f580900592563c3329d326deJerome Glisse unsigned i, nresources = 0; 2471235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_bc *bc = &shader->bc; 2481235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_bc_cf *cf; 2491235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_bc_vtx *vtx; 2501235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2511235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->processor_type != TGSI_PROCESSOR_VERTEX) 2521235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2536dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie /* doing a full memcmp fell over the refcount */ 2546dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie if ((rshader->vertex_elements.count == rctx->vertex_elements->count) && 2556dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie (!memcmp(&rshader->vertex_elements.elements, &rctx->vertex_elements->elements, 32 * sizeof(struct pipe_vertex_element)))) { 2561235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 2571235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2581235becaa1cf7e29f580900592563c3329d326deJerome Glisse rshader->vertex_elements = *rctx->vertex_elements; 2591235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (i = 0; i < rctx->vertex_elements->count; i++) { 2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format; 2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 262294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse r600_bo_reference(rctx->radeon, &rshader->bo, NULL); 2631235becaa1cf7e29f580900592563c3329d326deJerome Glisse LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) { 2641235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (cf->inst) { 2651235becaa1cf7e29f580900592563c3329d326deJerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX: 2661235becaa1cf7e29f580900592563c3329d326deJerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC: 2671235becaa1cf7e29f580900592563c3329d326deJerome Glisse LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) { 2681235becaa1cf7e29f580900592563c3329d326deJerome Glisse desc = util_format_description(resource_format[vtx->buffer_id]); 2691235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (desc == NULL) { 2701235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]); 2711235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2721235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2731235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_x = desc->swizzle[0]; 2741235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_y = desc->swizzle[1]; 2751235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_z = desc->swizzle[2]; 2761235becaa1cf7e29f580900592563c3329d326deJerome Glisse vtx->dst_sel_w = desc->swizzle[3]; 2771235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2781235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2791235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 2801235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 2811235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2821235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2831235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r600_bc_build(&shader->bc); 2841235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 2851235becaa1cf7e29f580900592563c3329d326deJerome Glisse 286dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *shader) 2871235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 2881235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 2891235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 2901235becaa1cf7e29f580900592563c3329d326deJerome Glisse 2911235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader == NULL) 2921235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2931235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* there should be enough input */ 2941235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rctx->vertex_elements->count < shader->shader.bc.nresource) { 2951235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("%d resources provided, expecting %d\n", 2961235becaa1cf7e29f580900592563c3329d326deJerome Glisse rctx->vertex_elements->count, shader->shader.bc.nresource); 2971235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 2981235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 2991235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_shader_update(ctx, shader); 3001235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) 3011235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 3021235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r600_pipe_shader(ctx, shader); 3031235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 3041235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3051235becaa1cf7e29f580900592563c3329d326deJerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader); 306dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens) 3071235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 3081235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 3091235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 3101235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3111235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n"); 3121235becaa1cf7e29f580900592563c3329d326deJerome Glisse//tgsi_dump(tokens, 0); 3131235becaa1cf7e29f580900592563c3329d326deJerome Glisse shader->shader.family = r600_get_family(rctx->radeon); 3141235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_shader_from_tgsi(tokens, &shader->shader); 3151235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 3161235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("translation from TGSI failed !\n"); 3171235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 3181235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 3191235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_bc_build(&shader->shader.bc); 3201235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 3211235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("building bytecode failed !\n"); 3221235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 3231235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 3241235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "______________________________________________________________\n"); 3251235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 3261235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 3271235becaa1cf7e29f580900592563c3329d326deJerome Glisse 3281235becaa1cf7e29f580900592563c3329d326deJerome Glisse/* 3291235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader 3301235becaa1cf7e29f580900592563c3329d326deJerome Glisse */ 3312b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 3322b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 3332b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 3342b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 3352b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 3362b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 3372b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 3382b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 3392b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 3402b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 3412b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_bc *bc; 3422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 3432b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse u32 value[4]; 344cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 345cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 346e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe u32 max_driver_temp_used; 3472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 3482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 3492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 3502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 3512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 3522b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 3532b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 3542b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 3552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 35650526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[]; 35742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 36772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 371c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 372a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 37672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 377a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 37947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Src[j].Register.Dimension || 380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Absolute) { 38147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported src %d (dimension %d|absolute %d)\n", j, 38247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie i->Src[j].Register.Dimension, 38347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie i->Src[j].Register.Absolute); 384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 38847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 38947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 39472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 39572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 39650526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int gpr) 39750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 39850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 39950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie struct r600_bc_alu alu; 40050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 40150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 40250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 40350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 40450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 40550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 40650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 40750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 40850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 40950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 41050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.sel = ctx->shader->input[gpr].gpr; 41150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 41250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 41350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 41450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 41550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.src[0].chan = (1 - (i % 2)); 41650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + gpr; 41750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 41850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 41950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 42050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 42150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 42250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 42350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 42450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 42550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 42650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie} 42750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 42850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 43072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx vtx; 433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 43572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 44135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx->type == TGSI_PROCESSOR_VERTEX) { 444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* turn input into fetch */ 445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&vtx, 0, sizeof(struct r600_bc_vtx)); 446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.inst = 0; 447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.fetch_type = 0; 448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.buffer_id = i; 449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register containing the index into the buffer */ 450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_gpr = 0; 451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_sel_x = 0; 452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.mega_fetch_count = 0x1F; 453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_gpr = ctx->shader->input[i].gpr; 454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_x = 0; 455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_y = 1; 456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_z = 2; 457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_w = 3; 458e973221538d5edfad62abedf5b37a4fb774d71fcDave Airlie vtx.use_const_fields = 1; 459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_vtx(ctx->bc, &vtx); 460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 46350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == 2) { 46450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 46550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie evergreen_interp_alu(ctx, i); 46650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 472de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 47335e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 47733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 47847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 483de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 48572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 48672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 487be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 488be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 489be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 490be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 491be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 49372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 496c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 497457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 50072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 501de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 513076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 514076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 515076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 516076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [256,511] correspond to cfile constants c[0..255]. 517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 518076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 519076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 520076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 521076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 53784457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == 2) { 53884457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas ctx.file_offset[TGSI_FILE_INPUT] = 1; 53984457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 544d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 545d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie ctx.file_offset[TGSI_FILE_CONSTANT] = 128; 546d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253; 548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 551cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 552cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 553cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen 554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 559cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 560cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 561cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 562cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 563cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 564cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 565cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 566cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 567cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 568cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 579be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 580be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 581be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 58350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (ctx.bc->chiprev == 2) 58450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 58550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 58650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 5902b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse r = r600_bc_add_literal(ctx.bc, ctx.value); 591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 601457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 602457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 603c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 604c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 605c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 606c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 607c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 608c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 609c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 610c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 611c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 612c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 613a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 614457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 617c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 618c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 620457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 621457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 622457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 623457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 624457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 625457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 626457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 631b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 632c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 6335f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 634c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 635b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_x = 2; 63639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 7; 63739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 63839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 63939d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 64039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].array_base = 61; 64139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_x = 7; 64239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 1; 64339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 644c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 65572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 656457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 657457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 658457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 659457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 660457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 661457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 662457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 663457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 664457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 665457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 666457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 667457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 668457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 669457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 670457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 671457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 672457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 673457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 674457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 675457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 6767e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 677457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 679c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 680481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 681481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 682481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 683481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 684481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 685481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 686481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 687481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 688481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 689481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 690608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 691481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 692a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 693481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 694481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 695457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 696457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 697457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (i == (noutput - 1)) { 698457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].end_of_program = 1; 699457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 700b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 701b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 702a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 703c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 704c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 705457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 706457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 707c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 711cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 715cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 735cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen int index; 7367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(r600_src, 0, sizeof(struct r600_bc_alu_src)); 737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = tgsi_src->Register.Index; 738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = 0; 740cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen index = tgsi_src->Register.Index; 741cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[0] = ctx->literals[index * 4 + 0]; 742cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[1] = ctx->literals[index * 4 + 1]; 743cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[2] = ctx->literals[index * 4 + 2]; 744cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[3] = ctx->literals[index * 4 + 3]; 745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 74647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_src->Register.Indirect) 74747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_src->rel = V_SQ_REL_RELATIVE; 7481bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse r600_src->neg = tgsi_src->Register.Negate; 749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 7587a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 7597a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 76447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 76547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 7667a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 7677a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 7687a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 7727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle) 7737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 7747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse switch (swizzle) { 7757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 0: 7767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleX; 7777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 1: 7787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleY; 7797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 2: 7807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleZ; 7817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 3: 7827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleW; 7837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse default: 7847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 7857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 7867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 7877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 7887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 7897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 7907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 7917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 7927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, k, nconst, r; 7937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 7947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 7957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 7967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse nconst++; 7977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 7987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]); 7997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) { 8007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 8049d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 805be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 8067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (k = 0; k < 4; k++) { 8077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 808a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 8099d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 8107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = k; 81140cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid alu.src[0].rel = r600_src[i].rel; 812be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 8137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = k; 8147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 8157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (k == 3) 8167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 8177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 8187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8219d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 82240cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid r600_src[i].rel =0; 8237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse j--; 8247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 8267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 8277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 8287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 829be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 830be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 831be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 832be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 833be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct r600_bc_alu alu; 83420846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee int i, j, k, nliteral, r; 835be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 836be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 837be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) { 838be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie nliteral++; 839be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 840be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 8419d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 8429d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) { 843be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 844be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (k = 0; k < 4; k++) { 845be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 846a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 8479d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse alu.src[0].sel = r600_src[i].sel; 848be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].chan = k; 849be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 850be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.chan = k; 851be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.write = 1; 852be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (k == 3) 853be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.last = 1; 854be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 855be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 856be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 857be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 8589d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = r600_bc_add_literal(ctx->bc, &ctx->literals[inst->Src[i].Register.Index * 4]); 859be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 860be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 8619d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r600_src[i].sel = treg; 8629d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse j--; 863be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 864be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 865be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return 0; 866be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 867be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 868d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 873de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 874d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie int lasti = 0; 875d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 876d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 877d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) { 878d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 879d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 880d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 8827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 8837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 8869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 8879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 888d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 889d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 890d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 891d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 892de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 893d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 894d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (r) 895d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return r; 896d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 897d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 898d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 9007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 9017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 902de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 903d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 904d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0] = r600_src[1]; 905d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[1], i); 906d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 907d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1] = r600_src[0]; 908d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 909de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 910de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 912de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 914de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 9157a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 9167a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 9177a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 918de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 919de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 921d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 923de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 925de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 926de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 928de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 929de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 931d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 932d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 933d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 934d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 935d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 936d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 937d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 938d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 939d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 940d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 94188f5976484842671ecb2cefcfa91838a43032359Dave Airlie/* 94288f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 94388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 94488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 94588f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 94692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx, 94792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]) 94888f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 94988f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 95092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 95188f5976484842671ecb2cefcfa91838a43032359Dave Airlie uint32_t lit_vals[4]; 95292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 95392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 95488f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(lit_vals, 0, 4*4); 95588f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_split_constant(ctx, r600_src); 95688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 95788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 9589d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 9599d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 9609d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 961be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 962be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 963be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 964be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 965be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 96688f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0 /(3.1415926535 * 2)); 96788f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(0.5f); 96888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 96988f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 970a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 97188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 97288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 97388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 97488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 97588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 97688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 97788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0] = r600_src[0]; 97888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 97988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 980921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 98188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 982921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 98388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 98488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 98588f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 98688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 98788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 98888f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 98988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 99088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 99188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 99288f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 993a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 99488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 99588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 99688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 99788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 99888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 99988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 100088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 100188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 100288f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 100388f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 100488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 100588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 100688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (ctx->bc->chiprev == 0) { 100788f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(3.1415926535897f * 2.0f); 100888f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-3.1415926535897f); 100988f5976484842671ecb2cefcfa91838a43032359Dave Airlie } else { 101088f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0f); 101188f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-0.5f); 101288f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 101388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 101488f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1015a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 101688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 101788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 101888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 101988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 102088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 102188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 102288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 102388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 102488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 1025921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 102688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1027921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 102888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 102988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 103088f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 103188f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 103288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 103388f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 103488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 103588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 103692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 103792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 103892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 103992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 104092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 104192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 104292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 104392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 104492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1045be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int lasti = 0; 104692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 104792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = tgsi_setup_trig(ctx, r600_src); 104892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 104992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 105088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 105188f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 105288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 105388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 105488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 105588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 105688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 105788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 105888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 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 106488f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 106588f5976484842671ecb2cefcfa91838a43032359Dave Airlie for (i = 0; i < 4; i++) { 1066be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) 1067be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie lasti = i; 1068be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 1069be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1070be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1071be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1072be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 107388f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1074a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1075be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1076be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 107788f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 107888f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 107988f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 1080be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 108188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 108288f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 108388f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 108488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 108588f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 108688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 108788f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 108992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 109092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 109192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 109292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 109392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 109492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 109592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 109657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 109757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 109857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 109957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 110057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_setup_trig(ctx, r600_src); 110157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 110257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 110357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 110492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 110592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 110657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 110757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 110857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 110957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 111057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 111157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 111292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 111357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 111457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 111557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 111657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 111757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 111857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 111957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 112092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 112192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 112257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 112357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 112457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 112557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 112657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 112757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 112857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 112957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 113057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 113157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 113257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 113357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 113457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 113557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 113692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1137ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1138ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 1139ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1140ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1141ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1142ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1143ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1144ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1145ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1146ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1147ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1148ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1149ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1150ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1151ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1152ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1153ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1154ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1155ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1156ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 1157ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1158ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1159ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1160ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1161ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1162ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 1163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1164ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1165ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1171ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1176ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1178ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 1181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1182ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1183ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1184ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 118592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 118692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 118792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1188094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1189094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 1190094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1191094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 1192094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1193094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1194094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 1195094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1196094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 11974502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1198094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 11994502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1200921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 12014502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 12024502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 12034502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 12044502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 12054502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 12064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 12074502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 12084502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 12094502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 12104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1211094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1212094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1213094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 1214094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1215094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1216094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1217094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 12184502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 12194502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 12204502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 12214502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 12224502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 12234502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 12244502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1225094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1226094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1227094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 12280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 12290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 12300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 1232ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie struct r600_bc_alu_src r600_src[3]; 12330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 12340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1235ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie r = tgsi_split_constant(ctx, r600_src); 1236ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie if (r) 1237ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie return r; 1238d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 1239d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie if (r) 1240d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie return r; 1241ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 12427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.x, <- 1.0 */ 12437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1244a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1245921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 12467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 12477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 12487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 12517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.y = max(src.x, 0.0) */ 12567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1257a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 1258ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1259921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 126085e401d8bfd80450a31eac234e13008e33e64227Dave Airlie alu.src[1].chan = 0; 12617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 12627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 12657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.w, <- 1.0 */ 12707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1271a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1272921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 12737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 12747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 12757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 12787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 12797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 12835ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 12845ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 12855ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 12865ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 12870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 12880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 12896a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 12906a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 12916a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 12920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 12930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1294a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1295ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1296ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 12970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 12980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 12990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13055ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 13065ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 13075ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 130885e401d8bfd80450a31eac234e13008e33e64227Dave Airlie 13096a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 13106a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 13110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 13130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1314a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 1315ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 13167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 13170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 13180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 1319ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 1320ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[2] = r600_src[0]; 13217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[2].chan = tgsi_chan(&inst->Src[0], 0); 13220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 13230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 13240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 13250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 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; 13340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 13350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1336a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 13370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 13380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 13390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 13400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 13470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 13480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 13490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 135042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 135142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 135242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 135342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct r600_bc_alu alu; 135442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 135542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 135642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1357df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1358df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1359df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1360df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1361df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1362df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1363df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 136442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 136542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 136642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 136742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 136842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 136942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].abs = 1; 137042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 137142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 137242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 137342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 137442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 137542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 137642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 137742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 137842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 137942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 138042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 138142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 138242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 138342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1384a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 13857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 13867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 1388a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 13897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 13907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 13917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 13927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1393a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 13947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 13957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 13987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 13997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 14007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 14017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 14027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 14047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 14057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 14067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 14077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1408a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1409a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1410a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1411a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1412a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1413a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1414a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1415a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1416a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 1417a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 1418a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1419a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1420a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 1421a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1422a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1423a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1424a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1425a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1426a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1427a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 14285ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 14295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 14305ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 1431a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1432a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1433a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1434a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1436a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1440a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1441a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 1442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1443a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 1444a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1447a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 1448a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1449a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1450a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1451a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1452a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1453a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1454e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1455e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1456e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1457a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 1458a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1459a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE); 1460a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]); 1461a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1462a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1463a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[1], 0); 1464a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1465a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1466a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1467a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1468a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1469a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1470a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1471e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1472e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1473e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1474a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 1475a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1476a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1477a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1478a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1479a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1480a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1481a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1482a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1483a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1484e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1485e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1486e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1487a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1488a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1489a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 14900d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 14910d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 14920d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14930d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu alu; 14940d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu_src r600_src[3]; 1495921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 14960d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14970d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_split_constant(ctx, r600_src); 14980d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 14990d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15009d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 15019d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 15029d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 15030d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15040d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 15050d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 15060d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1507a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 15080d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1509cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 15100d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1511cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 15120d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15130d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0] = r600_src[0]; 15140d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 15150d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1516921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 15170d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15180d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2] = r600_src[0]; 15190d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[0], i); 15200d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 15210d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 15220d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15230d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15240d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15250d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 1526cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 1527cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie if (r) 1528cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie return r; 15290d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15300d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 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; 15350d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 15360d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15370d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15380d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15390d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1540cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 15410d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 15420d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1543921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 15440d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 15450d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15460d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1547cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 15480d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15490d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 15500d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 15510d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15520d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 15530d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 15540d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 15550d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 15560d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 15570d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1558cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1559cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1560cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1561cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1562cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 15639961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 15649961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse if (r) 15659961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse return r; 1566cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 1567cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1568cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1569a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 15706c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1571cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1572a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1573cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1574cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1575cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1576cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1577cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1578cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1579cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1580cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1581cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1582cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1583cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1584cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1585cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1586cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1587cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1588cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 15967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 15977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 15987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 15999d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 16009d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 16019d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* do it in 2 step as op3 doesn't support writemask */ 1603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 16077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 16087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.sel = ctx->temp_reg; 1611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1612cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 1614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1621cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1622cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1623cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1624cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1625cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1626cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1628cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1629cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 16317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 16327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 16337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 16349d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 16359d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 16369d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1639cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1640cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 16417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 16427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1643cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.sel = ctx->temp_reg; 1645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1647cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1648cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1649cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1650cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1651921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1652cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1653cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1655cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1656cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1657921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1658cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1659cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1660cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1661e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1662e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1663e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1664e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1665e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1666e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1667e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1668cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1669cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1678cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 168133241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 168233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 168333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 168433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1685641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1686641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 1687b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie int r, i; 1688bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 1689bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie boolean src_not_temp = inst->Src[0].Register.File != TGSI_FILE_TEMPORARY; 1690bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie uint32_t lit_vals[4]; 1691641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1692641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 1693641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1694b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1695b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 1696b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1697a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1698bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1699bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1700bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1701bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1702b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 1703b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1704b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1705b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1706b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1707b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1708b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1709b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 17109d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 1711b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1712b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1713a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1714b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 1715b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 3; 1716bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1717bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1718bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1719b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1720b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1721b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1722b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1723b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1724b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1725b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1726b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1727b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1728a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1729921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1730b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1731b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1732b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1733b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1734b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1735b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1736b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1737b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 173807b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1739b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1740bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1741bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1742bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1743bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int src_chan, src2_chan; 1744bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1745bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 1746bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 1747bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1748a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 1749bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie switch (i) { 1750bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 0: 1751bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1752bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 1; 1753bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1754bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 1: 1755bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1756bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 0; 1757bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1758bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 2: 1759bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 0; 1760bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1761bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1762bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 3: 1763bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 1; 1764bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1765bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 176684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee default: 176784b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee assert(0); 176884b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src_chan = 0; 176984b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src2_chan = 0; 177084b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee break; 1771bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1772bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1773bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1774bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1775bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan); 1776bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1777bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1778bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1779bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan); 1780bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1781bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 1782bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 1783bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1787bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1788bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1789bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1790bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 1791bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1792a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1793bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1794bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 2; 1795bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].abs = 1; 1796bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1797bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 2; 1798bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1799bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1800bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1801bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1802bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1803bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1804bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 1805bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 1806bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * muladd has no writemask, have to use another temp 1807bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 1808bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1809a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1810bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1811bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1812bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1813bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 1814bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1815bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 1816bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1817bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1818bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1819bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1820bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1821bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 1822bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1823bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1824bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1825bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1826bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1827bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1828bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1829a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1830bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1831bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1832bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1833bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 1834bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1835bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 1836bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1837bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1838bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 1842bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1843bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1845bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1848bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1849bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie lit_vals[0] = fui(1.5f); 1850bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1851bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 1852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1853bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 185407b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1855bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 1856bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1857bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1858bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (src_not_temp) { 1859b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 1860b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1861a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1862b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 1863a21a2748beb1f42d21e14858eee9a1323d85a00fFredrik Höglund alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 1864b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1865b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1866b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 1867b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1868b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1869b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1870b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1872b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1873b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1874b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1875bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1876bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 1877bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (opcode == SQ_TEX_INST_SAMPLE && 1878bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)) 1879bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = SQ_TEX_INST_SAMPLE_C; 188033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 188133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 1882bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 1883ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 1884ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.resource_id = tex.sampler_id; 1885ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie if (ctx->shader->processor_type == TGSI_PROCESSOR_VERTEX) 1886ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie tex.resource_id += PIPE_MAX_ATTRIBS; 1887641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 18886c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 18899d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 18909d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 18919d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 18929d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 189333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 189433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 189533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 189633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 18979a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 1898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 1900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 1901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 1902bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 1903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 190501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 190601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 190701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 19087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 190901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 191001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 1911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1912bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) 19135d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie tex.src_sel_w = 2; 1914bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_tex(ctx->bc, &tex); 1916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 1920bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 192233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 192333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 1924b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 1925b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 1926b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1928b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 1929b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 1930b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 1931b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 19327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 19337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 19347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 19359d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 19369d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 19379d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 1938b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 1939b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1940b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1941a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 1942921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1943b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 19447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 19457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1946b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 1947b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1948b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1949b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1950b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1951b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1952b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1953b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1954b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1955b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1956b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1957b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1958b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1959b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1960b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1961b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 1962b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1963b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1964a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1965b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1966b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 19677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[2]; 19687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 1969b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1970b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1971b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1972b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1973b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1974b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1975b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1976b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1977b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1978b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1979b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1980b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1981b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1982b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1983b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 1984b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1985b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1986a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1987b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 19887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[0]; 19897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 19907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[1]; 19917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 1992b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 1993b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 1994b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1995b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1996b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1997b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1998b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1999b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2000b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2001b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2002b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2003b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return tgsi_helper_copy(ctx, inst); 2004b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 2005b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 200687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 200787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 200887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 200987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu_src r600_src[3]; 201087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu alu; 201187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int use_temp = 0; 201287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 201387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 201487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_split_constant(ctx, r600_src); 201587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 201687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 20179d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 20189d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 20199d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 202087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 202187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 202287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie use_temp = 1; 202387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 202487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie for (i = 0; i < 4; i++) { 202587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2026a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 202787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0] = r600_src[0]; 202887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 202987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 203087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1] = r600_src[2]; 203187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 203287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 203387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2] = r600_src[1]; 203487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[1], i); 203587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 203687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 203787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.sel = ctx->temp_reg; 203887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie else { 203987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 204087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 204187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 204287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 204387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 204487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 204587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 204687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (i == 3) 204787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 204887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 204987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 205087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 205187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 205287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 205387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return tgsi_helper_copy(ctx, inst); 205487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 205587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 205687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 20570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 20580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 20590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu_src r600_src[3]; 20610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu alu; 20620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 20630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 20640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 20660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 20670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_split_constant(ctx, r600_src); 20690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 20700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 20719d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse r = tgsi_split_literal_constant(ctx, r600_src); 20729d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse if (r) 20739d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse return r; 20749d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 20750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 20760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2077a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 20780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 20800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 20810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 20820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 20830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 20850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 20860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 20880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 20890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 20910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 20920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 20930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 20940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 20960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 20970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 20980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 20990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 21020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 21050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 21080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 21090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 21120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 21130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 21140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 21160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 21170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 21180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 21190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 21201e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck 21211e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 21221e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck if (r) 21231e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck return r; 21240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 21270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2128a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 21290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 21310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 21340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 21370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 21400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 21430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 21440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 21470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 21480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 21490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 21500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 21520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 21530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 21550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 21560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 21570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 21580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 21590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 21600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 21630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 21640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 21650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 21660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 21670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 21680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie else { 21690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 21700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 21710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 21720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 21740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 21750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 21760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 21770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 21780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 21790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 21800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 21811e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck 21821e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 21831e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck if (r) 21841e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck return r; 21850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 21860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 21870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 21880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 21890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 21900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 219136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 219236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 219336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 219436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu_src r600_src[3]; 219536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu alu; 219609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 219736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 219836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 219936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 220036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 220136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2202a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 220336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 220436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 220536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 220636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 220736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 220836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 220936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 221036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 221136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 221236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 221336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 221436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 221536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 221636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 22175ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 22185ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 22195ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 22205ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 2221a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 222236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = ctx->temp_reg; 222336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 222436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 222536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 222636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 222736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 222836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 222936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 223036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 223136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 22325ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 22335ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 22345ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 22355ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 223636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 223736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 223836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 223936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 224036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 224136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2242a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 224336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0] = r600_src[0]; 224436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 224536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 224636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 224736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 224836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 224936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 225036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 225136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// if (r) 225236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// return r; 225336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 225436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 225536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 225636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 225736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 225836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 225936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 226036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 22615ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 22625ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 22635ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 226436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 226536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 226636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 226736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 226836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2269a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 227036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 227136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 227236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 227336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 227436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 227536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 227636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 227736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 2; 227836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 227936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 228036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 228136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 228236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 228336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 22845ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 22855ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 22865ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 228736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 228836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 228936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 229036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 229136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 229236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2293a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 229436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 229536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 229636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 229736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 229836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 229936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 230036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 230136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 230236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 230336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 23045ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 23055ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 23065ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 230736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 230836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 230936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 231087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2311460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2312460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2313460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2314460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct r600_bc_alu alu; 2315460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 2316460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2317460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.x = floor(log2(src)); */ 2318460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 2319460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2320460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2321460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2322460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2323460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2324460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2325460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2326460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2327460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2328460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2329460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2330460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2331460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2332460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2333460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2334460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2335460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2336460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2337460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2338460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2339460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2340460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2341460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2342460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2343460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2344460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2345460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2346460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2347460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2348460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2349460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2350460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2351460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2352460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2353460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2354460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2355460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2356460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2357460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 235896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck /* result.y = src.x / (2 ^ floor(log2(src.x))); */ 2359460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2360460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2361460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 236296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 236396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 236496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 236596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 236696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 236796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 236896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 236996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 237096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 237196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 237296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 237396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 237496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 237596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 237696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 237796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 237896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 237996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 238096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 238196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 238296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 238396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 238496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 238596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 238696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 238796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 238896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 238996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 239096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 239196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 239296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 239396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 239496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 239596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 239696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 239796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 239896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 239996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 240096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 240196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 240296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 240396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 240496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 240596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 240696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 240796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 240896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 240996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 241096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 241196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 241296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 241396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 241496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 241596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 241696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 241796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 241896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 241996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 242096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 242196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 242296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 242396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 242496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 242596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 242696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 242796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 242896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 242996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 243096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 243196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 243296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 243396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 243496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 243596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 243696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 243796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 243896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 243996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 244096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 244196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 244296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 244396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 244496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 244596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 244696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 244796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 244896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 244996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 245096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2451460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2452460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2453460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2454460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2455460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2456460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2457460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2458460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2459460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2460460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2461460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2462460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2463460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2464460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2465460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.z = log2(src);*/ 2467460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 2468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2469460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2470460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2471460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2472460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2473460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2474460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2475460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2476460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2477460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2478460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2479460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 2; 2480460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2481460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2482460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2483460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2484460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2485460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2486460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2487460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2488460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2489460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2490460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2491460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2492460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 2493460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2494460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2495460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2496460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2497460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2498460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2499460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2500460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2501460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2502460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2503460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2504460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2505460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2506460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2507460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2508460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2509460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2510460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2511460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2512460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2513460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2514460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2515460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 251650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie/* r6/7 only for now */ 251747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airliestatic int tgsi_arl(struct r600_shader_ctx *ctx) 251847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 251947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie /* TODO from r600c, ar values don't persist between clauses */ 252047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 252147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct r600_bc_alu alu; 252247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 252347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 252447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 252547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR; 252647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 252747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 252847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 252947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 253047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 253147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 253247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.last = 1; 253347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 2534a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)); 253547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 253647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 2537c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie ctx->bc->cf_last->r6xx_uses_waterfall = 1; 253847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 253947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 254047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 254157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 254257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 254357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 254457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct r600_bc_alu alu; 254557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 254657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 254757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 254857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 254957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2550a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 255157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 255257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 255357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 255457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 255557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 3) { 255657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 255757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 255857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 255957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 256057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 256157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 256257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 256357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 256457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 2) { 256557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 256657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 256757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]); 256857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 256957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 257057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 257157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 257257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 257357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 257457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 257557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 257657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 257757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 257857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 257957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 258057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2581a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 2582a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2583a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 258409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_bc_alu alu; 2585a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 2586a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2587a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2588a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 2589a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 2590a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2591a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 2592a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 2593a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 2594a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2595a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2596a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2597a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2598a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2599a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 2600a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 2601a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2602a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 2603a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2604a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 2605a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2606a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2607a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2608a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2609a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2610a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 2611a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2612a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 2613a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = pops; 2614a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2615a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2616a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 261709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 2618a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 261909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 262009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 262109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 262209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 262309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 262409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 262509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 262609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 262709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 262809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 262909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 263009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 263109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 263209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2633a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 263409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 263509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 263609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 263709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 263809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 263909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 264009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 264109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 264209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 264309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 264409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 2645a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 2646a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 2647a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 264809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 264909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 265009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 265109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 265209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 265309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 265409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 265509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 265609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 265709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 265809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 265909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 266009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 266109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 266209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 266309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 266409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 266509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 266609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 266709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 266809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 266909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 267009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 267109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 267209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 267309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 267409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 267509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 267609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 267709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 267809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 267909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 268009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid, 268109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sizeof(struct r600_bc_cf *) * (sp->num_mid + 1)); 268209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 268309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 268409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2685a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 268609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 268709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2688a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 268909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 269009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 269109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 269209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 269309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 269409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 269509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 269609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 269709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 269809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 269909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 270009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 270109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 270209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 270309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 270409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 270509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 270609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 270709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 270809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 270909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 271009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 271109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 271209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 271309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 271409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 271509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2716a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 271709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 271809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 271909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 272009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2721a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 272209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 272309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 272409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 272509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 272609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 272709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 272809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 272909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 273009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 273109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 273209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 273309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 273509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 273609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 273709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 273809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 273909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 274009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 274109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 274209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 274309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 274409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 274509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 274609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 274709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 274809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 274909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 275009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 275109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 275209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 275309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 275409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 275509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2756a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 275709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2758a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 275909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 276009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 276109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 276209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 2763a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2764a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2765a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2766a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 2767a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2768a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 2769a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 2770a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 277109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 2772a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 2773a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2774a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2775a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2776a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 2777a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2778a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 2779a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 2780a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 2781a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 2782a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 2783a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2784a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 2785a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 2786a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 2787a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 278809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 2789a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 279009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 279109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 279209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 279309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 279409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 279509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 279609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 279709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2798a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 279909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 280009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 2801a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 280209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 280309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 280409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 280509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 280609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 280709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 280809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 280909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 281009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2811a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 281209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 281309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 281409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 281509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 281609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 281709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 281809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 281909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 282009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 282109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 282209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 282309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 282409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 282509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 282609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 282809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 283109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 283309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 283609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 284209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 284309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 284409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 284509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 284609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 284709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 284809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 284909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 285009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 285109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 285209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 285309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 285409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 285509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 285609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 285709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 2858a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2859a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2860a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 286247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_arl}, 2863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 28640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 2865df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 2866df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 2867df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 2868df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 2869df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 2870df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 2871df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 287242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 287336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 2874460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 2875de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 2876de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2877cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2878cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 287957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 2880dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 2881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 2882d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 2883be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 2884de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 2885de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2886b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 2887de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2889de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2890de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2892de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2893de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28943af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 2895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28963af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 2897de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 28994558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 2900a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 29010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 2902de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29047a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 2905de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2906e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 290788f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 29083af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 29093af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 29104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 2911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2912de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2914de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29160d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 2917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29180d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 291988f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 2920d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 29210d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 2922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2923b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2925b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2926de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2928de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2929de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2931de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2933de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2934de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29360d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 293787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 293892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 2939d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 2940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2941de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2942cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2943ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 294409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 2945a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 2946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2949a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 2950a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 2951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 29594558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 2960de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2968de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2969de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 2971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2972de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 2974de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 2976de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2977de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2978de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2979de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2980de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2982de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2983de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2984de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2985de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2986de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2987de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2988de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2989de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2990de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2991de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2992094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 2993de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 2994de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2995de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2997de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2998de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3000de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3001de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3003de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3004de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3005de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3009de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3010de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3011de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3012de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3013de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3014de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3017de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3021de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 302450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 302550526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 302650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 302850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 302950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 303050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate}, 303150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 303250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 303450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 303550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 303650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 303750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 303850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 303950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 304050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 304150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 304250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 304350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 304450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 304550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 304750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 304950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 305050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 305350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 305550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 305650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 305750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 305850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 305950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 306050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 306150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 306350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 306450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 306550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 306650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 306750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 306850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 306950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 307550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 307650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 307750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 307850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 307950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 308050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 308250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 308450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 308950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 309550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 309650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 309750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 309850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 309950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3101ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 310250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 310350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 310450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 310550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 310750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 310850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 310950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 311050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 311850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 311950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 312050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 312850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 312950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 313250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 313450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 313650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 313950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 314250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 314950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 315150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 315250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 315350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 315950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 316950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 317950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 318150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 3182