diff options
Diffstat (limited to 'src/mesa/pipe/nv40')
-rw-r--r-- | src/mesa/pipe/nv40/nv40_state.c | 122 | ||||
-rw-r--r-- | src/mesa/pipe/nv40/nv40_state.h | 51 | ||||
-rw-r--r-- | src/mesa/pipe/nv40/nv40_state_tex.c | 49 |
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; |