📄 intel_tex.c
字号:
{ 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 + -