ref_gl: add VERY basic 16-bit texture support(no mips, no rescale, no filters), as an example to ref_vk dev

This commit is contained in:
Alibek Omarov 2021-11-23 04:12:30 +03:00
parent f16641b606
commit 501ff944b9
1 changed files with 63 additions and 9 deletions

View File

@ -362,6 +362,12 @@ static size_t GL_CalcImageSize( pixformat_t format, int width, int height, int d
case PF_RGBA_32: case PF_RGBA_32:
size = width * height * depth * 4; size = width * height * depth * 4;
break; break;
case PF_RGB_48:
size = width * height * depth * 6;
break;
case PF_RGBA_64:
size = width * height * depth * 8;
break;
case PF_DXT1: case PF_DXT1:
size = (((width + 3) >> 2) * ((height + 3) >> 2) * 8) * depth; size = (((width + 3) >> 2) * ((height + 3) >> 2) * 8) * depth;
break; break;
@ -452,9 +458,11 @@ static size_t GL_CalcTextureSize( GLenum format, int width, int height, int dept
case GL_LUMINANCE_ALPHA32F_ARB: case GL_LUMINANCE_ALPHA32F_ARB:
size = width * height * depth * 8; size = width * height * depth * 8;
break; break;
case GL_RGB16:
case GL_RGB16F_ARB: case GL_RGB16F_ARB:
size = width * height * depth * 6; size = width * height * depth * 6;
break; break;
case GL_RGBA16:
case GL_RGBA16F_ARB: case GL_RGBA16F_ARB:
size = width * height * depth * 8; size = width * height * depth * 8;
break; break;
@ -720,26 +728,56 @@ static void GL_SetTextureFormat( gl_texture_t *tex, pixformat_t format, int chan
switch( GL_CalcTextureSamples( channelMask )) switch( GL_CalcTextureSamples( channelMask ))
{ {
case 1: case 1:
{
if( FBitSet( tex->flags, TF_ALPHACONTRAST )) if( FBitSet( tex->flags, TF_ALPHACONTRAST ))
tex->format = GL_INTENSITY8; tex->format = Image16( format ) ? GL_INTENSITY16 : GL_INTENSITY8;
else tex->format = GL_LUMINANCE8; else tex->format = Image16( format ) ? GL_LUMINANCE16 : GL_LUMINANCE8;
break; break;
case 2: tex->format = GL_LUMINANCE8_ALPHA8; break; }
case 2:
{
tex->format = Image16( format ) ? GL_LUMINANCE16_ALPHA16 : GL_LUMINANCE8_ALPHA8;
break;
}
case 3: case 3:
switch( bits ) switch( bits )
{ {
case 16: tex->format = GL_RGB5; break; case 16:
case 32: tex->format = GL_RGB8; break; {
default: tex->format = GL_RGB; break; tex->format = Image16( format ) ? GL_RGB10 : GL_RGB5;
break;
}
case 32:
{
tex->format = Image16( format ) ? GL_RGB16 : GL_RGB8;
break;
}
default:
{
tex->format = GL_RGB;
break;
}
} }
break; break;
case 4: case 4:
default: default:
switch( bits ) switch( bits )
{ {
case 16: tex->format = GL_RGBA4; break; case 16:
case 32: tex->format = GL_RGBA8; break; {
default: tex->format = GL_RGBA; break; tex->format = Image16( format ) ? GL_RGBA8 : GL_RGBA4;
break;
}
case 32:
{
tex->format = Image16( format ) ? GL_RGBA16 : GL_RGBA8;
break;
}
default:
{
tex->format = GL_RGBA;
break;
}
} }
break; break;
} }
@ -1016,6 +1054,8 @@ static void GL_TextureImageRAW( gl_texture_t *tex, GLint side, GLint level, GLin
dataType = GL_HALF_FLOAT_ARB; dataType = GL_HALF_FLOAT_ARB;
else if( FBitSet( tex->flags, TF_ARB_FLOAT )) else if( FBitSet( tex->flags, TF_ARB_FLOAT ))
dataType = GL_FLOAT; dataType = GL_FLOAT;
else if( Image16( type ))
dataType = GL_UNSIGNED_SHORT;
if( tex->target == GL_TEXTURE_1D ) if( tex->target == GL_TEXTURE_1D )
{ {
@ -1185,6 +1225,20 @@ static qboolean GL_UploadTexture( gl_texture_t *tex, rgbdata_t *pic )
} }
} }
else if( Image16( pic->type ))
{
width = Q_max( 1, tex->width );
height = Q_max( 1, tex->height );
texsize = GL_CalcTextureSize( tex->format, width, height, tex->depth );
size = GL_CalcImageSize( pic->type, width, height, tex->depth );
GL_TextureImageRAW( tex, i, 0, width, height, tex->depth, pic->type, buf );
tex->size = texsize;
tex->numMips++;
buf += size; // move pointer
GL_CheckTexImageError( tex );
}
else // RGBA32 else // RGBA32
{ {
int mipCount = GL_CalcMipmapCount( tex, ( buf != NULL )); int mipCount = GL_CalcMipmapCount( tex, ( buf != NULL ));