summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/nv50/nv50_context.h17
-rw-r--r--src/gallium/drivers/nv50/nv50_miptree.c11
-rw-r--r--src/gallium/drivers/nv50/nv50_program.c6
-rw-r--r--src/gallium/drivers/nv50/nv50_screen.c1
-rw-r--r--src/gallium/drivers/nv50/nv50_state.c27
-rw-r--r--src/gallium/drivers/nv50/nv50_state_validate.c33
6 files changed, 83 insertions, 12 deletions
diff --git a/src/gallium/drivers/nv50/nv50_context.h b/src/gallium/drivers/nv50/nv50_context.h
index 19ec492eb3f..5214ce1a69c 100644
--- a/src/gallium/drivers/nv50/nv50_context.h
+++ b/src/gallium/drivers/nv50/nv50_context.h
@@ -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 *
diff --git a/src/gallium/drivers/nv50/nv50_miptree.c b/src/gallium/drivers/nv50/nv50_miptree.c
index 459e0ff9dd6..cdd98844f94 100644
--- a/src/gallium/drivers/nv50/nv50_miptree.c
+++ b/src/gallium/drivers/nv50/nv50_miptree.c
@@ -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)
{
diff --git a/src/gallium/drivers/nv50/nv50_program.c b/src/gallium/drivers/nv50/nv50_program.c
index 39597c54814..5eec68e5e19 100644
--- a/src/gallium/drivers/nv50/nv50_program.c
+++ b/src/gallium/drivers/nv50/nv50_program.c
@@ -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);
diff --git a/src/gallium/drivers/nv50/nv50_screen.c b/src/gallium/drivers/nv50/nv50_screen.c
index d76cce9f791..b9cecb77f1f 100644
--- a/src/gallium/drivers/nv50/nv50_screen.c
+++ b/src/gallium/drivers/nv50/nv50_screen.c
@@ -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:
diff --git a/src/gallium/drivers/nv50/nv50_state.c b/src/gallium/drivers/nv50/nv50_state.c
index 0129b0fb144..f36299db4d2 100644
--- a/src/gallium/drivers/nv50/nv50_state.c
+++ b/src/gallium/drivers/nv50/nv50_state.c
@@ -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 *
diff --git a/src/gallium/drivers/nv50/nv50_state_validate.c b/src/gallium/drivers/nv50/nv50_state_validate.c
index a3f399a139f..63c1756bcbf 100644
--- a/src/gallium/drivers/nv50/nv50_state_validate.c
+++ b/src/gallium/drivers/nv50/nv50_state_validate.c
@@ -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);