nv50: do tsc/tic upload + stub out shader TEX stuff

This commit is contained in:
Ben Skeggs
2008-06-13 12:09:46 +10:00
parent 0d7f25c890
commit c0ed6a871c
6 changed files with 83 additions and 12 deletions
+17
View File
@@ -44,6 +44,8 @@
#define NV50_NEW_FRAGPROG (1 << 10)
#define NV50_NEW_FRAGPROG_CB (1 << 11)
#define NV50_NEW_ARRAYS (1 << 12)
#define NV50_NEW_SAMPLER (1 << 13)
#define NV50_NEW_TEXTURE (1 << 14)
struct nv50_blend_stateobj {
struct pipe_blend_state pipe;
@@ -60,6 +62,17 @@ struct nv50_rasterizer_stateobj {
struct nouveau_stateobj *so;
};
struct nv50_miptree {
struct pipe_texture base;
struct pipe_buffer *buffer;
};
static INLINE struct nv50_miptree *
nv50_miptree(struct pipe_texture *pt)
{
return (struct nv50_miptree *)pt;
}
struct nv50_context {
struct pipe_context pipe;
@@ -84,6 +97,10 @@ struct nv50_context {
unsigned vtxbuf_nr;
struct pipe_vertex_element vtxelt[PIPE_MAX_ATTRIBS];
unsigned vtxelt_nr;
unsigned *sampler[PIPE_MAX_SAMPLERS];
unsigned sampler_nr;
struct nv50_miptree *miptree[PIPE_MAX_SAMPLERS];
unsigned miptree_nr;
};
static INLINE struct nv50_context *
-11
View File
@@ -5,17 +5,6 @@
#include "nv50_context.h"
struct nv50_miptree {
struct pipe_texture base;
struct pipe_buffer *buffer;
};
static INLINE struct nv50_miptree *
nv50_miptree(struct pipe_texture *pt)
{
return (struct nv50_miptree *)pt;
}
static struct pipe_texture *
nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
{
+6
View File
@@ -828,6 +828,8 @@ tgsi_src(struct nv50_pc *pc, int chan, const struct tgsi_full_src_register *src)
case TGSI_FILE_IMMEDIATE:
r = &pc->immd[src->SrcRegister.Index * 4 + c];
break;
case TGSI_FILE_SAMPLER:
break;
default:
assert(0);
break;
@@ -1130,6 +1132,8 @@ nv50_program_tx_insn(struct nv50_pc *pc, const union tgsi_full_token *tok)
emit_sub(pc, dst[c], src[0][c], src[1][c]);
}
break;
case TGSI_OPCODE_TEX:
break;
case TGSI_OPCODE_XPD:
temp = alloc_temp(pc, NULL);
if (mask & (1 << 0)) {
@@ -1226,6 +1230,8 @@ nv50_program_tx_prep(struct nv50_pc *pc)
if (pc->param_nr < (last + 1))
pc->param_nr = last + 1;
break;
case TGSI_FILE_SAMPLER:
break;
default:
NOUVEAU_ERR("bad decl file %d\n",
d->Declaration.File);
+1
View File
@@ -28,6 +28,7 @@ nv50_screen_is_format_supported(struct pipe_screen *pscreen,
break;
case PIPE_TEXTURE:
switch (format) {
case PIPE_FORMAT_A8R8G8B8_UNORM:
case PIPE_FORMAT_I8_UNORM:
return TRUE;
default:
+26 -1
View File
@@ -1,6 +1,7 @@
#include "pipe/p_state.h"
#include "pipe/p_defines.h"
#include "pipe/p_util.h"
#include "pipe/p_inlines.h"
#include "nv50_context.h"
@@ -85,23 +86,47 @@ static void *
nv50_sampler_state_create(struct pipe_context *pipe,
const struct pipe_sampler_state *cso)
{
return NULL;
unsigned *tsc = CALLOC(8, sizeof(unsigned));
tsc[0] = 0x00024080;
tsc[1] = 0x00000062;
return (void *)tsc;
}
static void
nv50_sampler_state_bind(struct pipe_context *pipe, unsigned nr, void **sampler)
{
struct nv50_context *nv50 = nv50_context(pipe);
int i;
nv50->sampler_nr = nr;
for (i = 0; i < nv50->sampler_nr; i++)
nv50->sampler[i] = sampler[i];
nv50->dirty |= NV50_NEW_SAMPLER;
}
static void
nv50_sampler_state_delete(struct pipe_context *pipe, void *hwcso)
{
FREE(hwcso);
}
static void
nv50_set_sampler_texture(struct pipe_context *pipe, unsigned nr,
struct pipe_texture **pt)
{
struct nv50_context *nv50 = nv50_context(pipe);
int i;
for (i = 0; i < nr; i++)
pipe_texture_reference(&nv50->miptree[i], pt[i]);
for (i = nr; i < nv50->miptree_nr; i++)
pipe_texture_reference(&nv50->miptree[i], NULL);
nv50->miptree_nr = nr;
nv50->dirty |= NV50_NEW_TEXTURE;
}
static void *
@@ -178,6 +178,39 @@ nv50_state_validate(struct nv50_context *nv50)
so_ref(NULL, &so);
}
if (nv50->dirty & NV50_NEW_SAMPLER) {
int i;
BEGIN_RING(tesla, 0x0f00, 1);
OUT_RING ((NV50_CB_TSC << 0) | (0 << 8));
BEGIN_RING(tesla, 0x40000f04, nv50->sampler_nr * 8);
for (i = 0; i < nv50->sampler_nr; i++)
OUT_RINGp(nv50->sampler[i], 8);
}
if (nv50->dirty & NV50_NEW_TEXTURE) {
int i;
BEGIN_RING(tesla, 0x0f00, 1);
OUT_RING ((NV50_CB_TIC << 0) | (0 << 8));
BEGIN_RING(tesla, 0x40000f04, nv50->miptree_nr * 8);
for (i = 0; i < nv50->sampler_nr; i++) {
struct nv50_miptree *mt = nv50->miptree[i];
OUT_RING (0x2a712488);
OUT_RELOCl(mt->buffer, 0,
NOUVEAU_BO_VRAM | NOUVEAU_BO_LOW);
OUT_RING (0xd0c05000);
OUT_RING (0x00300000);
OUT_RING (mt->base.width[0]);
OUT_RING ((mt->base.depth[0] << 16) |
mt->base.height[0]);
OUT_RING (0x03000000);
OUT_RELOCh(mt->buffer, 0,
NOUVEAU_BO_VRAM | NOUVEAU_BO_HIGH);
}
}
if (nv50->dirty & NV50_NEW_ARRAYS)
nv50_vbo_validate(nv50);