This commit is contained in:
bkaradzic 2014-01-12 14:54:58 -08:00
commit fc01a51e0b
8 changed files with 280 additions and 59 deletions

View file

@ -252,11 +252,30 @@
#define BGFX_CAPS_TEXTURE_FORMAT_PTC12A UINT64_C(0x0000000000001000)
#define BGFX_CAPS_TEXTURE_FORMAT_PTC22 UINT64_C(0x0000000000002000)
#define BGFX_CAPS_TEXTURE_FORMAT_PTC24 UINT64_C(0x0000000000004000)
#define BGFX_CAPS_TEXTURE_3D UINT64_C(0x0000000000010000)
#define BGFX_CAPS_VERTEX_ATTRIB_HALF UINT64_C(0x0000000000020000)
#define BGFX_CAPS_INSTANCING UINT64_C(0x0000000000040000)
#define BGFX_CAPS_RENDERER_MULTITHREADED UINT64_C(0x0000000000080000)
#define BGFX_CAPS_FRAGMENT_DEPTH UINT64_C(0x0000000000100000)
#define BGFX_CAPS_TEXTURE_FORMAT_D16 UINT64_C(0x0000000000008000)
#define BGFX_CAPS_TEXTURE_FORMAT_D24 UINT64_C(0x0000000000010000)
#define BGFX_CAPS_TEXTURE_FORMAT_D24S8 UINT64_C(0x0000000000020000)
#define BGFX_CAPS_TEXTURE_FORMAT_D32 UINT64_C(0x0000000000040000)
#define BGFX_CAPS_TEXTURE_FORMAT_D16F UINT64_C(0x0000000000080000)
#define BGFX_CAPS_TEXTURE_FORMAT_D24F UINT64_C(0x0000000000100000)
#define BGFX_CAPS_TEXTURE_FORMAT_D32F UINT64_C(0x0000000000200000)
#define BGFX_CAPS_TEXTURE_FORMAT_D0S8 UINT64_C(0x0000000000400000)
#define BGFX_CAPS_TEXTURE_3D UINT64_C(0x0000000001000000)
#define BGFX_CAPS_VERTEX_ATTRIB_HALF UINT64_C(0x0000000004000000)
#define BGFX_CAPS_INSTANCING UINT64_C(0x0000000008000000)
#define BGFX_CAPS_RENDERER_MULTITHREADED UINT64_C(0x0000000010000000)
#define BGFX_CAPS_FRAGMENT_DEPTH UINT64_C(0x0000000020000000)
#define BGFX_CAPS_TEXTURE_DEPTH_MASK (0 \
| BGFX_CAPS_TEXTURE_FORMAT_D16 \
| BGFX_CAPS_TEXTURE_FORMAT_D24 \
| BGFX_CAPS_TEXTURE_FORMAT_D24S8 \
| BGFX_CAPS_TEXTURE_FORMAT_D32 \
| BGFX_CAPS_TEXTURE_FORMAT_D16F \
| BGFX_CAPS_TEXTURE_FORMAT_D24F \
| BGFX_CAPS_TEXTURE_FORMAT_D32F \
| BGFX_CAPS_TEXTURE_FORMAT_D0S8 \
)
///
#define BGFX_HANDLE(_name) \
@ -355,7 +374,9 @@ namespace bgfx
PTC12A, // PVRTC1 RGBA 2BPP
PTC22, // PVRTC2 RGBA 2BPP
PTC24, // PVRTC2 RGBA 4BPP
Unknown,
Unknown, // compressed formats above
L8,
BGRA8,
RGBA16,
@ -365,6 +386,17 @@ namespace bgfx
RGB5A1,
RGB10A2,
UnknownDepth, // depth formats below
D16,
D24,
D24S8,
D32,
D16F,
D24F,
D32F,
D0S8,
Count
};
};

View file

