mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-11-28 18:45:54 -05:00
Added support for LATC/3DC texture compression.
This commit is contained in:
parent
6eed7bdccb
commit
c26f8f4718
15 changed files with 154 additions and 74 deletions
|
@ -70,7 +70,8 @@ void main()
|
||||||
normalize(v_normal)
|
normalize(v_normal)
|
||||||
);
|
);
|
||||||
|
|
||||||
vec3 normal = normalize(texture2D(u_texNormal, v_texcoord0).xyz * 2.0 - 1.0);
|
vec3 normal = texture2D(u_texNormal, v_texcoord0).xy * 2.0 - 1.0;
|
||||||
|
normal.z = sqrt(1.0 - dot(normal.xy, normal.xy) );
|
||||||
vec3 view = -normalize(v_view);
|
vec3 view = -normalize(v_view);
|
||||||
|
|
||||||
vec3 lightColor;
|
vec3 lightColor;
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 222 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -296,9 +296,11 @@ namespace bgfx
|
||||||
{
|
{
|
||||||
enum Enum
|
enum Enum
|
||||||
{
|
{
|
||||||
Dxt1,
|
BC1, // DXT1
|
||||||
Dxt3,
|
BC2, // DXT3
|
||||||
Dxt5,
|
BC3, // DXT5
|
||||||
|
BC4, // LATC1/ATI1
|
||||||
|
BC5, // LATC2/ATI2
|
||||||
Unknown,
|
Unknown,
|
||||||
L8,
|
L8,
|
||||||
BGRX8,
|
BGRX8,
|
||||||
|
|
|
@ -909,6 +909,8 @@ namespace bgfx
|
||||||
4, // Dxt1
|
4, // Dxt1
|
||||||
4, // Dxt3
|
4, // Dxt3
|
||||||
4, // Dxt5
|
4, // Dxt5
|
||||||
|
4, // BC4
|
||||||
|
4, // BC5
|
||||||
0, // Unknown
|
0, // Unknown
|
||||||
8, // L8
|
8, // L8
|
||||||
32, // BGRX8
|
32, // BGRX8
|
||||||
|
|
115
src/dds.cpp
115
src/dds.cpp
|
@ -18,6 +18,8 @@ namespace bgfx
|
||||||
#define DDS_DXT3 BX_MAKEFOURCC('D', 'X', 'T', '3')
|
#define DDS_DXT3 BX_MAKEFOURCC('D', 'X', 'T', '3')
|
||||||
#define DDS_DXT4 BX_MAKEFOURCC('D', 'X', 'T', '4')
|
#define DDS_DXT4 BX_MAKEFOURCC('D', 'X', 'T', '4')
|
||||||
#define DDS_DXT5 BX_MAKEFOURCC('D', 'X', 'T', '5')
|
#define DDS_DXT5 BX_MAKEFOURCC('D', 'X', 'T', '5')
|
||||||
|
#define DDS_ATI1 BX_MAKEFOURCC('A', 'T', 'I', '1')
|
||||||
|
#define DDS_ATI2 BX_MAKEFOURCC('A', 'T', 'I', '2')
|
||||||
|
|
||||||
#define D3DFMT_A16B16G16R16F 113
|
#define D3DFMT_A16B16G16R16F 113
|
||||||
|
|
||||||
|
@ -165,7 +167,7 @@ void decodeBlockDxt1(uint8_t _dst[16*4], const uint8_t _src[8])
|
||||||
|
|
||||||
void decodeBlockDxt23A(uint8_t _dst[16*4], const uint8_t _src[8])
|
void decodeBlockDxt23A(uint8_t _dst[16*4], const uint8_t _src[8])
|
||||||
{
|
{
|
||||||
for (uint32_t ii = 3, next = 0; ii < 16*4; ii += 4, next += 4)
|
for (uint32_t ii = 0, next = 0; ii < 16*4; ii += 4, next += 4)
|
||||||
{
|
{
|
||||||
uint32_t c0 = (_src[next>>3] >> (next&7) ) & 0xf;
|
uint32_t c0 = (_src[next>>3] >> (next&7) ) & 0xf;
|
||||||
_dst[ii] = bitRangeConvert(c0, 4, 8);
|
_dst[ii] = bitRangeConvert(c0, 4, 8);
|
||||||
|
@ -197,20 +199,18 @@ void decodeBlockDxt45A(uint8_t _dst[16*4], const uint8_t _src[8])
|
||||||
alpha[7] = 255;
|
alpha[7] = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t ii = 3, next = 8*2; ii < 16*4; ii += 4, ++next)
|
uint32_t idx0 = _src[2];
|
||||||
|
uint32_t idx1 = _src[5];
|
||||||
|
idx0 |= uint32_t(_src[3])<<8;
|
||||||
|
idx1 |= uint32_t(_src[6])<<8;
|
||||||
|
idx0 |= uint32_t(_src[4])<<16;
|
||||||
|
idx1 |= uint32_t(_src[7])<<16;
|
||||||
|
for (uint32_t ii = 0; ii < 8*4; ii += 4)
|
||||||
{
|
{
|
||||||
uint32_t bit = (_src[next>>3] >> (next&7) ) & 1;
|
_dst[ii] = alpha[idx0&7];
|
||||||
uint32_t idx = bit;
|
_dst[ii+32] = alpha[idx1&7];
|
||||||
++next;
|
idx0 >>= 3;
|
||||||
|
idx1 >>= 3;
|
||||||
bit = (_src[next>>3] >> (next&7) ) & 1;
|
|
||||||
idx += bit << 1;
|
|
||||||
++next;
|
|
||||||
|
|
||||||
bit = (_src[next>>3] >> (next&7) ) & 1;
|
|
||||||
idx += bit << 2;
|
|
||||||
|
|
||||||
_dst[ii] = alpha[idx & 7];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,7 +233,7 @@ void Mip::decode(uint8_t* _dst)
|
||||||
|
|
||||||
switch (m_type)
|
switch (m_type)
|
||||||
{
|
{
|
||||||
case TextureFormat::Dxt1:
|
case TextureFormat::BC1:
|
||||||
for (uint32_t yy = 0; yy < height; ++yy)
|
for (uint32_t yy = 0; yy < height; ++yy)
|
||||||
{
|
{
|
||||||
for (uint32_t xx = 0; xx < width; ++xx)
|
for (uint32_t xx = 0; xx < width; ++xx)
|
||||||
|
@ -242,46 +242,91 @@ void Mip::decode(uint8_t* _dst)
|
||||||
src += 8;
|
src += 8;
|
||||||
|
|
||||||
uint8_t* dst = &_dst[(yy*pitch+xx*4)*4];
|
uint8_t* dst = &_dst[(yy*pitch+xx*4)*4];
|
||||||
memcpy(dst, temp, 16);
|
memcpy(&dst[0*pitch], &temp[ 0], 16);
|
||||||
memcpy(&dst[pitch], &temp[16], 16);
|
memcpy(&dst[1*pitch], &temp[16], 16);
|
||||||
memcpy(&dst[2*pitch], &temp[32], 16);
|
memcpy(&dst[2*pitch], &temp[32], 16);
|
||||||
memcpy(&dst[3*pitch], &temp[48], 16);
|
memcpy(&dst[3*pitch], &temp[48], 16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TextureFormat::Dxt3:
|
case TextureFormat::BC2:
|
||||||
for (uint32_t yy = 0; yy < height; ++yy)
|
for (uint32_t yy = 0; yy < height; ++yy)
|
||||||
{
|
{
|
||||||
for (uint32_t xx = 0; xx < width; ++xx)
|
for (uint32_t xx = 0; xx < width; ++xx)
|
||||||
{
|
{
|
||||||
decodeBlockDxt23A(temp, src);
|
decodeBlockDxt23A(temp+3, src);
|
||||||
src += 8;
|
src += 8;
|
||||||
decodeBlockDxt(temp, src);
|
decodeBlockDxt(temp, src);
|
||||||
src += 8;
|
src += 8;
|
||||||
|
|
||||||
uint8_t* dst = &_dst[(yy*pitch+xx*4)*4];
|
uint8_t* dst = &_dst[(yy*pitch+xx*4)*4];
|
||||||
memcpy(dst, temp, 16);
|
memcpy(&dst[0*pitch], &temp[ 0], 16);
|
||||||
memcpy(&dst[pitch], &temp[16], 16);
|
memcpy(&dst[1*pitch], &temp[16], 16);
|
||||||
memcpy(&dst[2*pitch], &temp[32], 16);
|
memcpy(&dst[2*pitch], &temp[32], 16);
|
||||||
memcpy(&dst[3*pitch], &temp[48], 16);
|
memcpy(&dst[3*pitch], &temp[48], 16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TextureFormat::Dxt5:
|
case TextureFormat::BC3:
|
||||||
|
for (uint32_t yy = 0; yy < height; ++yy)
|
||||||
|
{
|
||||||
|
for (uint32_t xx = 0; xx < width; ++xx)
|
||||||
|
{
|
||||||
|
decodeBlockDxt45A(temp+3, src);
|
||||||
|
src += 8;
|
||||||
|
decodeBlockDxt(temp, src);
|
||||||
|
src += 8;
|
||||||
|
|
||||||
|
uint8_t* dst = &_dst[(yy*pitch+xx*4)*4];
|
||||||
|
memcpy(&dst[0*pitch], &temp[ 0], 16);
|
||||||
|
memcpy(&dst[1*pitch], &temp[16], 16);
|
||||||
|
memcpy(&dst[2*pitch], &temp[32], 16);
|
||||||
|
memcpy(&dst[3*pitch], &temp[48], 16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TextureFormat::BC4:
|
||||||
for (uint32_t yy = 0; yy < height; ++yy)
|
for (uint32_t yy = 0; yy < height; ++yy)
|
||||||
{
|
{
|
||||||
for (uint32_t xx = 0; xx < width; ++xx)
|
for (uint32_t xx = 0; xx < width; ++xx)
|
||||||
{
|
{
|
||||||
decodeBlockDxt45A(temp, src);
|
decodeBlockDxt45A(temp, src);
|
||||||
src += 8;
|
src += 8;
|
||||||
decodeBlockDxt(temp, src);
|
|
||||||
src += 8;
|
|
||||||
|
|
||||||
uint8_t* dst = &_dst[(yy*pitch+xx*4)*4];
|
uint8_t* dst = &_dst[(yy*pitch+xx*4)*4];
|
||||||
memcpy(dst, temp, 16);
|
memcpy(&dst[0*pitch], &temp[ 0], 16);
|
||||||
memcpy(&dst[pitch], &temp[16], 16);
|
memcpy(&dst[1*pitch], &temp[16], 16);
|
||||||
|
memcpy(&dst[2*pitch], &temp[32], 16);
|
||||||
|
memcpy(&dst[3*pitch], &temp[48], 16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TextureFormat::BC5:
|
||||||
|
for (uint32_t yy = 0; yy < height; ++yy)
|
||||||
|
{
|
||||||
|
for (uint32_t xx = 0; xx < width; ++xx)
|
||||||
|
{
|
||||||
|
decodeBlockDxt45A(temp+1, src);
|
||||||
|
src += 8;
|
||||||
|
decodeBlockDxt45A(temp+2, src);
|
||||||
|
src += 8;
|
||||||
|
|
||||||
|
for (uint32_t ii = 0; ii < 16; ++ii)
|
||||||
|
{
|
||||||
|
float nx = temp[ii*4+2]*2.0f/255.0f - 1.0f;
|
||||||
|
float ny = temp[ii*4+1]*2.0f/255.0f - 1.0f;
|
||||||
|
float nz = sqrtf(1.0f - nx*nx - ny*ny);
|
||||||
|
temp[ii*4+0] = uint8_t( (nz + 1.0f)*255.0f/2.0f);
|
||||||
|
temp[ii*4+3] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* dst = &_dst[(yy*pitch+xx*4)*4];
|
||||||
|
memcpy(&dst[0*pitch], &temp[ 0], 16);
|
||||||
|
memcpy(&dst[1*pitch], &temp[16], 16);
|
||||||
memcpy(&dst[2*pitch], &temp[32], 16);
|
memcpy(&dst[2*pitch], &temp[32], 16);
|
||||||
memcpy(&dst[3*pitch], &temp[48], 16);
|
memcpy(&dst[3*pitch], &temp[48], 16);
|
||||||
}
|
}
|
||||||
|
@ -417,21 +462,33 @@ bool parseDds(Dds& _dds, const Memory* _mem)
|
||||||
switch (fourcc)
|
switch (fourcc)
|
||||||
{
|
{
|
||||||
case DDS_DXT1:
|
case DDS_DXT1:
|
||||||
type = TextureFormat::Dxt1;
|
type = TextureFormat::BC1;
|
||||||
blockSize = 8;
|
blockSize = 8;
|
||||||
bpp = 4;
|
bpp = 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DDS_DXT2:
|
case DDS_DXT2:
|
||||||
case DDS_DXT3:
|
case DDS_DXT3:
|
||||||
type = TextureFormat::Dxt3;
|
type = TextureFormat::BC2;
|
||||||
blockSize = 16;
|
blockSize = 16;
|
||||||
bpp = 4;
|
bpp = 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DDS_DXT4:
|
case DDS_DXT4:
|
||||||
case DDS_DXT5:
|
case DDS_DXT5:
|
||||||
type = TextureFormat::Dxt5;
|
type = TextureFormat::BC3;
|
||||||
|
blockSize = 16;
|
||||||
|
bpp = 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DDS_ATI1:
|
||||||
|
type = TextureFormat::BC4;
|
||||||
|
blockSize = 16;
|
||||||
|
bpp = 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DDS_ATI2:
|
||||||
|
type = TextureFormat::BC5;
|
||||||
blockSize = 16;
|
blockSize = 16;
|
||||||
bpp = 4;
|
bpp = 4;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -152,6 +152,8 @@ namespace bgfx
|
||||||
{ DXGI_FORMAT_BC1_UNORM, 4 },
|
{ DXGI_FORMAT_BC1_UNORM, 4 },
|
||||||
{ DXGI_FORMAT_BC2_UNORM, 4 },
|
{ DXGI_FORMAT_BC2_UNORM, 4 },
|
||||||
{ DXGI_FORMAT_BC3_UNORM, 4 },
|
{ DXGI_FORMAT_BC3_UNORM, 4 },
|
||||||
|
{ DXGI_FORMAT_BC4_UNORM, 4 },
|
||||||
|
{ DXGI_FORMAT_BC5_UNORM, 4 },
|
||||||
{ DXGI_FORMAT_UNKNOWN, 0 },
|
{ DXGI_FORMAT_UNKNOWN, 0 },
|
||||||
{ DXGI_FORMAT_R8_UNORM, 8 },
|
{ DXGI_FORMAT_R8_UNORM, 8 },
|
||||||
{ DXGI_FORMAT_B8G8R8A8_UNORM, 32 },
|
{ DXGI_FORMAT_B8G8R8A8_UNORM, 32 },
|
||||||
|
|
|
@ -167,6 +167,8 @@ namespace bgfx
|
||||||
{ D3DFMT_DXT1, 4 },
|
{ D3DFMT_DXT1, 4 },
|
||||||
{ D3DFMT_DXT3, 4 },
|
{ D3DFMT_DXT3, 4 },
|
||||||
{ D3DFMT_DXT5, 4 },
|
{ D3DFMT_DXT5, 4 },
|
||||||
|
{ D3DFMT_ATI1, 4 },
|
||||||
|
{ D3DFMT_ATI2, 4 },
|
||||||
{ D3DFMT_UNKNOWN, 0 },
|
{ D3DFMT_UNKNOWN, 0 },
|
||||||
{ D3DFMT_L8, 8 },
|
{ D3DFMT_L8, 8 },
|
||||||
{ D3DFMT_X8R8G8B8, 32 },
|
{ D3DFMT_X8R8G8B8, 32 },
|
||||||
|
@ -357,7 +359,7 @@ namespace bgfx
|
||||||
if (m_amd
|
if (m_amd
|
||||||
&& s_extendedFormats[ExtendedFormat::Inst].m_supported)
|
&& s_extendedFormats[ExtendedFormat::Inst].m_supported)
|
||||||
{
|
{
|
||||||
// ATi only
|
// AMD only
|
||||||
m_device->SetRenderState(D3DRS_POINTSIZE, D3DFMT_INST);
|
m_device->SetRenderState(D3DRS_POINTSIZE, D3DFMT_INST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1360,23 +1362,27 @@ namespace bgfx
|
||||||
m_format = dds.m_type;
|
m_format = dds.m_type;
|
||||||
const TextureFormatInfo& tfi = s_textureFormat[dds.m_type];
|
const TextureFormatInfo& tfi = s_textureFormat[dds.m_type];
|
||||||
|
|
||||||
bool decompress = false;
|
bool decompress = false
|
||||||
|
|| (TextureFormat::BC4 == dds.m_type && !s_extendedFormats[ExtendedFormat::Ati1].m_supported)
|
||||||
|
|| (TextureFormat::BC5 == dds.m_type && !s_extendedFormats[ExtendedFormat::Ati2].m_supported)
|
||||||
|
;
|
||||||
|
|
||||||
|
D3DFORMAT format = decompress ? D3DFMT_A8R8G8B8 : tfi.m_fmt;
|
||||||
|
uint8_t bpp = decompress ? 32 : tfi.m_bpp;
|
||||||
|
|
||||||
if (dds.m_cubeMap)
|
if (dds.m_cubeMap)
|
||||||
{
|
{
|
||||||
createCubeTexture(dds.m_width, dds.m_numMips, tfi.m_fmt);
|
createCubeTexture(dds.m_width, dds.m_numMips, format);
|
||||||
}
|
}
|
||||||
else if (dds.m_depth > 1)
|
else if (dds.m_depth > 1)
|
||||||
{
|
{
|
||||||
createVolumeTexture(dds.m_width, dds.m_height, dds.m_depth, dds.m_numMips, tfi.m_fmt);
|
createVolumeTexture(dds.m_width, dds.m_height, dds.m_depth, dds.m_numMips, format);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
createTexture(dds.m_width, dds.m_height, dds.m_numMips, tfi.m_fmt);
|
createTexture(dds.m_width, dds.m_height, dds.m_numMips, format);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t bpp = tfi.m_bpp;
|
|
||||||
|
|
||||||
if (decompress
|
if (decompress
|
||||||
|| TextureFormat::Unknown < dds.m_type)
|
|| TextureFormat::Unknown < dds.m_type)
|
||||||
{
|
{
|
||||||
|
|
|
@ -71,43 +71,43 @@ namespace bgfx
|
||||||
#endif // BGFX_CONFIG_DEBUG_PIX
|
#endif // BGFX_CONFIG_DEBUG_PIX
|
||||||
|
|
||||||
# ifndef D3DFMT_ATI1
|
# ifndef D3DFMT_ATI1
|
||||||
# define D3DFMT_ATI1 ( (D3DFORMAT)BX_MAKEFOURCC('A','T','I','1') )
|
# define D3DFMT_ATI1 ( (D3DFORMAT)BX_MAKEFOURCC('A', 'T', 'I', '1') )
|
||||||
# endif // D3DFMT_ATI1
|
# endif // D3DFMT_ATI1
|
||||||
|
|
||||||
# ifndef D3DFMT_ATI2
|
# ifndef D3DFMT_ATI2
|
||||||
# define D3DFMT_ATI2 ( (D3DFORMAT)BX_MAKEFOURCC('A','T','I','2') )
|
# define D3DFMT_ATI2 ( (D3DFORMAT)BX_MAKEFOURCC('A', 'T', 'I', '2') )
|
||||||
# endif // D3DFMT_ATI2
|
# endif // D3DFMT_ATI2
|
||||||
|
|
||||||
# ifndef D3DFMT_ATOC
|
# ifndef D3DFMT_ATOC
|
||||||
# define D3DFMT_ATOC ( (D3DFORMAT)BX_MAKEFOURCC('A','T','O','C') )
|
# define D3DFMT_ATOC ( (D3DFORMAT)BX_MAKEFOURCC('A', 'T', 'O', 'C') )
|
||||||
# endif // D3DFMT_ATOC
|
# endif // D3DFMT_ATOC
|
||||||
|
|
||||||
# ifndef D3DFMT_DF16
|
# ifndef D3DFMT_DF16
|
||||||
# define D3DFMT_DF16 ( (D3DFORMAT)BX_MAKEFOURCC('D','F','1','6') )
|
# define D3DFMT_DF16 ( (D3DFORMAT)BX_MAKEFOURCC('D', 'F', '1', '6') )
|
||||||
# endif // D3DFMT_DF16
|
# endif // D3DFMT_DF16
|
||||||
|
|
||||||
# ifndef D3DFMT_DF24
|
# ifndef D3DFMT_DF24
|
||||||
# define D3DFMT_DF24 ( (D3DFORMAT)BX_MAKEFOURCC('D','F','2','4') )
|
# define D3DFMT_DF24 ( (D3DFORMAT)BX_MAKEFOURCC('D', 'F', '2', '4') )
|
||||||
# endif // D3DFMT_DF24
|
# endif // D3DFMT_DF24
|
||||||
|
|
||||||
# ifndef D3DFMT_INST
|
# ifndef D3DFMT_INST
|
||||||
# define D3DFMT_INST ( (D3DFORMAT)BX_MAKEFOURCC('I','N','S','T') )
|
# define D3DFMT_INST ( (D3DFORMAT)BX_MAKEFOURCC('I', 'N', 'S', 'T') )
|
||||||
# endif // D3DFMT_INST
|
# endif // D3DFMT_INST
|
||||||
|
|
||||||
# ifndef D3DFMT_INTZ
|
# ifndef D3DFMT_INTZ
|
||||||
# define D3DFMT_INTZ ( (D3DFORMAT)BX_MAKEFOURCC('I','N','T','Z') )
|
# define D3DFMT_INTZ ( (D3DFORMAT)BX_MAKEFOURCC('I', 'N', 'T', 'Z') )
|
||||||
# endif // D3DFMT_INTZ
|
# endif // D3DFMT_INTZ
|
||||||
|
|
||||||
# ifndef D3DFMT_NULL
|
# ifndef D3DFMT_NULL
|
||||||
# define D3DFMT_NULL ( (D3DFORMAT)BX_MAKEFOURCC('N','U','L','L') )
|
# define D3DFMT_NULL ( (D3DFORMAT)BX_MAKEFOURCC('N', 'U', 'L', 'L') )
|
||||||
# endif // D3DFMT_NULL
|
# endif // D3DFMT_NULL
|
||||||
|
|
||||||
# ifndef D3DFMT_RESZ
|
# ifndef D3DFMT_RESZ
|
||||||
# define D3DFMT_RESZ ( (D3DFORMAT)BX_MAKEFOURCC('R','E','S','Z') )
|
# define D3DFMT_RESZ ( (D3DFORMAT)BX_MAKEFOURCC('R', 'E', 'S', 'Z') )
|
||||||
# endif // D3DFMT_RESZ
|
# endif // D3DFMT_RESZ
|
||||||
|
|
||||||
# ifndef D3DFMT_RAWZ
|
# ifndef D3DFMT_RAWZ
|
||||||
# define D3DFMT_RAWZ ( (D3DFORMAT)BX_MAKEFOURCC('R','A','W','Z') )
|
# define D3DFMT_RAWZ ( (D3DFORMAT)BX_MAKEFOURCC('R', 'A', 'W', 'Z') )
|
||||||
# endif // D3DFMT_RAWZ
|
# endif // D3DFMT_RAWZ
|
||||||
|
|
||||||
struct ExtendedFormat
|
struct ExtendedFormat
|
||||||
|
|
|
@ -22,6 +22,7 @@ namespace bgfx
|
||||||
EXT_texture_compression_dxt1,
|
EXT_texture_compression_dxt1,
|
||||||
CHROMIUM_texture_compression_dxt3,
|
CHROMIUM_texture_compression_dxt3,
|
||||||
CHROMIUM_texture_compression_dxt5,
|
CHROMIUM_texture_compression_dxt5,
|
||||||
|
EXT_texture_compression_latc,
|
||||||
ARB_texture_float,
|
ARB_texture_float,
|
||||||
OES_texture_float,
|
OES_texture_float,
|
||||||
OES_texture_float_linear,
|
OES_texture_float_linear,
|
||||||
|
@ -70,6 +71,7 @@ namespace bgfx
|
||||||
{ "GL_EXT_texture_compression_dxt1", false, true },
|
{ "GL_EXT_texture_compression_dxt1", false, true },
|
||||||
{ "GL_CHROMIUM_texture_compression_dxt3", false, true },
|
{ "GL_CHROMIUM_texture_compression_dxt3", false, true },
|
||||||
{ "GL_CHROMIUM_texture_compression_dxt5", false, true },
|
{ "GL_CHROMIUM_texture_compression_dxt5", false, true },
|
||||||
|
{ "GL_EXT_texture_compression_latc", false, true },
|
||||||
{ "GL_ARB_texture_float", false, true },
|
{ "GL_ARB_texture_float", false, true },
|
||||||
{ "GL_OES_texture_float", false, true },
|
{ "GL_OES_texture_float", false, true },
|
||||||
{ "GL_OES_texture_float_linear", false, true },
|
{ "GL_OES_texture_float_linear", false, true },
|
||||||
|
@ -152,7 +154,6 @@ namespace bgfx
|
||||||
: m_capture(NULL)
|
: m_capture(NULL)
|
||||||
, m_captureSize(0)
|
, m_captureSize(0)
|
||||||
, m_maxAnisotropy(0.0f)
|
, m_maxAnisotropy(0.0f)
|
||||||
, m_dxtSupport(false)
|
|
||||||
, m_vaoSupport(false)
|
, m_vaoSupport(false)
|
||||||
, m_programBinarySupport(false)
|
, m_programBinarySupport(false)
|
||||||
, m_textureSwizzleSupport(false)
|
, m_textureSwizzleSupport(false)
|
||||||
|
@ -328,7 +329,6 @@ namespace bgfx
|
||||||
void* m_capture;
|
void* m_capture;
|
||||||
uint32_t m_captureSize;
|
uint32_t m_captureSize;
|
||||||
float m_maxAnisotropy;
|
float m_maxAnisotropy;
|
||||||
bool m_dxtSupport;
|
|
||||||
bool m_vaoSupport;
|
bool m_vaoSupport;
|
||||||
bool m_programBinarySupport;
|
bool m_programBinarySupport;
|
||||||
bool m_textureSwizzleSupport;
|
bool m_textureSwizzleSupport;
|
||||||
|
@ -521,26 +521,29 @@ namespace bgfx
|
||||||
GLenum m_fmt;
|
GLenum m_fmt;
|
||||||
GLenum m_type;
|
GLenum m_type;
|
||||||
uint8_t m_bpp;
|
uint8_t m_bpp;
|
||||||
|
bool m_supported;
|
||||||
};
|
};
|
||||||
|
|
||||||
static TextureFormatInfo s_textureFormat[TextureFormat::Count] =
|
static TextureFormatInfo s_textureFormat[TextureFormat::Count] =
|
||||||
{
|
{
|
||||||
{ GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_ZERO, 4 },
|
{ GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_ZERO, 4, false },
|
||||||
{ GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_ZERO, 4 },
|
{ GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_ZERO, 4, false },
|
||||||
{ GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_ZERO, 4 },
|
{ GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_ZERO, 4, false },
|
||||||
{ GL_ZERO, GL_ZERO, GL_ZERO, 0 },
|
{ GL_COMPRESSED_LUMINANCE_LATC1_EXT, GL_COMPRESSED_LUMINANCE_LATC1_EXT, GL_ZERO, 4, false },
|
||||||
{ GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, 8 },
|
{ GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT, GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT, GL_ZERO, 4, false },
|
||||||
{ GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 32 },
|
{ GL_ZERO, GL_ZERO, GL_ZERO, 0, true },
|
||||||
{ GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 32 },
|
{ GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, 8, true },
|
||||||
|
{ GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 32, true },
|
||||||
|
{ GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 32, true },
|
||||||
#if BGFX_CONFIG_RENDERER_OPENGL
|
#if BGFX_CONFIG_RENDERER_OPENGL
|
||||||
{ GL_RGBA16, GL_RGBA, GL_HALF_FLOAT, 64 },
|
{ GL_RGBA16, GL_RGBA, GL_HALF_FLOAT, 64, true },
|
||||||
#else
|
#else
|
||||||
{ GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 64 },
|
{ GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 64, true },
|
||||||
#endif // BGFX_CONFIG_RENDERER_OPENGL
|
#endif // BGFX_CONFIG_RENDERER_OPENGL
|
||||||
{ GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 16 },
|
{ GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 16, true },
|
||||||
{ GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 16 },
|
{ GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 16, true },
|
||||||
{ GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, 16 },
|
{ GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, 16, true },
|
||||||
{ GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, 32 },
|
{ GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, 32, true },
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* glslTypeName(GLuint _type)
|
const char* glslTypeName(GLuint _type)
|
||||||
|
@ -1019,7 +1022,7 @@ namespace bgfx
|
||||||
target = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
|
target = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_renderCtx.m_dxtSupport
|
if (!tfi.m_supported
|
||||||
|| TextureFormat::Unknown < dds.m_type)
|
|| TextureFormat::Unknown < dds.m_type)
|
||||||
{
|
{
|
||||||
bool decompress = TextureFormat::Unknown > dds.m_type;
|
bool decompress = TextureFormat::Unknown > dds.m_type;
|
||||||
|
@ -1790,15 +1793,14 @@ namespace bgfx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
s_renderCtx.m_dxtSupport = true
|
bool dxtSupported = s_extension[Extension::EXT_texture_compression_s3tc].m_supported;
|
||||||
&& s_extension[Extension::EXT_texture_compression_dxt1].m_supported
|
s_textureFormat[TextureFormat::BC1].m_supported = dxtSupported || s_extension[Extension::EXT_texture_compression_dxt1].m_supported;
|
||||||
&& s_extension[Extension::CHROMIUM_texture_compression_dxt3].m_supported
|
s_textureFormat[TextureFormat::BC2].m_supported = dxtSupported || s_extension[Extension::CHROMIUM_texture_compression_dxt3].m_supported;
|
||||||
&& s_extension[Extension::CHROMIUM_texture_compression_dxt5].m_supported
|
s_textureFormat[TextureFormat::BC3].m_supported = dxtSupported || s_extension[Extension::CHROMIUM_texture_compression_dxt5].m_supported;
|
||||||
;
|
|
||||||
|
|
||||||
s_renderCtx.m_dxtSupport |=
|
bool latcSupported = s_extension[Extension::EXT_texture_compression_latc].m_supported;
|
||||||
s_extension[Extension::EXT_texture_compression_s3tc].m_supported
|
s_textureFormat[TextureFormat::BC4].m_supported = latcSupported;
|
||||||
;
|
s_textureFormat[TextureFormat::BC5].m_supported = latcSupported;
|
||||||
|
|
||||||
s_renderCtx.m_vaoSupport = !!BGFX_CONFIG_RENDERER_OPENGLES3
|
s_renderCtx.m_vaoSupport = !!BGFX_CONFIG_RENDERER_OPENGLES3
|
||||||
|| s_extension[Extension::ARB_vertex_array_object].m_supported
|
|| s_extension[Extension::ARB_vertex_array_object].m_supported
|
||||||
|
|
|
@ -123,6 +123,14 @@
|
||||||
# define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
|
# define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
|
||||||
# endif // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
|
# endif // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
|
||||||
|
|
||||||
|
# ifndef GL_COMPRESSED_LUMINANCE_LATC1_EXT
|
||||||
|
# define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70
|
||||||
|
# endif // GL_COMPRESSED_LUMINANCE_LATC1_EXT
|
||||||
|
|
||||||
|
# ifndef GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT
|
||||||
|
# define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72
|
||||||
|
# endif // GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT
|
||||||
|
|
||||||
# ifndef GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
|
# ifndef GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
|
||||||
# define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
|
# define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
|
||||||
# endif // GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
|
# endif // GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
|
||||||
|
|
Loading…
Reference in a new issue