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

📄 intel_tex.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 2 页
字号:
{   driTextureObject * t = (driTextureObject *) tObj->DriverData;   if ( t != NULL ) {      intelFlush( ctx );      driDestroyTextureObject( t );   }      /* Free mipmap images and the texture object itself */   _mesa_delete_texture_object(ctx, tObj);}static const struct gl_texture_format *intelChooseTextureFormat( GLcontext *ctx, GLint internalFormat,			 GLenum format, GLenum type ){   intelContextPtr intel = INTEL_CONTEXT( ctx );   const GLboolean do32bpt = ( intel->intelScreen->cpp == 4 &&			       intel->intelScreen->tex.size > 4*1024*1024);   switch ( internalFormat ) {   case 4:   case GL_RGBA:   case GL_COMPRESSED_RGBA:      if ( format == GL_BGRA ) {	 if ( type == GL_UNSIGNED_INT_8_8_8_8_REV ) {	    return &_mesa_texformat_argb8888;	 }         else if ( type == GL_UNSIGNED_SHORT_4_4_4_4_REV ) {            return &_mesa_texformat_argb4444;	 }         else if ( type == GL_UNSIGNED_SHORT_1_5_5_5_REV ) {	    return &_mesa_texformat_argb1555;	 }      }      return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_argb4444;   case 3:   case GL_RGB:   case GL_COMPRESSED_RGB:      if ( format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5 ) {	 return &_mesa_texformat_rgb565;      }      return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_rgb565;   case GL_RGBA8:   case GL_RGB10_A2:   case GL_RGBA12:   case GL_RGBA16:      return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_argb4444;   case GL_RGBA4:   case GL_RGBA2:      return &_mesa_texformat_argb4444;   case GL_RGB5_A1:      return &_mesa_texformat_argb1555;   case GL_RGB8:   case GL_RGB10:   case GL_RGB12:   case GL_RGB16:      return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_rgb565;   case GL_RGB5:   case GL_RGB4:   case GL_R3_G3_B2:      return &_mesa_texformat_rgb565;   case GL_ALPHA:   case GL_ALPHA4:   case GL_ALPHA8:   case GL_ALPHA12:   case GL_ALPHA16:   case GL_COMPRESSED_ALPHA:      return &_mesa_texformat_a8;   case 1:   case GL_LUMINANCE:   case GL_LUMINANCE4:   case GL_LUMINANCE8:   case GL_LUMINANCE12:   case GL_LUMINANCE16:   case GL_COMPRESSED_LUMINANCE:      return &_mesa_texformat_l8;   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:      return &_mesa_texformat_al88;   case GL_INTENSITY:   case GL_INTENSITY4:   case GL_INTENSITY8:   case GL_INTENSITY12:   case GL_INTENSITY16:   case GL_COMPRESSED_INTENSITY:      return &_mesa_texformat_i8;   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;   case GL_COMPRESSED_RGB_FXT1_3DFX:     return &_mesa_texformat_rgb_fxt1;   case GL_COMPRESSED_RGBA_FXT1_3DFX:     return &_mesa_texformat_rgba_fxt1;   case GL_RGB_S3TC:   case GL_RGB4_S3TC:   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:     return &_mesa_texformat_rgb_dxt1;   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:     return &_mesa_texformat_rgba_dxt1;   case GL_RGBA_S3TC:   case GL_RGBA4_S3TC:   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:     return &_mesa_texformat_rgba_dxt3;   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:      return &_mesa_texformat_rgba_dxt5;   case GL_DEPTH_COMPONENT:   case GL_DEPTH_COMPONENT16:   case GL_DEPTH_COMPONENT24:   case GL_DEPTH_COMPONENT32:      return &_mesa_texformat_depth_component16;   default:      fprintf(stderr, "unexpected texture format %s in %s\n", 	      _mesa_lookup_enum_by_nr(internalFormat),	      __FUNCTION__);      return NULL;   }   return NULL; /* never get here */}void intelDestroyTexObj(intelContextPtr intel, intelTextureObjectPtr t){   unsigned   i;   if ( intel == NULL )       return;   if ( t->age > intel->dirtyAge )      intel->dirtyAge = t->age;   for ( i = 0 ; i < MAX_TEXTURE_UNITS ; i++ ) {      if ( t == intel->CurrentTexObj[ i ] ) 	 intel->CurrentTexObj[ i ] = NULL;   }}/* Upload an image from mesa's internal copy.  Image may be 1D, 2D or * 3D.  Cubemaps are expanded elsewhere. */static void intelUploadTexImage( intelContextPtr intel,				 intelTextureObjectPtr t,				 const struct gl_texture_image *image,				 const GLuint offset ){   if (!image || !image->Data)       return;   if (image->Depth == 1 && image->IsClientData) {      if (INTEL_DEBUG & DEBUG_TEXTURE)	 fprintf(stderr, "Blit uploading\n");      /* Do it with a blit.       */      intelEmitCopyBlitLocked( intel,			       image->TexFormat->TexelBytes,			       image->RowStride, /* ? */			       intelGetMemoryOffsetMESA( NULL, 0, image->Data ),			       t->Pitch / image->TexFormat->TexelBytes,			       intelGetMemoryOffsetMESA( NULL, 0, t->BufAddr + offset ),			       0, 0,			       0, 0,			       image->Width,			       image->Height);   }   else if (image->IsCompressed) {      GLuint row_len = image->Width * 2;      GLubyte *dst = (GLubyte *)(t->BufAddr + offset);      GLubyte *src = (GLubyte *)image->Data;      GLuint j;      if (INTEL_DEBUG & DEBUG_TEXTURE)	 fprintf(stderr, 		 "Upload image %dx%dx%d offset %xm row_len %x "		 "pitch %x depth_pitch %x\n",		 image->Width, image->Height, image->Depth, offset,		 row_len, t->Pitch, t->depth_pitch);      switch (image->InternalFormat) {	case GL_COMPRESSED_RGB_FXT1_3DFX:	case GL_COMPRESSED_RGBA_FXT1_3DFX:	case GL_RGB_S3TC:	case GL_RGB4_S3TC:	case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:	case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:	  for (j = 0 ; j < image->Height/4 ; j++, dst += (t->Pitch)) {	    __memcpy(dst, src, row_len );	    src += row_len;	  }	  break;	case GL_RGBA_S3TC:	case GL_RGBA4_S3TC:	case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:	case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:	  for (j = 0 ; j < image->Height/4 ; j++, dst += (t->Pitch)) {	    __memcpy(dst, src, (image->Width*4) );	    src += image->Width*4;	  }	  break;	default:	  fprintf(stderr,"Internal Compressed format not supported %d\n", image->InternalFormat);	  break;      }   }   /* Time for another vtbl entry:    */   else if (intel->intelScreen->deviceID == PCI_CHIP_I945_G ||            intel->intelScreen->deviceID == PCI_CHIP_I945_GM) {      GLuint row_len = image->Width * image->TexFormat->TexelBytes;      GLubyte *dst = (GLubyte *)(t->BufAddr + offset);      GLubyte *src = (GLubyte *)image->Data;      GLuint d, j;      if (INTEL_DEBUG & DEBUG_TEXTURE)	 fprintf(stderr, 		 "Upload image %dx%dx%d offset %xm row_len %x "		 "pitch %x depth_pitch %x\n",		 image->Width, image->Height, image->Depth, offset,		 row_len, t->Pitch, t->depth_pitch);      if (row_len == t->Pitch) {	 memcpy( dst, src, row_len * image->Height * image->Depth );      }      else { 	 GLuint x = 0, y = 0;	 for (d = 0 ; d < image->Depth ; d++) {	    GLubyte *dst0 = dst + x + y * t->Pitch;	    for (j = 0 ; j < image->Height ; j++) {	       __memcpy(dst0, src, row_len );	       src += row_len;	       dst0 += t->Pitch;	    }	    x += MIN2(4, row_len); /* Guess: 4 byte minimum alignment */	    if (x > t->Pitch) {	       x = 0;	       y += image->Height;	    }	 }      }   }   else {      GLuint row_len = image->Width * image->TexFormat->TexelBytes;      GLubyte *dst = (GLubyte *)(t->BufAddr + offset);      GLubyte *src = (GLubyte *)image->Data;      GLuint d, j;      if (INTEL_DEBUG & DEBUG_TEXTURE)	 fprintf(stderr, 		 "Upload image %dx%dx%d offset %xm row_len %x "		 "pitch %x depth_pitch %x\n",		 image->Width, image->Height, image->Depth, offset,		 row_len, t->Pitch, t->depth_pitch);      if (row_len == t->Pitch) {	 for (d = 0; d < image->Depth; d++) {	    memcpy( dst, src, t->Pitch * image->Height );	    dst += t->depth_pitch;	    src += row_len * image->Height;	 }      }      else { 	 for (d = 0 ; d < image->Depth ; d++) {	    for (j = 0 ; j < image->Height ; j++) {	       __memcpy(dst, src, row_len );	       src += row_len;	       dst += t->Pitch;	    }	    dst += t->depth_pitch - (t->Pitch * image->Height);	 }      }   }}int intelUploadTexImages( intelContextPtr intel, 			  intelTextureObjectPtr t,			  GLuint face){   const int numLevels = t->base.lastLevel - t->base.firstLevel + 1;   const struct gl_texture_image *firstImage = t->image[face][t->base.firstLevel].image;   int pitch = firstImage->RowStride * firstImage->TexFormat->TexelBytes;   /* Can we texture out of the existing client data? */   if ( numLevels == 1 &&	firstImage->IsClientData &&	(pitch & 3) == 0) {      if (INTEL_DEBUG & DEBUG_TEXTURE)	 fprintf(stderr, "AGP texturing from client memory\n");      t->TextureOffset = intelAgpOffsetFromVirtual( intel, firstImage->Data );      t->BufAddr = 0;      t->dirty = ~0;      return GL_TRUE;   }   else {      if (INTEL_DEBUG & DEBUG_TEXTURE) 	 fprintf(stderr, "Uploading client data to agp\n");      INTEL_FIREVERTICES( intel );      LOCK_HARDWARE( intel );      if ( t->base.memBlock == NULL ) {	 int heap;	 heap = driAllocateTexture( intel->texture_heaps, intel->nr_heaps,				    (driTextureObject *) t );	 if ( heap == -1 ) {	    UNLOCK_HARDWARE( intel );	    return GL_FALSE;	 }	 /* Set the base offset of the texture image */	 t->BufAddr = intel->intelScreen->tex.map + t->base.memBlock->ofs;	 t->TextureOffset = intel->intelScreen->tex.offset + t->base.memBlock->ofs;	 t->dirty = ~0;      }      /* Let the world know we've used this memory recently.       */      driUpdateTextureLRU( (driTextureObject *) t );      /* Upload any images that are new */      if (t->base.dirty_images[face]) {	 int i; 	 intelWaitForIdle( intel );	    	 for (i = 0 ; i < numLevels ; i++) { 	    int level = i + t->base.firstLevel;	    if (t->base.dirty_images[face] & (1<<level)) {	       const struct gl_texture_image *image = t->image[face][i].image;	       GLuint offset = t->image[face][i].offset;     	       if (INTEL_DEBUG & DEBUG_TEXTURE)	          fprintf(stderr, "upload level %d, offset %x\n", 			  level, offset);	       intelUploadTexImage( intel, t, image, offset );	    }	 }	 t->base.dirty_images[face] = 0;	 intel->perf_boxes |= I830_BOX_TEXTURE_LOAD;      }            UNLOCK_HARDWARE( intel );      return GL_TRUE;   }}/** * 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 *intelNewTextureObject( GLcontext *ctx, GLuint name, GLenum target ){   struct gl_texture_object *obj = _mesa_new_texture_object(ctx, name, target);   INTEL_CONTEXT(ctx)->vtbl.alloc_tex_obj( obj );   return obj;}void intelInitTextureFuncs( struct dd_function_table *functions ){   functions->NewTextureObject          = intelNewTextureObject;   functions->ChooseTextureFormat       = intelChooseTextureFormat;   functions->TexImage1D                = intelTexImage1D;   functions->TexImage2D                = intelTexImage2D;   functions->TexImage3D                = intelTexImage3D;   functions->TexSubImage1D             = intelTexSubImage1D;   functions->TexSubImage2D             = intelTexSubImage2D;   functions->TexSubImage3D             = intelTexSubImage3D;   functions->CopyTexImage1D            = _swrast_copy_teximage1d;   functions->CopyTexImage2D            = _swrast_copy_teximage2d;   functions->CopyTexSubImage1D         = _swrast_copy_texsubimage1d;   functions->CopyTexSubImage2D         = _swrast_copy_texsubimage2d;   functions->CopyTexSubImage3D         = _swrast_copy_texsubimage3d;   functions->DeleteTexture             = intelDeleteTexture;   functions->UpdateTexturePalette      = NULL;   functions->IsTextureResident         = driIsTextureResident;   functions->TestProxyTexImage         = _mesa_test_proxy_teximage;   functions->DeleteTexture             = intelDeleteTexture;   functions->CompressedTexImage2D      = intelCompressedTexImage2D;   functions->CompressedTexSubImage2D   = intelCompressedTexSubImage2D;}

⌨️ 快捷键说明

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