@ -657,6 +657,48 @@ namespace bgfx
#endif // BGFX_CONFIG_RENDERER_
}
struct CapsFlags
{
uint64_t m_flag;
const char* m_str;
};
static const CapsFlags s_capsFlags[] =
{
#define CAPS_FLAGS(_x) { _x, #_x }
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_BC1),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_BC2),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_BC3),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_BC4),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_BC5),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_ETC1),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_ETC2),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_ETC2A),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_ETC2A1),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_PTC12),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_PTC14),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_PTC14A),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_PTC12A),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_PTC22),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_PTC24),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_D16),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_D24),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_D24S8),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_D32),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_D16F),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_D24F),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_D32F),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_FORMAT_D0S8),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_3D),
CAPS_FLAGS(BGFX_CAPS_VERTEX_ATTRIB_HALF),
CAPS_FLAGS(BGFX_CAPS_INSTANCING),
CAPS_FLAGS(BGFX_CAPS_RENDERER_MULTITHREADED),
CAPS_FLAGS(BGFX_CAPS_FRAGMENT_DEPTH),
#undef CAPS_FLAGS
};
void init(CallbackI* _callback, bx::ReallocatorI* _allocator)
{
BX_TRACE("Init...");
@ -666,17 +708,7 @@ namespace bgfx
g_caps.supported = 0
| (BGFX_CONFIG_MULTITHREADED ? BGFX_CAPS_RENDERER_MULTITHREADED : 0)
;
g_caps.emulated = 0
| BGFX_CAPS_TEXTURE_FORMAT_BC1
| BGFX_CAPS_TEXTURE_FORMAT_BC2
| BGFX_CAPS_TEXTURE_FORMAT_BC3
| BGFX_CAPS_TEXTURE_FORMAT_BC4
| BGFX_CAPS_TEXTURE_FORMAT_BC5
| BGFX_CAPS_TEXTURE_FORMAT_ETC1
| BGFX_CAPS_TEXTURE_FORMAT_ETC2
| BGFX_CAPS_TEXTURE_FORMAT_ETC2A
| BGFX_CAPS_TEXTURE_FORMAT_ETC2A1
;
g_caps.emulated = 0;
g_caps.maxDrawCalls = BGFX_CONFIG_MAX_DRAW_CALLS;
if (NULL != _allocator)
@ -707,6 +739,38 @@ namespace bgfx
// On NaCl and iOS renderer is on the main thread.
s_ctx->init(!BX_PLATFORM_NACL && !BX_PLATFORM_IOS && !BX_PLATFORM_OSX);
const uint64_t emulatedCaps = 0
| BGFX_CAPS_TEXTURE_FORMAT_BC1
| BGFX_CAPS_TEXTURE_FORMAT_BC2
| BGFX_CAPS_TEXTURE_FORMAT_BC3
| BGFX_CAPS_TEXTURE_FORMAT_BC4
| BGFX_CAPS_TEXTURE_FORMAT_BC5
| BGFX_CAPS_TEXTURE_FORMAT_ETC1
| BGFX_CAPS_TEXTURE_FORMAT_ETC2
| BGFX_CAPS_TEXTURE_FORMAT_ETC2A
| BGFX_CAPS_TEXTURE_FORMAT_ETC2A1
;
g_caps.emulated |= emulatedCaps ^ (g_caps.supported & emulatedCaps);
BX_TRACE("Supported capabilities:");
for (uint32_t ii = 0; ii < BX_COUNTOF(s_capsFlags); ++ii)
{
if (0 != (g_caps.supported & s_capsFlags[ii].m_flag) )
{
BX_TRACE("\t%s", s_capsFlags[ii].m_str);
}
}
BX_TRACE("Emulated capabilities:");
for (uint32_t ii = 0; ii < BX_COUNTOF(s_capsFlags); ++ii)
{
if (0 != (g_caps.emulated & s_capsFlags[ii].m_flag) )
{
BX_TRACE("\t%s", s_capsFlags[ii].m_str);
}
}
BX_TRACE("Init complete.");
}

