diff --git a/Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h b/Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h index 1e39c1e8cf..44313936d2 100644 --- a/Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h +++ b/Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h @@ -155,6 +155,15 @@ # define GL_MIRROR_CLAMP_TO_EDGE 0 #endif +// Define unsupported texture parameters +#ifndef GL_DEPTH_STENCIL_TEXTURE_MODE +# define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA +#endif + +#ifndef GL_STENCIL_INDEX +# define GL_STENCIL_INDEX 0x1901 +#endif + // Define unsupported bind points #ifndef GL_ARB_draw_indirect # define GL_ARB_draw_indirect 1 diff --git a/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h b/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h index 20b282b250..d4225093f4 100644 --- a/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h +++ b/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h @@ -170,6 +170,14 @@ # define GL_DEPTH_CLAMP 0x864F #endif +// Define unsupported texture parameters +#ifndef GL_DEPTH_STENCIL_TEXTURE_MODE +# define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA +#endif + +#ifndef GL_STENCIL_INDEX +# define GL_STENCIL_INDEX 0x1901 +#endif // Define unsupported formats for OpenGL ES #ifndef GL_RGBA16 diff --git a/Graphics/GraphicsEngineOpenGL/src/GLTypeConversions.cpp b/Graphics/GraphicsEngineOpenGL/src/GLTypeConversions.cpp index 9c911f7f9b..5de0314c34 100644 --- a/Graphics/GraphicsEngineOpenGL/src/GLTypeConversions.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/GLTypeConversions.cpp @@ -72,7 +72,7 @@ class FormatToGLInternalTexFormatMap m_FmtToGLFmtMap[TEX_FORMAT_R32G8X24_TYPELESS] = GL_DEPTH32F_STENCIL8; m_FmtToGLFmtMap[TEX_FORMAT_D32_FLOAT_S8X24_UINT] = GL_DEPTH32F_STENCIL8; m_FmtToGLFmtMap[TEX_FORMAT_R32_FLOAT_X8X24_TYPELESS]=GL_DEPTH32F_STENCIL8; - m_FmtToGLFmtMap[TEX_FORMAT_X32_TYPELESS_G8X24_UINT]= 0;//GL_DEPTH32F_STENCIL8; + m_FmtToGLFmtMap[TEX_FORMAT_X32_TYPELESS_G8X24_UINT]= GL_DEPTH32F_STENCIL8; m_FmtToGLFmtMap[TEX_FORMAT_RGB10A2_TYPELESS] = GL_RGB10_A2; m_FmtToGLFmtMap[TEX_FORMAT_RGB10A2_UNORM] = GL_RGB10_A2; @@ -102,7 +102,7 @@ class FormatToGLInternalTexFormatMap m_FmtToGLFmtMap[TEX_FORMAT_R24G8_TYPELESS] = GL_DEPTH24_STENCIL8; m_FmtToGLFmtMap[TEX_FORMAT_D24_UNORM_S8_UINT] = GL_DEPTH24_STENCIL8; m_FmtToGLFmtMap[TEX_FORMAT_R24_UNORM_X8_TYPELESS] = GL_DEPTH24_STENCIL8; - m_FmtToGLFmtMap[TEX_FORMAT_X24_TYPELESS_G8_UINT] = 0;//GL_DEPTH24_STENCIL8; + m_FmtToGLFmtMap[TEX_FORMAT_X24_TYPELESS_G8_UINT] = GL_DEPTH24_STENCIL8; m_FmtToGLFmtMap[TEX_FORMAT_RG8_TYPELESS] = GL_RG8; m_FmtToGLFmtMap[TEX_FORMAT_RG8_UNORM] = GL_RG8; diff --git a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp index e52596b94f..80e70b9108 100644 --- a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp @@ -1138,13 +1138,16 @@ void RenderDeviceGLImpl::FlagSupportedTexFormats() { const RenderDeviceInfo& DeviceInfo = GetDeviceInfo(); const bool bDekstopGL = DeviceInfo.Type == RENDER_DEVICE_TYPE_GL; + const bool bGL430OrAbove = DeviceInfo.Type == RENDER_DEVICE_TYPE_GL && DeviceInfo.APIVersion >= Version{4, 3}; const bool bGLES30OrAbove = DeviceInfo.Type == RENDER_DEVICE_TYPE_GLES && DeviceInfo.APIVersion >= Version{3, 0}; + const bool bGLES31OrAbove = DeviceInfo.Type == RENDER_DEVICE_TYPE_GLES && DeviceInfo.APIVersion >= Version{3, 1}; const bool bRGTC = CheckExtension("GL_EXT_texture_compression_rgtc") || CheckExtension("GL_ARB_texture_compression_rgtc"); const bool bBPTC = CheckExtension("GL_EXT_texture_compression_bptc") || CheckExtension("GL_ARB_texture_compression_bptc"); const bool bS3TC = CheckExtension("GL_EXT_texture_compression_s3tc") || CheckExtension("GL_WEBGL_compressed_texture_s3tc"); const bool bTexNorm16 = bDekstopGL || CheckExtension("GL_EXT_texture_norm16"); // Only for ES3.1+ const bool bTexSwizzle = bDekstopGL || bGLES30OrAbove || CheckExtension("GL_ARB_texture_swizzle"); + const bool bStencilTex = bGL430OrAbove || bGLES31OrAbove || CheckExtension("GL_ARB_stencil_texturing"); #if PLATFORM_WEB const bool bETC2 = CheckExtension("GL_WEBGL_compressed_texture_etc"); @@ -1253,7 +1256,7 @@ void RenderDeviceGLImpl::FlagSupportedTexFormats() FlagFormat(TEX_FORMAT_R32G8X24_TYPELESS, true ); FlagFormat(TEX_FORMAT_D32_FLOAT_S8X24_UINT, true, BIND_DEPTH_STENCIL ); FlagFormat(TEX_FORMAT_R32_FLOAT_X8X24_TYPELESS, true, TexBindFlags, bDekstopGL); - FlagFormat(TEX_FORMAT_X32_TYPELESS_G8X24_UINT, false ); + FlagFormat(TEX_FORMAT_X32_TYPELESS_G8X24_UINT, bStencilTex, BIND_SHADER_RESOURCE, false); FlagFormat(TEX_FORMAT_RGB10A2_TYPELESS, true ); FlagFormat(TEX_FORMAT_RGB10A2_UNORM, true, BindSrvRtvUav, true); FlagFormat(TEX_FORMAT_RGB10A2_UINT, true, BindSrvRtvUav ); @@ -1278,7 +1281,7 @@ void RenderDeviceGLImpl::FlagSupportedTexFormats() FlagFormat(TEX_FORMAT_R24G8_TYPELESS, true ); FlagFormat(TEX_FORMAT_D24_UNORM_S8_UINT, true, BIND_DEPTH_STENCIL ); FlagFormat(TEX_FORMAT_R24_UNORM_X8_TYPELESS, true, TexBindFlags, true); - FlagFormat(TEX_FORMAT_X24_TYPELESS_G8_UINT, false ); + FlagFormat(TEX_FORMAT_X24_TYPELESS_G8_UINT, bStencilTex, BIND_SHADER_RESOURCE, false); FlagFormat(TEX_FORMAT_RG8_TYPELESS, true ); FlagFormat(TEX_FORMAT_RG8_UNORM, true, U8BindFlags, true); FlagFormat(TEX_FORMAT_RG8_UINT, true, UI8BindFlags ); diff --git a/Graphics/GraphicsEngineOpenGL/src/TextureBaseGL.cpp b/Graphics/GraphicsEngineOpenGL/src/TextureBaseGL.cpp index 49dfaf507c..9c28a43809 100644 --- a/Graphics/GraphicsEngineOpenGL/src/TextureBaseGL.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/TextureBaseGL.cpp @@ -493,6 +493,28 @@ void TextureBaseGL::CreateViewInternal(const TextureViewDesc& OrigViewDesc, ITex DEV_CHECK_GL_ERROR_AND_THROW("Failed to create texture view"); pViewOGL->SetBindTarget(GLViewTarget); + if (ViewDesc.Format == TEX_FORMAT_X24_TYPELESS_G8_UINT || ViewDesc.Format == TEX_FORMAT_X32_TYPELESS_G8X24_UINT) + { + const TextureFormatInfo& FmtInfo = pDeviceGLImpl->GetTextureFormatInfo(ViewDesc.Format); + + if (FmtInfo.Supported) + { + RefCntAutoPtr pDeviceContext = pDeviceGLImpl->GetImmediateContext(0); + VERIFY(pDeviceContext, "Immediate device context has been destroyed"); + GLContextState& GLState = pDeviceContext->GetContextState(); + + GLState.BindTexture(-1, GLViewTarget, pViewOGL->GetHandle()); + glTexParameteri(GLViewTarget, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX); + DEV_CHECK_GL_ERROR("Failed to set GL_DEPTH_STENCIL_TEXTURE_MODE texture parameter"); + GLState.BindTexture(-1, GLViewTarget, GLObjectWrappers::GLTextureObj::Null()); + } + else + { + // Throw an error if the format is not supported + LOG_ERROR_AND_THROW("Format ", GetTextureFormatAttribs(ViewDesc.Format).Name, " is not supported"); + } + } + if (!IsIdentityComponentMapping(ViewDesc.Swizzle)) { RefCntAutoPtr pDeviceContext = pDeviceGLImpl->GetImmediateContext(0);