📄 i810tex.c
字号:
} if (t == imesa->CurrentTexObj[1]) { I810_STATECHANGE( imesa, I810_UPLOAD_TEX1 ); }}/** * Setup hardware bits for new texture environment settings. * * \todo * Determine whether or not \c param can be used instead of * \c texUnit->EnvColor in the \c GL_TEXTURE_ENV_COLOR case. */static void i810TexEnv( GLcontext *ctx, GLenum target, GLenum pname, const GLfloat *param ){ i810ContextPtr imesa = I810_CONTEXT( ctx ); const GLuint unit = ctx->Texture.CurrentUnit; const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; /* Only one env color. Need a fallback if env colors are different * and texture setup references env color in both units. */ switch (pname) { case GL_TEXTURE_ENV_COLOR: { GLubyte c[4]; GLuint envColor; UNCLAMPED_FLOAT_TO_RGBA_CHAN( c, texUnit->EnvColor ); envColor = PACK_COLOR_8888( c[3], c[0], c[1], c[2] ); if (imesa->Setup[I810_CTXREG_CF1] != envColor) { I810_STATECHANGE(imesa, I810_UPLOAD_CTX); imesa->Setup[I810_CTXREG_CF1] = envColor; } break; } case GL_TEXTURE_ENV_MODE: imesa->TexEnvImageFmt[unit] = 0; /* force recalc of env state */ break; case GL_TEXTURE_LOD_BIAS: { if ( texUnit->_Current != NULL ) { const struct gl_texture_object *tObj = texUnit->_Current; i810TextureObjectPtr t = (i810TextureObjectPtr) tObj->DriverData; t->Setup[I810_TEXREG_MLC] &= ~(MLC_LOD_BIAS_MASK); t->Setup[I810_TEXREG_MLC] |= i810ComputeLodBias(*param); } break; } default: break; }} #if 0static void i810TexImage1D( GLcontext *ctx, GLenum target, GLint level, GLint internalFormat, GLint width, GLint border, GLenum format, GLenum type, const GLvoid *pixels, const struct gl_pixelstore_attrib *pack, struct gl_texture_object *texObj, struct gl_texture_image *texImage ){ i810TextureObjectPtr t = (i810TextureObjectPtr) texObj->DriverData; if (t) { i810SwapOutTexObj( imesa, t ); }}static void i810TexSubImage1D( GLcontext *ctx, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels, const struct gl_pixelstore_attrib *pack, struct gl_texture_object *texObj, struct gl_texture_image *texImage ){}#endifstatic void i810TexImage2D( GLcontext *ctx, GLenum target, GLint level, GLint internalFormat, GLint width, GLint height, GLint border, GLenum format, GLenum type, const GLvoid *pixels, const struct gl_pixelstore_attrib *packing, struct gl_texture_object *texObj, struct gl_texture_image *texImage ){ driTextureObject *t = (driTextureObject *) texObj->DriverData; if (t) { I810_FIREVERTICES( I810_CONTEXT(ctx) ); driSwapOutTextureObject( t ); } else { t = (driTextureObject *) i810AllocTexObj( ctx, texObj ); if (!t) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); return; } } _mesa_store_teximage2d( ctx, target, level, internalFormat, width, height, border, format, type, pixels, packing, texObj, texImage );}static void i810TexSubImage2D( GLcontext *ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels, const struct gl_pixelstore_attrib *packing, struct gl_texture_object *texObj, struct gl_texture_image *texImage ){ driTextureObject *t = (driTextureObject *)texObj->DriverData; if (t) { I810_FIREVERTICES( I810_CONTEXT(ctx) ); driSwapOutTextureObject( t ); } _mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width, height, format, type, pixels, packing, texObj, texImage);}static void i810BindTexture( GLcontext *ctx, GLenum target, struct gl_texture_object *tObj ){ assert( (target != GL_TEXTURE_2D) || (tObj->DriverData != NULL) );}static void i810DeleteTexture( GLcontext *ctx, struct gl_texture_object *tObj ){ driTextureObject * t = (driTextureObject *) tObj->DriverData; if (t) { i810ContextPtr imesa = I810_CONTEXT( ctx ); if (imesa) I810_FIREVERTICES( imesa ); driDestroyTextureObject( t ); } /* Free mipmap images and the texture object itself */ _mesa_delete_texture_object(ctx, tObj);}/** * Choose a Mesa texture format to match the requested format. * * The i810 only supports 5 texture modes that are useful to Mesa. That * makes this routine pretty simple. */static const struct gl_texture_format *i810ChooseTextureFormat( GLcontext *ctx, GLint internalFormat, GLenum format, GLenum type ){ switch ( internalFormat ) { case 4: case GL_RGBA: case GL_RGBA2: case GL_RGBA4: case GL_RGB5_A1: case GL_RGBA8: case GL_RGB10_A2: case GL_RGBA12: case GL_RGBA16: case GL_COMPRESSED_RGBA: if ( ((format == GL_BGRA) && (type == GL_UNSIGNED_SHORT_1_5_5_5_REV)) || ((format == GL_RGBA) && (type == GL_UNSIGNED_SHORT_5_5_5_1)) || (internalFormat == GL_RGB5_A1) ) { return &_mesa_texformat_argb1555; } return &_mesa_texformat_argb4444; case 3: case GL_RGB: case GL_COMPRESSED_RGB: case GL_R3_G3_B2: case GL_RGB4: case GL_RGB5: case GL_RGB8: case GL_RGB10: case GL_RGB12: case GL_RGB16: return &_mesa_texformat_rgb565; case GL_ALPHA: case GL_ALPHA4: case GL_ALPHA8: case GL_ALPHA12: case GL_ALPHA16: case GL_COMPRESSED_ALPHA: case 1: case GL_LUMINANCE: case GL_LUMINANCE4: case GL_LUMINANCE8: case GL_LUMINANCE12: case GL_LUMINANCE16: case GL_COMPRESSED_LUMINANCE: case 2: case GL_LUMINANCE_ALPHA: case GL_LUMINANCE4_ALPHA4: case GL_LUMINANCE6_ALPHA2: case GL_LUMINANCE8_ALPHA8: case GL_LUMINANCE12_ALPHA4: case GL_LUMINANCE12_ALPHA12: case GL_LUMINANCE16_ALPHA16: case GL_COMPRESSED_LUMINANCE_ALPHA: case GL_INTENSITY: case GL_INTENSITY4: case GL_INTENSITY8: case GL_INTENSITY12: case GL_INTENSITY16: case GL_COMPRESSED_INTENSITY: return &_mesa_texformat_al88; case GL_YCBCR_MESA: if (type == GL_UNSIGNED_SHORT_8_8_MESA || type == GL_UNSIGNED_BYTE) return &_mesa_texformat_ycbcr; else return &_mesa_texformat_ycbcr_rev; default: fprintf(stderr, "unexpected texture format in %s\n", __FUNCTION__); return NULL; } return NULL; /* never get here */}/** * Allocate a new texture object. * Called via ctx->Driver.NewTextureObject. * Note: this function will be called during context creation to * allocate the default texture objects. * Note: we could use containment here to 'derive' the driver-specific * texture object from the core mesa gl_texture_object. Not done at this time. */static struct gl_texture_object *i810NewTextureObject( GLcontext *ctx, GLuint name, GLenum target ){ struct gl_texture_object *obj; obj = _mesa_new_texture_object(ctx, name, target); i810AllocTexObj( ctx, obj ); return obj;}void i810InitTextureFuncs( struct dd_function_table *functions ){ functions->ChooseTextureFormat = i810ChooseTextureFormat; functions->TexImage2D = i810TexImage2D; functions->TexSubImage2D = i810TexSubImage2D; functions->BindTexture = i810BindTexture; functions->NewTextureObject = i810NewTextureObject; functions->DeleteTexture = i810DeleteTexture; functions->TexParameter = i810TexParameter; functions->TexEnv = i810TexEnv; functions->IsTextureResident = driIsTextureResident;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -