diff --git a/bindings/bf/bgfx.bf b/bindings/bf/bgfx.bf
index 3e1f5575f..b196982c1 100644
--- a/bindings/bf/bgfx.bf
+++ b/bindings/bf/bgfx.bf
@@ -2994,6 +2994,16 @@ public static class bgfx
[LinkName("bgfx_is_texture_valid")]
public static extern bool is_texture_valid(uint16 _depth, bool _cubeMap, uint16 _numLayers, TextureFormat _format, uint64 _flags);
+ ///
+ /// Validate frame buffer parameters.
+ ///
+ ///
+ /// Number of attachments.
+ /// Attachment texture info. See: `bgfx::Attachment`.
+ ///
+ [LinkName("bgfx_is_frame_buffer_valid")]
+ public static extern bool is_frame_buffer_valid(uint8 _num, Attachment* _attachment);
+
///
/// Calculate amount of memory required for texture.
///
diff --git a/bindings/cs/bgfx.cs b/bindings/cs/bgfx.cs
index ee490566c..a6260988b 100644
--- a/bindings/cs/bgfx.cs
+++ b/bindings/cs/bgfx.cs
@@ -2950,6 +2950,17 @@ public static partial class bgfx
[return: MarshalAs(UnmanagedType.I1)]
public static extern unsafe bool is_texture_valid(ushort _depth, bool _cubeMap, ushort _numLayers, TextureFormat _format, ulong _flags);
+ ///
+ /// Validate frame buffer parameters.
+ ///
+ ///
+ /// Number of attachments.
+ /// Attachment texture info. See: `bgfx::Attachment`.
+ ///
+ [DllImport(DllName, EntryPoint="bgfx_is_frame_buffer_valid", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ public static extern unsafe bool is_frame_buffer_valid(byte _num, Attachment* _attachment);
+
///
/// Calculate amount of memory required for texture.
///
diff --git a/bindings/d/funcs.d b/bindings/d/funcs.d
index f3ea7bc8f..8485de2b4 100644
--- a/bindings/d/funcs.d
+++ b/bindings/d/funcs.d
@@ -698,6 +698,14 @@ version(BindBgfx_Static)
*/
bool bgfx_is_texture_valid(ushort _depth, bool _cubeMap, ushort _numLayers, bgfx_texture_format_t _format, ulong _flags);
+ /**
+ * Validate frame buffer parameters.
+ * Params:
+ * _num = Number of attachments.
+ * _attachment = Attachment texture info. See: `bgfx::Attachment`.
+ */
+ bool bgfx_is_frame_buffer_valid(byte _num, const(bgfx_attachment_t)* _attachment);
+
/**
* Calculate amount of memory required for texture.
* Params:
@@ -2897,6 +2905,15 @@ else
alias da_bgfx_is_texture_valid = bool function(ushort _depth, bool _cubeMap, ushort _numLayers, bgfx_texture_format_t _format, ulong _flags);
da_bgfx_is_texture_valid bgfx_is_texture_valid;
+ /**
+ * Validate frame buffer parameters.
+ * Params:
+ * _num = Number of attachments.
+ * _attachment = Attachment texture info. See: `bgfx::Attachment`.
+ */
+ alias da_bgfx_is_frame_buffer_valid = bool function(byte _num, const(bgfx_attachment_t)* _attachment);
+ da_bgfx_is_frame_buffer_valid bgfx_is_frame_buffer_valid;
+
/**
* Calculate amount of memory required for texture.
* Params:
diff --git a/bindings/d/types.d b/bindings/d/types.d
index 18c35939f..56268fc61 100644
--- a/bindings/d/types.d
+++ b/bindings/d/types.d
@@ -10,7 +10,7 @@ public import core.stdc.stdarg : va_list;
extern(C) @nogc nothrow:
-enum uint BGFX_API_VERSION = 112;
+enum uint BGFX_API_VERSION = 113;
alias bgfx_view_id_t = ushort;
diff --git a/include/bgfx/bgfx.h b/include/bgfx/bgfx.h
index 78a64b351..0437289ab 100644
--- a/include/bgfx/bgfx.h
+++ b/include/bgfx/bgfx.h
@@ -2629,6 +2629,18 @@ namespace bgfx
, uint64_t _flags
);
+ /// Validate frame buffer parameters.
+ ///
+ /// @param[in] _num Number of attachments.
+ /// @param[in] _attachment Attachment texture info. See: `bgfx::Attachment`.
+ ///
+ /// @returns True if frame buffer can be successfully created.
+ ///
+ bool isFrameBufferValid(
+ uint8_t _num
+ , const Attachment* _attachment
+ );
+
/// Calculate amount of memory required for texture.
///
/// @param[out] _info Resulting texture info structure. See: `TextureInfo`.
diff --git a/include/bgfx/c99/bgfx.h b/include/bgfx/c99/bgfx.h
index 6a4e489ad..656a5b3cf 100644
--- a/include/bgfx/c99/bgfx.h
+++ b/include/bgfx/c99/bgfx.h
@@ -1705,6 +1705,17 @@ BGFX_C_API void bgfx_destroy_program(bgfx_program_handle_t _handle);
*/
BGFX_C_API bool bgfx_is_texture_valid(uint16_t _depth, bool _cubeMap, uint16_t _numLayers, bgfx_texture_format_t _format, uint64_t _flags);
+/**
+ * Validate frame buffer parameters.
+ *
+ * @param[in] _num Number of attachments.
+ * @param[in] _attachment Attachment texture info. See: `bgfx::Attachment`.
+ *
+ * @returns True if frame buffer can be successfully created.
+ *
+ */
+BGFX_C_API bool bgfx_is_frame_buffer_valid(uint8_t _num, const bgfx_attachment_t* _attachment);
+
/**
* Calculate amount of memory required for texture.
*
@@ -3402,6 +3413,7 @@ typedef enum bgfx_function_id
BGFX_FUNCTION_ID_CREATE_COMPUTE_PROGRAM,
BGFX_FUNCTION_ID_DESTROY_PROGRAM,
BGFX_FUNCTION_ID_IS_TEXTURE_VALID,
+ BGFX_FUNCTION_ID_IS_FRAME_BUFFER_VALID,
BGFX_FUNCTION_ID_CALC_TEXTURE_SIZE,
BGFX_FUNCTION_ID_CREATE_TEXTURE,
BGFX_FUNCTION_ID_CREATE_TEXTURE_2D,
@@ -3601,6 +3613,7 @@ struct bgfx_interface_vtbl
bgfx_program_handle_t (*create_compute_program)(bgfx_shader_handle_t _csh, bool _destroyShaders);
void (*destroy_program)(bgfx_program_handle_t _handle);
bool (*is_texture_valid)(uint16_t _depth, bool _cubeMap, uint16_t _numLayers, bgfx_texture_format_t _format, uint64_t _flags);
+ bool (*is_frame_buffer_valid)(uint8_t _num, const bgfx_attachment_t* _attachment);
void (*calc_texture_size)(bgfx_texture_info_t * _info, uint16_t _width, uint16_t _height, uint16_t _depth, bool _cubeMap, bool _hasMips, uint16_t _numLayers, bgfx_texture_format_t _format);
bgfx_texture_handle_t (*create_texture)(const bgfx_memory_t* _mem, uint64_t _flags, uint8_t _skip, bgfx_texture_info_t* _info);
bgfx_texture_handle_t (*create_texture_2d)(uint16_t _width, uint16_t _height, bool _hasMips, uint16_t _numLayers, bgfx_texture_format_t _format, uint64_t _flags, const bgfx_memory_t* _mem);
diff --git a/include/bgfx/defines.h b/include/bgfx/defines.h
index 57400f2a1..16e301c02 100644
--- a/include/bgfx/defines.h
+++ b/include/bgfx/defines.h
@@ -15,7 +15,7 @@
#ifndef BGFX_DEFINES_H_HEADER_GUARD
#define BGFX_DEFINES_H_HEADER_GUARD
-#define BGFX_API_VERSION UINT32_C(112)
+#define BGFX_API_VERSION UINT32_C(113)
/**
* Color RGB/alpha/depth write. When it's not specified write will be disabled.
diff --git a/scripts/bgfx.idl b/scripts/bgfx.idl
index 26f8a7fa7..f474cecfd 100644
--- a/scripts/bgfx.idl
+++ b/scripts/bgfx.idl
@@ -1,7 +1,7 @@
-- vim: syntax=lua
-- bgfx interface
-version(112)
+version(113)
typedef "bool"
typedef "char"
@@ -1593,6 +1593,12 @@ func.isTextureValid
.format "TextureFormat::Enum" --- Texture format. See: `TextureFormat::Enum`.
.flags "uint64_t" --- Texture flags. See `BGFX_TEXTURE_*`.
+--- Validate frame buffer parameters.
+func.isFrameBufferValid
+ "bool" --- True if frame buffer can be successfully created.
+ .num "uint8_t" --- Number of attachments.
+ .attachment "const Attachment*" --- Attachment texture info. See: `bgfx::Attachment`.
+
--- Calculate amount of memory required for texture.
func.calcTextureSize
"void"
diff --git a/src/bgfx.cpp b/src/bgfx.cpp
index 6933d592c..a41fe9763 100644
--- a/src/bgfx.cpp
+++ b/src/bgfx.cpp
@@ -16,7 +16,8 @@
# include
#endif // BX_PLATFORM_OSX
-BX_ERROR_RESULT(BGFX_ERROR_TEXTURE_VALIDATION, BX_MAKEFOURCC('b', 'g', 0, 1) );
+BX_ERROR_RESULT(BGFX_ERROR_TEXTURE_VALIDATION, BX_MAKEFOURCC('b', 'g', 0, 1) );
+BX_ERROR_RESULT(BGFX_ERROR_FRAME_BUFFER_VALIDATION, BX_MAKEFOURCC('b', 'g', 0, 2) );
namespace bgfx
{
@@ -4328,8 +4329,24 @@ namespace bgfx
s_ctx->destroyProgram(_handle);
}
- void checkFrameBuffer(uint8_t _num, const Attachment* _attachment)
+#define BGFX_ERROR_CHECK(_condition, _err, _result, _msg, _format, ...) \
+ if (!BX_IGNORE_C4127(_condition) ) \
+ { \
+ BX_ERROR_SET(_err, _result, _msg); \
+ BX_TRACE("%.*s: '%.*s' - " _format \
+ , bxErrorScope.getName().getLength() \
+ , bxErrorScope.getName().getPtr() \
+ , _err->getMessage().getLength() \
+ , _err->getMessage().getPtr() \
+ , ##__VA_ARGS__ \
+ ); \
+ return; \
+ }
+
+ void isFrameBufferValid(uint8_t _num, const Attachment* _attachment, bx::Error* _err)
{
+ BX_ERROR_SCOPE(_err, "Frame buffer validation");
+
uint8_t color = 0;
uint8_t depth = 0;
@@ -4337,60 +4354,104 @@ namespace bgfx
const uint16_t firstAttachmentWidth = bx::max(firstTexture.m_width >> _attachment[0].mip, 1);
const uint16_t firstAttachmentHeight = bx::max(firstTexture.m_height >> _attachment[0].mip, 1);
- BX_UNUSED(firstAttachmentWidth, firstAttachmentHeight);
for (uint32_t ii = 0; ii < _num; ++ii)
{
- const TextureHandle texHandle = _attachment[ii].handle;
- BGFX_CHECK_HANDLE("createFrameBuffer texture", s_ctx->m_textureHandle, texHandle);
+ const Attachment& at = _attachment[ii];
+ const TextureHandle texHandle = at.handle;
const TextureRef& tr = s_ctx->m_textureRef[texHandle.idx];
- BX_ASSERT(_attachment[ii].mip < tr.m_numMips
- , "Invalid texture mip level (%d > %d)."
- , _attachment[ii].mip
- , tr.m_numMips - 1
+ BGFX_ERROR_CHECK(true
+ && isValid(texHandle)
+ && s_ctx->m_textureHandle.isValid(texHandle.idx)
+ , _err
+ , BGFX_ERROR_FRAME_BUFFER_VALIDATION
+ , "Invalid texture attachment."
+ , "Attachment %d, texture handle %d."
+ , ii
+ , texHandle.idx
);
- const uint16_t numLayers = tr.is3D()
- ? bx::max(tr.m_depth >> _attachment[ii].mip, 1)
- : tr.m_numLayers * (tr.isCubeMap() ? 6 : 1)
- ;
- BX_UNUSED(numLayers);
-
- BX_ASSERT( (_attachment[ii].layer + _attachment[ii].numLayers) <= numLayers
- , "Invalid texture layer range (layer %d + num %d > total %d)."
- , _attachment[ii].layer
- , _attachment[ii].numLayers
- , numLayers
+ BGFX_ERROR_CHECK(
+ at.mip < tr.m_numMips
+ , _err
+ , BGFX_ERROR_FRAME_BUFFER_VALIDATION
+ , "Invalid texture mip level."
+ , "Attachment %d, Mip %d, texture number of mips %d."
+ , ii
+ , at.mip
+ , tr.m_numMips
);
- BX_ASSERT(_attachment[0].numLayers == _attachment[ii].numLayers
- , "Mismatch in attachment layer count (%d != %d)."
- , _attachment[ii].numLayers
+ {
+ const uint16_t numLayers = tr.is3D()
+ ? bx::max(tr.m_depth >> at.mip, 1)
+ : tr.m_numLayers * (tr.isCubeMap() ? 6 : 1)
+ ;
+
+ BGFX_ERROR_CHECK(
+ (at.layer + at.numLayers) <= numLayers
+ , _err
+ , BGFX_ERROR_FRAME_BUFFER_VALIDATION
+ , "Invalid texture layer range."
+ , "Attachment %d, Layer: %d, Num: %d, Max number of layers: %d."
+ , ii
+ , at.layer
+ , at.numLayers
+ , numLayers
+ );
+ }
+
+ BGFX_ERROR_CHECK(
+ _attachment[0].numLayers == at.numLayers
+ , _err
+ , BGFX_ERROR_FRAME_BUFFER_VALIDATION
+ , "Mismatch in attachment layer count."
+ , "Attachment %d, Given: %d, Expected: %d."
+ , ii
+ , at.numLayers
, _attachment[0].numLayers
);
- BX_ASSERT(firstTexture.m_bbRatio == tr.m_bbRatio
+ BGFX_ERROR_CHECK(
+ firstTexture.m_bbRatio == tr.m_bbRatio
+ , _err
+ , BGFX_ERROR_FRAME_BUFFER_VALIDATION
, "Mismatch in texture back-buffer ratio."
+ , "Attachment %d, Given: %d, Expected: %d."
+ , ii
+ , tr.m_bbRatio
+ , firstTexture.m_bbRatio
);
- BX_ASSERT(firstTexture.m_numSamples == tr.m_numSamples
- , "Mismatch in texture sample count (%d != %d)."
+ BGFX_ERROR_CHECK(
+ firstTexture.m_numSamples == tr.m_numSamples
+ , _err
+ , BGFX_ERROR_FRAME_BUFFER_VALIDATION
+ , "Mismatch in texture sample count."
+ , "Attachment %d, Given: %d, Expected: %d."
+ , ii
, tr.m_numSamples
, firstTexture.m_numSamples
);
if (BackbufferRatio::Count == firstTexture.m_bbRatio)
{
- const uint16_t width = bx::max(tr.m_width >> _attachment[ii].mip, 1);
- const uint16_t height = bx::max(tr.m_height >> _attachment[ii].mip, 1);
- BX_UNUSED(width, height);
+ const uint16_t width = bx::max(tr.m_width >> at.mip, 1);
+ const uint16_t height = bx::max(tr.m_height >> at.mip, 1);
- BX_ASSERT(width == firstAttachmentWidth && height == firstAttachmentHeight
- , "Mismatch in texture size (%dx%d != %dx%d)."
+ BGFX_ERROR_CHECK(true
+ && width == firstAttachmentWidth
+ && height == firstAttachmentHeight
+ , _err
+ , BGFX_ERROR_FRAME_BUFFER_VALIDATION
+ , "Mismatch in texture size."
+ , "Attachment %d, Given: %dx%d, Expected: %dx%d."
+ , ii
, width
, height
- , firstAttachmentWidth, firstAttachmentHeight
+ , firstAttachmentWidth
+ , firstAttachmentHeight
);
}
@@ -4403,70 +4464,98 @@ namespace bgfx
++color;
}
- BX_ASSERT(0 == (tr.m_flags & BGFX_TEXTURE_READ_BACK)
- , "Frame buffer texture cannot be read back texture. Attachment %d: has flags 0x%016" PRIx64 "."
+ BGFX_ERROR_CHECK(
+ 0 == (tr.m_flags & BGFX_TEXTURE_READ_BACK)
+ , _err
+ , BGFX_ERROR_FRAME_BUFFER_VALIDATION
+ , "Frame buffer texture cannot be created with `BGFX_TEXTURE_READ_BACK`."
+ , "Attachment %d, texture flags 0x%016" PRIx64 "."
, ii
, tr.m_flags
);
- BX_ASSERT(0 != (tr.m_flags & BGFX_TEXTURE_RT_MASK)
- , "Frame buffer texture is not created with one of `BGFX_TEXTURE_RT*` flags. Attachment %d: has flags 0x%016" PRIx64 "."
+ BGFX_ERROR_CHECK(
+ 0 != (tr.m_flags & BGFX_TEXTURE_RT_MASK)
+ , _err
+ , BGFX_ERROR_FRAME_BUFFER_VALIDATION
+ , "Frame buffer texture is not created with one of `BGFX_TEXTURE_RT*` flags."
+ , "Attachment %d, texture flags 0x%016" PRIx64 "."
, ii
, tr.m_flags
);
}
- BX_ASSERT(true
- && color <= g_caps.limits.maxFBAttachments
- && depth <= 1
- , "Too many frame buffer attachments (num attachments: %d, max color attachments %d)!"
+ BGFX_ERROR_CHECK(
+ color <= g_caps.limits.maxFBAttachments
+ , _err
+ , BGFX_ERROR_FRAME_BUFFER_VALIDATION
+ , "Too many frame buffer color attachments."
+ , "Num: %d, Max: %d."
, _num
, g_caps.limits.maxFBAttachments
);
+
+ BGFX_ERROR_CHECK(
+ depth <= 1
+ , _err
+ , BGFX_ERROR_FRAME_BUFFER_VALIDATION
+ , "There can be only one depth texture attachment."
+ , "Num depth attachments %d."
+ , depth
+ );
+ }
+
+ bool isFrameBufferValid(uint8_t _num, const Attachment* _attachment)
+ {
+ BGFX_MUTEX_SCOPE(s_ctx->m_resourceApiLock);
+ bx::Error err;
+ isFrameBufferValid(_num, _attachment, &err);
+ return err.isOk();
}
static void isTextureValid(uint16_t _depth, bool _cubeMap, uint16_t _numLayers, TextureFormat::Enum _format, uint64_t _flags, bx::Error* _err)
{
- BX_ERROR_SCOPE(_err);
+ BX_ERROR_SCOPE(_err, "Texture validation");
const bool is3DTexture = 1 < _depth;
- if (_cubeMap && is3DTexture)
- {
- _err->setError(BGFX_ERROR_TEXTURE_VALIDATION
- , "Texture can't be depth and cube map at the same time."
- );
- return;
- }
+ BGFX_ERROR_CHECK(false
+ || !_cubeMap
+ || !is3DTexture
+ , _err
+ , BGFX_ERROR_TEXTURE_VALIDATION
+ , "Texture can't be 3D and cube map at the same time."
+ , ""
+ );
- if (is3DTexture
- && 0 == (g_caps.supported & BGFX_CAPS_TEXTURE_3D) )
- {
- _err->setError(BGFX_ERROR_TEXTURE_VALIDATION
- , "Texture3D is not supported! "
- "Use bgfx::getCaps to check BGFX_CAPS_TEXTURE_3D backend renderer capabilities."
- );
- return;
- }
+ BGFX_ERROR_CHECK(false
+ || is3DTexture
+ || 0 != (g_caps.supported & BGFX_CAPS_TEXTURE_3D)
+ , _err
+ , BGFX_ERROR_TEXTURE_VALIDATION
+ , "Texture3D is not supported! "
+ "Use bgfx::getCaps to check `BGFX_CAPS_TEXTURE_3D` backend renderer capabilities."
+ , ""
+ );
- if (0 != (_flags & BGFX_TEXTURE_RT_MASK)
- && 0 != (_flags & BGFX_TEXTURE_READ_BACK) )
- {
- _err->setError(BGFX_ERROR_TEXTURE_VALIDATION
- , "Can't create render target with BGFX_TEXTURE_READ_BACK flag."
- );
- return;
- }
+ BGFX_ERROR_CHECK(false
+ || 0 == (_flags & BGFX_TEXTURE_RT_MASK)
+ || 0 == (_flags & BGFX_TEXTURE_READ_BACK)
+ , _err
+ , BGFX_ERROR_TEXTURE_VALIDATION
+ , "Can't create render target with `BGFX_TEXTURE_READ_BACK` flag."
+ , ""
+ );
- if (1 < _numLayers
- && 0 == (g_caps.supported & BGFX_CAPS_TEXTURE_2D_ARRAY) )
- {
- _err->setError(BGFX_ERROR_TEXTURE_VALIDATION
- , "Texture array is not supported! "
- "Use bgfx::getCaps to check BGFX_CAPS_TEXTURE_2D_ARRAY backend renderer capabilities."
- );
- return;
- }
+ BGFX_ERROR_CHECK(false
+ || 1 >= _numLayers
+ || 0 != (g_caps.supported & BGFX_CAPS_TEXTURE_2D_ARRAY)
+ , _err
+ , BGFX_ERROR_TEXTURE_VALIDATION
+ , "Texture array is not supported! "
+ "Use bgfx::getCaps to check `BGFX_CAPS_TEXTURE_2D_ARRAY` backend renderer capabilities."
+ , ""
+ );
bool formatSupported;
if (0 != (_flags & (BGFX_TEXTURE_RT | BGFX_TEXTURE_RT_WRITE_ONLY)) )
@@ -4511,36 +4600,36 @@ namespace bgfx
) );
}
- if (!formatSupported)
- {
- _err->setError(BGFX_ERROR_TEXTURE_VALIDATION
- , "Texture format is not supported! "
- "Use bgfx::isTextureValid to check support for texture format before creating it."
- );
- return;
- }
+ BGFX_ERROR_CHECK(
+ formatSupported
+ , _err
+ , BGFX_ERROR_TEXTURE_VALIDATION
+ , "Texture format is not supported! "
+ "Use bgfx::isTextureValid to check support for texture format before creating it."
+ , ""
+ );
- if (0 != (_flags & BGFX_TEXTURE_MSAA_SAMPLE)
- && 0 == (g_caps.formats[_format] & BGFX_CAPS_FORMAT_TEXTURE_MSAA) )
- {
- _err->setError(BGFX_ERROR_TEXTURE_VALIDATION
- , "MSAA sampling for this texture format is not supported."
- );
- return;
- }
+ BGFX_ERROR_CHECK(false
+ || 0 == (_flags & BGFX_TEXTURE_MSAA_SAMPLE)
+ || 0 != (g_caps.formats[_format] & BGFX_CAPS_FORMAT_TEXTURE_MSAA)
+ , _err
+ , BGFX_ERROR_TEXTURE_VALIDATION
+ , "MSAA sampling for this texture format is not supported."
+ , ""
+ );
- if (0 != (_flags & BGFX_TEXTURE_SRGB)
- && 0 == (g_caps.formats[_format] & srgbCaps & (0
- | BGFX_CAPS_FORMAT_TEXTURE_2D_SRGB
- | BGFX_CAPS_FORMAT_TEXTURE_3D_SRGB
- | BGFX_CAPS_FORMAT_TEXTURE_CUBE_SRGB
- ) ) )
- {
- _err->setError(BGFX_ERROR_TEXTURE_VALIDATION
- , "sRGB sampling for this texture format is not supported."
- );
- return;
- }
+ BGFX_ERROR_CHECK(false
+ || 0 == (_flags & BGFX_TEXTURE_SRGB)
+ || 0 != (g_caps.formats[_format] & srgbCaps & (0
+ | BGFX_CAPS_FORMAT_TEXTURE_2D_SRGB
+ | BGFX_CAPS_FORMAT_TEXTURE_3D_SRGB
+ | BGFX_CAPS_FORMAT_TEXTURE_CUBE_SRGB
+ ) )
+ , _err
+ , BGFX_ERROR_TEXTURE_VALIDATION
+ , "sRGB sampling for this texture format is not supported."
+ , ""
+ );
}
bool isTextureValid(uint16_t _depth, bool _cubeMap, uint16_t _numLayers, TextureFormat::Enum _format, uint64_t _flags)
diff --git a/src/bgfx.idl.inl b/src/bgfx.idl.inl
index a0837952c..6322a8388 100644
--- a/src/bgfx.idl.inl
+++ b/src/bgfx.idl.inl
@@ -433,6 +433,11 @@ BGFX_C_API bool bgfx_is_texture_valid(uint16_t _depth, bool _cubeMap, uint16_t _
return bgfx::isTextureValid(_depth, _cubeMap, _numLayers, (bgfx::TextureFormat::Enum)_format, _flags);
}
+BGFX_C_API bool bgfx_is_frame_buffer_valid(uint8_t _num, const bgfx_attachment_t* _attachment)
+{
+ return bgfx::isFrameBufferValid(_num, (const bgfx::Attachment*)_attachment);
+}
+
BGFX_C_API void bgfx_calc_texture_size(bgfx_texture_info_t * _info, uint16_t _width, uint16_t _height, uint16_t _depth, bool _cubeMap, bool _hasMips, uint16_t _numLayers, bgfx_texture_format_t _format)
{
bgfx::TextureInfo & info = *(bgfx::TextureInfo *)_info;
@@ -1316,6 +1321,7 @@ BGFX_C_API bgfx_interface_vtbl_t* bgfx_get_interface(uint32_t _version)
bgfx_create_compute_program,
bgfx_destroy_program,
bgfx_is_texture_valid,
+ bgfx_is_frame_buffer_valid,
bgfx_calc_texture_size,
bgfx_create_texture,
bgfx_create_texture_2d,
diff --git a/src/bgfx_p.h b/src/bgfx_p.h
index 2013ef085..262c2cde0 100644
--- a/src/bgfx_p.h
+++ b/src/bgfx_p.h
@@ -73,7 +73,6 @@ namespace bgfx
#endif // BX_COMPILER_CLANG_ANALYZER
void trace(const char* _filePath, uint16_t _line, const char* _format, ...);
- void checkFrameBuffer(uint8_t _num, const Attachment* _attachment);
inline bool operator==(const VertexLayoutHandle& _lhs, const VertexLayoutHandle& _rhs) { return _lhs.idx == _rhs.idx; }
inline bool operator==(const UniformHandle& _lhs, const UniformHandle& _rhs) { return _lhs.idx == _rhs.idx; }
@@ -114,6 +113,7 @@ namespace bgfx
#include
#include
#include
+#include
#include
#include
#include
@@ -279,6 +279,7 @@ namespace bgfx
extern InternalData g_internalData;
extern PlatformData g_platformData;
extern bool g_platformDataChangedSinceReset;
+ extern void isFrameBufferValid(uint8_t _num, const Attachment* _attachment, bx::Error* _err);
#if BGFX_CONFIG_MAX_DRAW_CALLS < (64<<10)
typedef uint16_t RenderItemCount;
@@ -4534,7 +4535,13 @@ namespace bgfx
{
BGFX_MUTEX_SCOPE(m_resourceApiLock);
- checkFrameBuffer(_num, _attachment);
+ bx::Error err;
+ isFrameBufferValid(_num, _attachment, &err);
+
+ if (!err.isOk() )
+ {
+ return BGFX_INVALID_HANDLE;
+ }
FrameBufferHandle handle = { m_frameBufferHandle.alloc() };
BX_WARN(isValid(handle), "Failed to allocate frame buffer handle.");