Skip to content

Commit

Permalink
Support ETC2 texture format.
Browse files Browse the repository at this point in the history
  • Loading branch information
eugeneko committed Oct 23, 2024
1 parent 54f13c8 commit a3a6f7d
Show file tree
Hide file tree
Showing 13 changed files with 154 additions and 24 deletions.
39 changes: 37 additions & 2 deletions Graphics/GraphicsAccessories/src/GraphicsAccessories.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,13 @@ class TexFormatToViewFormatConverter
INIT_TEX_VIEW_FORMAT_INFO(TEX_FORMAT_BC7_TYPELESS, BC7_UNORM_SRGB, UNKNOWN, UNKNOWN, UNKNOWN);
INIT_TEX_VIEW_FORMAT_INFO(TEX_FORMAT_BC7_UNORM, BC7_UNORM, UNKNOWN, UNKNOWN, UNKNOWN);
INIT_TEX_VIEW_FORMAT_INFO(TEX_FORMAT_BC7_UNORM_SRGB, BC7_UNORM_SRGB, UNKNOWN, UNKNOWN, UNKNOWN);

INIT_TEX_VIEW_FORMAT_INFO(TEX_FORMAT_ETC2_RGB8_UNORM, ETC2_RGB8_UNORM, UNKNOWN, UNKNOWN, UNKNOWN);
INIT_TEX_VIEW_FORMAT_INFO(TEX_FORMAT_ETC2_RGB8_UNORM_SRGB, ETC2_RGB8_UNORM_SRGB, UNKNOWN, UNKNOWN, UNKNOWN);
INIT_TEX_VIEW_FORMAT_INFO(TEX_FORMAT_ETC2_RGB8A1_UNORM, ETC2_RGB8A1_UNORM, UNKNOWN, UNKNOWN, UNKNOWN);
INIT_TEX_VIEW_FORMAT_INFO(TEX_FORMAT_ETC2_RGB8A1_UNORM_SRGB, ETC2_RGB8A1_UNORM_SRGB, UNKNOWN, UNKNOWN, UNKNOWN);
INIT_TEX_VIEW_FORMAT_INFO(TEX_FORMAT_ETC2_RGBA8_UNORM, ETC2_RGBA8_UNORM, UNKNOWN, UNKNOWN, UNKNOWN);
INIT_TEX_VIEW_FORMAT_INFO(TEX_FORMAT_ETC2_RGBA8_UNORM_SRGB, ETC2_RGBA8_UNORM_SRGB, UNKNOWN, UNKNOWN, UNKNOWN);
#undef INIT_TVIEW_FORMAT_INFO
// clang-format on

Expand Down Expand Up @@ -399,9 +406,16 @@ const TextureFormatAttribs& GetTextureFormatAttribs(TEXTURE_FORMAT Format)
INIT_TEX_FORMAT_INFO(TEX_FORMAT_BC7_TYPELESS, 16, 4, COMPONENT_TYPE_COMPRESSED, true, 4,4);
INIT_TEX_FORMAT_INFO(TEX_FORMAT_BC7_UNORM, 16, 4, COMPONENT_TYPE_COMPRESSED, false, 4,4);
INIT_TEX_FORMAT_INFO(TEX_FORMAT_BC7_UNORM_SRGB, 16, 4, COMPONENT_TYPE_COMPRESSED, false, 4,4);

INIT_TEX_FORMAT_INFO(TEX_FORMAT_ETC2_RGB8_UNORM, 8, 3, COMPONENT_TYPE_COMPRESSED, false, 4,4);
INIT_TEX_FORMAT_INFO(TEX_FORMAT_ETC2_RGB8_UNORM_SRGB, 8, 3, COMPONENT_TYPE_COMPRESSED, false, 4,4);
INIT_TEX_FORMAT_INFO(TEX_FORMAT_ETC2_RGB8A1_UNORM, 8, 4, COMPONENT_TYPE_COMPRESSED, false, 4,4);
INIT_TEX_FORMAT_INFO(TEX_FORMAT_ETC2_RGB8A1_UNORM_SRGB, 8, 4, COMPONENT_TYPE_COMPRESSED, false, 4,4);
INIT_TEX_FORMAT_INFO(TEX_FORMAT_ETC2_RGBA8_UNORM, 16, 4, COMPONENT_TYPE_COMPRESSED, false, 4,4);
INIT_TEX_FORMAT_INFO(TEX_FORMAT_ETC2_RGBA8_UNORM_SRGB, 16, 4, COMPONENT_TYPE_COMPRESSED, false, 4,4);
#undef INIT_TEX_FORMAT_INFO
// clang-format on
static_assert(TEX_FORMAT_NUM_FORMATS == TEX_FORMAT_BC7_UNORM_SRGB + 1, "Not all texture formats initialized.");
static_assert(TEX_FORMAT_NUM_FORMATS == TEX_FORMAT_ETC2_RGBA8_UNORM_SRGB + 1, "Not all texture formats initialized.");

#ifdef DILIGENT_DEBUG
for (Uint32 Fmt = TEX_FORMAT_UNKNOWN; Fmt < TEX_FORMAT_NUM_FORMATS; ++Fmt)
Expand Down Expand Up @@ -2568,6 +2582,15 @@ TEXTURE_FORMAT UnormFormatToSRGB(TEXTURE_FORMAT Fmt)
case TEX_FORMAT_BC7_UNORM:
return TEX_FORMAT_BC7_UNORM_SRGB;

case TEX_FORMAT_ETC2_RGB8_UNORM:
return TEX_FORMAT_ETC2_RGB8_UNORM_SRGB;

case TEX_FORMAT_ETC2_RGB8A1_UNORM:
return TEX_FORMAT_ETC2_RGB8A1_UNORM_SRGB;

case TEX_FORMAT_ETC2_RGBA8_UNORM:
return TEX_FORMAT_ETC2_RGBA8_UNORM_SRGB;

default:
return Fmt;
}
Expand Down Expand Up @@ -2598,6 +2621,15 @@ TEXTURE_FORMAT SRGBFormatToUnorm(TEXTURE_FORMAT Fmt)
case TEX_FORMAT_BC7_UNORM_SRGB:
return TEX_FORMAT_BC7_UNORM;

case TEX_FORMAT_ETC2_RGB8_UNORM_SRGB:
return TEX_FORMAT_ETC2_RGB8_UNORM;

case TEX_FORMAT_ETC2_RGB8A1_UNORM_SRGB:
return TEX_FORMAT_ETC2_RGB8A1_UNORM;

case TEX_FORMAT_ETC2_RGBA8_UNORM_SRGB:
return TEX_FORMAT_ETC2_RGBA8_UNORM;

default:
return Fmt;
}
Expand Down Expand Up @@ -2660,7 +2692,10 @@ bool IsSRGBFormat(TEXTURE_FORMAT Fmt)
Fmt == TEX_FORMAT_BC3_UNORM_SRGB ||
Fmt == TEX_FORMAT_BGRA8_UNORM_SRGB ||
Fmt == TEX_FORMAT_BGRX8_UNORM_SRGB ||
Fmt == TEX_FORMAT_BC7_UNORM_SRGB);
Fmt == TEX_FORMAT_BC7_UNORM_SRGB ||
Fmt == TEX_FORMAT_ETC2_RGB8_UNORM_SRGB ||
Fmt == TEX_FORMAT_ETC2_RGB8A1_UNORM_SRGB ||
Fmt == TEX_FORMAT_ETC2_RGBA8_UNORM_SRGB);
}

String GetPipelineShadingRateFlagsString(PIPELINE_SHADING_RATE_FLAGS Flags)
Expand Down
30 changes: 29 additions & 1 deletion Graphics/GraphicsEngine/interface/GraphicsTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -906,6 +906,30 @@ DILIGENT_TYPED_ENUM(TEXTURE_FORMAT, Uint16)
/// <a href = "https://www.opengl.org/wiki/BPTC_Texture_Compression">BPTC Texture Compression on OpenGL.org </a>
TEX_FORMAT_BC7_UNORM_SRGB,

