summaryrefslogtreecommitdiff
path: root/src/mesa/pipe/nv40
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/pipe/nv40')
-rw-r--r--src/mesa/pipe/nv40/nv40_state.c122
-rw-r--r--src/mesa/pipe/nv40/nv40_state.h51
-rw-r--r--src/mesa/pipe/nv40/nv40_state_tex.c49
3 files changed, 118 insertions, 104 deletions
diff --git a/src/mesa/pipe/nv40/nv40_state.c b/src/mesa/pipe/nv40/nv40_state.c
index e38a5ea534..a9790484b9 100644
--- a/src/mesa/pipe/nv40/nv40_state.c
+++ b/src/mesa/pipe/nv40/nv40_state.c
@@ -119,21 +119,101 @@ nv40_blend_state_delete(struct pipe_context *pipe, void *hwcso)
free(hwcso);
}
+
+static INLINE unsigned
+wrap_mode(unsigned wrap) {
+ unsigned ret;
+
+ switch (wrap) {
+ case PIPE_TEX_WRAP_REPEAT:
+ ret = NV40TCL_TEX_WRAP_S_REPEAT;
+ break;
+ case PIPE_TEX_WRAP_MIRROR_REPEAT:
+ ret = NV40TCL_TEX_WRAP_S_MIRRORED_REPEAT;
+ break;
+ case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
+ ret = NV40TCL_TEX_WRAP_S_CLAMP_TO_EDGE;
+ break;
+ case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
+ ret = NV40TCL_TEX_WRAP_S_CLAMP_TO_BORDER;
+ break;
+ case PIPE_TEX_WRAP_CLAMP:
+ ret = NV40TCL_TEX_WRAP_S_CLAMP;
+ break;
+ case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
+ ret = NV40TCL_TEX_WRAP_S_MIRROR_CLAMP_TO_EDGE;
+ break;
+ case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
+ ret = NV40TCL_TEX_WRAP_S_MIRROR_CLAMP_TO_BORDER;
+ break;
+ case PIPE_TEX_WRAP_MIRROR_CLAMP:
+ ret = NV40TCL_TEX_WRAP_S_MIRROR_CLAMP;
+ break;
+ default:
+ NOUVEAU_ERR("unknown wrap mode: %d\n", wrap);
+ ret = NV40TCL_TEX_WRAP_S_REPEAT;
+ break;
+ }
+
+ return ret >> NV40TCL_TEX_WRAP_S_SHIFT;
+}
+
static void *
nv40_sampler_state_create(struct pipe_context *pipe,
const struct pipe_sampler_state *cso)
{
struct nv40_sampler_state *ps;
-
+ uint32_t filter = 0;
+
ps = malloc(sizeof(struct nv40_sampler_state));
- ps->wrap = ((nv40_tex_wrap_mode(cso->wrap_r) << 16) |
- (nv40_tex_wrap_mode(cso->wrap_t) << 8) |
- (nv40_tex_wrap_mode(cso->wrap_s) << 0));
- ps->filt = ((nv40_tex_filter(cso->min_img_filter,
- cso->min_mip_filter) << 16) |
- (nv40_tex_filter(cso->mag_img_filter,
- PIPE_TEX_MIPFILTER_NONE) << 24));
+ switch (cso->mag_img_filter) {
+ case PIPE_TEX_FILTER_LINEAR:
+ filter |= NV40TCL_TEX_FILTER_MAG_LINEAR;
+ break;
+ case PIPE_TEX_FILTER_NEAREST:
+ default:
+ filter |= NV40TCL_TEX_FILTER_MAG_NEAREST;
+ break;
+ }
+
+ switch (cso->min_img_filter) {
+ case PIPE_TEX_FILTER_LINEAR:
+ switch (cso->min_mip_filter) {
+ case PIPE_TEX_MIPFILTER_NEAREST:
+ filter |= NV40TCL_TEX_FILTER_MIN_LINEAR_MIPMAP_NEAREST;
+ break;
+ case PIPE_TEX_MIPFILTER_LINEAR:
+ filter |= NV40TCL_TEX_FILTER_MIN_LINEAR_MIPMAP_LINEAR;
+ break;
+ case PIPE_TEX_MIPFILTER_NONE:
+ default:
+ filter |= NV40TCL_TEX_FILTER_MIN_LINEAR;
+ break;
+ }
+ break;
+ case PIPE_TEX_FILTER_NEAREST:
+ default:
+ switch (cso->min_mip_filter) {
+ case PIPE_TEX_MIPFILTER_NEAREST:
+ filter |= NV40TCL_TEX_FILTER_MIN_NEAREST_MIPMAP_NEAREST;
+ break;
+ case PIPE_TEX_MIPFILTER_LINEAR:
+ filter |= NV40TCL_TEX_FILTER_MIN_NEAREST_MIPMAP_LINEAR;
+ break;
+ case PIPE_TEX_MIPFILTER_NONE:
+ default:
+ filter |= NV40TCL_TEX_FILTER_MIN_NEAREST;
+ break;
+ }
+ break;
+ }
+
+
+ ps->wrap = ((wrap_mode(cso->wrap_r) << NV40TCL_TEX_WRAP_S_SHIFT) |
+ (wrap_mode(cso->wrap_t) << NV40TCL_TEX_WRAP_T_SHIFT) |
+ (wrap_mode(cso->wrap_s) << NV40TCL_TEX_WRAP_R_SHIFT));
+ ps->filt = filter;
ps->bcol = ((float_to_ubyte(cso->border_color[3]) << 24) |
(float_to_ubyte(cso->border_color[0]) << 16) |
(float_to_ubyte(cso->border_color[1]) << 8) |
@@ -497,33 +577,23 @@ nv40_set_framebuffer_state(struct pipe_context *pipe,
OUT_RING (rt_enable);
if (0) {
-#if 0
- rt_format |= (log2width <<
- NV40TCL_RT_FORMAT_LOG2_WIDTH_SHIFT);
- rt_format |= (log2height <<
- NV40TCL_RT_FORMAT_LOG2_HEIGHT_SHIFT);
-#endif
- rt_format |= (NV40TCL_RT_FORMAT_TYPE_SWIZZLED <<
- NV40TCL_RT_FORMAT_TYPE_SHIFT);
+ rt_format |= (0 << NV40TCL_RT_FORMAT_LOG2_WIDTH_SHIFT);
+ rt_format |= (0 << NV40TCL_RT_FORMAT_LOG2_HEIGHT_SHIFT);
+ rt_format |= NV40TCL_RT_FORMAT_TYPE_SWIZZLED;
} else {
- rt_format |= (NV40TCL_RT_FORMAT_TYPE_LINEAR <<
- NV40TCL_RT_FORMAT_TYPE_SHIFT);
+ rt_format |= NV40TCL_RT_FORMAT_TYPE_LINEAR;
}
if (fb->cbufs[0]->format == PIPE_FORMAT_U_R5_G6_B5) {
- rt_format |= (NV40TCL_RT_FORMAT_COLOR_R5G6B5 <<
- NV40TCL_RT_FORMAT_COLOR_SHIFT);
+ rt_format |= NV40TCL_RT_FORMAT_COLOR_R5G6B5;
} else {
- rt_format |= (NV40TCL_RT_FORMAT_COLOR_A8R8G8B8 <<
- NV40TCL_RT_FORMAT_COLOR_SHIFT);
+ rt_format |= NV40TCL_RT_FORMAT_COLOR_A8R8G8B8;
}
if (fb->zbuf && fb->zbuf->format == PIPE_FORMAT_U_Z16) {
- rt_format |= (NV40TCL_RT_FORMAT_DEPTH_Z16 <<
- NV40TCL_RT_FORMAT_DEPTH_SHIFT);
+ rt_format |= NV40TCL_RT_FORMAT_ZETA_Z16;
} else {
- rt_format |= (NV40TCL_RT_FORMAT_DEPTH_Z24S8 <<
- NV40TCL_RT_FORMAT_DEPTH_SHIFT);
+ rt_format |= NV40TCL_RT_FORMAT_ZETA_Z24S8;
}
BEGIN_RING(curie, NV40TCL_RT_HORIZ, 3);
diff --git a/src/mesa/pipe/nv40/nv40_state.h b/src/mesa/pipe/nv40/nv40_state.h
index 1535037f63..ae162b95ce 100644
--- a/src/mesa/pipe/nv40/nv40_state.h
+++ b/src/mesa/pipe/nv40/nv40_state.h
@@ -119,55 +119,4 @@ struct nv40_depth_stencil_state {
} stencil;
};
-static INLINE unsigned
-nv40_tex_wrap_mode(unsigned wrap) {
- switch (wrap) {
- case PIPE_TEX_WRAP_REPEAT:
- return NV40TCL_TEX_WRAP_S_REPEAT;
- case PIPE_TEX_WRAP_MIRROR_REPEAT:
- return NV40TCL_TEX_WRAP_S_MIRRORED_REPEAT;
- case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
- return NV40TCL_TEX_WRAP_S_CLAMP_TO_EDGE;
- case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
- return NV40TCL_TEX_WRAP_S_CLAMP_TO_BORDER;
- case PIPE_TEX_WRAP_CLAMP:
- return NV40TCL_TEX_WRAP_S_CLAMP;
- case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
- return NV40TCL_TEX_WRAP_S_MIRROR_CLAMP_TO_EDGE;
- case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
- return NV40TCL_TEX_WRAP_S_MIRROR_CLAMP_TO_BORDER;
- case PIPE_TEX_WRAP_MIRROR_CLAMP:
- return NV40TCL_TEX_WRAP_S_MIRROR_CLAMP;
- default:
- return NV40TCL_TEX_WRAP_S_REPEAT;
- }
-}
-
-static INLINE unsigned
-nv40_tex_filter(unsigned f0, unsigned f1) {
- switch (f0) {
- case PIPE_TEX_FILTER_NEAREST:
- switch (f1) {
- case PIPE_TEX_MIPFILTER_NEAREST:
- return NV40TCL_TEX_FILTER_MIN_NEAREST_MIPMAP_NEAREST;
- case PIPE_TEX_MIPFILTER_LINEAR:
- return NV40TCL_TEX_FILTER_MIN_NEAREST_MIPMAP_LINEAR;
- case PIPE_TEX_MIPFILTER_NONE:
- default:
- return NV40TCL_TEX_FILTER_MIN_NEAREST;
- }
- case PIPE_TEX_FILTER_LINEAR:
- default:
- switch (f1) {
- case PIPE_TEX_MIPFILTER_NEAREST:
- return NV40TCL_TEX_FILTER_MIN_LINEAR_MIPMAP_NEAREST;
- case PIPE_TEX_MIPFILTER_LINEAR:
- return NV40TCL_TEX_FILTER_MIN_LINEAR_MIPMAP_LINEAR;
- case PIPE_TEX_MIPFILTER_NONE:
- default:
- return NV40TCL_TEX_FILTER_MIN_LINEAR;
- }
- }
-}
-
#endif
diff --git a/src/mesa/pipe/nv40/nv40_state_tex.c b/src/mesa/pipe/nv40/nv40_state_tex.c
index a92d6250a2..4acf80c9ce 100644
--- a/src/mesa/pipe/nv40/nv40_state_tex.c
+++ b/src/mesa/pipe/nv40/nv40_state_tex.c
@@ -6,14 +6,10 @@
TRUE, \
PIPE_FORMAT_##m, \
NV40TCL_TEX_FORMAT_FORMAT_##tf, \
- (NV40TCL_TEX_SWIZZLE_S0_X_##ts0x << NV40TCL_TEX_SWIZZLE_S0_X_SHIFT) | \
- (NV40TCL_TEX_SWIZZLE_S0_X_##ts0y << NV40TCL_TEX_SWIZZLE_S0_Y_SHIFT) | \
- (NV40TCL_TEX_SWIZZLE_S0_X_##ts0z << NV40TCL_TEX_SWIZZLE_S0_Z_SHIFT) | \
- (NV40TCL_TEX_SWIZZLE_S0_X_##ts0w << NV40TCL_TEX_SWIZZLE_S0_W_SHIFT) | \
- (NV40TCL_TEX_SWIZZLE_S1_X_##ts1x << NV40TCL_TEX_SWIZZLE_S1_X_SHIFT) | \
- (NV40TCL_TEX_SWIZZLE_S1_X_##ts1y << NV40TCL_TEX_SWIZZLE_S1_Y_SHIFT) | \
- (NV40TCL_TEX_SWIZZLE_S1_X_##ts1z << NV40TCL_TEX_SWIZZLE_S1_Z_SHIFT) | \
- (NV40TCL_TEX_SWIZZLE_S1_X_##ts1w << NV40TCL_TEX_SWIZZLE_S1_W_SHIFT), \
+ (NV40TCL_TEX_SWIZZLE_S0_X_##ts0x | NV40TCL_TEX_SWIZZLE_S0_Y_##ts0y | \
+ NV40TCL_TEX_SWIZZLE_S0_Z_##ts0z | NV40TCL_TEX_SWIZZLE_S0_W_##ts0w | \
+ NV40TCL_TEX_SWIZZLE_S1_X_##ts1x | NV40TCL_TEX_SWIZZLE_S1_Y_##ts1y | \
+ NV40TCL_TEX_SWIZZLE_S1_Z_##ts1z | NV40TCL_TEX_SWIZZLE_S1_W_##ts1w), \
}
struct nv40_texture_format {
@@ -53,20 +49,6 @@ nv40_tex_format(uint pipe_format)
return NULL;
}
-static INLINE int
-nv40_tex_dims(uint pipe_target)
-{
- switch (pipe_target) {
- case PIPE_TEXTURE_1D: return 1;
- case PIPE_TEXTURE_2D: return 2;
- case PIPE_TEXTURE_3D: return 3;
- case PIPE_TEXTURE_CUBE: return 2;
- default:
- NOUVEAU_ERR("AII unknown pipe target: %d\n", pipe_target);
- return 2;
- }
-}
-
static void
nv40_tex_unit_enable(struct nv40_context *nv40, int unit)
{
@@ -78,20 +60,33 @@ nv40_tex_unit_enable(struct nv40_context *nv40, int unit)
int swizzled = 0; /*XXX: implement in region code? */
tf = nv40_tex_format(mt->format);
- if (!tf->defined) {
+ if (!tf || !tf->defined) {
NOUVEAU_ERR("Unsupported texture format: 0x%x\n", mt->format);
return;
}
- txf = (tf->format | 0x80) << NV40TCL_TEX_FORMAT_FORMAT_SHIFT;
+ txf = tf->format | 0x8000;
txf |= ((mt->last_level - mt->first_level + 1) <<
NV40TCL_TEX_FORMAT_MIPMAP_COUNT_SHIFT);
+
if (1) /* XXX */
txf |= NV40TCL_TEX_FORMAT_NO_BORDER;
- txf |= (nv40_tex_dims(mt->target) << NV40TCL_TEX_FORMAT_DIMS_SHIFT);
- if (0) /*XXX*/
- txf |= NV40TCL_TEX_FORMAT_RECT;
+ switch (mt->target) {
+ case PIPE_TEXTURE_2D:
+ case PIPE_TEXTURE_CUBE:
+ txf |= NV40TCL_TEX_FORMAT_DIMS_2D;
+ break;
+ case PIPE_TEXTURE_3D:
+ txf |= NV40TCL_TEX_FORMAT_DIMS_3D;
+ break;
+ case PIPE_TEXTURE_1D:
+ txf |= NV40TCL_TEX_FORMAT_DIMS_1D;
+ break;
+ default:
+ NOUVEAU_ERR("Unknown target %d\n", mt->target);
+ return;
+ }
if (swizzled) {
txp = 0;