r600_shader.c revision 460c5304aba646143938b76d536a6fc13a302ca8
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" 2872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_screen.h" 2972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_context.h" 30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_shader.h" 31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h" 32de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h" 33a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h" 3472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h" 35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h> 36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h> 37de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 382b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 392b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 402b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 412b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 432b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 442b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 452b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 462b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_bc *bc; 502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse u32 value[4]; 52cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 53cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 54be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie u32 max_driver_temp_used; 552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 562b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 572b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 582b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 592b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 602b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 612b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 622b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 632b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 642b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[]; 65de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader); 6642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 67de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 68de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_shader *shader) 69de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 70de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 71de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct util_format_description *desc; 72de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse enum pipe_format resource_format[160]; 73de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i, nresources = 0; 74de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc *bc = &shader->bc; 75de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_cf *cf; 76de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx *vtx; 77de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 78de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->processor_type != TGSI_PROCESSOR_VERTEX) 79de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 80de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < rctx->vertex_elements->count; i++) { 81de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format; 82de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 83de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) { 84de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (cf->inst) { 85de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX: 86de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC: 87de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) { 88de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse desc = util_format_description(resource_format[vtx->buffer_id]); 89de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (desc == NULL) { 90de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]); 91de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 92de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 93de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_x = desc->swizzle[0]; 94de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_y = desc->swizzle[1]; 95de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_z = desc->swizzle[2]; 96de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_w = desc->swizzle[3]; 97de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 98de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 99de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_bc_build(&shader->bc); 104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1066f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_create(struct pipe_context *ctx, 1076f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rpshader, 1086f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct tgsi_token *tokens) 109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_screen *rscreen = r600_screen(ctx->screen); 111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 11336efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n"); 11436efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//tgsi_dump(tokens, 0); 115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rpshader == NULL) 1166f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return -ENOMEM; 117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rpshader->shader.family = radeon_get_family(rscreen->rw); 118d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie rpshader->shader.use_mem_constant = rscreen->use_mem_constant; 119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_from_tgsi(tokens, &rpshader->shader); 120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) { 121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("translation from TGSI failed !\n"); 1226f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return r; 123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_build(&rpshader->shader.bc); 125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) { 126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("building bytecode failed !\n"); 1276f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return r; 128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 12936efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "______________________________________________________________\n"); 1306f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return 0; 131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 13272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1336f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_context_state *rpshader) 13472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 1359ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie struct r600_context *rctx = r600_context(ctx); 13672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 13772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 13867234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse state = &rpshader->rstate[0]; 13967234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse radeon_state_fini(&rpshader->rstate[0]); 1409ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie 1419ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie return rctx->vtbl->vs_shader(rctx, rpshader, state); 14272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 14372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1446f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_context_state *rpshader) 14572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 146457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse struct r600_context *rctx = r600_context(ctx); 14772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 14872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 14967234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse state = &rpshader->rstate[0]; 15066e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse radeon_state_fini(state); 1515f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie 1529ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie return rctx->vtbl->ps_shader(rctx, rpshader, state); 15372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 15472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1556f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader) 15672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 157ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 158ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_context *rctx = r600_context(ctx); 15972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 16072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 16172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 16272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* copy new shader */ 16372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_decref(rscreen->rw, rpshader->bo); 16472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->bo = NULL; 165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4, 16672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 4096, NULL); 16772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader->bo == NULL) { 16872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -ENOMEM; 16972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 17072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_map(rscreen->rw, rpshader->bo); 171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4); 17272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_unmap(rscreen->rw, rpshader->bo); 17372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* build state */ 17472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rshader->flat_shade = rctx->flat_shade; 175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (rshader->processor_type) { 176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 17772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_vs(ctx, rpshader); 17872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 18072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_ps(ctx, rpshader); 18172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 18272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse default: 18372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = -EINVAL; 18472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 18572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 18672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return r; 18772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 18872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1896f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader) 19072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 19272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 19372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 19472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader == NULL) 195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* there should be enough input */ 197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) { 198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d resources provided, expecting %d\n", 199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rctx->vertex_elements->count, rpshader->shader.bc.nresource); 200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 20172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_update(ctx, &rpshader->shader); 203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_pipe_shader(ctx, rpshader); 206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 21672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 220c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 221a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 22572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 226a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 22847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Src[j].Register.Dimension || 229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Absolute) { 23047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported src %d (dimension %d|absolute %d)\n", j, 23147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie i->Src[j].Register.Dimension, 23247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie i->Src[j].Register.Absolute); 233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 23747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 23847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 24472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 24672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx vtx; 249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 25172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 25735e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx->type == TGSI_PROCESSOR_VERTEX) { 260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* turn input into fetch */ 261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&vtx, 0, sizeof(struct r600_bc_vtx)); 262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.inst = 0; 263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.fetch_type = 0; 264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.buffer_id = i; 265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register containing the index into the buffer */ 266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_gpr = 0; 267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_sel_x = 0; 268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.mega_fetch_count = 0x1F; 269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_gpr = ctx->shader->input[i].gpr; 270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_x = 0; 271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_y = 1; 272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_z = 2; 273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_w = 3; 274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_vtx(ctx->bc, &vtx); 275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 28435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 28833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 28947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 29672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 29772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 298be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 299be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 300be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 301be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 302be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 30472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 307c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 308457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 31172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 317d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie ctx.bc->use_mem_constant = shader->use_mem_constant; 318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 325076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 326076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 327076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 328076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [256,511] correspond to cfile constants c[0..255]. 329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 330076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 331076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 332076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 333076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 353d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie if (ctx.shader->use_mem_constant) 354d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie ctx.file_offset[TGSI_FILE_CONSTANT] = 128; 355d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie else 356d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie ctx.file_offset[TGSI_FILE_CONSTANT] = 256; 357d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253; 359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 362cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 363cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 364cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen 365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 370cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 371cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 372cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 373cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 374cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 375cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 376cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 377cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 378cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 379cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 390be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 391be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 392be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 3982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse r = r600_bc_add_literal(ctx.bc, ctx.value); 399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 409457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 410457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 411c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 412c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 413c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 414c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 415c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 416c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 417c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 418c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 419c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 420c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 421a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 422457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 425c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 426c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 428457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 429457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 430457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 431457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 432457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 433457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 434457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 439b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 440c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 4415f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 442c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 443b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_x = 2; 444b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_y = output[i].swizzle_z = output[i].swizzle_w = 7; 445c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 45672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 457457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 458457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 459457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 460457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 461457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 462457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 463457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 464457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 465457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 466457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 467457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 468457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 469457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 470457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 471457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 472457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 473457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 474457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 475457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 476457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 477457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT; 478457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 480c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 481481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 482481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 483481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 484481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 485481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 486481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 487481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 488481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 489481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 490481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 491608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 492481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 493a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 494481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 495481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 496457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 497457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 498457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (i == (noutput - 1)) { 499457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].end_of_program = 1; 500457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 501b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 502b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 503a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 504c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 505c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 506457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 507457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 508c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 512cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 516cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 536cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen int index; 5377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(r600_src, 0, sizeof(struct r600_bc_alu_src)); 538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = tgsi_src->Register.Index; 539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = 0; 541cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen index = tgsi_src->Register.Index; 542cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[0] = ctx->literals[index * 4 + 0]; 543cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[1] = ctx->literals[index * 4 + 1]; 544cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[2] = ctx->literals[index * 4 + 2]; 545cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[3] = ctx->literals[index * 4 + 3]; 546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 54747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_src->Register.Indirect) 54847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_src->rel = V_SQ_REL_RELATIVE; 5491bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse r600_src->neg = tgsi_src->Register.Negate; 550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 5597a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5607a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 56547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 56647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 5677a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 5687a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 5697a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 5737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle) 5747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 5757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse switch (swizzle) { 5767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 0: 5777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleX; 5787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 1: 5797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleY; 5807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 2: 5817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleZ; 5827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 3: 5837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleW; 5847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse default: 5857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 5867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 5877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 5887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 5897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 5907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 5917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 5937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, k, nconst, r; 5947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 5957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 5967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 5977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse nconst++; 5987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 5997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]); 6007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) { 6017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 6027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 6057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[j].Register.File == TGSI_FILE_CONSTANT && j > 0) { 606be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 6077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (k = 0; k < 4; k++) { 6087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 609a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 6109bbc54a10d225679a180a085f7ca5bb88ee2bd15Dave Airlie alu.src[0].sel = r600_src[j].sel; 6117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = k; 612be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 6137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = k; 6147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 6157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (k == 3) 6167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 6177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 6187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 6197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 6207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 621be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_src[j].sel = treg; 6227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse j--; 6237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 6267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 6277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 628be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 629be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 630be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 631be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 632be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct r600_bc_alu alu; 633be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int i, j, k, nliteral, r; 634be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 635be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 636be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) { 637be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie nliteral++; 638be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 639be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 640be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0, j = 0; i < inst->Instruction.NumSrcRegs; i++) { 641be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Src[j].Register.File == TGSI_FILE_IMMEDIATE) { 642be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 643be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (k = 0; k < 4; k++) { 644be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 645a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 646be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = r600_src[j].sel; 647be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].chan = k; 648be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 649be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.chan = k; 650be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.write = 1; 651be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (k == 3) 652be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.last = 1; 653be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 654be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 655be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 656be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 657be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 658be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 659be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 660be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_src[j].sel = treg; 661be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie j++; 662be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 663be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 664be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return 0; 665be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 666be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 667d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 673d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie int lasti = 0; 674d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 675d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 676d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) { 677d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 678d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 679d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 6817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 6827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 6837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 684d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 685d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 686d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 687d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 689d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 690d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (r) 691d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return r; 692d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 693d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 694d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 6967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 6977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 699d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 700d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0] = r600_src[1]; 701d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[1], i); 702d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 703d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1] = r600_src[0]; 704d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 7117a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 7127a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 7137a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 717d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 727d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 728d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 729d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 730d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 731d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 732d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 733d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 734d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 735d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 736d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 73788f5976484842671ecb2cefcfa91838a43032359Dave Airlie/* 73888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 73988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 74088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 74188f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 74292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx, 74392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]) 74488f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 74588f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 74692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 74788f5976484842671ecb2cefcfa91838a43032359Dave Airlie uint32_t lit_vals[4]; 74892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 74992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 75088f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(lit_vals, 0, 4*4); 75188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_split_constant(ctx, r600_src); 75288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 75388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 754be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 755be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 756be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 757be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 758be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 75988f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0 /(3.1415926535 * 2)); 76088f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(0.5f); 76188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 76288f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 763a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 76488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 76588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 76688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 76788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 76888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 76988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 77088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0] = r600_src[0]; 77188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 77288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 773921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 77488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 775921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 77688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 77788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 77888f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 77988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 78088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 78188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 78288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 78388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 78488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 78588f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 786a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 78788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 78888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 78988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 79088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 79188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 79288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 79388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 79488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 79588f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 79688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 79788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 79888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 79988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (ctx->bc->chiprev == 0) { 80088f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(3.1415926535897f * 2.0f); 80188f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-3.1415926535897f); 80288f5976484842671ecb2cefcfa91838a43032359Dave Airlie } else { 80388f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0f); 80488f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-0.5f); 80588f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 80688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 80788f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 808a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 80988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 81088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 81188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 81288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 81388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 81488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 81588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 81688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 81788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 818921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 81988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 820921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 82188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 82288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 82388f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 82488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 82588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 82688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 82788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 82888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 82992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 83092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 83192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 83292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 83392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 83492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 83592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 83692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 83792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 838be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int lasti = 0; 83992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 84092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = tgsi_setup_trig(ctx, r600_src); 84192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 84292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 84388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 84488f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 84588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 84688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 84788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 84888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 84988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 85088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 85188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 85288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 85388f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 85488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 85588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 85688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 85788f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 85888f5976484842671ecb2cefcfa91838a43032359Dave Airlie for (i = 0; i < 4; i++) { 859be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) 860be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie lasti = i; 861be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 862be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 863be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 864be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 865be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 86688f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 867a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 868be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 869be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 87088f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 87188f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 87288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 873be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 87488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 87588f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 87688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 87788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 87888f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 87988f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 88088f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 88188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 88292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 88392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 88492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 88592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 88692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 88792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 88892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 88992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = tgsi_setup_trig(ctx, r600_src); 89092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 89192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 89292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 89392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 89492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 89592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 896a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 89792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 89892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 89992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 90092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 90192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie alu.src[0].sel = ctx->temp_reg; 90292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie alu.src[0].chan = 0; 90392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie alu.last = 1; 90492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 90592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 90692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 90792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 90892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 90992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 910a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 91192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 91292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 91392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 91492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 91592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie alu.src[0].sel = ctx->temp_reg; 91692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie alu.src[0].chan = 0; 91792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie alu.last = 1; 91892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 91992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 92092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 92192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 92292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 92392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 924094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 925094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 926094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 927094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 928094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 929094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 930094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 931094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 932094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 9334502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 934094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 9354502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 936921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 9374502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 9384502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 9394502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 9404502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 9414502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 9424502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 9434502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 9444502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 9454502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 9464502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 947094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 948094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 949094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 950094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 951094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 952094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 953094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 9544502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 9554502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 9564502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 9574502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 9584502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 9594502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 9604502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 961094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 962094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 963094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 9640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 9650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 9660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 9670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 968ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie struct r600_bc_alu_src r600_src[3]; 9690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 9700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 971ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie r = tgsi_split_constant(ctx, r600_src); 972ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie if (r) 973ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie return r; 974d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 975d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie if (r) 976d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie return r; 977ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 9787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.x, <- 1.0 */ 9797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 980a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 981921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 9827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 9837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 9847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 9877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 9887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.y = max(src.x, 0.0) */ 9927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 993a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 994ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 995921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 99685e401d8bfd80450a31eac234e13008e33e64227Dave Airlie alu.src[1].chan = 0; 9977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 9987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 10007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 10017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 10027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 10037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 10040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 10057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.w, <- 1.0 */ 10067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1007a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1008921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 10097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 10107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 10117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 10127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 10137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 10147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 10157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 10167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 10177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 10180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 10195ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 10205ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 10215ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 10225ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 10230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 10240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 10256a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 10266a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 10276a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 10280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 10290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1030a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1031ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1032ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 10330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 10340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 10350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 10360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 10370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 10380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 10390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 10400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 10415ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 10425ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 10435ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 104485e401d8bfd80450a31eac234e13008e33e64227Dave Airlie 10456a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 10466a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 10470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 10480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 10490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1050a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 1051ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 10527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 10530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 10540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 1055ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 1056ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[2] = r600_src[0]; 10577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[2].chan = tgsi_chan(&inst->Src[0], 0); 10580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 10590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 10600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 10610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 10620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 10630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 10640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 10650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 10660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 10675ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 10685ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 10695ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 10700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 10710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1072a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 10730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 10740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 10750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 10760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 10770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 10780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 10790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 10800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 10810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 10820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 10830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 10840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 10850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 108642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 108742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 108842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 108942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct r600_bc_alu alu; 109042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 109142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 109242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 109342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE); 109442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 109542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 109642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 109742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 109842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 109942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].abs = 1; 110042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 110142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 110242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 110342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 110442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 110542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 110642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 110742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 110842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 110942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 111042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 111142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 111242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 111342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 11145cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx) 11155cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{ 11165cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 11175cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct r600_bc_alu alu; 11185cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse int i, j, r; 11195cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 11205cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (i = 0; i < 4; i++) { 11215cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 11225cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (inst->Dst[0].Register.WriteMask & (1 << i)) { 11235cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 11245cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 11257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]); 11265cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 11275cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 11287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 11295cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 11305cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 11315cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 11325cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 11335cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.last = 1; 11345cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 11355cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 11365cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 11375cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 11385cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 11395cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return 0; 11405cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse} 11415cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 1142a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 11437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 11447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 11457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 1146a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 11477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 11487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 11497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 11507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1151a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 11527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 11537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 11547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 11557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 11567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 11577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 11587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 11597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 11607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 11617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 11627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 11637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 11647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 11657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1166a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1167a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1168a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1169a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1170a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1171a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1172a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1173a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1174a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 1175a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 1176a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1177a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1178a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 1179a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1180a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1181a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1182a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1183a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1184a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1185a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 11865ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 11875ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 11885ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 1189a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1190a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1191a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1192a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1193a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1194a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1195a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1196a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1197a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1198a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1199a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 1200a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1201a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 1202a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1203a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1204a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1205a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 1206a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1207a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1208a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1209a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1210a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1211a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1212e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1213e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1214e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1215a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 1216a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1217a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE); 1218a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]); 1219a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1220a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1221a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[1], 0); 1222a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1223a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1224a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1225a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1226a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1227a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1228a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1229e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1230e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1231e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1232a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 1233a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1234a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1235a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1236a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1237a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1238a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1239a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1240a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1241a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1242e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1243e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1244e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1245a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1246a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1247a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 12480d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 12490d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 12500d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12510d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu alu; 12520d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu_src r600_src[3]; 1253921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 12540d48925a56ad4fb253386110b545abda82a25464Dave Airlie 12550d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_split_constant(ctx, r600_src); 12560d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 12570d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 12580d48925a56ad4fb253386110b545abda82a25464Dave Airlie 12590d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 12600d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 12610d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1262a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 12630d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1264cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 12650d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1266cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 12670d48925a56ad4fb253386110b545abda82a25464Dave Airlie 12680d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0] = r600_src[0]; 12690d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 12700d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1271921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 12720d48925a56ad4fb253386110b545abda82a25464Dave Airlie 12730d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2] = r600_src[0]; 12740d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[0], i); 12750d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 12760d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 12770d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 12780d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 12790d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 12800d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 1281cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 1282cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie if (r) 1283cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie return r; 12840d48925a56ad4fb253386110b545abda82a25464Dave Airlie 12850d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 12860d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 12870d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1288a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 12890d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 12900d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 12910d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 12920d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 12930d48925a56ad4fb253386110b545abda82a25464Dave Airlie 12940d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1295cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 12960d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 12970d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1298921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 12990d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 13000d48925a56ad4fb253386110b545abda82a25464Dave Airlie 13010d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1302cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 13030d48925a56ad4fb253386110b545abda82a25464Dave Airlie 13040d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 13050d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 13060d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 13070d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 13080d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 13090d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 13100d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 13110d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 13120d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1313cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1314cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1315cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1316cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1317cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 13189961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 13199961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse if (r) 13209961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse return r; 1321cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 1322cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1323cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1324a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 13256c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1326cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1327a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1328cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1329cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1330cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1331cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1332cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1333cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1334cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1335cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1336cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1337cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1338cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1339cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1340cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1341cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1342cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1343cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 13517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 13527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* do it in 2 step as op3 doesn't support writemask */ 1355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 13597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 13607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.sel = ctx->temp_reg; 1363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1364cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 1366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1373cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1374cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1375cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1376cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1377cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1378cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1380cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1381cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1382cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 13837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 13847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1388cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1389cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 13907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 13917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1392cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1393cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.sel = ctx->temp_reg; 1394cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1395cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1396cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1397cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1398cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1399cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1400921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1401cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1402cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1403cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1404cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1405cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1406921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1407cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1408cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1409cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1410e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1411e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1412e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1413e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1414e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1415e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1416e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1417cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1418cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1427cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 143033241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 143133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 143233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 143333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1434641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1435641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 1436b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie int r, i; 1437bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 1438bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie boolean src_not_temp = inst->Src[0].Register.File != TGSI_FILE_TEMPORARY; 1439bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie uint32_t lit_vals[4]; 1440641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1441641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 1442641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1443b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1444b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 1445b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1446a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1447bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1448bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1449bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1450bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1451b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 1452b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1453b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1454b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1455b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1456b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1457b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1458b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1459b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie 1460b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1461b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1462a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1463b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 1464b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 3; 1465bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1466bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1467bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1468b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1469b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1470b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1471b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1472b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1473b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1474b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1475b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1476b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1477a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1478921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1479b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1480b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1481b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1482b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1483b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1484b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1485b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1486b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1487bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_not_temp = false; 1488b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1489bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1490bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1491bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1492bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int src_chan, src2_chan; 1493bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1494bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 1495bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 1496bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1497a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 1498bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie switch (i) { 1499bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 0: 1500bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1501bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 1; 1502bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1503bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 1: 1504bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1505bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 0; 1506bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1507bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 2: 1508bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 0; 1509bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1510bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1511bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 3: 1512bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 1; 1513bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1514bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1515bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1516bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1517bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1518bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1519bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan); 1520bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1521bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1522bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1523bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan); 1524bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1525bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 1526bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 1527bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1528bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1529bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1530bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1531bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1532bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1533bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1534bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 1535bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1536a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1537bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1538bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 2; 1539bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].abs = 1; 1540bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1541bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 2; 1542bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1543bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1544bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1545bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1546bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1547bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1548bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 1549bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 1550bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * muladd has no writemask, have to use another temp 1551bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 1552bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1553a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1554bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1555bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1556bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1557bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 1558bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1559bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 1560bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1561bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1562bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1563bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1564bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1565bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 1566bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1567bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1568bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1569bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1570bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1571bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1572bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1573a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1574bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1575bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1576bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1577bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 1578bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1579bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 1580bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1581bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1582bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1583bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1584bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1585bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 1586bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1587bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1588bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1589bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1590bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1591bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1592bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1593bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie lit_vals[0] = fui(1.5f); 1594bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1595bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 1596bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1597bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1598bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_not_temp = false; 1599bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 1600bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1601bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1602bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (src_not_temp) { 1603b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 1604b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1605a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1606b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 1607b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = i; 1608b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1609b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1610b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 1611b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1612b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1613b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1614b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1615b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1616b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1617b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1618b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1619bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1620bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 1621bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (opcode == SQ_TEX_INST_SAMPLE && 1622bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)) 1623bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = SQ_TEX_INST_SAMPLE_C; 162433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 162533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 1626bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 162733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 162833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.sampler_id = tex.resource_id; 1629641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 16306c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 163133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_x = 0; 163233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_y = 1; 163333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_z = 2; 163433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_w = 3; 163533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 163633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 163733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 163833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 16399a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 1640bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1641bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 1642bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 1643bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 1644bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 1645bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1646bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 164701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 164801984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 164901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 16507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 165101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 165201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 1653bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1654bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) 16555d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie tex.src_sel_w = 2; 1656bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1657bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_tex(ctx->bc, &tex); 1658bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1659bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1660bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1661bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 1662bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 1663bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 166433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 166533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 1666b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 1667b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 1668b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1670b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 1671b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 1672b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 1673b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 16747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 16757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 16767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1677b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 1678b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1679b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1680a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 1681921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1682b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 16837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 16847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1685b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 1686b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1687b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1688b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1689b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1690b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1691b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1692b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1693b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1694b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1695b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1696b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1697b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1698b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1699b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1700b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 1701b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1702b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1703a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1704b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1705b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 17067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[2]; 17077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 1708b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1709b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1710b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1711b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1712b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1713b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1714b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1715b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1716b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1717b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1718b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1719b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1720b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1721b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1722b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 1723b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1724b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1725a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1726b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 17277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[0]; 17287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 17297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[1]; 17307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 1731b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 1732b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 1733b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1734b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1735b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1736b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1737b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1738b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1739b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1740b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1741b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1742b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return tgsi_helper_copy(ctx, inst); 1743b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 1744b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 174587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 174687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 174787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 174887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu_src r600_src[3]; 174987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu alu; 175087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int use_temp = 0; 175187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 175287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 175387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_split_constant(ctx, r600_src); 175487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 175587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 175687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 175787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 175887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie use_temp = 1; 175987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 176087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie for (i = 0; i < 4; i++) { 176187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1762a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 176387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0] = r600_src[0]; 176487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 176587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 176687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1] = r600_src[2]; 176787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 176887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 176987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2] = r600_src[1]; 177087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[1], i); 177187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 177287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 177387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.sel = ctx->temp_reg; 177487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie else { 177587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 177687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 177787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 177887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 177987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 178087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 178187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 178287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (i == 3) 178387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 178487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 178587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 178687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 178787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 178887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 178987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return tgsi_helper_copy(ctx, inst); 179087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 179187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 179287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 17930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 17940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 17950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu_src r600_src[3]; 17970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu alu; 17980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 17990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 18000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 18010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 18020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 18030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 18040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_split_constant(ctx, r600_src); 18050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 18060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 18070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 18080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 18090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1810a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 18110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 18120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 18130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 18140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 18150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 18160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 18170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 18180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 18190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 18200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 18210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 18220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 18230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 18240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 18250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 18260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 18270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 18280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 18290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 18300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 18310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 18320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 18330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 18340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 18350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 18360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 18370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 18380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 18390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 18400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 18410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 18420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 18430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 18440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 18450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 18460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 18470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 18480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 18490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 18500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 18510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 18520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 18530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 18540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 18550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 18560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1857a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 18580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 18590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 18600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 18610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 18620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 18630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 18640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 18650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 18660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 18670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 18680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 18690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 18700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 18710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 18720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 18730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 18740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 18750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 18760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 18770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 18780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 18790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 18800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 18810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 18820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 18830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 18840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 18850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 18860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 18870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 18880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 18890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 18900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 18910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 18920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 18930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 18940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 18950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 18960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 18970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie else { 18980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 18990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 19000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 19010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 19020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 19030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 19040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 19050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 19060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 19070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 19080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 19090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 19100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 19110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 19120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 19130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 19140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 19150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 191636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 191736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 191836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 191936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu_src r600_src[3]; 192036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu alu; 192109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 192236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 192336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 192436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 192536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 192636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 1927a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 192836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 192936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 193036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 193136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 193236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 193336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 193436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 193536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 193636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 193736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 193836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 193936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 194036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 194136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 19425ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 19435ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 19445ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 19455ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 1946a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 194736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = ctx->temp_reg; 194836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 194936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 195036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 195136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 195236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 195336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 195436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 195536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 195636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 19575ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 19585ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 19595ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 19605ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 196136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 196236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 196336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 196436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 196536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 196636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 1967a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 196836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0] = r600_src[0]; 196936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 197036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 197136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 197236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 197336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 197436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 197536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 197636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// if (r) 197736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// return r; 197836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 197936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 198036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 198136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 198236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 198336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 198436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 198536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 19865ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 19875ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 19885ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 198936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 199036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 199136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 199236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 199336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1994a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 199536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 199636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 199736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 199836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 199936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 200036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 200136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 200236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 2; 200336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 200436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 200536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 200636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 200736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 200836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 20095ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 20105ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 20115ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 201236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 201336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 201436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 201536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 201636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 201736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2018a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 201936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 202036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 202136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 202236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 202336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 202436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 202536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 202636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 202736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 202836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 20295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 20305ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 20315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 203236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 203336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 203436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 203587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2036460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2037460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2038460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2039460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct r600_bc_alu_src r600_src[3]; 2040460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct r600_bc_alu alu; 2041460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 2042460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2043460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.x = floor(log2(src)); */ 2044460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 2045460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2046460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2047460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2048460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2049460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2050460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2051460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2052460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2053460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2054460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2055460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2056460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2057460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2058460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2059460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2060460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2061460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2062460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2063460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2064460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2065460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2066460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2067460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2068460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2069460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2070460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2071460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2072460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2073460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2074460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2075460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2076460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2077460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2078460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2079460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2080460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2081460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2082460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2083460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2084460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.y = FIXME; */ 2085460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2086460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2087460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2088460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2089460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2090460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2091460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2092460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2093460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2094460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2095460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2096460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2097460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2098460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2099460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2100460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2101460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2102460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2103460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2104460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2105460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2106460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.z = log2(src);*/ 2107460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 2108460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2109460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2110460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2111460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2112460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2113460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2114460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2115460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2116460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2117460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2118460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2119460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 2; 2120460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2121460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2122460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2123460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2124460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2125460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2126460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2127460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2128460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2129460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2130460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2131460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2132460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 2133460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2134460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2135460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2136460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2137460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2138460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2139460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2140460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2141460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2142460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2143460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2144460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2145460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2146460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2147460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2148460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2149460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2150460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2151460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2152460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2153460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2154460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2155460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 215647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airliestatic int tgsi_arl(struct r600_shader_ctx *ctx) 215747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 215847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie /* TODO from r600c, ar values don't persist between clauses */ 215947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 216047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct r600_bc_alu alu; 216147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 216247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 216347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 216447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR; 216547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 216647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 216747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 216847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 216947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 217047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 217147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.last = 1; 217247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 2173a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)); 217447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 217547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 217647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 217747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 217847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 217957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 218057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 218157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 218257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct r600_bc_alu alu; 218357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 218457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 218557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 218657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 218757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2188a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 218957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 219057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 219157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 219257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 219357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 3) { 219457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 219557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 219657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 219757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 219857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 219957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 220057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 220157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 220257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 2) { 220357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 220457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 220557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]); 220657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 220757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 220857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 220957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 221057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 221157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 221257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 221357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 221457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 221557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 221657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 221757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 221857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2219a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 2220a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2221a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 222209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_bc_alu alu; 2223a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 2224a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2225a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2226a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 2227a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 2228a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2229a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 2230a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 2231a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 2232a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2233a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2234a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2235a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2236a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2237a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 2238a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 2239a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2240a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 2241a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2242a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 2243a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2244a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2245a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2246a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2247a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2248a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 2249a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2250a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 2251a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = pops; 2252a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2253a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2254a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 225509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 2256a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 225709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 225809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 225909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 226009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 226109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 226209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 226309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 226409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 226509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 226609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 226709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 226809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 226909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 227009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2271a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 227209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 227309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 227409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 227509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 227609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 227709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 227809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 227909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 228009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 228109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 228209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 228309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 228409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 228509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 228609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 228709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 228809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 228909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 229009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 229109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 229209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 229309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 229409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 229509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 229609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 229709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 229809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 229909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 230009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 230109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 230209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 230309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 230409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 230509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 230609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 230709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 230809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 230909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 231009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 231109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 231209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 231309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 231409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 231509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid, 231609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sizeof(struct r600_bc_cf *) * (sp->num_mid + 1)); 231709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 231809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 231909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2320a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 232109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 232209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2323a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 232409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 232509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 232609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 232709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 232809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 232909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 233009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 233109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 233209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 233309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 233409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 233509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 233609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 233709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 233809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 233909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 234009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 234109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 234209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 234309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 234409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 234509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 234609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 234709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 234809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 234909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 235009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2351a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 235209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 235309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 235409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 235509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2356a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 235709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 235809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 235909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 236009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 236109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 236209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 236309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 236409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 236509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 236609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 236709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 236809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 236909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 237009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 237109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 237209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 237309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 237409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 237509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 237609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 237709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 237809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 237909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 238009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 238109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 238209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 238309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 238409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 238509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 238609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 238709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 238809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 238909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 239009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2391a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 239209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2393a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 239409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 239509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 239609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 239709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 2398a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2399a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2400a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2401a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 2402a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2403a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 2404a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 2405a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 240609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 2407a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 2408a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2409a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2410a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2411a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 2412a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2413a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 2414a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 2415a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 2416a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 2417a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 2418a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2419a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 2420a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 2421a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 2422a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 242309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 2424a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 242509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 242609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 242709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 242809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 242909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 243009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 243109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 243209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2433a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 243409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 243509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 2436a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 243709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 243809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 243909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 244009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 244109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 244209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 244309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 244409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 244509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2446a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 244709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 244809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 244909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 245009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 245109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 245209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 245309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 245409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 245509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 245609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 245709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 245809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 245909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 246009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 246109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 246209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 246309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 246409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 246509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 246609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 246709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 246809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 246909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 247009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 247109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 247209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 247309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 247409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 247509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 247609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 247709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 247809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 247909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 248009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 248109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 248209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 248309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 248409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 248509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 248609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 248709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 248809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 248909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 249009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 249109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 249209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 2493a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2494a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2495a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 249747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_arl}, 2498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 24990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 25007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 250142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 250236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 2503460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 2504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 2505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2506cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2507cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 250857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 2509dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 2510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 2511d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 2512be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 2513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 2514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2515b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 2516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 25233af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 2524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 25253af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 2526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 25277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 25284558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 2529a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 25300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 2531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 25337a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 2534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2535e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 253688f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 25373af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 25383af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 25394502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 2540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 25450d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 2546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 25470d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 254888f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 2549d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 25500d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 2551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2552b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2554b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 25650d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 256687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 256792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 2568d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 2569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2571cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 257309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 2574a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 2575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2578a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 2579a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 2580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 25884558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 2589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 259909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 2600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 260209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 2603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 260409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 2605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2621094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 2622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 2623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2634de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2639de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 2653