diff --git a/include/bgfx.h b/include/bgfx.h index 2c4c333e..664e9116 100644 --- a/include/bgfx.h +++ b/include/bgfx.h @@ -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 }; }; diff --git a/src/bgfx.cpp b/src/bgfx.cpp index b1ba0d78..141a7584 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -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."); } diff --git a/src/image.cpp b/src/image.cpp index 8728c4fb..305a9ddc 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -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]; diff --git a/src/image.h b/src/image.h index 9738fcdd..0c4bfc2e 100644 --- a/src/image.h +++ b/src/image.h @@ -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); diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index d8aa9cd4..7eab917c 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -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 ); diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index c8d663f6..acdfe4b1 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -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 diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 5c77899c..45c85ea8 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -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) ); diff --git a/src/renderer_gl.h b/src/renderer_gl.h index 13009ce0..4d88128f 100644 --- a/src/renderer_gl.h +++ b/src/renderer_gl.h @@ -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