nv50_program.c revision 1bbbc8e0c8230d33cb1eae89cc47b5296edefc10
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 23633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller#include "nv50_program.h" 24633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller#include "nv50_pc.h" 25633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller#include "nv50_context.h" 26f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 27f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs#include "pipe/p_shader_tokens.h" 28fda01b584715c05696a0e6768fda669ef1eb5f3bBen Skeggs#include "tgsi/tgsi_parse.h" 29fda01b584715c05696a0e6768fda669ef1eb5f3bBen Skeggs#include "tgsi/tgsi_util.h" 303a68fcfb6b406cf864afbf200e436fc384fd0865Christoph Bumiller#include "tgsi/tgsi_dump.h" 31f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic INLINE unsigned 33633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerbitcount4(const uint32_t val) 34170cdb4507683fb9042620f7ab2ad96e57787d6cChristoph Bumiller{ 35633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller static const unsigned cnt[16] 36633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; 37633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return cnt[val & 0xf]; 38170cdb4507683fb9042620f7ab2ad96e57787d6cChristoph Bumiller} 39170cdb4507683fb9042620f7ab2ad96e57787d6cChristoph Bumiller 40633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic unsigned 41633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_tgsi_src_mask(const struct tgsi_full_instruction *inst, int c) 42633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 43633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned mask = inst->Dst[0].Register.WriteMask; 44633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 45633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller switch (inst->Instruction.Opcode) { 46633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_COS: 47633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_SIN: 48633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return (mask & 0x8) | ((mask & 0x7) ? 0x1 : 0x0); 49633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_DP3: 50633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 0x7; 51633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_DP4: 52633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_DPH: 53633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_KIL: /* WriteMask ignored */ 54633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 0xf; 55633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_DST: 56633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return mask & (c ? 0xa : 0x6); 57633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_EX2: 58633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_EXP: 59633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_LG2: 60633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_LOG: 61633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_POW: 62633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_RCP: 63633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_RSQ: 64633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_SCS: 65633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 0x1; 66633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_IF: 67633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 0x1; 68633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_LIT: 69633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return 0xb; 70633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_TEX: 71633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_TXB: 72633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_TXL: 73633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_TXP: 74633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller { 75633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller const struct tgsi_instruction_texture *tex; 76633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 77633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller assert(inst->Instruction.Texture); 78633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller tex = &inst->Texture; 79633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 80633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mask = 0x7; 81633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (inst->Instruction.Opcode != TGSI_OPCODE_TEX && 82633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller inst->Instruction.Opcode != TGSI_OPCODE_TXD) 83633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mask |= 0x8; /* bias, lod or proj */ 84633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 85633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller switch (tex->Texture) { 86633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_TEXTURE_1D: 87633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mask &= 0x9; 88633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 89633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_TEXTURE_SHADOW1D: 90633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mask &= 0x5; 91633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 92633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_TEXTURE_2D: 93633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mask &= 0xb; 94633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 95633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller default: 96633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 97633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 98633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 99633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return mask; 100633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_OPCODE_XPD: 101633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller { 102633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned x = 0; 103633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (mask & 1) x |= 0x6; 104633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (mask & 2) x |= 0x5; 105633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (mask & 4) x |= 0x3; 106633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return x; 107633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 108633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller default: 109633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 110633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 111633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 112633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return mask; 113633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller} 114633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 115633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic void 116633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_indirect_inputs(struct nv50_translation_info *ti, int id) 117633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 118633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int i, c; 119633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 120633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = 0; i < PIPE_MAX_SHADER_INPUTS; ++i) 121633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) 122633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->input_access[i][c] = id; 123633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 124633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->indirect_inputs = TRUE; 125633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller} 126633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 127633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic void 128633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_indirect_outputs(struct nv50_translation_info *ti, int id) 129633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 130633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int i, c; 131633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 132633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; ++i) 133633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) 134633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->output_access[i][c] = id; 135633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 136633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->indirect_outputs = TRUE; 137633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller} 138633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 139633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic void 140633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerprog_inst(struct nv50_translation_info *ti, 141633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller const struct tgsi_full_instruction *inst, int id) 142633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 143633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller const struct tgsi_dst_register *dst; 144633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller const struct tgsi_src_register *src; 145633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int s, c, k; 146633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned mask; 147633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 148633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (inst->Dst[0].Register.File == TGSI_FILE_OUTPUT) { 149633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) { 150633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller dst = &inst->Dst[0].Register; 151633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (inst->Dst[0].Register.Indirect) 152633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller nv50_indirect_outputs(ti, id); 153633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (!(dst->WriteMask & (1 << c))) 154633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller continue; 155633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->output_access[dst->Index][c] = id; 156633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 157633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 158633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (inst->Instruction.Opcode == TGSI_OPCODE_MOV && 159633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller inst->Src[0].Register.File == TGSI_FILE_INPUT && 160633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller dst->Index == ti->edgeflag_out) 161633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->p->vp.edgeflag = inst->Src[0].Register.Index; 162633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 163f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 164633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (s = 0; s < inst->Instruction.NumSrcRegs; ++s) { 165633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller src = &inst->Src[s].Register; 166633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (src->File != TGSI_FILE_INPUT) 167633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller continue; 168633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mask = nv50_tgsi_src_mask(inst, s); 169f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 170633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (inst->Src[s].Register.Indirect) 171633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller nv50_indirect_inputs(ti, id); 172f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 173633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) { 174633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (!(mask & (1 << c))) 175633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller continue; 176633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller k = tgsi_util_get_full_src_register_swizzle(&inst->Src[s], c); 177633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (k <= TGSI_SWIZZLE_W) 178633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->input_access[src->Index][k] = id; 179633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 180633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 181f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 182f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1837ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumillerstatic void 184633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerprog_immediate(struct nv50_translation_info *ti, 185633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller const struct tgsi_full_immediate *imm) 1867ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller{ 187633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int c; 188633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned n = ++ti->immd32_nr; 1897ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 1903a68fcfb6b406cf864afbf200e436fc384fd0865Christoph Bumiller tgsi_dump_immediate(imm); 1913a68fcfb6b406cf864afbf200e436fc384fd0865Christoph Bumiller 192633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (n == (1 << (ffs(n) - 1))) 193633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->immd32 = REALLOC(ti->immd32, (n / 2) * 16, (n * 2) * 16); 1947ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 195633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller for (c = 0; c < 4; ++c) 196633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->immd32[(n - 1) * 4 + c] = imm->u[c].Uint; 1977ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller} 1987ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 199633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic INLINE unsigned 200633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillertranslate_interpolate(const struct tgsi_full_declaration *decl) 201633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 202633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned mode; 203633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 204633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (decl->Declaration.Interpolate == TGSI_INTERPOLATE_CONSTANT) 205633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mode = NV50_INTERP_FLAT; 206633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller else 207633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (decl->Declaration.Interpolate == TGSI_INTERPOLATE_PERSPECTIVE) 208633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mode = 0; 209633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller else 210633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mode = NV50_INTERP_LINEAR; 211633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 212633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (decl->Declaration.Centroid) 213633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller mode |= NV50_INTERP_CENTROID; 214633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 215633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return mode; 216633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller} 217633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 218633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerstatic void 219633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerprog_decl(struct nv50_translation_info *ti, 220633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller const struct tgsi_full_declaration *decl) 221633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller{ 222633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller unsigned i, first, last, sn = 0, si = 0; 223633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 224633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller first = decl->Range.First; 225633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller last = decl->Range.Last; 226633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 227633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (decl->Declaration.Semantic) { 228633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller sn = decl->Semantic.Name; 229633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller si = decl->Semantic.Index; 230633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 231633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller tgsi_dump_declaration(decl); 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; 464633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->out[depr].hw = 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 495633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller tgsi_parse_init(&parse, p->pipe.tokens); 496633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller while (!tgsi_parse_end_of_tokens(&parse)) { 497633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller tgsi_parse_token(&parse); 498633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 499633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller switch (parse.FullToken.Token.Type) { 500633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_TOKEN_TYPE_IMMEDIATE: 501633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller prog_immediate(ti, &parse.FullToken.FullImmediate); 502633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 503633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_TOKEN_TYPE_DECLARATION: 504633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller prog_decl(ti, &parse.FullToken.FullDeclaration); 505633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 506633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case TGSI_TOKEN_TYPE_INSTRUCTION: 507633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller prog_inst(ti, &parse.FullToken.FullInstruction, ++ti->inst_nr); 508633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 509633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 510633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 511633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 512633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->in_nr = ti->scan.file_max[TGSI_FILE_INPUT] + 1; 513633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->out_nr = ti->scan.file_max[TGSI_FILE_OUTPUT] + 1; 514633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 515633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller switch (p->type) { 516633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case PIPE_SHADER_VERTEX: 517633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ret = nv50_vertprog_prepare(ti); 518633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 519633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case PIPE_SHADER_FRAGMENT: 520633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ret = nv50_fragprog_prepare(ti); 521633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 522633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller case PIPE_SHADER_GEOMETRY: 523633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ret = nv50_geomprog_prepare(ti); 524633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 525633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller default: 526633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller assert(!"unsupported program type"); 527633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ret = -1; 528633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller break; 529633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 530633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 531633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller assert(!ret); 532633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return ret; 533633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller} 534633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller 535633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerboolean 536633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_program_tx(struct nv50_program *p) 53744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller{ 538633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller struct nv50_translation_info *ti; 539633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller int ret; 54044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 541633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti = CALLOC_STRUCT(nv50_translation_info); 542633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->p = p; 5432a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 544633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ti->edgeflag_out = PIPE_MAX_SHADER_OUTPUTS; 5452a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 546633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ret = nv50_prog_scan(ti); 547633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (ret) { 548633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller NOUVEAU_ERR("unsupported shader program\n"); 549633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller goto out; 550633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 551708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 552633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller ret = nv50_generate_code(ti); 553633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (ret) { 554633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller NOUVEAU_ERR("error during shader translation\n"); 555633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller goto out; 556633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller } 5572a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 558633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillerout: 559633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (ti->immd32) 560633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller FREE(ti->immd32); 561633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller FREE(ti); 562633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller return ret ? FALSE : TRUE; 5632a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 5642a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 565633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillervoid 566633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumillernv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p) 5672a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 568633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller nouveau_bo_ref(NULL, &p->bo); 569f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 570633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller so_ref(NULL, &p->so); 571f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 572633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller if (p->code) 573633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller FREE(p->code); 5747c745de74997e859d7e2640092bda9ad900e28a9Ben Skeggs 575633f5ac6124b1b57152c09becba92d176e905ae9Christoph Bumiller p->translated = FALSE; 576f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 577