View file

@ -37,8 +37,36 @@ namespace bgfx
16, // RGBA4
16, // RGB5A1
32, // RGB10A2
0, // UnknownDepth
16, // D16
24, // D24
32, // D24S8
32, // D32
16, // D16F
24, // D24F
32, // D32F
8, // D0S8
};
bool isCompressed(TextureFormat::Enum _format)
{
return _format < TextureFormat::Unknown;
}
bool isColor(TextureFormat::Enum _format)
{
return _format > TextureFormat::Unknown
&& _format < TextureFormat::UnknownDepth
;
}
bool isDepth(TextureFormat::Enum _format)
{
return _format > TextureFormat::UnknownDepth
&& _format < TextureFormat::Count
;
}
uint32_t getBitsPerPixel(TextureFormat::Enum _format)
{
return s_bitsPerPixel[_format];

View file

@ -39,6 +39,15 @@ namespace bgfx
const uint8_t* m_data;
};
///
bool isCompressed(TextureFormat::Enum _format);
///
bool isColor(TextureFormat::Enum _format);
///
bool isDepth(TextureFormat::Enum _format);
///
uint32_t getBitsPerPixel(TextureFormat::Enum _format);

View file

@ -214,6 +214,15 @@ namespace bgfx
{ DXGI_FORMAT_B4G4R4A4_UNORM }, // RGBA4
{ DXGI_FORMAT_B5G5R5A1_UNORM }, // RGB5A1
{ DXGI_FORMAT_R10G10B10A2_UNORM }, // RGB10A2
{ DXGI_FORMAT_UNKNOWN }, // UnknownDepth
{ DXGI_FORMAT_D16_UNORM }, // D16
{ DXGI_FORMAT_D24_UNORM_S8_UINT }, // D24
{ DXGI_FORMAT_D24_UNORM_S8_UINT }, // D24S8
{ DXGI_FORMAT_D24_UNORM_S8_UINT }, // D32
{ DXGI_FORMAT_D32_FLOAT, }, // D16F
{ DXGI_FORMAT_D32_FLOAT, }, // D24F
{ DXGI_FORMAT_D32_FLOAT, }, // D32F
{ DXGI_FORMAT_D24_UNORM_S8_UINT }, // D0S8
};
static const D3D11_INPUT_ELEMENT_DESC s_attrib[Attrib::Count] =
@ -488,15 +497,15 @@ namespace bgfx
m_uniformReg.add(getPredefinedUniformName(PredefinedUniform::Enum(ii) ), &m_predefinedUniforms[ii]);
}
g_caps.emulated &= ~( 0
g_caps.supported |= ( 0
| BGFX_CAPS_TEXTURE_FORMAT_BC1
| BGFX_CAPS_TEXTURE_FORMAT_BC2
| BGFX_CAPS_TEXTURE_FORMAT_BC3
| BGFX_CAPS_TEXTURE_FORMAT_BC4
);
g_caps.supported |= ( 0
| BGFX_CAPS_TEXTURE_FORMAT_BC5
| BGFX_CAPS_INSTANCING
| BGFX_CAPS_TEXTURE_3D
| BGFX_CAPS_TEXTURE_DEPTH_MASK
| BGFX_CAPS_VERTEX_ATTRIB_HALF
| BGFX_CAPS_FRAGMENT_DEPTH
);

View file

@ -222,6 +222,19 @@ namespace bgfx
{ D3DFMT_A4R4G4B4 }, // RGBA4
{ D3DFMT_A1R5G5B5 }, // RGB5A1
{ D3DFMT_A2B10G10R10 }, // RGB10A2
{ D3DFMT_UNKNOWN }, // UnknownDepth
{ D3DFMT_D16 }, // D16
{ D3DFMT_D24X8 }, // D24
{ D3DFMT_D24S8 }, // D24S8
{ D3DFMT_D32 }, // D32
{ D3DFMT_DF16 }, // D16F
{ D3DFMT_DF24 }, // D24F
{ D3DFMT_D32F_LOCKABLE }, // D32F
#if defined(D3D_DISABLE_9EX)
{ D3DFMT_UNKNOWN }, // D0S8
#else
{ D3DFMT_S8_LOCKABLE }, // D0S8
#endif // defined(D3D_DISABLE_9EX)
};
static ExtendedFormat s_extendedFormats[ExtendedFormat::Count] =
@ -413,13 +426,12 @@ namespace bgfx
BX_TRACE("Max fragment shader 2.0 instr. slots: %d", m_caps.PS20Caps.NumInstructionSlots);
BX_TRACE("Max fragment shader 3.0 instr. slots: %d", m_caps.MaxPixelShader30InstructionSlots);
g_caps.emulated &= ~( 0
g_caps.supported |= ( 0
| BGFX_CAPS_TEXTURE_FORMAT_BC1
| BGFX_CAPS_TEXTURE_FORMAT_BC2
| BGFX_CAPS_TEXTURE_FORMAT_BC3
);
g_caps.supported |= ( 0
| BGFX_CAPS_TEXTURE_3D
| BGFX_CAPS_TEXTURE_DEPTH_MASK
| BGFX_CAPS_VERTEX_ATTRIB_HALF
| BGFX_CAPS_FRAGMENT_DEPTH
);
@ -451,10 +463,10 @@ namespace bgfx
s_textureFormat[TextureFormat::BC4].m_fmt = s_extendedFormats[ExtendedFormat::Ati1].m_supported ? D3DFMT_ATI1 : D3DFMT_UNKNOWN;
s_textureFormat[TextureFormat::BC5].m_fmt = s_extendedFormats[ExtendedFormat::Ati2].m_supported ? D3DFMT_ATI2 : D3DFMT_UNKNOWN;
g_caps.emulated &= ~( 0
| (D3DFMT_UNKNOWN != s_textureFormat[TextureFormat::BC4].m_fmt ? BGFX_CAPS_TEXTURE_FORMAT_BC4 : 0)
| (D3DFMT_UNKNOWN != s_textureFormat[TextureFormat::BC5].m_fmt ? BGFX_CAPS_TEXTURE_FORMAT_BC5 : 0)
);
g_caps.supported |= 0
| (D3DFMT_UNKNOWN != s_textureFormat[TextureFormat::BC4].m_fmt ? BGFX_CAPS_TEXTURE_FORMAT_BC4 : 0)
| (D3DFMT_UNKNOWN != s_textureFormat[TextureFormat::BC5].m_fmt ? BGFX_CAPS_TEXTURE_FORMAT_BC5 : 0)
;
g_caps.supported |= m_instancing ? BGFX_CAPS_INSTANCING : 0;
#endif // BGFX_CONFIG_RENDERER_USE_EXTENSIONS

View file

@ -231,6 +231,15 @@ namespace bgfx
{ GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, true }, // RGBA4
{ GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, true }, // RGB5A1
{ GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, true }, // RGB10A2
{ GL_ZERO, GL_ZERO, GL_ZERO, true }, // UnknownDepth
{ GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_SHORT, false }, // D16
{ GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, false }, // D24
{ GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, false }, // D24S8
{ GL_DEPTH_COMPONENT32, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, false }, // D32
{ GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, false }, // D16F
{ GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, false }, // D24F
{ GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, false }, // D32F
{ GL_STENCIL_INDEX8, GL_DEPTH_STENCIL, GL_UNSIGNED_BYTE, false }, // D0S8
};
struct Extension
@ -251,6 +260,7 @@ namespace bgfx
ARB_multisample,
ARB_sampler_objects,
ARB_seamless_cube_map,
ARB_texture_compression_rgtc,
ARB_texture_float,
ARB_texture_multisample,
ARB_texture_swizzle,
@ -258,6 +268,7 @@ namespace bgfx
ARB_vertex_array_object,
ARB_vertex_type_2_10_10_10_rev,
ATI_meminfo,
CHROMIUM_depth_texture,
CHROMIUM_framebuffer_multisample,
CHROMIUM_texture_compression_dxt3,
CHROMIUM_texture_compression_dxt5,
@ -282,6 +293,7 @@ namespace bgfx
EXT_texture_type_2_10_10_10_REV,
EXT_timer_query,
EXT_unpack_subimage,
GOOGLE_depth_texture,
IMG_multisampled_render_to_texture,
IMG_read_format,
IMG_shader_binary,
@ -334,6 +346,7 @@ namespace bgfx
{ "GL_ARB_multisample", false, true },
{ "GL_ARB_sampler_objects", BGFX_CONFIG_RENDERER_OPENGL >= 33, true },
{ "GL_ARB_seamless_cube_map", BGFX_CONFIG_RENDERER_OPENGL >= 32, true },
{ "GL_ARB_texture_compression_rgtc", BGFX_CONFIG_RENDERER_OPENGL >= 30, true },
{ "GL_ARB_texture_float", BGFX_CONFIG_RENDERER_OPENGL >= 30, true },
{ "GL_ARB_texture_multisample", BGFX_CONFIG_RENDERER_OPENGL >= 32, true },
{ "GL_ARB_texture_swizzle", BGFX_CONFIG_RENDERER_OPENGL >= 33, true },
@ -341,6 +354,7 @@ namespace bgfx
{ "GL_ARB_vertex_array_object", BGFX_CONFIG_RENDERER_OPENGL >= 30, true },
{ "GL_ARB_vertex_type_2_10_10_10_rev", false, true },
{ "GL_ATI_meminfo", false, true },
{ "GL_CHROMIUM_depth_texture", false, true },
{ "GL_CHROMIUM_framebuffer_multisample", false, true },
{ "GL_CHROMIUM_texture_compression_dxt3", false, true },
{ "GL_CHROMIUM_texture_compression_dxt5", false, true },
@ -365,6 +379,7 @@ namespace bgfx
{ "GL_EXT_texture_type_2_10_10_10_REV", false, true },
{ "GL_EXT_timer_query", false, true },
{ "GL_EXT_unpack_subimage", false, true },
{ "GL_GOOGLE_depth_texture", false, true },
{ "GL_IMG_multisampled_render_to_texture", false, true },
{ "GL_IMG_read_format", false, true },
{ "GL_IMG_shader_binary", false, true },
@ -550,6 +565,7 @@ namespace bgfx
, m_vaoSupport(BGFX_CONFIG_RENDERER_OPENGL >= 31)
, m_programBinarySupport(false)
, m_textureSwizzleSupport(false)
, m_depthTextureSupport(false)
, m_useClearQuad(true)
, m_flip(false)
, m_hash( (BX_PLATFORM_WINDOWS<<1) | BX_ARCH_64BIT)
@ -911,6 +927,7 @@ namespace bgfx
bool m_samplerObjectSupport;
bool m_programBinarySupport;
bool m_textureSwizzleSupport;
bool m_depthTextureSupport;
bool m_useClearQuad;
bool m_flip;
@ -1617,7 +1634,6 @@ namespace bgfx
GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) );
GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) );
// OpenGL ES 2.0 doesn't support GL_DEPTH_COMPONENT... this will fail.
GL_CHECK(glTexImage2D(m_target
, 0
, GL_DEPTH_COMPONENT
@ -2013,7 +2029,8 @@ namespace bgfx
}
#if 0 // GLES can't create texture with depth texture format...
if (0 < depthFormat)
if (s_renderCtx->m_depthTextureSupport
&& 0 < depthFormat)
{
m_depth.createDepth(_width, _height);
}
@ -2472,14 +2489,18 @@ namespace bgfx
s_renderCtx = BX_NEW(g_allocator, RendererContext);
s_renderCtx->init();
#if BGFX_CONFIG_DEBUG
GLint numCmpFormats;
GL_CHECK(glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numCmpFormats) );
BX_TRACE("GL_NUM_COMPRESSED_TEXTURE_FORMATS %d", numCmpFormats);
GLint* cmpFormat = NULL;
if (0 < numCmpFormats)
{
cmpFormat = (GLint*)alloca(sizeof(GLint)*numCmpFormats);
GL_CHECK(glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, cmpFormat) );
#if BGFX_CONFIG_DEBUG
static const char* s_textureFormatName[TextureFormat::Unknown+1] =
{
"BC1",
@ -2500,18 +2521,17 @@ namespace bgfx
"",
// TextureFormat::Count
};
GLint* formats = (GLint*)alloca(sizeof(GLint)*numCmpFormats);
GL_CHECK(glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, formats) );
#endif // BGFX_CONFIG_DEBUG
for (GLint ii = 0; ii < numCmpFormats; ++ii)
{
GLint internalFmt = formats[ii];
GLint internalFmt = cmpFormat[ii];
uint32_t fmt = uint32_t(TextureFormat::Unknown);
for (uint32_t jj = 0; jj < fmt; ++jj)
{
if (s_textureFormat[jj].m_internalFmt == (GLenum)internalFmt)
{
s_textureFormat[jj].m_supported = true;
fmt = jj;
}
}
@ -2520,6 +2540,7 @@ namespace bgfx
}
}
#if BGFX_CONFIG_DEBUG
# define GL_GET(_pname, _min) BX_TRACE(" " #_pname " %d (min: %d)", glGet(_pname), _min)
BX_TRACE("Defaults:");
@ -2613,28 +2634,46 @@ namespace bgfx
#endif // BGFX_CONFIG_RENDERER_OPENGL_USE_EXTENSIONS
bool bc123Supported = s_extension[Extension::EXT_texture_compression_s3tc].m_supported;
s_textureFormat[TextureFormat::BC1].m_supported = bc123Supported || s_extension[Extension::EXT_texture_compression_dxt1].m_supported;
s_textureFormat[TextureFormat::BC2].m_supported = bc123Supported || s_extension[Extension::CHROMIUM_texture_compression_dxt3].m_supported;
s_textureFormat[TextureFormat::BC3].m_supported = bc123Supported || s_extension[Extension::CHROMIUM_texture_compression_dxt5].m_supported;
s_textureFormat[TextureFormat::BC1].m_supported |= bc123Supported || s_extension[Extension::EXT_texture_compression_dxt1].m_supported;
if (!s_textureFormat[TextureFormat::BC1].m_supported
&& (s_textureFormat[TextureFormat::BC2].m_supported || s_textureFormat[TextureFormat::BC3].m_supported) )
{
// If RGBA_S3TC_DXT1 is not supported, maybe RGB_S3TC_DXT1 is?
for (GLint ii = 0; ii < numCmpFormats; ++ii)
{
if (GL_COMPRESSED_RGB_S3TC_DXT1_EXT == cmpFormat[ii])
{
s_textureFormat[TextureFormat::BC1].m_internalFmt = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
s_textureFormat[TextureFormat::BC1].m_fmt = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
s_textureFormat[TextureFormat::BC1].m_supported = true;
break;
}
}
}
s_textureFormat[TextureFormat::BC2].m_supported |= bc123Supported || s_extension[Extension::CHROMIUM_texture_compression_dxt3].m_supported;
s_textureFormat[TextureFormat::BC3].m_supported |= bc123Supported || s_extension[Extension::CHROMIUM_texture_compression_dxt5].m_supported;
bool bc45Supported = s_extension[Extension::EXT_texture_compression_latc].m_supported
|| s_extension[Extension::ARB_texture_compression_rgtc].m_supported
|| s_extension[Extension::EXT_texture_compression_rgtc].m_supported
;
s_textureFormat[TextureFormat::BC4].m_supported = bc45Supported;
s_textureFormat[TextureFormat::BC5].m_supported = bc45Supported;
s_textureFormat[TextureFormat::BC4].m_supported |= bc45Supported;
s_textureFormat[TextureFormat::BC5].m_supported |= bc45Supported;
bool etc1Supported = s_extension[Extension::OES_compressed_ETC1_RGB8_texture].m_supported;
s_textureFormat[TextureFormat::ETC1].m_supported = etc1Supported;
s_textureFormat[TextureFormat::ETC1].m_supported |= etc1Supported;
bool etc2Supported = !!BGFX_CONFIG_RENDERER_OPENGLES3
|| s_extension[Extension::ARB_ES3_compatibility].m_supported
;
s_textureFormat[TextureFormat::ETC2 ].m_supported = etc2Supported;
s_textureFormat[TextureFormat::ETC2A ].m_supported = etc2Supported;
s_textureFormat[TextureFormat::ETC2A1].m_supported = etc2Supported;
s_textureFormat[TextureFormat::ETC2 ].m_supported |= etc2Supported;
s_textureFormat[TextureFormat::ETC2A ].m_supported |= etc2Supported;
s_textureFormat[TextureFormat::ETC2A1].m_supported |= etc2Supported;
if (!s_textureFormat[TextureFormat::ETC1].m_supported
&& etc2Supported)
&& s_textureFormat[TextureFormat::ETC2].m_supported)
{
// When ETC2 is supported override ETC1 texture format settings.
s_textureFormat[TextureFormat::ETC1].m_internalFmt = GL_COMPRESSED_RGB8_ETC2;
@ -2643,23 +2682,35 @@ namespace bgfx
}
bool ptc1Supported = s_extension[Extension::IMG_texture_compression_pvrtc ].m_supported;
s_textureFormat[TextureFormat::PTC12].m_supported = ptc1Supported;
s_textureFormat[TextureFormat::PTC14].m_supported = ptc1Supported;
s_textureFormat[TextureFormat::PTC12A].m_supported = ptc1Supported;
s_textureFormat[TextureFormat::PTC14A].m_supported = ptc1Supported;
s_textureFormat[TextureFormat::PTC12 ].m_supported |= ptc1Supported;
s_textureFormat[TextureFormat::PTC14 ].m_supported |= ptc1Supported;
s_textureFormat[TextureFormat::PTC12A].m_supported |= ptc1Supported;
s_textureFormat[TextureFormat::PTC14A].m_supported |= ptc1Supported;
bool ptc2Supported = s_extension[Extension::IMG_texture_compression_pvrtc2].m_supported;
s_textureFormat[TextureFormat::PTC22].m_supported = ptc2Supported;
s_textureFormat[TextureFormat::PTC24].m_supported = ptc2Supported;
s_textureFormat[TextureFormat::PTC22].m_supported |= ptc2Supported;
s_textureFormat[TextureFormat::PTC24].m_supported |= ptc2Supported;
uint64_t supportedCompressedFormats = 0
| (s_textureFormat[TextureFormat::BC1 ].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_BC1 : 0)
| (s_textureFormat[TextureFormat::BC2 ].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_BC2 : 0)
| (s_textureFormat[TextureFormat::BC3 ].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_BC3 : 0)
| (s_textureFormat[TextureFormat::BC4 ].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_BC4 : 0)
| (s_textureFormat[TextureFormat::BC5 ].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_BC5 : 0)
| (s_textureFormat[TextureFormat::ETC1 ].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_ETC1 : 0)
| (s_textureFormat[TextureFormat::ETC2 ].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_ETC2 : 0)
| (s_textureFormat[TextureFormat::ETC2A ].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_ETC2A : 0)
| (s_textureFormat[TextureFormat::ETC2A1].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_ETC2A1 : 0)
| (s_textureFormat[TextureFormat::PTC12 ].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_PTC12 : 0)
| (s_textureFormat[TextureFormat::PTC14 ].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_PTC14 : 0)
| (s_textureFormat[TextureFormat::PTC14A].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_PTC14A : 0)
| (s_textureFormat[TextureFormat::PTC12A].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_PTC12A : 0)
| (s_textureFormat[TextureFormat::PTC22 ].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_PTC22 : 0)
| (s_textureFormat[TextureFormat::PTC24 ].m_supported ? BGFX_CAPS_TEXTURE_FORMAT_PTC24 : 0)
;
g_caps.supported |= supportedCompressedFormats;
g_caps.emulated &= ~( 0
| bc123Supported ? BGFX_CAPS_TEXTURE_FORMAT_BC1|BGFX_CAPS_TEXTURE_FORMAT_BC2|BGFX_CAPS_TEXTURE_FORMAT_BC3 : 0
| bc45Supported ? BGFX_CAPS_TEXTURE_FORMAT_BC4|BGFX_CAPS_TEXTURE_FORMAT_BC5 : 0
| etc1Supported ? BGFX_CAPS_TEXTURE_FORMAT_ETC1 : 0
| etc2Supported ? BGFX_CAPS_TEXTURE_FORMAT_ETC2|BGFX_CAPS_TEXTURE_FORMAT_ETC2A|BGFX_CAPS_TEXTURE_FORMAT_ETC2A1 : 0
| ptc1Supported ? BGFX_CAPS_TEXTURE_FORMAT_PTC12|BGFX_CAPS_TEXTURE_FORMAT_PTC14|BGFX_CAPS_TEXTURE_FORMAT_PTC14A|BGFX_CAPS_TEXTURE_FORMAT_PTC12A : 0
| ptc2Supported ? BGFX_CAPS_TEXTURE_FORMAT_PTC22|BGFX_CAPS_TEXTURE_FORMAT_PTC24 : 0
);
g_caps.supported |= !!(BGFX_CONFIG_RENDERER_OPENGL|BGFX_CONFIG_RENDERER_OPENGLES3)|s_extension[Extension::OES_texture_3D].m_supported
? BGFX_CAPS_TEXTURE_3D
: 0
@ -2706,6 +2757,14 @@ namespace bgfx
|| s_extension[Extension::EXT_texture_swizzle].m_supported
;
s_renderCtx->m_depthTextureSupport = !!(BGFX_CONFIG_RENDERER_OPENGL|BGFX_CONFIG_RENDERER_OPENGLES3)
|| s_extension[Extension::CHROMIUM_depth_texture].m_supported
|| s_extension[Extension::GOOGLE_depth_texture].m_supported
|| s_extension[Extension::OES_depth_texture].m_supported
;
g_caps.supported |= s_renderCtx->m_depthTextureSupport ? BGFX_CAPS_TEXTURE_DEPTH_MASK : 0;
if (s_extension[Extension::EXT_texture_filter_anisotropic].m_supported)
{
GL_CHECK(glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &s_renderCtx->m_maxAnisotropy) );

View file

@ -148,6 +148,10 @@ typedef void (*PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)(GLuint shader, GLsizei b
# define GL_RGBA16F 0x881A
#endif // GL_RGBA16F
#ifndef GL_COMPRESSED_RGB_S3TC_DXT1_EXT
# define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
#endif // GL_COMPRESSED_RGB_S3TC_DXT1_EXT
#ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
# define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
#endif // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
@ -265,6 +269,10 @@ typedef void (*PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)(GLuint shader, GLsizei b
# define GL_UNPACK_ROW_LENGTH 0x0CF2
#endif // GL_UNPACK_ROW_LENGTH
#ifndef GL_DEPTH_STENCIL
# define GL_DEPTH_STENCIL 0x84F9
#endif // GL_DEPTH_STENCIL
#ifndef GL_DEPTH_COMPONENT32
# define GL_DEPTH_COMPONENT32 0x81A7
#endif // GL_DEPTH_COMPONENT32