/// Three-component block-compression unsigned-normalized-integer format. \n
/// OpenGL counterpart: GL_COMPRESSED_RGB8_ETC2.
TEX_FORMAT_ETC2_RGB8_UNORM,

/// Three-component block-compression unsigned-normalized-integer sRGB format. \n
/// OpenGL counterpart: GL_COMPRESSED_SRGB8_ETC2.
TEX_FORMAT_ETC2_RGB8_UNORM_SRGB,

/// Four-component block-compression unsigned-normalized-integer format. \n
/// OpenGL counterpart: GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2.
TEX_FORMAT_ETC2_RGB8A1_UNORM,

/// Four-component block-compression unsigned-normalized-integer sRGB format. \n
/// OpenGL counterpart: GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2.
TEX_FORMAT_ETC2_RGB8A1_UNORM_SRGB,

/// Four-component block-compression unsigned-normalized-integer format. \n
/// OpenGL counterpart: GL_COMPRESSED_RGBA8_ETC2_EAC.
TEX_FORMAT_ETC2_RGBA8_UNORM,

/// Four-component block-compression unsigned-normalized-integer sRGB format. \n
/// OpenGL counterpart: GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.
TEX_FORMAT_ETC2_RGBA8_UNORM_SRGB,

/// Helper member containing the total number of texture formats in the enumeration
TEX_FORMAT_NUM_FORMATS
};
Expand Down Expand Up @@ -1704,6 +1728,9 @@ struct DeviceFeatures
/// Indicates if device supports all BC-compressed formats
DEVICE_FEATURE_STATE TextureCompressionBC DEFAULT_INITIALIZER(DEVICE_FEATURE_STATE_DISABLED);

/// Indicates if device supports all ETC-compressed formats
DEVICE_FEATURE_STATE TextureCompressionETC DEFAULT_INITIALIZER(DEVICE_FEATURE_STATE_DISABLED);

/// Indicates if device supports writes to UAVs as well as atomic operations in vertex,
/// tessellation, and geometry shader stages.
DEVICE_FEATURE_STATE VertexPipelineUAVWritesAndAtomics DEFAULT_INITIALIZER(DEVICE_FEATURE_STATE_DISABLED);
Expand Down Expand Up @@ -1852,6 +1879,7 @@ struct DeviceFeatures
Handler(DualSourceBlend) \
Handler(MultiViewport) \
Handler(TextureCompressionBC) \
Handler(TextureCompressionETC) \
Handler(VertexPipelineUAVWritesAndAtomics) \
Handler(PixelUAVWritesAndAtomics) \
Handler(TextureUAVExtendedFormats) \
Expand Down Expand Up @@ -1880,7 +1908,7 @@ struct DeviceFeatures

explicit constexpr DeviceFeatures(DEVICE_FEATURE_STATE State) noexcept
{
static_assert(sizeof(*this) == 46, "Did you add a new feature to DeviceFeatures? Please add it to ENUMERATE_DEVICE_FEATURES.");
static_assert(sizeof(*this) == 47, "Did you add a new feature to DeviceFeatures? Please add it to ENUMERATE_DEVICE_FEATURES.");
#define INIT_FEATURE(Feature) Feature = State;
ENUMERATE_DEVICE_FEATURES(INIT_FEATURE)
#undef INIT_FEATURE
Expand Down
3 changes: 2 additions & 1 deletion Graphics/GraphicsEngine/src/RenderDeviceBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ DeviceFeatures EnableDeviceFeatures(const DeviceFeatures& SupportedFeatures,
ENABLE_FEATURE(DualSourceBlend, "Dual-source blend is");
ENABLE_FEATURE(MultiViewport, "Multiviewport is");
ENABLE_FEATURE(TextureCompressionBC, "BC texture compression is");
ENABLE_FEATURE(TextureCompressionETC, "ETC texture compression is");
ENABLE_FEATURE(VertexPipelineUAVWritesAndAtomics, "Vertex pipeline UAV writes and atomics are");
ENABLE_FEATURE(PixelUAVWritesAndAtomics, "Pixel UAV writes and atomics are");
ENABLE_FEATURE(TextureUAVExtendedFormats, "Texture UAV extended formats are");
Expand Down Expand Up @@ -121,7 +122,7 @@ DeviceFeatures EnableDeviceFeatures(const DeviceFeatures& SupportedFeatures,
// clang-format on
#undef ENABLE_FEATURE

ASSERT_SIZEOF(DeviceFeatures, 46, "Did you add a new feature to DeviceFeatures? Please handle its status here (if necessary).");
ASSERT_SIZEOF(DeviceFeatures, 47, "Did you add a new feature to DeviceFeatures? Please handle its status here (if necessary).");

return EnabledFeatures;
}
Expand Down
2 changes: 1 addition & 1 deletion Graphics/GraphicsEngineD3D11/src/EngineFactoryD3D11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,7 @@ GraphicsAdapterInfo EngineFactoryD3D11Impl::GetGraphicsAdapterInfo(void*
Features.ShaderFloat16 = ShaderFloat16Supported ? DEVICE_FEATURE_STATE_ENABLED : DEVICE_FEATURE_STATE_DISABLED;
}

ASSERT_SIZEOF(Features, 46, "Did you add a new feature to DeviceFeatures? Please handle its status here.");
ASSERT_SIZEOF(Features, 47, "Did you add a new feature to DeviceFeatures? Please handle its status here.");

// Texture properties
{
Expand Down
2 changes: 1 addition & 1 deletion Graphics/GraphicsEngineD3D12/src/EngineFactoryD3D12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1067,7 +1067,7 @@ GraphicsAdapterInfo EngineFactoryD3D12Impl::GetGraphicsAdapterInfo(void*
ASSERT_SIZEOF(DrawCommandProps, 12, "Did you add a new member to DrawCommandProperties? Please initialize it here.");
}

ASSERT_SIZEOF(DeviceFeatures, 46, "Did you add a new feature to DeviceFeatures? Please handle its status here.");
ASSERT_SIZEOF(DeviceFeatures, 47, "Did you add a new feature to DeviceFeatures? Please handle its status here.");

return AdapterInfo;
}
Expand Down
2 changes: 1 addition & 1 deletion Graphics/GraphicsEngineD3DBase/src/DXGITypeConversions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -407,13 +407,13 @@ DXGI_FORMAT TexFormatToDXGI_Format(TEXTURE_FORMAT TexFormat, Uint32 BindFlags)
FmtToDXGIFmtMap[TEX_FORMAT_BC7_UNORM_SRGB] = DXGI_FORMAT_BC7_UNORM_SRGB;
// clang-format on

static_assert(TEX_FORMAT_NUM_FORMATS == 106, "Please enter the new format information above");
bFormatMapInitialized = true;
}

if (TexFormat >= TEX_FORMAT_UNKNOWN && TexFormat < TEX_FORMAT_NUM_FORMATS)
{
auto DXGIFormat = FmtToDXGIFmtMap[TexFormat];
VERIFY(TexFormat == TEX_FORMAT_UNKNOWN || DXGIFormat != DXGI_FORMAT_UNKNOWN, "Unsupported texture format");
if (BindFlags != 0)
DXGIFormat = CorrectDXGIFormat(DXGIFormat, BindFlags);
return DXGIFormat;
Expand Down
14 changes: 13 additions & 1 deletion Graphics/GraphicsEngineOpenGL/src/GLTypeConversions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,15 @@ class FormatToGLInternalTexFormatMap
m_FmtToGLFmtMap[TEX_FORMAT_BC7_TYPELESS] = GL_COMPRESSED_RGBA_BPTC_UNORM;
m_FmtToGLFmtMap[TEX_FORMAT_BC7_UNORM] = GL_COMPRESSED_RGBA_BPTC_UNORM;
m_FmtToGLFmtMap[TEX_FORMAT_BC7_UNORM_SRGB] = GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM;
m_FmtToGLFmtMap[TEX_FORMAT_ETC2_RGB8_UNORM] = GL_COMPRESSED_RGB8_ETC2;
m_FmtToGLFmtMap[TEX_FORMAT_ETC2_RGB8_UNORM_SRGB] = GL_COMPRESSED_SRGB8_ETC2;
m_FmtToGLFmtMap[TEX_FORMAT_ETC2_RGB8A1_UNORM] = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
m_FmtToGLFmtMap[TEX_FORMAT_ETC2_RGB8A1_UNORM_SRGB] = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
m_FmtToGLFmtMap[TEX_FORMAT_ETC2_RGBA8_UNORM] = GL_COMPRESSED_RGBA8_ETC2_EAC;
m_FmtToGLFmtMap[TEX_FORMAT_ETC2_RGBA8_UNORM_SRGB] = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
// clang-format on

static_assert(TEX_FORMAT_NUM_FORMATS == 100, "Please enter the new format information above");
static_assert(TEX_FORMAT_NUM_FORMATS == 106, "Please enter the new format information above");
}

GLenum operator[](TEXTURE_FORMAT TexFormat) const
Expand Down Expand Up @@ -412,6 +418,12 @@ NativePixelAttribs GetNativePixelTransferAttribs(TEXTURE_FORMAT TexFormat)
FmtToGLPixelFmt[TEX_FORMAT_BC7_TYPELESS] = NativePixelAttribs{GL_RGBA, 0, True};
FmtToGLPixelFmt[TEX_FORMAT_BC7_UNORM] = NativePixelAttribs{GL_RGBA, 0, True};
FmtToGLPixelFmt[TEX_FORMAT_BC7_UNORM_SRGB] = NativePixelAttribs{GL_RGBA, 0, True};
FmtToGLPixelFmt[TEX_FORMAT_ETC2_RGB8_UNORM] = NativePixelAttribs{GL_RGB, 0, True};
FmtToGLPixelFmt[TEX_FORMAT_ETC2_RGB8_UNORM_SRGB] = NativePixelAttribs{GL_RGB, 0, True};
FmtToGLPixelFmt[TEX_FORMAT_ETC2_RGB8A1_UNORM] = NativePixelAttribs{GL_RGBA, 0, True};
FmtToGLPixelFmt[TEX_FORMAT_ETC2_RGB8A1_UNORM_SRGB] = NativePixelAttribs{GL_RGBA, 0, True};
FmtToGLPixelFmt[TEX_FORMAT_ETC2_RGBA8_UNORM] = NativePixelAttribs{GL_RGBA, 0, True};
FmtToGLPixelFmt[TEX_FORMAT_ETC2_RGBA8_UNORM_SRGB] = NativePixelAttribs{GL_RGBA, 0, True};
// clang-format on
bAttribsMapInitialized = true;
}
Expand Down
22 changes: 21 additions & 1 deletion Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1009,6 +1009,13 @@ void RenderDeviceGLImpl::InitAdapterInfo()
const bool bS3TC = CheckExtension("GL_EXT_texture_compression_s3tc") || CheckExtension("GL_WEBGL_compressed_texture_s3tc");
ENABLE_FEATURE(TextureCompressionBC, bRGTC && bBPTC && bS3TC);

