diff options
Diffstat (limited to 'xc/lib/GL/mesa/src/drv/i830/i830_tex.c')
-rw-r--r-- | xc/lib/GL/mesa/src/drv/i830/i830_tex.c | 90 |
1 files changed, 42 insertions, 48 deletions
diff --git a/xc/lib/GL/mesa/src/drv/i830/i830_tex.c b/xc/lib/GL/mesa/src/drv/i830/i830_tex.c index e90c8c12d..e6722dc8e 100644 --- a/xc/lib/GL/mesa/src/drv/i830/i830_tex.c +++ b/xc/lib/GL/mesa/src/drv/i830/i830_tex.c @@ -25,7 +25,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************/ -/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_tex.c,v 1.3 2002/09/11 00:29:26 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_tex.c,v 1.4 2002/12/10 01:26:53 dawes Exp $ */ /* * Author: @@ -35,13 +35,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. * Keith Whitwell <keithw@tungstengraphics.com> */ -#include <stdlib.h> -#include <stdio.h> - -#include <GL/gl.h> #include "glheader.h" #include "mtypes.h" -#include "mem.h" +#include "imports.h" #include "simple_list.h" #include "enums.h" #include "texstore.h" @@ -60,12 +56,18 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. /* * Compute the 'S2.4' lod bias factor from the floating point OpenGL bias. */ -static GLuint i830ComputeLodBias(GLfloat bias) +static void i830ComputeLodBias(i830ContextPtr imesa, + i830TextureObjectPtr t, + GLfloat bias) { - int b = (int) (bias * 16.0) + 12; + int b; + + b = (int) (bias * 16.0); if(b > 63) b = 63; else if (b < -64) b = -64; - return (GLuint) (b & MAP_LOD_MASK); + t->Setup[I830_TEXREG_TM0S3] &= ~TM0S3_LOD_BIAS_MASK; + t->Setup[I830_TEXREG_TM0S3] |= ((b << TM0S3_LOD_BIAS_SHIFT) & + TM0S3_LOD_BIAS_MASK); } static void i830SetTexWrapping(i830TextureObjectPtr tex, @@ -128,9 +130,9 @@ static void i830SetTexFilter(i830ContextPtr imesa, minFilt = FILTER_NEAREST; mipFilt = MIPFILTER_NEAREST; - if(magf == GL_LINEAR) { - bias -= 0.5; - } +/* if(magf == GL_LINEAR && 0) { */ +/* bias -= 0.5; */ +/* } */ break; case GL_LINEAR_MIPMAP_NEAREST: @@ -141,9 +143,9 @@ static void i830SetTexFilter(i830ContextPtr imesa, minFilt = FILTER_NEAREST; mipFilt = MIPFILTER_LINEAR; - if(magf == GL_LINEAR) { - bias -= 0.5; - } +/* if(magf == GL_LINEAR && 0) { */ +/* bias -= 0.5; */ +/* } */ break; case GL_LINEAR_MIPMAP_LINEAR: @@ -169,14 +171,14 @@ static void i830SetTexFilter(i830ContextPtr imesa, break; } - I830_SET_FIELD(t->Setup[I830_TEXREG_MF], - MIN_FILTER_MASK | MIP_FILTER_MASK, - MIN_FILTER(minFilt) | mipFilt); - - I830_SET_FIELD(t->Setup[I830_TEXREG_MF], - MAG_FILTER_MASK, MAG_FILTER(magFilt)); + t->Setup[I830_TEXREG_TM0S3] &= ~TM0S3_MIN_FILTER_MASK; + t->Setup[I830_TEXREG_TM0S3] &= ~TM0S3_MIP_FILTER_MASK; + t->Setup[I830_TEXREG_TM0S3] &= ~TM0S3_MAG_FILTER_MASK; + t->Setup[I830_TEXREG_TM0S3] |= ((minFilt << TM0S3_MIN_FILTER_SHIFT) | + (mipFilt << TM0S3_MIP_FILTER_SHIFT) | + (magFilt << TM0S3_MAG_FILTER_SHIFT)); - t->Setup[I830_TEXREG_MLC] |= i830ComputeLodBias(bias); + i830ComputeLodBias(imesa, t, bias); } static void i830SetTexBorderColor(i830TextureObjectPtr t, GLubyte color[4]) @@ -184,7 +186,7 @@ static void i830SetTexBorderColor(i830TextureObjectPtr t, GLubyte color[4]) if(I830_DEBUG&DEBUG_DRI) fprintf(stderr, "%s\n", __FUNCTION__); - t->Setup[I830_TEXREG_MI5] = + t->Setup[I830_TEXREG_TM0S4] = I830PACKCOLOR8888(color[0],color[1],color[2],color[3]); } @@ -223,18 +225,17 @@ static void i830TexParameter( GLcontext *ctx, GLenum target, break; case GL_TEXTURE_BORDER_COLOR: - i830SetTexBorderColor( t, tObj->BorderColor ); + i830SetTexBorderColor( t, tObj->_BorderChan ); break; case GL_TEXTURE_BASE_LEVEL: case GL_TEXTURE_MAX_LEVEL: case GL_TEXTURE_MIN_LOD: case GL_TEXTURE_MAX_LOD: - /* This isn't the most efficient solution but there doesn't appear to - * be a nice alternative for Radeon. Since there's no LOD clamping, - * we just have to rely on loading the right subset of mipmap levels - * to simulate a clamped LOD. + /* The i830 and its successors can do a lot of this without + * reloading the textures. A project for someone? */ + I830_FIREVERTICES( I830_CONTEXT(ctx) ); i830SwapOutTexObj( imesa, t ); break; @@ -283,8 +284,7 @@ static void i830TexEnv( GLcontext *ctx, GLenum target, { struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current; i830TextureObjectPtr t = (i830TextureObjectPtr) tObj->DriverData; - t->Setup[I830_TEXREG_MLC] &= ~(MLC_LOD_BIAS_MASK); - t->Setup[I830_TEXREG_MLC] |= i830ComputeLodBias(*param); + i830ComputeLodBias(imesa, t, *param); /* Do a state change */ if (t == imesa->CurrentTexObj[unit]) { I830_STATECHANGE( imesa, I830_UPLOAD_TEX_N(unit) ); @@ -307,6 +307,7 @@ static void i830TexImage2D( GLcontext *ctx, GLenum target, GLint level, { i830TextureObjectPtr t = (i830TextureObjectPtr) texObj->DriverData; if (t) { + I830_FIREVERTICES( I830_CONTEXT(ctx) ); i830SwapOutTexObj( I830_CONTEXT(ctx), t ); } _mesa_store_teximage2d( ctx, target, level, internalFormat, @@ -327,6 +328,7 @@ static void i830TexSubImage2D( GLcontext *ctx, { i830TextureObjectPtr t = (i830TextureObjectPtr) texObj->DriverData; if (t) { + I830_FIREVERTICES( I830_CONTEXT(ctx) ); i830SwapOutTexObj( I830_CONTEXT(ctx), t ); } _mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width, @@ -349,17 +351,15 @@ static void i830BindTexture( GLcontext *ctx, GLenum target, /* Initialize non-image-dependent parts of the state: */ t->globj = tObj; - t->Setup[I830_TEXREG_MI0] = STATE3D_MAP_INFO_COLR_CMD; - t->Setup[I830_TEXREG_MI1] = (MAP_INFO_TEX(0) | - MAP_INFO_OUTMUX_F0F1F2F3 | - MAP_INFO_VERTLINESTRIDE_0 | - MAP_INFO_VERTLINESTRIDEOFS_0 | - MAP_INFO_FORMAT_2D | - MAP_INFO_USE_FENCE); - t->Setup[I830_TEXREG_MLC] = (STATE3D_MAP_LOD_CNTL_CMD | - MAP_UNIT(0) | - ENABLE_TEXLOD_BIAS | - MAP_LOD_BIAS(0)); + t->Setup[I830_TEXREG_TM0LI] = STATE3D_LOAD_STATE_IMMEDIATE_2; + t->Setup[I830_TEXREG_TM0S0] = TM0S0_USE_FENCE; + t->Setup[I830_TEXREG_TM0S1] = 0; + t->Setup[I830_TEXREG_TM0S2] = 0; + t->Setup[I830_TEXREG_TM0S3] = 0; + + t->Setup[I830_TEXREG_NOP0] = 0; + t->Setup[I830_TEXREG_NOP1] = 0; + t->Setup[I830_TEXREG_NOP2] = 0; t->Setup[I830_TEXREG_MCS] = (STATE3D_MAP_COORD_SET_CMD | MAP_UNIT(0) | @@ -371,12 +371,6 @@ static void i830BindTexture( GLcontext *ctx, GLenum target, ENABLE_ADDR_U_CNTL | TEXCOORD_ADDR_U_MODE(TEXCOORDMODE_WRAP)); - t->Setup[I830_TEXREG_MF] = (STATE3D_MAP_FILTER_CMD | - MAP_UNIT(0) | - ENABLE_MIP_MODE_FILTER | - MIPFILTER_NEAREST | - ENABLE_MAG_MODE_FILTER | - ENABLE_MIN_MODE_FILTER); t->dirty_images = ~0; @@ -385,7 +379,7 @@ static void i830BindTexture( GLcontext *ctx, GLenum target, i830SetTexWrapping( t, tObj->WrapS, tObj->WrapT ); i830SetTexFilter( imesa, t, tObj->MinFilter, tObj->MagFilter, bias ); - i830SetTexBorderColor( t, tObj->BorderColor ); + i830SetTexBorderColor( t, tObj->_BorderChan ); } } } |