GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) { GL_BindMultiTexture(glDsaState.texunit, target, texture); qglCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, data); }
/* ======================== idImage::SubImageUpload ======================== */ void idImage::SubImageUpload( int mipLevel, int x, int y, int z, int width, int height, const void * pic, int pixelPitch ) const { assert( x >= 0 && y >= 0 && mipLevel >= 0 && width >= 0 && height >= 0 && mipLevel < opts.numLevels ); int compressedSize = 0; if ( IsCompressed() ) { assert( !(x&3) && !(y&3) ); // compressed size may be larger than the dimensions due to padding to quads int quadW = ( width + 3 ) & ~3; int quadH = ( height + 3 ) & ~3; compressedSize = quadW * quadH * BitsForFormat( opts.format ) / 8; int padW = ( opts.width + 3 ) & ~3; int padH = ( opts.height + 3 ) & ~3; (void)padH; (void)padW; assert( x + width <= padW && y + height <= padH ); // upload the non-aligned value, OpenGL understands that there // will be padding if ( x + width > opts.width ) { width = opts.width - x; } if ( y + height > opts.height ) { height = opts.height - x; } } else { assert( x + width <= opts.width && y + height <= opts.height ); } int target; int uploadTarget; if ( opts.textureType == TT_2D ) { target = GL_TEXTURE_2D; uploadTarget = GL_TEXTURE_2D; } else if ( opts.textureType == TT_CUBIC ) { target = GL_TEXTURE_CUBE_MAP_EXT; uploadTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT + z; } else { assert( !"invalid opts.textureType" ); target = GL_TEXTURE_2D; uploadTarget = GL_TEXTURE_2D; } qglBindTexture( target, texnum ); if ( pixelPitch != 0 ) { qglPixelStorei( GL_UNPACK_ROW_LENGTH, pixelPitch ); } if ( opts.format == FMT_RGB565 ) { glPixelStorei( GL_UNPACK_SWAP_BYTES, GL_TRUE ); } #ifdef DEBUG GL_CheckErrors(); #endif if ( IsCompressed() ) { qglCompressedTexSubImage2DARB( uploadTarget, mipLevel, x, y, width, height, internalFormat, compressedSize, pic ); } else { // make sure the pixel store alignment is correct so that lower mips get created // properly for odd shaped textures - this fixes the mip mapping issues with // fonts int unpackAlignment = width * BitsForFormat( (textureFormat_t)opts.format ) / 8; if ( ( unpackAlignment & 3 ) == 0 ) { qglPixelStorei( GL_UNPACK_ALIGNMENT, 4 ); } else { qglPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); } qglTexSubImage2D( uploadTarget, mipLevel, x, y, width, height, dataFormat, dataType, pic ); } #ifdef DEBUG GL_CheckErrors(); #endif if ( opts.format == FMT_RGB565 ) { glPixelStorei( GL_UNPACK_SWAP_BYTES, GL_FALSE ); } if ( pixelPitch != 0 ) { qglPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); } }