#if PLATFORM_EMSCRIPTEN
const bool bETC2 = CheckExtension("GL_WEBGL_compressed_texture_etc");
#else
const bool bETC2 = m_DeviceInfo.Type == RENDER_DEVICE_TYPE_GLES || CheckExtension("GL_ARB_ES3_compatibility");
#endif
ENABLE_FEATURE(TextureCompressionETC, bETC2);

// Buffer properties
{
auto& BufferProps{m_AdapterInfo.Buffer};
Expand Down Expand Up @@ -1108,7 +1115,7 @@ void RenderDeviceGLImpl::InitAdapterInfo()
m_AdapterInfo.Queues[0].TextureCopyGranularity[2] = 1;
}

ASSERT_SIZEOF(DeviceFeatures, 46, "Did you add a new feature to DeviceFeatures? Please handle its status here.");
ASSERT_SIZEOF(DeviceFeatures, 47, "Did you add a new feature to DeviceFeatures? Please handle its status here.");
}

void RenderDeviceGLImpl::FlagSupportedTexFormats()
Expand All @@ -1123,6 +1130,12 @@ void RenderDeviceGLImpl::FlagSupportedTexFormats()
const bool bTexNorm16 = bDekstopGL || CheckExtension("GL_EXT_texture_norm16"); // Only for ES3.1+
const bool bTexSwizzle = bDekstopGL || bGLES30OrAbove || CheckExtension("GL_ARB_texture_swizzle");

