nv50_program.c revision e08f70a41d1012a0270468866614485a3415168e
1857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs/* 2633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller * Copyright 2010 Chrsitoph Bumiller 3857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * 4857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 5857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * copy of this software and associated documentation files (the "Software"), 6857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * to deal in the Software without restriction, including without limitation 7857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the 9857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Software is furnished to do so, subject to the following conditions: 10857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * 11857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * The above copyright notice and this permission notice shall be included in 12857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * all copies or substantial portions of the Software. 13857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * 14857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * SOFTWARE. 21857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs */ 22857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs 23d90502b2b468732e2a42985580bbbe9d9fdfd14eChristoph Bumiller/* #define NV50_PROGRAM_DEBUG */ 24d90502b2b468732e2a42985580bbbe9d9fdfd14eChristoph Bumiller 25633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller#include "nv50_program.h" 26633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller#include "nv50_pc.h" 27633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller#include "nv50_context.h" 28f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 29f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs#include "pipe/p_shader_tokens.h" 30fda01b584715c05696a0e6768fda669ef1eb5f3bBen Skeggs#include "tgsi/tgsi_parse.h" 31fda01b584715c05696a0e6768fda669ef1eb5f3bBen Skeggs#include "tgsi/tgsi_util.h" 323a68fcfb6b406cf864afbf200e436fc384fd0865Christoph Bumiller#include "tgsi/tgsi_dump.h" 33f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 346516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic INLINE unsigned 35633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerbitcount4(const uint32_t val) 36170cdb4507683fb9042620f7ab2ad96e57787d6cChristoph Bumiller{ 37633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller static const unsigned cnt[16] 38633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; 39633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return cnt[val & 0xf]; 40170cdb4507683fb9042620f7ab2ad96e57787d6cChristoph Bumiller} 41170cdb4507683fb9042620f7ab2ad96e57787d6cChristoph Bumiller 42633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic unsigned 43633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_tgsi_src_mask(const struct tgsi_full_instruction *inst, int c) 44633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 45633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned mask = inst->Dst[0].Register.WriteMask; 46633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 47633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller switch (inst->Instruction.Opcode) { 48633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_COS: 49633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_SIN: 50633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return (mask & 0x8) | ((mask & 0x7) ? 0x1 : 0x0); 51633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_DP3: 52633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 0x7; 53633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_DP4: 54633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_DPH: 55633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_KIL: /* WriteMask ignored */ 56633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 0xf; 57633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_DST: 58633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return mask & (c ? 0xa : 0x6); 59633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_EX2: 60633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_EXP: 61633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_LG2: 62633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_LOG: 63633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_POW: 64633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_RCP: 65633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_RSQ: 66633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_SCS: 67633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 0x1; 68633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_IF: 69633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 0x1; 70633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_LIT: 71633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 0xb; 72633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_TEX: 73633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_TXB: 74633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_TXL: 75633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_TXP: 76633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller { 77633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller const struct tgsi_instruction_texture *tex; 78633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 79633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller assert(inst->Instruction.Texture); 80633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller tex = &inst->Texture; 81633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 82633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mask = 0x7; 83633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (inst->Instruction.Opcode != TGSI_OPCODE_TEX && 84633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller inst->Instruction.Opcode != TGSI_OPCODE_TXD) 85633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mask |= 0x8; /* bias, lod or proj */ 86633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 87633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller switch (tex->Texture) { 88633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_TEXTURE_1D: 89633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mask &= 0x9; 90633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 91633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_TEXTURE_SHADOW1D: 92633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mask &= 0x5; 93633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 94633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_TEXTURE_2D: 95633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mask &= 0xb; 96633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 97633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller default: 98633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 99633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 100633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 101633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return mask; 102633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_XPD: 103633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller { 104633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned x = 0; 105633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (mask & 1) x |= 0x6; 106633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (mask & 2) x |= 0x5; 107633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (mask & 4) x |= 0x3; 108633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return x; 109633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 110633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller default: 111633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 112633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 113633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 114633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return mask; 115633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller} 116633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 117633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic void 118633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_indirect_inputs(struct nv50_translation_info *ti, int id) 119633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 120633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int i, c; 121633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 122633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = 0; i < PIPE_MAX_SHADER_INPUTS; ++i) 123633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) 124633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->input_access[i][c] = id; 125633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 126633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->indirect_inputs = TRUE; 127633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller} 128633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 129633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic void 130633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_indirect_outputs(struct nv50_translation_info *ti, int id) 131633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 132633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int i, c; 133633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 134633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; ++i) 135633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) 136633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->output_access[i][c] = id; 137633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 138633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->indirect_outputs = TRUE; 139633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller} 140633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 141633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic void 142633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerprog_inst(struct nv50_translation_info *ti, 143633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller const struct tgsi_full_instruction *inst, int id) 144633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 145633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller const struct tgsi_dst_register *dst; 146633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller const struct tgsi_src_register *src; 147633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int s, c, k; 148633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned mask; 149633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 150633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (inst->Dst[0].Register.File == TGSI_FILE_OUTPUT) { 151633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) { 152633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller dst = &inst->Dst[0].Register; 153633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (inst->Dst[0].Register.Indirect) 154633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller nv50_indirect_outputs(ti, id); 155633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (!(dst->WriteMask & (1 << c))) 156633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller continue; 157633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->output_access[dst->Index][c] = id; 158633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 159633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 160633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (inst->Instruction.Opcode == TGSI_OPCODE_MOV && 161633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller inst->Src[0].Register.File == TGSI_FILE_INPUT && 162633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller dst->Index == ti->edgeflag_out) 163633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->p->vp.edgeflag = inst->Src[0].Register.Index; 164633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 165f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 166633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (s = 0; s < inst->Instruction.NumSrcRegs; ++s) { 167633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller src = &inst->Src[s].Register; 168633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (src->File != TGSI_FILE_INPUT) 169633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller continue; 170633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mask = nv50_tgsi_src_mask(inst, s); 171f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 172633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (inst->Src[s].Register.Indirect) 173633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller nv50_indirect_inputs(ti, id); 174f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 175633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) { 176633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (!(mask & (1 << c))) 177633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller continue; 178633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller k = tgsi_util_get_full_src_register_swizzle(&inst->Src[s], c); 179633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (k <= TGSI_SWIZZLE_W) 180633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->input_access[src->Index][k] = id; 181633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 182633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 183f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 184f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1857ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumillerstatic void 186633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerprog_immediate(struct nv50_translation_info *ti, 187633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller const struct tgsi_full_immediate *imm) 1887ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller{ 189633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int c; 190e08f70a41d1012a0270468866614485a3415168eChristoph Bumiller unsigned n = ti->immd32_nr++; 1917ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 192e08f70a41d1012a0270468866614485a3415168eChristoph Bumiller assert(ti->immd32_nr <= ti->scan.immediate_count); 1937ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 194633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) 195e08f70a41d1012a0270468866614485a3415168eChristoph Bumiller ti->immd32[n * 4 + c] = imm->u[c].Uint; 196e08f70a41d1012a0270468866614485a3415168eChristoph Bumiller 197e08f70a41d1012a0270468866614485a3415168eChristoph Bumiller ti->immd32_ty[n] = imm->Immediate.DataType; 1987ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller} 1997ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 200633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic INLINE unsigned 201633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillertranslate_interpolate(const struct tgsi_full_declaration *decl) 202633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 203633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned mode; 204633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 205633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (decl->Declaration.Interpolate == TGSI_INTERPOLATE_CONSTANT) 206633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mode = NV50_INTERP_FLAT; 207633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller else 208633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (decl->Declaration.Interpolate == TGSI_INTERPOLATE_PERSPECTIVE) 209633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mode = 0; 210633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller else 211633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mode = NV50_INTERP_LINEAR; 212633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 213633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (decl->Declaration.Centroid) 214633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mode |= NV50_INTERP_CENTROID; 215633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 216633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return mode; 217633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller} 218633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 219633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic void 220633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerprog_decl(struct nv50_translation_info *ti, 221633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller const struct tgsi_full_declaration *decl) 222633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 223633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned i, first, last, sn = 0, si = 0; 224633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 225633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller first = decl->Range.First; 226633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller last = decl->Range.Last; 227633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 228633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (decl->Declaration.Semantic) { 229633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller sn = decl->Semantic.Name; 230633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller si = decl->Semantic.Index; 231633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 232633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 233633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller switch (decl->Declaration.File) { 234633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_FILE_INPUT: 235633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = first; i <= last; ++i) 236633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->interp_mode[i] = translate_interpolate(decl); 237633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 238633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (!decl->Declaration.Semantic) 239633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 240633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 241633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = first; i <= last; ++i) { 242633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->p->in[i].sn = sn; 243633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->p->in[i].si = si; 244633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 245633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 246633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller switch (sn) { 247633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_SEMANTIC_FACE: 248633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 249633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_SEMANTIC_COLOR: 250633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (ti->p->type == PIPE_SHADER_FRAGMENT) 251633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->p->vp.bfc[si] = first; 252633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 253633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 254633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 255633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_FILE_OUTPUT: 256633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (!decl->Declaration.Semantic) 257633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 258633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 259633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = first; i <= last; ++i) { 260633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->p->out[i].sn = sn; 261633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->p->out[i].si = si; 262633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 263633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 264633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller switch (sn) { 265633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_SEMANTIC_BCOLOR: 266633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->p->vp.bfc[si] = first; 267633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 268633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_SEMANTIC_PSIZE: 269633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->p->vp.psiz = first; 270633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 271633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_SEMANTIC_EDGEFLAG: 272633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->edgeflag_out = first; 273633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 274633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller default: 275633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 276633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 277633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 278633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_FILE_SYSTEM_VALUE: 279633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller switch (decl->Semantic.Name) { 280633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_SEMANTIC_FACE: 281633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 282633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_SEMANTIC_INSTANCEID: 283633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 284633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_SEMANTIC_PRIMID: 285633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 286633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller /* 287633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_SEMANTIC_PRIMIDIN: 288633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 289633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_SEMANTIC_VERTEXID: 290633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 291633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller */ 292633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller default: 293633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 294633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 295633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 296633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_FILE_CONSTANT: 297633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->p->parm_size = MAX2(ti->p->parm_size, (last + 1) * 16); 298633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 299633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_FILE_ADDRESS: 300633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_FILE_SAMPLER: 301633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_FILE_TEMPORARY: 302633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 303633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller default: 304633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller assert(0); 305633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 306633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 307f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 308f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3093f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsstatic int 310633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_vertprog_prepare(struct nv50_translation_info *ti) 3113f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs{ 312633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller struct nv50_program *p = ti->p; 313633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int i, c; 314633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned num_inputs = 0; 3153f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 316633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->input_file = NV_FILE_MEM_S; 317633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->output_file = NV_FILE_OUT; 3183f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 319633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = 0; i <= ti->scan.file_max[TGSI_FILE_INPUT]; ++i) { 320633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->in[i].id = i; 321633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->in[i].hw = num_inputs; 3223f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 323633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) { 324633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (!ti->input_access[i][c]) 325633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller continue; 326633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->input_map[i][c] = num_inputs++; 327633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->vp.attrs[(4 * i + c) / 32] |= 1 << ((i * 4 + c) % 32); 328633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 329633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 3303f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 331633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = 0; i <= ti->scan.file_max[TGSI_FILE_OUTPUT]; ++i) { 332633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->out[i].id = i; 333633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->out[i].hw = p->max_out; 3342a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 335633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) { 336633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (!ti->output_access[i][c]) 337633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller continue; 338633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->output_map[i][c] = p->max_out++; 339633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->out[i].mask |= 1 << c; 340633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 341633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 3422a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 343633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (p->vp.psiz < 0x40) 344633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->vp.psiz = p->out[p->vp.psiz].hw; 345d4d880199ead954e79cad141f7a29f7dd17fe7fcPatrice Mandin 346633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 0; 3472a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 3482a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 34933e4d30d50344be26398a51365bea1be37487403Ben Skeggsstatic int 350633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_fragprog_prepare(struct nv50_translation_info *ti) 351633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 352633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller struct nv50_program *p = ti->p; 353633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int i, j, c; 354633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned nvary, nintp, depr; 355633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned n = 0, m = 0, skip = 0; 356633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ubyte sn[16], si[16]; 357633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 358633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller /* FP flags */ 359633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 360633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (ti->scan.writes_z) { 361633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->fp.flags[1] = 0x11; 362633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->fp.flags[0] |= NV50TCL_FP_CONTROL_EXPORTS_Z; 363633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 364633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 365633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (ti->scan.uses_kill) 366633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->fp.flags[0] |= NV50TCL_FP_CONTROL_USES_KIL; 367633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 368633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller /* FP inputs */ 369633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 370633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->input_file = NV_FILE_MEM_V; 371633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->output_file = NV_FILE_GPR; 372633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 373633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller /* count non-flat inputs, save semantic info */ 374633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = 0; i < p->in_nr; ++i) { 375633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller m += (ti->interp_mode[i] & NV50_INTERP_FLAT) ? 0 : 1; 376633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller sn[i] = p->in[i].sn; 377633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller si[i] = p->in[i].si; 378633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 379633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 380633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller /* reorder p->in[] so that non-flat inputs are first and 381633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller * kick out special inputs that don't use VP/GP_RESULT_MAP 382633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller */ 383633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller nintp = 0; 384633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = 0; i < p->in_nr; ++i) { 385633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (sn[i] == TGSI_SEMANTIC_POSITION) { 386633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) { 387633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->input_map[i][c] = nintp; 388633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (ti->input_access[i][c]) { 389633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->fp.interp |= 1 << (24 + c); 390633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ++nintp; 391633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 392633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 393633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller skip++; 394633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller continue; 395633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } else 396633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (sn[i] == TGSI_SEMANTIC_FACE) { 397633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->input_map[i][0] = 255; 398633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller skip++; 399633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller continue; 400633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 401633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 402633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller j = (ti->interp_mode[i] & NV50_INTERP_FLAT) ? m++ : n++; 403633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 404633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (sn[i] == TGSI_SEMANTIC_COLOR) 405633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->vp.bfc[si[i]] = j; 406633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 407633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->in[j].linear = (ti->interp_mode[i] & NV50_INTERP_LINEAR) ? 1 : 0; 408633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->in[j].id = i; 409633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->in[j].sn = sn[i]; 410633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->in[j].si = si[i]; 411633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 412633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller assert(n <= m); 413633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->in_nr -= skip; 414633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 415633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (!(p->fp.interp & (8 << 24))) { 416633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->fp.interp |= (8 << 24); 417633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ++nintp; 418633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 419633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 420633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->fp.colors = (1 << 24) | 4; /* CLAMP, FFC0_ID = 4 */ 421633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 422633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = 0; i < p->in_nr; ++i) { 423633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int j = p->in[i].id; 424633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->in[i].hw = nintp; 425633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 426633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) { 427633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (!ti->input_access[j][c]) 428633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller continue; 429633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->in[i].mask |= 1 << c; 430633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->input_map[j][c] = nintp++; 431633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 432633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller /* count color inputs */ 433633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (i == p->vp.bfc[0] || i == p->vp.bfc[1]) 434633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->fp.colors += bitcount4(p->in[i].mask) << 16; 435633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 436633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller nintp -= bitcount4(p->fp.interp >> 24); /* subtract position inputs */ 437633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller nvary = nintp; 438633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (n < m) 439633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller nvary -= p->in[n].hw; 440633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 441633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->fp.interp |= nvary << NV50TCL_FP_INTERPOLANT_CTRL_COUNT_NONFLAT_SHIFT; 442633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->fp.interp |= nintp << NV50TCL_FP_INTERPOLANT_CTRL_COUNT_SHIFT; 443633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 444633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller /* FP outputs */ 445633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 446633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (p->out_nr > (1 + (ti->scan.writes_z ? 1 : 0))) 447633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->fp.flags[0] |= NV50TCL_FP_CONTROL_MULTIPLE_RESULTS; 448633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 449633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller depr = p->out_nr; 450633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = 0; i < p->out_nr; ++i) { 451633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->out[i].id = i; 452633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (p->out[i].sn == TGSI_SEMANTIC_POSITION) { 453633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller depr = i; 454633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller continue; 455633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 456633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->out[i].hw = p->max_out; 457633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->out[i].mask = 0xf; 458633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 459633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) 460633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->output_map[i][c] = p->max_out++; 461633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 462633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (depr < p->out_nr) { 463633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->out[depr].mask = 0x4; 4643844c365947082550565accefd996c10fbb15cc4Christoph Bumiller p->out[depr].hw = ti->output_map[depr][2] = p->max_out++; 465633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 466633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 467633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 0; 46855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 46955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 470633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic int 471633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_geomprog_prepare(struct nv50_translation_info *ti) 47244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller{ 473633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->input_file = NV_FILE_MEM_S; 474633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->output_file = NV_FILE_OUT; 47544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 476633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller assert(0); 477633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 1; 47844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller} 47944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 480633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic int 481633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_prog_scan(struct nv50_translation_info *ti) 482633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 483633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller struct nv50_program *p = ti->p; 484633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller struct tgsi_parse_context parse; 485633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int ret; 486633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 4871bbbc8e0c8230d33cb1eae89cc47b5296edefc10Christoph Bumiller p->vp.edgeflag = 0x40; 488633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->vp.psiz = 0x40; 489633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->vp.bfc[0] = 0x40; 490633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->vp.bfc[1] = 0x40; 491633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->gp.primid = 0x80; 492633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 493633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller tgsi_scan_shader(p->pipe.tokens, &ti->scan); 494633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 495d90502b2b468732e2a42985580bbbe9d9fdfd14eChristoph Bumiller#ifdef NV50_PROGRAM_DEBUG 496d90502b2b468732e2a42985580bbbe9d9fdfd14eChristoph Bumiller tgsi_dump(p->pipe.tokens, 0); 497d90502b2b468732e2a42985580bbbe9d9fdfd14eChristoph Bumiller#endif 498d90502b2b468732e2a42985580bbbe9d9fdfd14eChristoph Bumiller 499e08f70a41d1012a0270468866614485a3415168eChristoph Bumiller ti->immd32 = (uint32_t *)MALLOC(ti->scan.immediate_count * 16); 500e08f70a41d1012a0270468866614485a3415168eChristoph Bumiller ti->immd32_ty = (ubyte *)MALLOC(ti->scan.immediate_count * sizeof(ubyte)); 501e08f70a41d1012a0270468866614485a3415168eChristoph Bumiller 502633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller tgsi_parse_init(&parse, p->pipe.tokens); 503633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller while (!tgsi_parse_end_of_tokens(&parse)) { 504633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller tgsi_parse_token(&parse); 505633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 506633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller switch (parse.FullToken.Token.Type) { 507633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_TOKEN_TYPE_IMMEDIATE: 508633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller prog_immediate(ti, &parse.FullToken.FullImmediate); 509633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 510633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_TOKEN_TYPE_DECLARATION: 511633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller prog_decl(ti, &parse.FullToken.FullDeclaration); 512633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 513633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_TOKEN_TYPE_INSTRUCTION: 514633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller prog_inst(ti, &parse.FullToken.FullInstruction, ++ti->inst_nr); 515633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 516633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 517633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 518633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 519633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->in_nr = ti->scan.file_max[TGSI_FILE_INPUT] + 1; 520633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->out_nr = ti->scan.file_max[TGSI_FILE_OUTPUT] + 1; 521633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 522633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller switch (p->type) { 523633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case PIPE_SHADER_VERTEX: 524633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ret = nv50_vertprog_prepare(ti); 525633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 526633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case PIPE_SHADER_FRAGMENT: 527633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ret = nv50_fragprog_prepare(ti); 528633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 529633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case PIPE_SHADER_GEOMETRY: 530633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ret = nv50_geomprog_prepare(ti); 531633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 532633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller default: 533633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller assert(!"unsupported program type"); 534633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ret = -1; 535633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 536633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 537633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 538633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller assert(!ret); 539633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return ret; 540633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller} 541633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 542633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerboolean 543633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_program_tx(struct nv50_program *p) 54444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller{ 545633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller struct nv50_translation_info *ti; 546633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int ret; 54744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 548633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti = CALLOC_STRUCT(nv50_translation_info); 549633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->p = p; 5502a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 551633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->edgeflag_out = PIPE_MAX_SHADER_OUTPUTS; 5522a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 553633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ret = nv50_prog_scan(ti); 554633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (ret) { 555633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller NOUVEAU_ERR("unsupported shader program\n"); 556633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller goto out; 557633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 558708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 559633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ret = nv50_generate_code(ti); 560633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (ret) { 561633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller NOUVEAU_ERR("error during shader translation\n"); 562633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller goto out; 563633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 5642a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 565633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerout: 566633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (ti->immd32) 567633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller FREE(ti->immd32); 568e08f70a41d1012a0270468866614485a3415168eChristoph Bumiller if (ti->immd32_ty) 569e08f70a41d1012a0270468866614485a3415168eChristoph Bumiller FREE(ti->immd32_ty); 570633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller FREE(ti); 571633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return ret ? FALSE : TRUE; 5722a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 5732a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 574633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillervoid 575633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p) 5762a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 577633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller nouveau_bo_ref(NULL, &p->bo); 578f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 579633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller so_ref(NULL, &p->so); 580f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 581633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (p->code) 582633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller FREE(p->code); 5837c745de74997e859d7e2640092bda9ad900e28a9Ben Skeggs 584633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->translated = FALSE; 585f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 586