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

📄 intel_tex.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************** *  * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. * All Rights Reserved. *  * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: *  * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. *  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *  **************************************************************************/#include "glheader.h"#include "mtypes.h"#include "imports.h"#include "macros.h"#include "simple_list.h"#include "enums.h"#include "image.h"#include "texstore.h"#include "texformat.h"#include "teximage.h"#include "texmem.h"#include "texobj.h"#include "swrast/swrast.h"#include "mm.h"#include "intel_screen.h"#include "intel_batchbuffer.h"#include "intel_context.h"#include "intel_tex.h"#include "intel_ioctl.h"static GLbooleanintelValidateClientStorage( intelContextPtr intel, GLenum target,			    GLint internalFormat,			    GLint srcWidth, GLint srcHeight, 			    GLenum format, GLenum type,  const void *pixels,			    const struct gl_pixelstore_attrib *packing,			    struct gl_texture_object *texObj,			    struct gl_texture_image *texImage){   GLcontext *ctx = &intel->ctx;   int texelBytes;   if (0)      fprintf(stderr, "intformat %s format %s type %s\n",	      _mesa_lookup_enum_by_nr( internalFormat ),	      _mesa_lookup_enum_by_nr( format ),	      _mesa_lookup_enum_by_nr( type ));   if (!ctx->Unpack.ClientStorage)      return 0;   if (ctx->_ImageTransferState ||       texImage->IsCompressed ||       texObj->GenerateMipmap)      return 0;   /* This list is incomplete    */   switch ( internalFormat ) {   case GL_RGBA:      if ( format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV ) {	 texImage->TexFormat = &_mesa_texformat_argb8888;	 texelBytes = 4;      }      else	 return 0;      break;   case GL_RGB:      if ( format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5 ) {	 texImage->TexFormat = &_mesa_texformat_rgb565;	 texelBytes = 2;      }      else	 return 0;      break;   case GL_YCBCR_MESA:      if ( format == GL_YCBCR_MESA && 	   type == GL_UNSIGNED_SHORT_8_8_REV_APPLE ) {	 texImage->TexFormat = &_mesa_texformat_ycbcr_rev;	 texelBytes = 2;      }      else if ( format == GL_YCBCR_MESA && 		(type == GL_UNSIGNED_SHORT_8_8_APPLE || 		 type == GL_UNSIGNED_BYTE)) {	 texImage->TexFormat = &_mesa_texformat_ycbcr;	 texelBytes = 2;      }      else	 return 0;      break;      	    default:      return 0;   }   /* Could deal with these packing issues, but currently don't:    */   if (packing->SkipPixels ||        packing->SkipRows ||        packing->SwapBytes ||       packing->LsbFirst) {      return 0;   }   {            GLint srcRowStride = _mesa_image_row_stride(packing, srcWidth,						  format, type);            if (0)	 fprintf(stderr, "%s: srcRowStride %d/%x\n", 		 __FUNCTION__, srcRowStride, srcRowStride);      /* Could check this later in upload, pitch restrictions could be       * relaxed, but would need to store the image pitch somewhere,       * as packing details might change before image is uploaded:       */      if (!intelIsAgpMemory( intel, pixels, srcHeight * srcRowStride ) ||	  (srcRowStride & 63))	 return 0;      /* Have validated that _mesa_transfer_teximage would be a straight       * memcpy at this point.  NOTE: future calls to TexSubImage will       * overwrite the client data.  This is explicitly mentioned in the       * extension spec.       */      texImage->Data = (void *)pixels;      texImage->IsClientData = GL_TRUE;      texImage->RowStride = srcRowStride / texelBytes;      return 1;   }} static void intelTexImage1D( GLcontext *ctx, GLenum target, GLint level,			    GLint internalFormat,			    GLint width, 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;   assert(t);   intelFlush( ctx );   driSwapOutTextureObject( t );   texImage->IsClientData = GL_FALSE;   _mesa_store_teximage1d( ctx, target, level, internalFormat,			   width, border, format, type,			   pixels, packing, texObj, texImage );   t->dirty_images[0] |= (1 << level);}static void intelTexSubImage1D( GLcontext *ctx, 			       GLenum target,			       GLint level,				       GLint xoffset,				GLsizei width,			       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;   assert(t);   intelFlush( ctx );   driSwapOutTextureObject( t );   _mesa_store_texsubimage1d(ctx, target, level, xoffset, width, 			     format, type, pixels, packing, texObj,			     texImage);}/* Handles 2D, CUBE, RECT: */static void intelTexImage2D( 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;   GLuint face;   /* which cube face or ordinary 2D image */   switch (target) {   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:      face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;      ASSERT(face < 6);      break;   default:      face = 0;   }   assert(t);   intelFlush( ctx );   driSwapOutTextureObject( t );   texImage->IsClientData = GL_FALSE;   if (intelValidateClientStorage( INTEL_CONTEXT(ctx), target, 				   internalFormat, 				   width, height, 				   format, type, pixels, 				   packing, texObj, texImage)) {      if (INTEL_DEBUG & DEBUG_TEXTURE)	 fprintf(stderr, "%s: Using client storage\n", __FUNCTION__);    }   else {      _mesa_store_teximage2d( ctx, target, level, internalFormat,			      width, height, border, format, type,			      pixels, packing, texObj, texImage );      t->dirty_images[face] |= (1 << level);   }}static void intelTexSubImage2D( 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;   GLuint face;   /* which cube face or ordinary 2D image */   switch (target) {   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:      face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;      ASSERT(face < 6);      break;   default:      face = 0;   }   if (texImage->IsClientData &&       (char *)pixels == (char *)texImage->Data +        ((xoffset + yoffset * texImage->RowStride) * 	texImage->TexFormat->TexelBytes)) {      /* Notification only - no upload required */   }   else {      assert( t ); /* this _should_ be true */      intelFlush( ctx );      driSwapOutTextureObject( t );      _mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width, 				height, format, type, pixels, packing, texObj,				texImage);      t->dirty_images[face] |= (1 << level);   }}static void intelCompressedTexImage2D( GLcontext *ctx, GLenum target, GLint level,                              GLint internalFormat,                              GLint width, GLint height, GLint border,                              GLsizei imageSize, const GLvoid *data,                              struct gl_texture_object *texObj,                              struct gl_texture_image *texImage ){   driTextureObject * t = (driTextureObject *) texObj->DriverData;   GLuint face;   /* which cube face or ordinary 2D image */   switch (target) {   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:      face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;      ASSERT(face < 6);      break;   default:      face = 0;   }   assert(t);   intelFlush( ctx );      driSwapOutTextureObject( t );   texImage->IsClientData = GL_FALSE;   if (INTEL_DEBUG & DEBUG_TEXTURE)     fprintf(stderr, "%s: Using normal storage\n", __FUNCTION__);       _mesa_store_compressed_teximage2d(ctx, target, level, internalFormat, width,				     height, border, imageSize, data, texObj, texImage);      t->dirty_images[face] |= (1 << level);}static void intelCompressedTexSubImage2D( GLcontext *ctx, GLenum target, GLint level,                                 GLint xoffset, GLint yoffset,                                 GLsizei width, GLsizei height,                                 GLenum format,                                 GLsizei imageSize, const GLvoid *data,                                 struct gl_texture_object *texObj,                                 struct gl_texture_image *texImage ){   driTextureObject * t = (driTextureObject *) texObj->DriverData;   GLuint face;   /* which cube face or ordinary 2D image */   switch (target) {   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:      face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;      ASSERT(face < 6);      break;   default:      face = 0;   }   assert( t ); /* this _should_ be true */   intelFlush( ctx );   driSwapOutTextureObject( t );      _mesa_store_compressed_texsubimage2d(ctx, target, level, xoffset, yoffset, width,					height, format, imageSize, data, texObj, texImage);      t->dirty_images[face] |= (1 << level);}static void intelTexImage3D( GLcontext *ctx, GLenum target, GLint level,                            GLint internalFormat,                            GLint width, GLint height, GLint depth,                            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;   assert(t);   driSwapOutTextureObject( t );   texImage->IsClientData = GL_FALSE;   _mesa_store_teximage3d(ctx, target, level, internalFormat,			  width, height, depth, border,			  format, type, pixels,			  &ctx->Unpack, texObj, texImage);      t->dirty_images[0] |= (1 << level);}static voidintelTexSubImage3D( GLcontext *ctx, GLenum target, GLint level,                   GLint xoffset, GLint yoffset, GLint zoffset,                   GLsizei width, GLsizei height, GLsizei depth,                   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;   assert( t ); /* this _should_ be true */   driSwapOutTextureObject( t );   _mesa_store_texsubimage3d(ctx, target, level, xoffset, yoffset, zoffset,                             width, height, depth,                             format, type, pixels, packing, texObj, texImage);   t->dirty_images[0] |= (1 << level);}static void intelDeleteTexture( GLcontext *ctx, struct gl_texture_object *tObj )

⌨️ 快捷键说明

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