#if PLATFORM_EMSCRIPTEN
const bool bETC2 = CheckExtension("GL_WEBGL_compressed_texture_etc");
#else
const bool bETC2 = bGLES30OrAbove || CheckExtension("GL_ARB_ES3_compatibility");
#endif

// || GLES3.0 || GLES3.1 || GLES3.2 ||
// | Format || CR | TF || CR | TF | Req RB | Req. Tex || CR | TF | Req RB | Req. Tex ||
// |------------||------|------||------|------|--------|----------||------|------|--------|----------||
Expand Down Expand Up @@ -1306,6 +1319,13 @@ void RenderDeviceGLImpl::FlagSupportedTexFormats()
FlagFormat(TEX_FORMAT_BC7_TYPELESS, bBPTC);
FlagFormat(TEX_FORMAT_BC7_UNORM, bBPTC, BIND_SHADER_RESOURCE, true);
FlagFormat(TEX_FORMAT_BC7_UNORM_SRGB, bBPTC, BIND_SHADER_RESOURCE, true);

FlagFormat(TEX_FORMAT_ETC2_RGB8_UNORM, bETC2, BIND_SHADER_RESOURCE, true);
FlagFormat(TEX_FORMAT_ETC2_RGB8_UNORM_SRGB, bETC2, BIND_SHADER_RESOURCE, true);
FlagFormat(TEX_FORMAT_ETC2_RGB8A1_UNORM, bETC2, BIND_SHADER_RESOURCE, true);
FlagFormat(TEX_FORMAT_ETC2_RGB8A1_UNORM_SRGB, bETC2, BIND_SHADER_RESOURCE, true);
FlagFormat(TEX_FORMAT_ETC2_RGBA8_UNORM, bETC2, BIND_SHADER_RESOURCE, true);
FlagFormat(TEX_FORMAT_ETC2_RGBA8_UNORM_SRGB, bETC2, BIND_SHADER_RESOURCE, true);
// clang-format on

#ifdef DILIGENT_DEVELOPMENT
Expand Down
3 changes: 2 additions & 1 deletion Graphics/GraphicsEngineVulkan/src/EngineFactoryVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -793,6 +793,7 @@ void EngineFactoryVkImpl::CreateDeviceAndContextsVk(const EngineVkCreateInfo& En
ENABLE_VKFEATURE(dualSrcBlend, EnabledFeatures.DualSourceBlend);
ENABLE_VKFEATURE(multiViewport, EnabledFeatures.MultiViewport);
ENABLE_VKFEATURE(textureCompressionBC, EnabledFeatures.TextureCompressionBC);
ENABLE_VKFEATURE(textureCompressionETC2, EnabledFeatures.TextureCompressionETC);
ENABLE_VKFEATURE(vertexPipelineStoresAndAtomics, EnabledFeatures.VertexPipelineUAVWritesAndAtomics);
ENABLE_VKFEATURE(fragmentStoresAndAtomics, EnabledFeatures.PixelUAVWritesAndAtomics);
ENABLE_VKFEATURE(shaderStorageImageExtendedFormats, EnabledFeatures.TextureUAVExtendedFormats);
Expand Down Expand Up @@ -1170,7 +1171,7 @@ void EngineFactoryVkImpl::CreateDeviceAndContextsVk(const EngineVkCreateInfo& En
LOG_ERROR_MESSAGE("Can not enable extended device features when VK_KHR_get_physical_device_properties2 extension is not supported by device");
}

ASSERT_SIZEOF(DeviceFeatures, 46, "Did you add a new feature to DeviceFeatures? Please handle its status here.");
ASSERT_SIZEOF(DeviceFeatures, 47, "Did you add a new feature to DeviceFeatures? Please handle its status here.");

for (Uint32 i = 0; i < EngineCI.DeviceExtensionCount; ++i)
{
Expand Down
Loading

0 comments on commit a3a6f7d

Please sign in to comment.