bkaradzic il y a 12 ans
Parent
commit
fc01a51e0b
8 fichiers modifiés avec 281 ajouts et 60 suppressions
  1. 38 6
      include/bgfx.h
  2. 75 11
      src/bgfx.cpp
  3. 28 0
      src/image.cpp
  4. 9 0
      src/image.h
  5. 12 3
      src/renderer_d3d11.cpp
  6. 19 7
      src/renderer_d3d9.cpp
  7. 92 33
      src/renderer_gl.cpp
  8. 8 0
      src/renderer_gl.h

+ 38 - 6
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
 		};
 	};

+ 75 - 11
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.");
 	}
 

+ 28 - 0
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];

+ 9 - 0
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);
 

+ 12 - 3
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
 								);

+ 19 - 7
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
 

+ 92 - 33
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;
-
-		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
-							);
+		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.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) );

+ 8 - 0
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