Skip to content

Commit 5530bc1

Browse files
authored
Enable stencil view support in OpenGL (close #689)
* Add TEX_FORMAT_X24_TYPELESS_G8_UINT, TEX_FORMAT_X32_TYPELESS_G8X24_UINT and GL_STENCIL_INDEX support * Fix typo * Add GL_ARB_stencil_texturing capability checking, and FormatInfo.Supported checking. * Add DEV_CHECK_GL_ERROR for glTexParameteri GL_DEPTH_STENCIL_TEXTURE_MODE. Add error thrown when format not supported * Fix formatting * Replace auto with actual type * Add missing definition for GL_DEPTH_STENCIL_TEXTURE_MODE and GL_STENCIL_INDEX for iOS and Android * Fix formatting in GLStubsIOS.h
1 parent 756fc8f commit 5530bc1

File tree

5 files changed

+46
-4
lines changed

5 files changed

+46
-4
lines changed

Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,15 @@
155155
# define GL_MIRROR_CLAMP_TO_EDGE 0
156156
#endif
157157

158+
// Define unsupported texture parameters
159+
#ifndef GL_DEPTH_STENCIL_TEXTURE_MODE
160+
# define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA
161+
#endif
162+
163+
#ifndef GL_STENCIL_INDEX
164+
# define GL_STENCIL_INDEX 0x1901
165+
#endif
166+
158167
// Define unsupported bind points
159168
#ifndef GL_ARB_draw_indirect
160169
# define GL_ARB_draw_indirect 1

Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,14 @@
170170
# define GL_DEPTH_CLAMP 0x864F
171171
#endif
172172

173+
// Define unsupported texture parameters
174+
#ifndef GL_DEPTH_STENCIL_TEXTURE_MODE
175+
# define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA
176+
#endif
177+
178+
#ifndef GL_STENCIL_INDEX
179+
# define GL_STENCIL_INDEX 0x1901
180+
#endif
173181

174182
// Define unsupported formats for OpenGL ES
175183
#ifndef GL_RGBA16

Graphics/GraphicsEngineOpenGL/src/GLTypeConversions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class FormatToGLInternalTexFormatMap
7272
m_FmtToGLFmtMap[TEX_FORMAT_R32G8X24_TYPELESS] = GL_DEPTH32F_STENCIL8;
7373
m_FmtToGLFmtMap[TEX_FORMAT_D32_FLOAT_S8X24_UINT] = GL_DEPTH32F_STENCIL8;
7474
m_FmtToGLFmtMap[TEX_FORMAT_R32_FLOAT_X8X24_TYPELESS]=GL_DEPTH32F_STENCIL8;
75-
m_FmtToGLFmtMap[TEX_FORMAT_X32_TYPELESS_G8X24_UINT]= 0;//GL_DEPTH32F_STENCIL8;
75+
m_FmtToGLFmtMap[TEX_FORMAT_X32_TYPELESS_G8X24_UINT]= GL_DEPTH32F_STENCIL8;
7676

7777
m_FmtToGLFmtMap[TEX_FORMAT_RGB10A2_TYPELESS] = GL_RGB10_A2;
7878
m_FmtToGLFmtMap[TEX_FORMAT_RGB10A2_UNORM] = GL_RGB10_A2;
@@ -102,7 +102,7 @@ class FormatToGLInternalTexFormatMap
102102
m_FmtToGLFmtMap[TEX_FORMAT_R24G8_TYPELESS] = GL_DEPTH24_STENCIL8;
103103
m_FmtToGLFmtMap[TEX_FORMAT_D24_UNORM_S8_UINT] = GL_DEPTH24_STENCIL8;
104104
m_FmtToGLFmtMap[TEX_FORMAT_R24_UNORM_X8_TYPELESS] = GL_DEPTH24_STENCIL8;
105-
m_FmtToGLFmtMap[TEX_FORMAT_X24_TYPELESS_G8_UINT] = 0;//GL_DEPTH24_STENCIL8;
105+
m_FmtToGLFmtMap[TEX_FORMAT_X24_TYPELESS_G8_UINT] = GL_DEPTH24_STENCIL8;
106106

107107
m_FmtToGLFmtMap[TEX_FORMAT_RG8_TYPELESS] = GL_RG8;
108108
m_FmtToGLFmtMap[TEX_FORMAT_RG8_UNORM] = GL_RG8;

Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,13 +1138,16 @@ void RenderDeviceGLImpl::FlagSupportedTexFormats()
11381138
{
11391139
const RenderDeviceInfo& DeviceInfo = GetDeviceInfo();
11401140
const bool bDekstopGL = DeviceInfo.Type == RENDER_DEVICE_TYPE_GL;
1141+
const bool bGL430OrAbove = DeviceInfo.Type == RENDER_DEVICE_TYPE_GL && DeviceInfo.APIVersion >= Version{4, 3};
11411142
const bool bGLES30OrAbove = DeviceInfo.Type == RENDER_DEVICE_TYPE_GLES && DeviceInfo.APIVersion >= Version{3, 0};
1143+
const bool bGLES31OrAbove = DeviceInfo.Type == RENDER_DEVICE_TYPE_GLES && DeviceInfo.APIVersion >= Version{3, 1};
11421144

11431145
const bool bRGTC = CheckExtension("GL_EXT_texture_compression_rgtc") || CheckExtension("GL_ARB_texture_compression_rgtc");
11441146
const bool bBPTC = CheckExtension("GL_EXT_texture_compression_bptc") || CheckExtension("GL_ARB_texture_compression_bptc");
11451147
const bool bS3TC = CheckExtension("GL_EXT_texture_compression_s3tc") || CheckExtension("GL_WEBGL_compressed_texture_s3tc");
11461148
const bool bTexNorm16 = bDekstopGL || CheckExtension("GL_EXT_texture_norm16"); // Only for ES3.1+
11471149
const bool bTexSwizzle = bDekstopGL || bGLES30OrAbove || CheckExtension("GL_ARB_texture_swizzle");
1150+
const bool bStencilTex = bGL430OrAbove || bGLES31OrAbove || CheckExtension("GL_ARB_stencil_texturing");
11481151

11491152
#if PLATFORM_WEB
11501153
const bool bETC2 = CheckExtension("GL_WEBGL_compressed_texture_etc");
@@ -1253,7 +1256,7 @@ void RenderDeviceGLImpl::FlagSupportedTexFormats()
12531256
FlagFormat(TEX_FORMAT_R32G8X24_TYPELESS, true );
12541257
FlagFormat(TEX_FORMAT_D32_FLOAT_S8X24_UINT, true, BIND_DEPTH_STENCIL );
12551258
FlagFormat(TEX_FORMAT_R32_FLOAT_X8X24_TYPELESS, true, TexBindFlags, bDekstopGL);
1256-
FlagFormat(TEX_FORMAT_X32_TYPELESS_G8X24_UINT, false );
1259+
FlagFormat(TEX_FORMAT_X32_TYPELESS_G8X24_UINT, bStencilTex, BIND_SHADER_RESOURCE, false);
12571260
FlagFormat(TEX_FORMAT_RGB10A2_TYPELESS, true );
12581261
FlagFormat(TEX_FORMAT_RGB10A2_UNORM, true, BindSrvRtvUav, true);
12591262
FlagFormat(TEX_FORMAT_RGB10A2_UINT, true, BindSrvRtvUav );
@@ -1278,7 +1281,7 @@ void RenderDeviceGLImpl::FlagSupportedTexFormats()
12781281
FlagFormat(TEX_FORMAT_R24G8_TYPELESS, true );
12791282
FlagFormat(TEX_FORMAT_D24_UNORM_S8_UINT, true, BIND_DEPTH_STENCIL );
12801283
FlagFormat(TEX_FORMAT_R24_UNORM_X8_TYPELESS, true, TexBindFlags, true);
1281-
FlagFormat(TEX_FORMAT_X24_TYPELESS_G8_UINT, false );
1284+
FlagFormat(TEX_FORMAT_X24_TYPELESS_G8_UINT, bStencilTex, BIND_SHADER_RESOURCE, false);
12821285
FlagFormat(TEX_FORMAT_RG8_TYPELESS, true );
12831286
FlagFormat(TEX_FORMAT_RG8_UNORM, true, U8BindFlags, true);
12841287
FlagFormat(TEX_FORMAT_RG8_UINT, true, UI8BindFlags );

Graphics/GraphicsEngineOpenGL/src/TextureBaseGL.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,28 @@ void TextureBaseGL::CreateViewInternal(const TextureViewDesc& OrigViewDesc, ITex
493493
DEV_CHECK_GL_ERROR_AND_THROW("Failed to create texture view");
494494
pViewOGL->SetBindTarget(GLViewTarget);
495495

496+
if (ViewDesc.Format == TEX_FORMAT_X24_TYPELESS_G8_UINT || ViewDesc.Format == TEX_FORMAT_X32_TYPELESS_G8X24_UINT)
497+
{
498+
const TextureFormatInfo& FmtInfo = pDeviceGLImpl->GetTextureFormatInfo(ViewDesc.Format);
499+
500+
if (FmtInfo.Supported)
501+
{
502+
RefCntAutoPtr<DeviceContextGLImpl> pDeviceContext = pDeviceGLImpl->GetImmediateContext(0);
503+
VERIFY(pDeviceContext, "Immediate device context has been destroyed");
504+
GLContextState& GLState = pDeviceContext->GetContextState();
505+
506+
GLState.BindTexture(-1, GLViewTarget, pViewOGL->GetHandle());
507+
glTexParameteri(GLViewTarget, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);
508+
DEV_CHECK_GL_ERROR("Failed to set GL_DEPTH_STENCIL_TEXTURE_MODE texture parameter");
509+
GLState.BindTexture(-1, GLViewTarget, GLObjectWrappers::GLTextureObj::Null());
510+
}
511+
else
512+
{
513+
// Throw an error if the format is not supported
514+
LOG_ERROR_AND_THROW("Format ", GetTextureFormatAttribs(ViewDesc.Format).Name, " is not supported");
515+
}
516+
}
517+
496518
if (!IsIdentityComponentMapping(ViewDesc.Swizzle))
497519
{
498520
RefCntAutoPtr<DeviceContextGLImpl> pDeviceContext = pDeviceGLImpl->GetImmediateContext(0);

0 commit comments

Comments
 (0)