From 851ef6dd8111d0d11d8a7520eb296e947944458c Mon Sep 17 00:00:00 2001 From: Matthias Bentrup Date: Thu, 2 Feb 2012 09:26:13 +0100 Subject: [PATCH 3/5] Support uploading pre-compressed textures Extend the R_CreateImage function to upload precompressed images if the format is not GL_RGBA8. --- code/renderer/qgl.h | 6 ++++++ code/renderer/tr_image.c | 19 +++++++++++++++++-- code/sdl/sdl_glimp.c | 11 +++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/code/renderer/qgl.h b/code/renderer/qgl.h index 5296193..0d22d1b 100644 --- a/code/renderer/qgl.h +++ b/code/renderer/qgl.h @@ -39,6 +39,12 @@ extern void (APIENTRYP qglMultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat extern void (APIENTRYP qglLockArraysEXT) (GLint first, GLsizei count); extern void (APIENTRYP qglUnlockArraysEXT) (void); +extern void (APIENTRYP qglCompressedTexImage2DARB) (GLenum target, GLint level, + GLenum internalformat, + GLsizei width, GLsizei height, + GLint border, GLsizei imageSize, + const GLvoid *data); + //=========================================================================== diff --git a/code/renderer/tr_image.c b/code/renderer/tr_image.c index f3478bb..447fe92 100644 --- a/code/renderer/tr_image.c +++ b/code/renderer/tr_image.c @@ -473,8 +473,23 @@ static qboolean UploadOneTexLevel( int level, const textureLevel_t *pic ) { GLsizei w; if( pic->format != GL_RGBA8 ) { - return qfalse; - } else { + if( !qglCompressedTexImage2DARB ) + return qfalse; + + qglCompressedTexImage2DARB( GL_PROXY_TEXTURE_2D, level, + pic->format, + pic->width, pic->height, 0, + pic->size, NULL); + qglGetTexLevelParameteriv( GL_PROXY_TEXTURE_2D, level, + GL_TEXTURE_WIDTH, &w); + if( !w ) + return qfalse; + + qglCompressedTexImage2DARB( GL_TEXTURE_2D, level, + pic->format, + pic->width, pic->height, 0, + pic->size, pic->data); + } else { qglTexImage2D( GL_PROXY_TEXTURE_2D, level, pic->format, pic->width, pic->height, 0, diff --git a/code/sdl/sdl_glimp.c b/code/sdl/sdl_glimp.c index cbdbcef..e86630e 100644 --- a/code/sdl/sdl_glimp.c +++ b/code/sdl/sdl_glimp.c @@ -76,13 +76,22 @@ cvar_t *r_allowResize; // make window resizable cvar_t *r_centerWindow; cvar_t *r_sdlDriver; +// GL_ARB_multisample void (APIENTRYP qglActiveTextureARB) (GLenum texture); void (APIENTRYP qglClientActiveTextureARB) (GLenum texture); void (APIENTRYP qglMultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat t); +// GL_EXT_compiled_vertex_array void (APIENTRYP qglLockArraysEXT) (GLint first, GLsizei count); void (APIENTRYP qglUnlockArraysEXT) (void); +// GL_ARB_texture_compression +void (APIENTRYP qglCompressedTexImage2DARB) (GLenum target, GLint level, + GLenum internalformat, + GLsizei width, GLsizei height, + GLint border, GLsizei imageSize, + const GLvoid *data); + /* =============== GLimp_Shutdown @@ -520,12 +529,14 @@ static void GLimp_InitExtensions( void ) glConfig.textureCompression = TC_NONE; // GL_EXT_texture_compression_s3tc + qglCompressedTexImage2DARB = NULL; if ( GLimp_HaveExtension( "GL_ARB_texture_compression" ) && GLimp_HaveExtension( "GL_EXT_texture_compression_s3tc" ) ) { if ( r_ext_compressed_textures->value ) { glConfig.textureCompression = TC_S3TC_ARB; + qglCompressedTexImage2DARB = SDL_GL_GetProcAddress( "glCompressedTexImage2DARB" ); ri.Printf( PRINT_ALL, "...using GL_EXT_texture_compression_s3tc\n" ); } else -- 1.7.5.4