⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamma_tex.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
字号:
/* $XFree86: xc/lib/GL/mesa/src/drv/gamma/gamma_tex.c,v 1.4 2002/11/05 17:46:07 tsi Exp $ */#include <stdlib.h>#include <stdio.h>#include "glheader.h"#include "mtypes.h"#include "imports.h"#include "simple_list.h"#include "enums.h"#include "texstore.h"#include "teximage.h"#include "texformat.h"#include "texobj.h"#include "swrast/swrast.h"#include "mm.h"#include "gamma_context.h"#include "colormac.h"/* * Compute the 'S2.4' lod bias factor from the floating point OpenGL bias. */#if 0static GLuint gammaComputeLodBias(GLfloat bias){   return bias;}#endifstatic void gammaSetTexWrapping(gammaTextureObjectPtr t, 			       GLenum wraps, GLenum wrapt){   u_int32_t t1 = t->TextureAddressMode;   u_int32_t t2 = t->TextureReadMode;   t1 &= ~(TAM_SWrap_Mask | TAM_TWrap_Mask);   t2 &= ~(TRM_UWrap_Mask | TRM_VWrap_Mask);      if (wraps != GL_CLAMP) {      t1 |= TAM_SWrap_Repeat;      t2 |= TRM_UWrap_Repeat;   }   if (wrapt != GL_CLAMP) {      t1 |= TAM_TWrap_Repeat;      t2 |= TRM_VWrap_Repeat;   }   t->TextureAddressMode = t1;   t->TextureReadMode = t2;}static void gammaSetTexFilter(gammaContextPtr gmesa, 			     gammaTextureObjectPtr t, 			     GLenum minf, GLenum magf,                             GLfloat bias){   u_int32_t t1 = t->TextureAddressMode;   u_int32_t t2 = t->TextureReadMode;   t2 &= ~(TRM_Mag_Mask | TRM_Min_Mask);   switch (minf) {   case GL_NEAREST:      t1 &= ~TAM_LODEnable;      t2 &= ~TRM_MipMapEnable;      t2 |= TRM_Min_Nearest;      break;   case GL_LINEAR:      t1 &= ~TAM_LODEnable;      t2 &= ~TRM_MipMapEnable;      t2 |= TRM_Min_Linear;      break;   case GL_NEAREST_MIPMAP_NEAREST:      t2 |= TRM_Min_NearestMMNearest;      break;   case GL_LINEAR_MIPMAP_NEAREST:      t2 |= TRM_Min_LinearMMNearest;      break;   case GL_NEAREST_MIPMAP_LINEAR:      t2 |= TRM_Min_NearestMMLinear;      break;   case GL_LINEAR_MIPMAP_LINEAR:      t2 |= TRM_Min_LinearMMLinear;      break;   default:      break;   }   switch (magf) {   case GL_NEAREST:      t2 |= TRM_Mag_Nearest;      break;   case GL_LINEAR:      t2 |= TRM_Mag_Linear;      break;   default:      break;   }     t->TextureAddressMode = t1;   t->TextureReadMode = t2;}static void gammaSetTexBorderColor(gammaContextPtr gmesa,				  gammaTextureObjectPtr t, 				  GLubyte color[4]){    t->TextureBorderColor = PACK_COLOR_8888(color[0], color[1], color[2], color[3]);}static void gammaTexParameter( GLcontext *ctx, GLenum target,			      struct gl_texture_object *tObj,			      GLenum pname, const GLfloat *params ){   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);   gammaTextureObjectPtr t = (gammaTextureObjectPtr) tObj->DriverData;   if (!t)      return;   /* Can't do the update now as we don't know whether to flush    * vertices or not.  Setting gmesa->new_state means that    * gammaUpdateTextureState() will be called before any triangles are    * rendered.  If a statechange has occurred, it will be detected at    * that point, and buffered vertices flushed.      */   switch (pname) {   case GL_TEXTURE_MIN_FILTER:   case GL_TEXTURE_MAG_FILTER:      {         GLfloat bias = ctx->Texture.Unit[ctx->Texture.CurrentUnit].LodBias;         gammaSetTexFilter( gmesa, t, tObj->MinFilter, tObj->MagFilter, bias );      }      break;   case GL_TEXTURE_WRAP_S:   case GL_TEXTURE_WRAP_T:      gammaSetTexWrapping( t, tObj->WrapS, tObj->WrapT );      break;     case GL_TEXTURE_BORDER_COLOR:      gammaSetTexBorderColor( gmesa, 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.       */      gammaSwapOutTexObj( gmesa, t );      break;   default:      return;   }   if (t == gmesa->CurrentTexObj[0])      gmesa->dirty |= GAMMA_UPLOAD_TEX0;#if 0   if (t == gmesa->CurrentTexObj[1]) {      gmesa->dirty |= GAMMA_UPLOAD_TEX1;   }#endif}static void gammaTexEnv( GLcontext *ctx, GLenum target, 			GLenum pname, const GLfloat *param ){   gammaContextPtr gmesa = GAMMA_CONTEXT( ctx );   GLuint unit = ctx->Texture.CurrentUnit;   /* 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: {      struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];      GLfloat *fc = texUnit->EnvColor;      GLuint r, g, b, a, col;      CLAMPED_FLOAT_TO_UBYTE(r, fc[0]);      CLAMPED_FLOAT_TO_UBYTE(g, fc[1]);      CLAMPED_FLOAT_TO_UBYTE(b, fc[2]);      CLAMPED_FLOAT_TO_UBYTE(a, fc[3]);      col = ((a << 24) | 	     (r << 16) | 	     (g <<  8) | 	     (b <<  0));      break;   }   case GL_TEXTURE_ENV_MODE:      gmesa->TexEnvImageFmt[unit] = 0; /* force recalc of env state */      break;   case GL_TEXTURE_LOD_BIAS_EXT:#if 0  /* ?!?!?! */      {         struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;         gammaTextureObjectPtr t = (gammaTextureObjectPtr) tObj->DriverData;         (void) t;	 /* XXX Looks like there's something missing here */      }#endif      break;   default:      break;   }} #if 0static void gammaTexImage1D( 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 ){   gammaTextureObjectPtr t = (gammaTextureObjectPtr) texObj->DriverData;   if (t) {      gammaSwapOutTexObj( GAMMA_CONTEXT(ctx), t );   }   _mesa_store_teximage1d( ctx, target, level, internalFormat,			   width, border, format, type,			   pixels, pack, texObj, texImage );}#endif#if 0static void gammaTexSubImage1D( 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 ){   gammaTextureObjectPtr t = (gammaTextureObjectPtr) texObj->DriverData;   if (t) {      gammaSwapOutTexObj( GAMMA_CONTEXT(ctx), t );   }   _mesa_store_texsubimage1d(ctx, target, level, xoffset, width, 			     format, type, pixels, pack, texObj,			     texImage);}#endifstatic void gammaTexImage2D( 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 ){   gammaTextureObjectPtr t = (gammaTextureObjectPtr) texObj->DriverData;   if (t) {      gammaSwapOutTexObj( GAMMA_CONTEXT(ctx), t );   }   _mesa_store_teximage2d( ctx, target, level, internalFormat,			   width, height, border, format, type,			   pixels, packing, texObj, texImage );}static void gammaTexSubImage2D( 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 ){   gammaTextureObjectPtr t = (gammaTextureObjectPtr) texObj->DriverData;   if (t) {      gammaSwapOutTexObj( GAMMA_CONTEXT(ctx), t );   }   _mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width, 			     height, format, type, pixels, packing, texObj,			     texImage);}static void gammaBindTexture( GLcontext *ctx, GLenum target,			     struct gl_texture_object *tObj ){      gammaContextPtr gmesa = GAMMA_CONTEXT( ctx );      gammaTextureObjectPtr t = (gammaTextureObjectPtr) tObj->DriverData;      if (!t) {         GLfloat bias = ctx->Texture.Unit[ctx->Texture.CurrentUnit].LodBias;	 t = CALLOC_STRUCT(gamma_texture_object_t);	 /* Initialize non-image-dependent parts of the state:	  */	 t->globj = tObj;   	 t->TextureAddressMode = TextureAddressModeEnable | TAM_Operation_3D |			   TAM_DY_Enable | TAM_LODEnable;         t->TextureReadMode = TextureReadModeEnable | TRM_PrimaryCacheEnable |			TRM_MipMapEnable | TRM_BorderClamp | TRM_Border;         t->TextureColorMode = TextureColorModeEnable;         t->TextureFilterMode = TextureFilterModeEnable;         if (target == GL_TEXTURE_2D) {            t->TextureAddressMode |= TAM_TexMapType_2D;            t->TextureReadMode |= TRM_TexMapType_2D;         }         else if (target == GL_TEXTURE_1D) {            t->TextureAddressMode |= TAM_TexMapType_1D;            t->TextureReadMode |= TRM_TexMapType_1D;         }         t->TextureColorMode = TextureColorModeEnable;         t->TextureFilterMode = TextureFilterModeEnable;#ifdef MESA_LITTLE_ENDIAN         t->TextureFormat = (TF_LittleEndian |#else         t->TextureFormat = (TF_BigEndian |#endif			TF_ColorOrder_RGB |			TF_OutputFmt_Texel);	 t->dirty_images = ~0;	 tObj->DriverData = t;	 make_empty_list( t );	 gammaSetTexWrapping( t, tObj->WrapS, tObj->WrapT );	 gammaSetTexFilter( gmesa, t, tObj->MinFilter, tObj->MagFilter, bias );	 gammaSetTexBorderColor( gmesa, t, tObj->_BorderChan );      }}static void gammaDeleteTexture( GLcontext *ctx, struct gl_texture_object *tObj ){   gammaTextureObjectPtr t = (gammaTextureObjectPtr)tObj->DriverData;   if (t) {      gammaContextPtr gmesa = GAMMA_CONTEXT( ctx );#if 0      if (gmesa)         GAMMA_FIREVERTICES( gmesa );#endif      gammaDestroyTexObj( gmesa, t );      tObj->DriverData = 0;   }   /* Free mipmap images and the texture object itself */   _mesa_delete_texture_object(ctx, tObj);}static GLboolean gammaIsTextureResident( GLcontext *ctx, 					struct gl_texture_object *tObj ){   gammaTextureObjectPtr t = (gammaTextureObjectPtr)tObj->DriverData;   return t && t->MemBlock;}#ifdef UNUSED/** * 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 *gammaNewTextureObject( GLcontext *ctx, GLuint name, GLenum target ){   struct gl_texture_object *obj;   obj = _mesa_new_texture_object(ctx, name, target);   return obj;}#endifvoid gammaInitTextureObjects( GLcontext *ctx ){   struct gl_texture_object *texObj;   GLuint tmp = ctx->Texture.CurrentUnit;   ctx->Texture.CurrentUnit = 0;   texObj = ctx->Texture.Unit[0].Current1D;   gammaBindTexture( ctx, GL_TEXTURE_1D, texObj );   texObj = ctx->Texture.Unit[0].Current2D;   gammaBindTexture( ctx, GL_TEXTURE_2D, texObj );#if 0   ctx->Texture.CurrentUnit = 1;   texObj = ctx->Texture.Unit[1].Current1D;   gammaBindTexture( ctx, GL_TEXTURE_1D, texObj );   texObj = ctx->Texture.Unit[1].Current2D;   gammaBindTexture( ctx, GL_TEXTURE_2D, texObj );#endif   ctx->Texture.CurrentUnit = tmp;}void gammaDDInitTextureFuncs( struct dd_function_table *functions ){   functions->TexEnv = gammaTexEnv;   functions->TexImage2D = gammaTexImage2D;   functions->TexSubImage2D = gammaTexSubImage2D;   functions->BindTexture = gammaBindTexture;   functions->DeleteTexture = gammaDeleteTexture;   functions->TexParameter = gammaTexParameter;   functions->IsTextureResident = gammaIsTextureResident;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -