nv30: remove nv30_context use from nvfx_*prog

This should pave the way to being able to use the compiler without a
context. Also leads to cleaner code.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
Ilia Mirkin 2014-02-21 02:22:31 -05:00
parent 41dbc4c444
commit dd370f0af6
13 changed files with 110 additions and 107 deletions

View file

@ -25,8 +25,8 @@
#include "codegen/nv50_ir_driver.h"
extern "C" {
#include "nouveau_debug.h"
#include "nv50/nv50_program.h"
#include "nv50/nv50_debug.h"
}
namespace nv50_ir {

View file

@ -0,0 +1,25 @@
#ifndef __NOUVEAU_DEBUG_H__
#define __NOUVEAU_DEBUG_H__
#include <stdio.h>
#include "util/u_debug.h"
#define NOUVEAU_DEBUG_MISC 0x0001
#define NOUVEAU_DEBUG_SHADER 0x0100
#define NOUVEAU_DEBUG_PROG_IR 0x0200
#define NOUVEAU_DEBUG_PROG_RA 0x0400
#define NOUVEAU_DEBUG_PROG_CFLOW 0x0800
#define NOUVEAU_DEBUG_PROG_ALL 0x1f00
#define NOUVEAU_DEBUG 0
#define NOUVEAU_ERR(fmt, args...) \
fprintf(stderr, "%s:%d - "fmt, __FUNCTION__, __LINE__, ##args)
#define NOUVEAU_DBG(ch, args...) \
if ((NOUVEAU_DEBUG) & (NOUVEAU_DEBUG_##ch)) \
debug_printf(args)
#endif /* __NOUVEAU_DEBUG_H__ */

View file

@ -233,9 +233,6 @@ nv30_context_create(struct pipe_screen *pscreen, void *priv)
if (debug_get_bool_option("NV30_SWTNL", FALSE))
nv30->draw_flags |= NV30_NEW_SWTNL;
/*XXX: nvfx... */
nv30->is_nv4x = (screen->eng3d->oclass >= NV40_3D_CLASS) ? ~0 : 0;
nv30->sample_mask = 0xffff;
nv30_vbo_init(pipe);
nv30_query_init(pipe);

View file

@ -122,9 +122,6 @@ struct nv30_context {
struct pipe_query *render_cond_query;
unsigned render_cond_mode;
boolean render_cond_cond;
/*XXX: nvfx state, DO NOT USE EVER OUTSIDE "STOLEN" NVFX code */
unsigned is_nv4x;
};
static INLINE struct nv30_context *
@ -212,13 +209,6 @@ nv30_state_validate(struct nv30_context *nv30, boolean hwtnl);
void
nv30_state_release(struct nv30_context *nv30);
//XXX: needed to make it build, clean this up!
void
_nvfx_fragprog_translate(struct nv30_context *nvfx, struct nv30_fragprog *fp);
boolean
_nvfx_vertprog_translate(struct nv30_context *nv30, struct nv30_vertprog *vp);
#ifdef NV30_3D_VERTEX_BEGIN_END
#define NV30_PRIM_GL_CASE(n) \
case PIPE_PRIM_##n: return NV30_3D_VERTEX_BEGIN_END_##n

View file

@ -67,7 +67,7 @@ nv30_fragprog_validate(struct nv30_context *nv30)
int i;
if (!fp->translated) {
_nvfx_fragprog_translate(nv30, fp);
_nvfx_fragprog_translate(eng3d->oclass, fp);
if (!fp->translated)
return;

View file

@ -3,11 +3,9 @@
#include <stdio.h>
#define NOUVEAU_ERR(fmt, args...) \
fprintf(stderr, "%s:%d - "fmt, __FUNCTION__, __LINE__, ##args);
#include "util/u_double_list.h"
#include "nouveau_debug.h"
#include "nouveau_screen.h"
#include "nouveau_fence.h"
#include "nouveau_heap.h"

View file

@ -29,6 +29,7 @@
#include "nv_object.xml.h"
#include "nv30/nv30-40_3d.xml.h"
#include "nv30/nv30_context.h"
#include "nv30/nvfx_shader.h"
#include "nv30/nv30_state.h"
static void
@ -75,7 +76,7 @@ nv30_vertprog_validate(struct nv30_context *nv30)
}
if (!vp->translated) {
vp->translated = _nvfx_vertprog_translate(nv30, vp);
vp->translated = _nvfx_vertprog_translate(eng3d->oclass, vp);
if (!vp->translated) {
nv30->draw_flags |= NV30_NEW_VERTPROG;
return;

View file

@ -2,6 +2,7 @@
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "pipe/p_state.h"
#include "util/u_dynarray.h"
#include "util/u_linkage.h"
#include "util/u_inlines.h"
#include "util/u_debug.h"
@ -12,9 +13,11 @@
#include "tgsi/tgsi_dump.h"
#include "tgsi/tgsi_ureg.h"
#include "nouveau_debug.h"
#include "nv_object.xml.h"
#include "nv30/nv30-40_3d.xml.h"
#include "nv30/nv30_context.h"
#include "nv30/nvfx_shader.h"
#include "nv30/nv30_state.h"
struct nvfx_fpc {
struct nv30_fragprog *fp;
@ -30,6 +33,7 @@ struct nvfx_fpc {
unsigned inst_offset;
unsigned have_const;
unsigned is_nv4x;
struct util_dynarray imm_data;
@ -437,7 +441,7 @@ tgsi_mask(uint tgsi)
}
static boolean
nvfx_fragprog_parse_instruction(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
nvfx_fragprog_parse_instruction(struct nvfx_fpc *fpc,
const struct tgsi_full_instruction *finst)
{
const struct nvfx_src none = nvfx_src(nvfx_reg(NVFXSR_NONE, 0));
@ -621,7 +625,7 @@ nvfx_fragprog_parse_instruction(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
nvfx_fp_emit(fpc, arith(sat, LG2, dst, mask, src[0], none, none));
break;
case TGSI_OPCODE_LIT:
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
nvfx_fp_emit(fpc, arith(sat, LIT_NV30, dst, mask, src[0], none, none));
else {
/* we use FLT_MIN, so that log2 never gives -infinity, and thus multiplication by
@ -642,7 +646,7 @@ nvfx_fragprog_parse_instruction(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
}
break;
case TGSI_OPCODE_LRP:
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
nvfx_fp_emit(fpc, arith(sat, LRP_NV30, dst, mask, src[0], src[1], src[2]));
else {
tmp = nvfx_src(temp(fpc));
@ -668,7 +672,7 @@ nvfx_fragprog_parse_instruction(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
case TGSI_OPCODE_NOP:
break;
case TGSI_OPCODE_POW:
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
nvfx_fp_emit(fpc, arith(sat, POW_NV30, dst, mask, src[0], src[1], none));
else {
tmp = nvfx_src(temp(fpc));
@ -681,7 +685,7 @@ nvfx_fragprog_parse_instruction(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
nvfx_fp_emit(fpc, arith(sat, RCP, dst, mask, src[0], none, none));
break;
case TGSI_OPCODE_RFL:
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
nvfx_fp_emit(fpc, arith(0, RFL_NV30, dst, mask, src[0], src[1], none));
else {
tmp = nvfx_src(temp(fpc));
@ -694,7 +698,7 @@ nvfx_fragprog_parse_instruction(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
}
break;
case TGSI_OPCODE_RSQ:
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
nvfx_fp_emit(fpc, arith(sat, RSQ_NV30, dst, mask, abs(swz(src[0], X, X, X, X)), none, none));
else {
tmp = nvfx_src(temp(fpc));
@ -790,7 +794,7 @@ nvfx_fragprog_parse_instruction(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
nvfx_fp_emit(fpc, tex(sat, TXB, unit, dst, mask, src[0], none, none));
break;
case TGSI_OPCODE_TXL:
if(nvfx->is_nv4x)
if(fpc->is_nv4x)
nvfx_fp_emit(fpc, tex(sat, TXL_NV40, unit, dst, mask, src[0], none, none));
else /* unsupported on nv30, use TEX and hope they like it */
nvfx_fp_emit(fpc, tex(sat, TEX, unit, dst, mask, src[0], none, none));
@ -807,7 +811,7 @@ nvfx_fragprog_parse_instruction(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
case TGSI_OPCODE_IF:
// MOVRC0 R31 (TR0.xyzw), R<src>:
// IF (NE.xxxx) ELSE <else> END <end>
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
goto nv3x_cflow;
nv40_fp_if(fpc, src[0]);
break;
@ -815,7 +819,7 @@ nvfx_fragprog_parse_instruction(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
case TGSI_OPCODE_ELSE:
{
uint32_t *hw;
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
goto nv3x_cflow;
assert(util_dynarray_contains(&fpc->if_stack, unsigned));
hw = &fpc->fp->insn[util_dynarray_top(&fpc->if_stack, unsigned)];
@ -826,7 +830,7 @@ nvfx_fragprog_parse_instruction(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
case TGSI_OPCODE_ENDIF:
{
uint32_t *hw;
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
goto nv3x_cflow;
assert(util_dynarray_contains(&fpc->if_stack, unsigned));
hw = &fpc->fp->insn[util_dynarray_pop(&fpc->if_stack, unsigned)];
@ -849,19 +853,19 @@ nvfx_fragprog_parse_instruction(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
break;
case TGSI_OPCODE_CAL:
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
goto nv3x_cflow;
nv40_fp_cal(fpc, finst->Label.Label);
break;
case TGSI_OPCODE_RET:
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
goto nv3x_cflow;
nv40_fp_ret(fpc);
break;
case TGSI_OPCODE_BGNLOOP:
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
goto nv3x_cflow;
/* TODO: we should support using two nested REPs to allow a > 255 iteration count */
nv40_fp_rep(fpc, 255, finst->Label.Label);
@ -871,7 +875,7 @@ nvfx_fragprog_parse_instruction(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
break;
case TGSI_OPCODE_BRK:
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
goto nv3x_cflow;
nv40_fp_brk(fpc);
break;
@ -908,7 +912,7 @@ nv3x_cflow:
}
static boolean
nvfx_fragprog_parse_decl_input(struct nv30_context *nvfx, struct nvfx_fpc *fpc,
nvfx_fragprog_parse_decl_input(struct nvfx_fpc *fpc,
const struct tgsi_full_declaration *fdec)
{
unsigned idx = fdec->Range.First;
@ -948,10 +952,10 @@ nvfx_fragprog_parse_decl_input(struct nv30_context *nvfx, struct nvfx_fpc *fpc,
}
static boolean
nvfx_fragprog_assign_generic(struct nv30_context *nvfx, struct nvfx_fpc *fpc,
nvfx_fragprog_assign_generic(struct nvfx_fpc *fpc,
const struct tgsi_full_declaration *fdec)
{
unsigned num_texcoords = nvfx->is_nv4x ? 10 : 8;
unsigned num_texcoords = fpc->is_nv4x ? 10 : 8;
unsigned idx = fdec->Range.First;
unsigned hw;
@ -984,7 +988,7 @@ nvfx_fragprog_assign_generic(struct nv30_context *nvfx, struct nvfx_fpc *fpc,
}
static boolean
nvfx_fragprog_parse_decl_output(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
nvfx_fragprog_parse_decl_output(struct nvfx_fpc *fpc,
const struct tgsi_full_declaration *fdec)
{
unsigned idx = fdec->Range.First;
@ -1002,7 +1006,7 @@ nvfx_fragprog_parse_decl_output(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
case 2: hw = 3; break;
case 3: hw = 4; break;
}
if(hw > ((nvfx->is_nv4x) ? 4 : 2)) {
if(hw > ((fpc->is_nv4x) ? 4 : 2)) {
NOUVEAU_ERR("bad rcol index\n");
return FALSE;
}
@ -1018,7 +1022,7 @@ nvfx_fragprog_parse_decl_output(struct nv30_context* nvfx, struct nvfx_fpc *fpc,
}
static boolean
nvfx_fragprog_prepare(struct nv30_context* nvfx, struct nvfx_fpc *fpc)
nvfx_fragprog_prepare(struct nvfx_fpc *fpc)
{
struct tgsi_parse_context p;
int high_temp = -1, i;
@ -1037,11 +1041,11 @@ nvfx_fragprog_prepare(struct nv30_context* nvfx, struct nvfx_fpc *fpc)
fdec = &p.FullToken.FullDeclaration;
switch (fdec->Declaration.File) {
case TGSI_FILE_INPUT:
if (!nvfx_fragprog_parse_decl_input(nvfx, fpc, fdec))
if (!nvfx_fragprog_parse_decl_input(fpc, fdec))
goto out_err;
break;
case TGSI_FILE_OUTPUT:
if (!nvfx_fragprog_parse_decl_output(nvfx, fpc, fdec))
if (!nvfx_fragprog_parse_decl_output(fpc, fdec))
goto out_err;
break;
case TGSI_FILE_TEMPORARY:
@ -1081,7 +1085,7 @@ nvfx_fragprog_prepare(struct nv30_context* nvfx, struct nvfx_fpc *fpc)
fdec = &p.FullToken.FullDeclaration;
switch (fdec->Declaration.File) {
case TGSI_FILE_INPUT:
if (!nvfx_fragprog_assign_generic(nvfx, fpc, fdec))
if (!nvfx_fragprog_assign_generic(fpc, fdec))
goto out_err;
break;
default:
@ -1114,7 +1118,7 @@ out_err:
DEBUG_GET_ONCE_BOOL_OPTION(nvfx_dump_fp, "NVFX_DUMP_FP", FALSE)
void
_nvfx_fragprog_translate(struct nv30_context *nvfx, struct nv30_fragprog *fp)
_nvfx_fragprog_translate(uint16_t oclass, struct nv30_fragprog *fp)
{
struct tgsi_parse_context parse;
struct nvfx_fpc *fpc = NULL;
@ -1128,7 +1132,8 @@ _nvfx_fragprog_translate(struct nv30_context *nvfx, struct nv30_fragprog *fp)
if (!fpc)
goto out_err;
fpc->max_temps = nvfx->is_nv4x ? 48 : 32;
fpc->is_nv4x = (oclass >= NV40_3D_CLASS) ? ~0 : 0;
fpc->max_temps = fpc->is_nv4x ? 48 : 32;
fpc->fp = fp;
fpc->num_regs = 2;
memset(fp->texcoord, 0xff, sizeof(fp->texcoord));
@ -1152,7 +1157,7 @@ _nvfx_fragprog_translate(struct nv30_context *nvfx, struct nv30_fragprog *fp)
}
}
if (!nvfx_fragprog_prepare(nvfx, fpc))
if (!nvfx_fragprog_prepare(fpc))
goto out_err;
tgsi_parse_init(&parse, fp->pipe.tokens);
@ -1168,7 +1173,7 @@ _nvfx_fragprog_translate(struct nv30_context *nvfx, struct nv30_fragprog *fp)
util_dynarray_append(&insns, unsigned, fp->insn_len);
finst = &parse.FullToken.FullInstruction;
if (!nvfx_fragprog_parse_instruction(nvfx, fpc, finst))
if (!nvfx_fragprog_parse_instruction(fpc, finst))
goto out_err;
}
break;
@ -1185,7 +1190,7 @@ _nvfx_fragprog_translate(struct nv30_context *nvfx, struct nv30_fragprog *fp)
}
util_dynarray_fini(&insns);
if(!nvfx->is_nv4x)
if(!fpc->is_nv4x)
fp->fp_control |= (fpc->num_regs-1)/2;
else
fp->fp_control |= fpc->num_regs << NV40_3D_FP_CONTROL_TEMP_COUNT__SHIFT;
@ -1207,7 +1212,7 @@ _nvfx_fragprog_translate(struct nv30_context *nvfx, struct nv30_fragprog *fp)
debug_printf("\n");
tgsi_dump(fp->pipe.tokens, 0);
debug_printf("\n%s fragment program:\n", nvfx->is_nv4x ? "nv4x" : "nv3x");
debug_printf("\n%s fragment program:\n", fpc->is_nv4x ? "nv4x" : "nv3x");
for (unsigned i = 0; i < fp->insn_len; i += 4)
debug_printf("%3u: %08x %08x %08x %08x\n", i >> 2, fp->insn[i], fp->insn[i + 1], fp->insn[i + 2], fp->insn[i + 3]);
debug_printf("\n");

View file

@ -10,7 +10,7 @@
/* this will resolve to either the NV30 or the NV40 version
* depending on the current hardware */
/* unusual, but very fast and compact method */
#define NVFX_VP(c) ((NV30_VP_##c) + (nv30->is_nv4x & ((NV40_VP_##c) - (NV30_VP_##c))))
#define NVFX_VP(c) ((NV30_VP_##c) + (vpc->is_nv4x & ((NV40_VP_##c) - (NV30_VP_##c))))
#define NVFX_VP_INST_SLOT_VEC 0
#define NVFX_VP_INST_SLOT_SCA 1
@ -522,4 +522,14 @@ struct nvfx_relocation {
unsigned target;
};
struct nv30_fragprog;
struct nv30_vertprog;
//XXX: needed to make it build, clean this up!
void
_nvfx_fragprog_translate(uint16_t oclass, struct nv30_fragprog *fp);
boolean
_nvfx_vertprog_translate(uint16_t oclass, struct nv30_vertprog *vp);
#endif

View file

@ -1,6 +1,7 @@
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "pipe/p_state.h"
#include "util/u_dynarray.h"
#include "util/u_linkage.h"
#include "util/u_debug.h"
@ -12,9 +13,10 @@
#include "draw/draw_context.h"
#include "nv_object.xml.h"
#include "nouveau_debug.h"
#include "nv30/nv30-40_3d.xml.h"
#include "nv30/nv30_context.h"
#include "nv30/nv30_resource.h"
#include "nv30/nv30_state.h"
/* TODO (at least...):
* 1. Indexed consts + ARL
@ -36,7 +38,6 @@ struct nvfx_loop_entry {
};
struct nvfx_vpc {
struct nv30_context* nv30;
struct pipe_shader_state pipe;
struct nv30_vertprog *vp;
struct tgsi_shader_info* info;
@ -57,6 +58,8 @@ struct nvfx_vpc {
int hpos_idx;
int cvtx_idx;
unsigned is_nv4x;
struct util_dynarray label_relocs;
struct util_dynarray loop_stack;
};
@ -114,7 +117,7 @@ constant(struct nvfx_vpc *vpc, int pipe, float x, float y, float z, float w)
nvfx_insn((s), (NVFX_VP_INST_SLOT_##t << 7) | NVFX_VP_INST_##t##_OP_##o, -1, (d), (m), (s0), (s1), (s2))
static void
emit_src(struct nv30_context *nv30, struct nvfx_vpc *vpc, uint32_t *hw,
emit_src(struct nvfx_vpc *vpc, uint32_t *hw,
int pos, struct nvfx_src src)
{
struct nv30_vertprog *vp = vpc->vp;
@ -198,14 +201,14 @@ emit_src(struct nv30_context *nv30, struct nvfx_vpc *vpc, uint32_t *hw,
}
static void
emit_dst(struct nv30_context *nv30, struct nvfx_vpc *vpc, uint32_t *hw,
emit_dst(struct nvfx_vpc *vpc, uint32_t *hw,
int slot, struct nvfx_reg dst)
{
struct nv30_vertprog *vp = vpc->vp;
switch (dst.type) {
case NVFXSR_NONE:
if(!nv30->is_nv4x)
if(!vpc->is_nv4x)
hw[0] |= NV30_VP_INST_DEST_TEMP_ID_MASK;
else {
hw[3] |= NV40_VP_INST_DEST_MASK;
@ -216,7 +219,7 @@ emit_dst(struct nv30_context *nv30, struct nvfx_vpc *vpc, uint32_t *hw,
}
break;
case NVFXSR_TEMP:
if(!nv30->is_nv4x)
if(!vpc->is_nv4x)
hw[0] |= (dst.index << NV30_VP_INST_DEST_TEMP_ID_SHIFT);
else {
hw[3] |= NV40_VP_INST_DEST_MASK;
@ -228,7 +231,7 @@ emit_dst(struct nv30_context *nv30, struct nvfx_vpc *vpc, uint32_t *hw,
break;
case NVFXSR_OUTPUT:
/* TODO: this may be wrong because on nv30 COL0 and BFC0 are swapped */
if(nv30->is_nv4x) {
if(vpc->is_nv4x) {
switch (dst.index) {
case NV30_VP_INST_DEST_CLP(0):
dst.index = NVFX_VP(INST_DEST_FOGC);
@ -263,7 +266,7 @@ emit_dst(struct nv30_context *nv30, struct nvfx_vpc *vpc, uint32_t *hw,
}
}
if(!nv30->is_nv4x) {
if(!vpc->is_nv4x) {
hw[3] |= (dst.index << NV30_VP_INST_DEST_SHIFT);
hw[0] |= NV30_VP_INST_VEC_DEST_TEMP_MASK;
@ -290,7 +293,6 @@ emit_dst(struct nv30_context *nv30, struct nvfx_vpc *vpc, uint32_t *hw,
static void
nvfx_vp_emit(struct nvfx_vpc *vpc, struct nvfx_insn insn)
{
struct nv30_context *nv30 = vpc->nv30;
struct nv30_vertprog *vp = vpc->vp;
unsigned slot = insn.op >> 7;
unsigned op = insn.op & 0x7f;
@ -313,12 +315,12 @@ nvfx_vp_emit(struct nvfx_vpc *vpc, struct nvfx_insn insn)
hw[0] |= NVFX_VP(INST_COND_UPDATE_ENABLE);
if(insn.sat) {
assert(nv30->is_nv4x);
if(nv30->is_nv4x)
assert(vpc->is_nv4x);
if(vpc->is_nv4x)
hw[0] |= NV40_VP_INST_SATURATE;
}
if(!nv30->is_nv4x) {
if(!vpc->is_nv4x) {
if(slot == 0)
hw[1] |= (op << NV30_VP_INST_VEC_OPCODE_SHIFT);
else {
@ -351,10 +353,10 @@ nvfx_vp_emit(struct nvfx_vpc *vpc, struct nvfx_insn insn)
}
}
emit_dst(nv30, vpc, hw, slot, insn.dst);
emit_src(nv30, vpc, hw, 0, insn.src[0]);
emit_src(nv30, vpc, hw, 1, insn.src[1]);
emit_src(nv30, vpc, hw, 2, insn.src[2]);
emit_dst(vpc, hw, slot, insn.dst);
emit_src(vpc, hw, 0, insn.src[0]);
emit_src(vpc, hw, 1, insn.src[1]);
emit_src(vpc, hw, 2, insn.src[2]);
// if(insn.src[0].indirect || op == NVFX_VP_INST_VEC_OP_ARL)
// hw[3] |= NV40_VP_INST_SCA_RESULT;
@ -455,7 +457,7 @@ tgsi_mask(uint tgsi)
}
static boolean
nvfx_vertprog_parse_instruction(struct nv30_context *nv30, struct nvfx_vpc *vpc,
nvfx_vertprog_parse_instruction(struct nvfx_vpc *vpc,
unsigned idx, const struct tgsi_full_instruction *finst)
{
struct nvfx_src src[3], tmp;
@ -540,7 +542,7 @@ nvfx_vertprog_parse_instruction(struct nv30_context *nv30, struct nvfx_vpc *vpc,
mask = tgsi_mask(finst->Dst[0].Register.WriteMask);
if(finst->Instruction.Saturate == TGSI_SAT_ZERO_ONE) {
assert(finst->Instruction.Opcode != TGSI_OPCODE_ARL);
if (nv30->is_nv4x)
if (vpc->is_nv4x)
sat = TRUE;
else
if(dst.type != NVFXSR_TEMP)
@ -802,7 +804,7 @@ nvfx_vertprog_parse_instruction(struct nv30_context *nv30, struct nvfx_vpc *vpc,
return FALSE;
}
if(finst->Instruction.Saturate == TGSI_SAT_ZERO_ONE && !nv30->is_nv4x) {
if(finst->Instruction.Saturate == TGSI_SAT_ZERO_ONE && !vpc->is_nv4x) {
if (!vpc->r_0_1.type)
vpc->r_0_1 = constant(vpc, -1, 0, 1, 0, 0);
nvfx_vp_emit(vpc, arith(0, VEC, MAX, dst, mask, nvfx_src(dst), swz(nvfx_src(vpc->r_0_1), X, X, X, X), none));
@ -814,10 +816,10 @@ nvfx_vertprog_parse_instruction(struct nv30_context *nv30, struct nvfx_vpc *vpc,
}
static boolean
nvfx_vertprog_parse_decl_output(struct nv30_context *nv30, struct nvfx_vpc *vpc,
nvfx_vertprog_parse_decl_output(struct nvfx_vpc *vpc,
const struct tgsi_full_declaration *fdec)
{
unsigned num_texcoords = nv30->is_nv4x ? 10 : 8;
unsigned num_texcoords = vpc->is_nv4x ? 10 : 8;
unsigned idx = fdec->Range.First;
unsigned semantic_index = fdec->Semantic.Index;
int hw = 0, i;
@ -891,7 +893,7 @@ nvfx_vertprog_parse_decl_output(struct nv30_context *nv30, struct nvfx_vpc *vpc,
}
static boolean
nvfx_vertprog_prepare(struct nv30_context *nv30, struct nvfx_vpc *vpc)
nvfx_vertprog_prepare(struct nvfx_vpc *vpc)
{
struct tgsi_parse_context p;
int high_const = -1, high_temp = -1, high_addr = -1, nr_imm = 0, i;
@ -930,7 +932,7 @@ nvfx_vertprog_prepare(struct nv30_context *nv30, struct nvfx_vpc *vpc)
}
break;
case TGSI_FILE_OUTPUT:
if (!nvfx_vertprog_parse_decl_output(nv30, vpc, fdec))
if (!nvfx_vertprog_parse_decl_output(vpc, fdec))
return FALSE;
break;
default:
@ -974,7 +976,7 @@ nvfx_vertprog_prepare(struct nv30_context *nv30, struct nvfx_vpc *vpc)
DEBUG_GET_ONCE_BOOL_OPTION(nvfx_dump_vp, "NVFX_DUMP_VP", FALSE)
boolean
_nvfx_vertprog_translate(struct nv30_context *nv30, struct nv30_vertprog *vp)
_nvfx_vertprog_translate(uint16_t oclass, struct nv30_vertprog *vp)
{
struct tgsi_parse_context parse;
struct nvfx_vpc *vpc = NULL;
@ -989,13 +991,13 @@ _nvfx_vertprog_translate(struct nv30_context *nv30, struct nv30_vertprog *vp)
vpc = CALLOC_STRUCT(nvfx_vpc);
if (!vpc)
return FALSE;
vpc->nv30 = nv30;
vpc->is_nv4x = (oclass >= NV40_3D_CLASS) ? ~0 : 0;
vpc->vp = vp;
vpc->pipe = vp->pipe;
vpc->info = &vp->info;
vpc->cvtx_idx = -1;
if (!nvfx_vertprog_prepare(nv30, vpc)) {
if (!nvfx_vertprog_prepare(vpc)) {
FREE(vpc);
return FALSE;
}
@ -1038,7 +1040,7 @@ _nvfx_vertprog_translate(struct nv30_context *nv30, struct nv30_vertprog *vp)
unsigned idx = insns.size >> 2;
util_dynarray_append(&insns, unsigned, vp->nr_insns);
finst = &parse.FullToken.FullInstruction;
if (!nvfx_vertprog_parse_instruction(nv30, vpc, idx, finst))
if (!nvfx_vertprog_parse_instruction(vpc, idx, finst))
goto out;
}
break;
@ -1084,7 +1086,7 @@ _nvfx_vertprog_translate(struct nv30_context *nv30, struct nv30_vertprog *vp)
struct nvfx_src htmp = nvfx_src(vpc->r_result[vpc->cvtx_idx]);
unsigned mask;
if(nv30->is_nv4x)
if(vpc->is_nv4x)
{
switch (i) {
case 0: case 3: mask = NVFX_VP_MASK_Y; break;
@ -1109,7 +1111,7 @@ _nvfx_vertprog_translate(struct nv30_context *nv30, struct nv30_vertprog *vp)
debug_printf("\n");
tgsi_dump(vpc->pipe.tokens, 0);
debug_printf("\n%s vertex program:\n", nv30->is_nv4x ? "nv4x" : "nv3x");
debug_printf("\n%s vertex program:\n", vpc->is_nv4x ? "nv4x" : "nv3x");
for (i = 0; i < vp->nr_insns; i++)
debug_printf("%3u: %08x %08x %08x %08x\n", i, vp->insns[i].data[0], vp->insns[i].data[1], vp->insns[i].data[2], vp->insns[i].data[3]);
debug_printf("\n");

View file

@ -14,7 +14,6 @@
#include "draw/draw_vertex.h"
#endif
#include "nv50/nv50_debug.h"
#include "nv50/nv50_winsys.h"
#include "nv50/nv50_stateobj.h"
#include "nv50/nv50_screen.h"
@ -23,6 +22,7 @@
#include "nv50/nv50_transfer.h"
#include "nouveau_context.h"
#include "nouveau_debug.h"
#include "nv_object.xml.h"
#include "nv_m2mf.xml.h"
#include "nv50/nv50_3ddefs.xml.h"

View file

@ -1,25 +0,0 @@
#ifndef __NV50_DEBUG_H__
#define __NV50_DEBUG_H__
#include <stdio.h>
#include "util/u_debug.h"
#define NV50_DEBUG_MISC 0x0001
#define NV50_DEBUG_SHADER 0x0100
#define NV50_DEBUG_PROG_IR 0x0200
#define NV50_DEBUG_PROG_RA 0x0400
#define NV50_DEBUG_PROG_CFLOW 0x0800
#define NV50_DEBUG_PROG_ALL 0x1f00
#define NV50_DEBUG 0
#define NOUVEAU_ERR(fmt, args...) \
fprintf(stderr, "%s:%d - "fmt, __FUNCTION__, __LINE__, ##args)
#define NV50_DBGMSG(ch, args...) \
if ((NV50_DEBUG) & (NV50_DEBUG_##ch)) \
debug_printf(args)
#endif /* __NV50_DEBUG_H__ */

View file

@ -14,7 +14,6 @@
#include "draw/draw_vertex.h"
#endif
#include "nv50/nv50_debug.h"
#include "nvc0/nvc0_winsys.h"
#include "nvc0/nvc0_stateobj.h"
#include "nvc0/nvc0_screen.h"
@ -24,6 +23,7 @@
#include "nv50/nv50_transfer.h"
#include "nouveau_context.h"
#include "nouveau_debug.h"
#include "nvc0/nvc0_3ddefs.xml.h"
#include "nvc0/nvc0_3d.xml.h"