r600_shader.c revision cf864fd58b2a4780482a108cd3ff86779e8fa965
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" 26de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h" 2772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_screen.h" 2872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_context.h" 29de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_shader.h" 30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h" 31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h" 3272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h" 33de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h> 34de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h> 35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader); 37de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 38de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_shader *shader) 39de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 40de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 41de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct util_format_description *desc; 42de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse enum pipe_format resource_format[160]; 43de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i, nresources = 0; 44de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc *bc = &shader->bc; 45de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_cf *cf; 46de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx *vtx; 47de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 48de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->processor_type != TGSI_PROCESSOR_VERTEX) 49de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 50de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < rctx->vertex_elements->count; i++) { 51de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format; 52de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 53de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) { 54de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (cf->inst) { 55de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX: 56de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC: 57de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) { 58de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse desc = util_format_description(resource_format[vtx->buffer_id]); 59de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (desc == NULL) { 60de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]); 61de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 62de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 63de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_x = desc->swizzle[0]; 64de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_y = desc->swizzle[1]; 65de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_z = desc->swizzle[2]; 66de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_w = desc->swizzle[3]; 67de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 68de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 69de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 70de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 71de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 72de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 73de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_bc_build(&shader->bc); 74de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 75de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 76de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestruct r600_pipe_shader *r600_pipe_shader_create(struct pipe_context *ctx, 77de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_token *tokens) 78de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 79de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_screen *rscreen = r600_screen(ctx->screen); 80de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_pipe_shader *rpshader = CALLOC_STRUCT(r600_pipe_shader); 81de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 82de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 83de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissefprintf(stderr, "--------------------------------------------------------------\n"); 84de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissetgsi_dump(tokens, 0); 85de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rpshader == NULL) 86de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return NULL; 87de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rpshader->shader.family = radeon_get_family(rscreen->rw); 88de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_from_tgsi(tokens, &rpshader->shader); 89de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) { 90de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("translation from TGSI failed !\n"); 91de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 92de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 93de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_build(&rpshader->shader.bc); 94de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) { 95de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("building bytecode failed !\n"); 96de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 97de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 98de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissefprintf(stderr, "______________________________________________________________\n"); 99de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return rpshader; 100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse free(rpshader); 102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return NULL; 103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 10472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 10572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *rpshader) 10672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 107ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 10872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 10972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i, j, tmp; 11172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 11272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->state = radeon_state_decref(rpshader->state); 11372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state = radeon_state(rscreen->rw, R600_VS_SHADER_TYPE, R600_VS_SHADER); 11472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (state == NULL) 11572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -ENOMEM; 116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 10; i++) { 117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i] = 0; 118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0, j = 0; i < rshader->noutput; i++) { 120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rshader->output[i].name != TGSI_SEMANTIC_POSITION) { 121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tmp = rshader->output[i].sid << ((j & 3) * 8); 122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + j / 4] |= tmp; 123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse j++; 124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_VS_SHADER__SPI_VS_OUT_CONFIG] = S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2); 127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_VS_SHADER__SQ_PGM_RESOURCES_VS] = S_028868_NUM_GPRS(rshader->bc.ngpr); 12872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->state = state; 12972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->state->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo); 13072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->state->bo[1] = radeon_bo_incref(rscreen->rw, rpshader->bo); 13172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->state->nbo = 2; 13272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->state->placement[0] = RADEON_GEM_DOMAIN_GTT; 13372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return radeon_state_pm4(state); 13472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 13572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 13672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *rpshader) 13772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 138ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 13972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 14072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 14172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse unsigned i, tmp; 14272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 14372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->state = radeon_state_decref(rpshader->state); 14472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state = radeon_state(rscreen->rw, R600_PS_SHADER_TYPE, R600_PS_SHADER); 14572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (state == NULL) 14672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -ENOMEM; 14772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse for (i = 0; i < rshader->ninput; i++) { 14872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse tmp = S_028644_SEMANTIC(rshader->input[i].sid); 14972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse tmp |= S_028644_SEL_CENTROID(1); 15072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse tmp |= S_028644_FLAT_SHADE(rshader->flat_shade); 15172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_INPUT_CNTL_0 + i] = tmp; 15272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 15372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_0] = S_0286CC_NUM_INTERP(rshader->ninput) | 15472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse S_0286CC_PERSP_GRADIENT_ENA(1); 15572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_1] = 0x00000000; 156de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_PS_SHADER__SQ_PGM_RESOURCES_PS] = S_028868_NUM_GPRS(rshader->bc.ngpr); 15772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SQ_PGM_EXPORTS_PS] = 0x00000002; 15872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->state = state; 15972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->state->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo); 16072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->state->nbo = 1; 16172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->state->placement[0] = RADEON_GEM_DOMAIN_GTT; 16272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return radeon_state_pm4(state); 16372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 16472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 16572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *rpshader) 16672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 167ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 168ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_context *rctx = r600_context(ctx); 16972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 17072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 17172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 17272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* copy new shader */ 17372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_decref(rscreen->rw, rpshader->bo); 17472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->bo = NULL; 175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4, 17672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 4096, NULL); 17772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader->bo == NULL) { 17872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -ENOMEM; 17972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 18072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_map(rscreen->rw, rpshader->bo); 181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4); 18272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_unmap(rscreen->rw, rpshader->bo); 18372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* build state */ 18472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rshader->flat_shade = rctx->flat_shade; 185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (rshader->processor_type) { 186de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 18772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_vs(ctx, rpshader); 18872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 19072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_ps(ctx, rpshader); 19172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 19272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse default: 19372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = -EINVAL; 19472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 19572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 19672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return r; 19772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 19872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *rpshader) 20072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 20272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 20372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 20472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader == NULL) 205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* there should be enough input */ 207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) { 208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d resources provided, expecting %d\n", 209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rctx->vertex_elements->count, rpshader->shader.bc.nresource); 210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 21172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_update(ctx, &rpshader->shader); 213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_pipe_shader(ctx, rpshader); 216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestruct r600_shader_tgsi_instruction; 219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestruct r600_shader_ctx { 221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_shader_info info; 222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_parse_context parse; 223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_token *tokens; 224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned type; 225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned temp_reg; 227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc *bc; 229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader *shader; 230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestruct r600_shader_tgsi_instruction { 233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned tgsi_opcode; 234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned is_op3; 235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned r600_opcode; 236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[]; 240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 24972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Saturate) { 251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("staturate unsupported\n"); 252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 25372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 257c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 26172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Texture) { 263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("texture unsupported\n"); 264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 26572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Src[j].Register.Indirect || 268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Dimension || 269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Absolute) { 270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported src (indirect|dimension|absolute)\n"); 271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Dst[j].Register.Indirect || i->Dst[j].Register.Dimension) { 276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported dst (indirect|dimension)\n"); 277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 28172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 28272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 28472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx vtx; 287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 28972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx->type == TGSI_PROCESSOR_VERTEX) { 297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* turn input into fetch */ 298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&vtx, 0, sizeof(struct r600_bc_vtx)); 299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.inst = 0; 300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.fetch_type = 0; 301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.buffer_id = i; 302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register containing the index into the buffer */ 303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_gpr = 0; 304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_sel_x = 0; 305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.mega_fetch_count = 0x1F; 306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_gpr = ctx->shader->input[i].gpr; 307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_x = 0; 308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_y = 1; 309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_z = 2; 310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_w = 3; 311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_vtx(ctx->bc, &vtx); 312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 33072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 33172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 33372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_output output; 337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse u32 value[4]; 34072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* Values [0,127] correspond to GPR[0..127]. 354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Values [256,511] correspond to cfile constants c[0..255]. 355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_CONSTANT] = 256; 376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253; 377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 379de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse// R600_ERR("TGSI_TOKEN_TYPE_IMMEDIATE unsupported\n"); 385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse value[0] = immediate->u[0].Uint; 387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse value[1] = immediate->u[1].Uint; 388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse value[2] = immediate->u[2].Uint; 389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse value[3] = immediate->u[3].Uint; 390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_literal(ctx.bc, value); 406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0, pos0 = 0; i < shader->noutput; i++) { 417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&output, 0, sizeof(struct r600_bc_output)); 418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.gpr = shader->output[i].gpr; 419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.elem_size = 3; 420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.swizzle_x = 0; 421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.swizzle_y = 1; 422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.swizzle_z = 2; 423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.swizzle_w = 3; 424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.barrier = 1; 425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.array_base = i - pos0; 427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE; 428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.type == TGSI_PROCESSOR_VERTEX) { 429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.array_base = 60; 432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse pos0 = 1; 435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.array_base = 0; 440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 45172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == (shader->noutput - 1)) { 453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse output.end_of_program = 1; 454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_output(ctx.bc, &output); 456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 472de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = tgsi_src->Register.Index; 483de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = 0; 485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (swizzle) { 488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case 0: 489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->chan = tgsi_src->Register.SwizzleX; 49072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case 1: 492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->chan = tgsi_src->Register.SwizzleY; 49372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case 2: 495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->chan = tgsi_src->Register.SwizzleZ; 496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case 3: 498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->chan = tgsi_src->Register.SwizzleW; 499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 50172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -EINVAL; 502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op2(struct r600_shader_ctx *ctx) 519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]); 532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_slt(struct r600_shader_ctx *ctx) 558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r; 562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[1]); 570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], i, &alu.src[0]); 573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 58772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 5895cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx) 5905cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{ 5915cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5925cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct r600_bc_alu alu; 5935cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse int i, j, r; 5945cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 5955cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (i = 0; i < 4; i++) { 5965cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 5975cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (inst->Dst[0].Register.WriteMask & (1 << i)) { 5985cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 5995cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 6005cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]); 6015cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 6025cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 6035cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 6045cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 6055cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 6065cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 6075cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.last = 1; 6085cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 6095cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 6105cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 6115cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 6125cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 6135cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return 0; 6145cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse} 6155cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 616cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 617cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 618cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 619cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 620cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 621cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 622cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 623cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 624cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 625cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 626cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 627cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 628cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 629cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 632cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 633cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 634cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 635cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 636cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 637cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 638cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 639cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 640cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 641cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 642cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* do it in 2 step as op3 doesn't support writemask */ 650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]); 655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.sel = ctx->temp_reg; 659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 660cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 669cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 670cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 671cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 672cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 673cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 674cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 675cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 676cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 677cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 680cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 681cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 682cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]); 683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 685cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 686cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.sel = ctx->temp_reg; 687cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 688cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 689cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 690cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 691cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 692cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 693cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = alu.src[1].sel = 248; 694cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 695cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 696cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 697cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 698cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 699cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = alu.src[1].sel = 248; 700cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 701cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 702cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 703cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 704cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 713cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 7215cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans}, 722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 726cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 727cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_slt}, 732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DDX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DDY, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* predicated kill */ 760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TEX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 773de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* SGN */ 786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 789de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 791cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 792de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 793de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRK, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 794de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 796de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 807de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CONT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 825de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 827de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 830de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 831de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 832de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* conditional kill */ 842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 847de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 873