summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/bgfx_p.h
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/bgfx_p.h')
-rw-r--r--3rdparty/bgfx/src/bgfx_p.h989
1 files changed, 565 insertions, 424 deletions
diff --git a/3rdparty/bgfx/src/bgfx_p.h b/3rdparty/bgfx/src/bgfx_p.h
index f6dfc434b19..2e422bf6542 100644
--- a/3rdparty/bgfx/src/bgfx_p.h
+++ b/3rdparty/bgfx/src/bgfx_p.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2019 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
@@ -25,24 +25,24 @@
#include <inttypes.h>
// Check handle, cannot be bgfx::kInvalidHandle and must be valid.
-#define BGFX_CHECK_HANDLE(_desc, _handleAlloc, _handle) \
- BX_CHECK(isValid(_handle) \
- && _handleAlloc.isValid(_handle.idx) \
- , "Invalid handle. %s handle: %d (max %d)" \
- , _desc \
- , _handle.idx \
- , _handleAlloc.getMaxHandles() \
- )
+#define BGFX_CHECK_HANDLE(_desc, _handleAlloc, _handle) \
+ BX_CHECK(isValid(_handle) \
+ && _handleAlloc.isValid(_handle.idx) \
+ , "Invalid handle. %s handle: %d (max %d)" \
+ , _desc \
+ , _handle.idx \
+ , _handleAlloc.getMaxHandles() \
+ )
// Check handle, it's ok to be bgfx::kInvalidHandle or must be valid.
#define BGFX_CHECK_HANDLE_INVALID_OK(_desc, _handleAlloc, _handle) \
- BX_CHECK(!isValid(_handle) \
- || _handleAlloc.isValid(_handle.idx) \
- , "Invalid handle. %s handle: %d (max %d)" \
- , _desc \
- , _handle.idx \
- , _handleAlloc.getMaxHandles() \
- )
+ BX_CHECK(!isValid(_handle) \
+ || _handleAlloc.isValid(_handle.idx) \
+ , "Invalid handle. %s handle: %d (max %d)" \
+ , _desc \
+ , _handle.idx \
+ , _handleAlloc.getMaxHandles() \
+ )
#if BGFX_CONFIG_MULTITHREADED
# define BGFX_MUTEX_SCOPE(_mutex) bx::MutexScope BX_CONCATENATE(mutexScope, __LINE__)(_mutex)
@@ -51,14 +51,16 @@
#endif // BGFX_CONFIG_MULTITHREADED
#if BGFX_CONFIG_PROFILER
-# define BGFX_PROFILER_SCOPE(_name, _abgr) ProfilerScope BX_CONCATENATE(profilerScope, __LINE__)(_name, _abgr, __FILE__, uint16_t(__LINE__) )
-# define BGFX_PROFILER_BEGIN(_name, _abgr) g_callback->profilerBeginLiteral(_name, _abgr, __FILE__, uint16_t(__LINE__) )
-# define BGFX_PROFILER_END() g_callback->profilerEnd()
+# define BGFX_PROFILER_SCOPE(_name, _abgr) ProfilerScope BX_CONCATENATE(profilerScope, __LINE__)(_name, _abgr, __FILE__, uint16_t(__LINE__) )
+# define BGFX_PROFILER_BEGIN(_name, _abgr) g_callback->profilerBegin(_name, _abgr, __FILE__, uint16_t(__LINE__) )
+# define BGFX_PROFILER_BEGIN_LITERAL(_name, _abgr) g_callback->profilerBeginLiteral(_name, _abgr, __FILE__, uint16_t(__LINE__) )
+# define BGFX_PROFILER_END() g_callback->profilerEnd()
# define BGFX_PROFILER_SET_CURRENT_THREAD_NAME(_name) BX_NOOP()
#else
-# define BGFX_PROFILER_SCOPE(_name, _abgr) BX_NOOP()
-# define BGFX_PROFILER_BEGIN(_name, _abgr) BX_NOOP()
-# define BGFX_PROFILER_END() BX_NOOP()
+# define BGFX_PROFILER_SCOPE(_name, _abgr) BX_NOOP()
+# define BGFX_PROFILER_BEGIN(_name, _abgr) BX_NOOP()
+# define BGFX_PROFILER_BEGIN_LITERAL(_name, _abgr) BX_NOOP()
+# define BGFX_PROFILER_END() BX_NOOP()
# define BGFX_PROFILER_SET_CURRENT_THREAD_NAME(_name) BX_NOOP()
#endif // BGFX_PROFILER_SCOPE
@@ -72,7 +74,7 @@ namespace bgfx
void trace(const char* _filePath, uint16_t _line, const char* _format, ...);
- inline bool operator==(const VertexDeclHandle& _lhs, const VertexDeclHandle& _rhs) { return _lhs.idx == _rhs.idx; }
+ 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; }
}
@@ -213,14 +215,16 @@ namespace stl = std;
#define BGFX_STATE_INTERNAL_SCISSOR UINT64_C(0x2000000000000000)
#define BGFX_STATE_INTERNAL_OCCLUSION_QUERY UINT64_C(0x4000000000000000)
+#define BGFX_SUBMIT_RESERVED_MASK UINT8_C(0xff)
#define BGFX_SUBMIT_INTERNAL_OCCLUSION_VISIBLE UINT8_C(0x80)
#define BGFX_RENDERER_DIRECT3D9_NAME "Direct3D 9"
#define BGFX_RENDERER_DIRECT3D11_NAME "Direct3D 11"
#define BGFX_RENDERER_DIRECT3D12_NAME "Direct3D 12"
+#define BGFX_RENDERER_GNM_NAME "GNM"
#define BGFX_RENDERER_METAL_NAME "Metal"
+#define BGFX_RENDERER_NVN_NAME "NVN"
#define BGFX_RENDERER_VULKAN_NAME "Vulkan"
-#define BGFX_RENDERER_GNM_NAME "GNM"
#define BGFX_RENDERER_NOOP_NAME "Noop"
#if BGFX_CONFIG_RENDERER_OPENGL
@@ -232,7 +236,7 @@ namespace stl = std;
# else
# define BGFX_RENDERER_OPENGL_NAME "OpenGL 3.3"
# endif // 31+
-# elif BGFX_CONFIG_RENDERER_OPENGL >= 40 && BGFX_CONFIG_RENDERER_OPENGL <= 45
+# elif BGFX_CONFIG_RENDERER_OPENGL >= 40 && BGFX_CONFIG_RENDERER_OPENGL <= 46
# if BGFX_CONFIG_RENDERER_OPENGL == 40
# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.0"
# elif BGFX_CONFIG_RENDERER_OPENGL == 41
@@ -243,8 +247,10 @@ namespace stl = std;
# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.3"
# elif BGFX_CONFIG_RENDERER_OPENGL == 44
# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.4"
-# else
+# elif BGFX_CONFIG_RENDERER_OPENGL == 45
# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.5"
+# else
+# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.6"
# endif // 40+
# else
# define BGFX_RENDERER_OPENGL_NAME "OpenGL 2.1"
@@ -252,8 +258,10 @@ namespace stl = std;
#elif BGFX_CONFIG_RENDERER_OPENGLES
# if BGFX_CONFIG_RENDERER_OPENGLES == 30
# define BGFX_RENDERER_OPENGL_NAME "OpenGL ES 3.0"
-# elif BGFX_CONFIG_RENDERER_OPENGLES >= 31
+# elif BGFX_CONFIG_RENDERER_OPENGLES == 31
# define BGFX_RENDERER_OPENGL_NAME "OpenGL ES 3.1"
+# elif BGFX_CONFIG_RENDERER_OPENGLES >= 32
+# define BGFX_RENDERER_OPENGL_NAME "OpenGL ES 3.2"
# else
# define BGFX_RENDERER_OPENGL_NAME "OpenGL ES 2.0"
# endif // BGFX_CONFIG_RENDERER_OPENGLES
@@ -277,8 +285,10 @@ namespace bgfx
{
enum Enum
{
+ IndexBuffer,
Shader,
Texture,
+ VertexBuffer,
Count
};
@@ -287,21 +297,25 @@ namespace bgfx
uint16_t idx;
};
- inline Handle convert(ShaderHandle _handle)
- {
- Handle handle = { Handle::Shader, _handle.idx };
- return handle;
+#define CONVERT_HANDLE(_name) \
+ inline Handle convert(_name##Handle _handle) \
+ { \
+ Handle handle = { Handle::_name, _handle.idx }; \
+ return handle; \
}
- inline Handle convert(TextureHandle _handle)
- {
- Handle handle = { Handle::Texture, _handle.idx };
- return handle;
- }
+ CONVERT_HANDLE(IndexBuffer);
+ CONVERT_HANDLE(Shader);
+ CONVERT_HANDLE(Texture);
+ CONVERT_HANDLE(VertexBuffer);
+
+#undef CONVERT_HANDLE
- inline bool isValid(const VertexDecl& _decl)
+ const char* getTypeName(Handle _handle);
+
+ inline bool isValid(const VertexLayout& _layout)
{
- return 0 != _decl.m_stride;
+ return 0 != _layout.m_stride;
}
struct Condition
@@ -507,7 +521,7 @@ namespace bgfx
return uint32_t( (_stencil >> (32*_0or1) ) );
}
- inline bool needBorderColor(uint32_t _flags)
+ inline bool needBorderColor(uint64_t _flags)
{
return BGFX_SAMPLER_U_BORDER == (_flags & BGFX_SAMPLER_U_BORDER)
|| BGFX_SAMPLER_V_BORDER == (_flags & BGFX_SAMPLER_V_BORDER)
@@ -528,8 +542,8 @@ namespace bgfx
return 1;
}
- /// Dump vertex declaration into debug output.
- void dump(const VertexDecl& _decl);
+ /// Dump vertex layout into debug output.
+ void dump(const VertexLayout& _layout);
struct TextVideoMem
{
@@ -643,7 +657,7 @@ namespace bgfx
TextureHandle m_texture;
TransientVertexBuffer* m_vb;
TransientIndexBuffer* m_ib;
- VertexDecl m_decl;
+ VertexLayout m_layout;
ProgramHandle m_program;
};
@@ -712,8 +726,8 @@ namespace bgfx
void init();
void shutdown();
- TransientVertexBuffer* m_vb;
- VertexDecl m_decl;
+ VertexBufferHandle m_vb;
+ VertexLayout m_layout;
ProgramHandle m_program[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
};
@@ -765,7 +779,7 @@ namespace bgfx
{
RendererInit,
RendererShutdownBegin,
- CreateVertexDecl,
+ CreateVertexLayout,
CreateIndexBuffer,
CreateVertexBuffer,
CreateDynamicIndexBuffer,
@@ -784,7 +798,7 @@ namespace bgfx
SetName,
End,
RendererShutdownEnd,
- DestroyVertexDecl,
+ DestroyVertexLayout,
DestroyIndexBuffer,
DestroyVertexBuffer,
DestroyDynamicIndexBuffer,
@@ -801,7 +815,12 @@ namespace bgfx
void write(const void* _data, uint32_t _size)
{
BX_CHECK(m_size == BGFX_CONFIG_MAX_COMMAND_BUFFER_SIZE, "Called write outside start/finish?");
- BX_CHECK(m_pos < m_size, "CommandBuffer::write error (pos: %d, size: %d).", m_pos, m_size);
+ BX_CHECK(m_pos + _size <= m_size
+ , "CommandBuffer::write error (pos: %d-%d, size: %d)."
+ , m_pos
+ , m_pos + _size
+ , m_size
+ );
bx::memCopy(&m_buffer[m_pos], _data, _size);
m_pos += _size;
}
@@ -815,7 +834,12 @@ namespace bgfx
void read(void* _data, uint32_t _size)
{
- BX_CHECK(m_pos < m_size, "CommandBuffer::read error (pos: %d, size: %d).", m_pos, m_size);
+ BX_CHECK(m_pos + _size <= m_size
+ , "CommandBuffer::read error (pos: %d-%d, size: %d)."
+ , m_pos
+ , m_pos + _size
+ , m_size
+ );
bx::memCopy(_data, &m_buffer[m_pos], _size);
m_pos += _size;
}
@@ -829,7 +853,12 @@ namespace bgfx
const uint8_t* skip(uint32_t _size)
{
- BX_CHECK(m_pos < m_size, "CommandBuffer::skip error (pos: %d, size: %d).", m_pos, m_size);
+ BX_CHECK(m_pos + _size <= m_size
+ , "CommandBuffer::skip error (pos: %d-%d, size: %d)."
+ , m_pos
+ , m_pos + _size
+ , m_size
+ );
const uint8_t* result = &m_buffer[m_pos];
m_pos += _size;
return result;
@@ -874,120 +903,118 @@ namespace bgfx
};
//
-#define SORT_KEY_NUM_BITS_VIEW 10
+constexpr uint8_t kSortKeyViewNumBits = 10;
+constexpr uint8_t kSortKeyViewBitShift = 64-kSortKeyViewNumBits;
+constexpr uint64_t kSortKeyViewMask = uint64_t(BGFX_CONFIG_MAX_VIEWS-1)<<kSortKeyViewBitShift;
-#define SORT_KEY_VIEW_SHIFT (64-SORT_KEY_NUM_BITS_VIEW)
-#define SORT_KEY_VIEW_MASK ( (uint64_t(BGFX_CONFIG_MAX_VIEWS-1) )<<SORT_KEY_VIEW_SHIFT)
-
-#define SORT_KEY_DRAW_BIT_SHIFT (SORT_KEY_VIEW_SHIFT - 1)
-#define SORT_KEY_DRAW_BIT (UINT64_C(1)<<SORT_KEY_DRAW_BIT_SHIFT)
+constexpr uint8_t kSortKeyDrawBitShift = kSortKeyViewBitShift - 1;
+constexpr uint64_t kSortKeyDrawBit = uint64_t(1)<<kSortKeyDrawBitShift;
//
-#define SORT_KEY_NUM_BITS_DRAW_TYPE 2
-
-#define SORT_KEY_DRAW_TYPE_BIT_SHIFT (SORT_KEY_DRAW_BIT_SHIFT - SORT_KEY_NUM_BITS_DRAW_TYPE)
-#define SORT_KEY_DRAW_TYPE_MASK (UINT64_C(3)<<SORT_KEY_DRAW_TYPE_BIT_SHIFT)
+constexpr uint8_t kSortKeyDrawTypeNumBits = 2;
+constexpr uint8_t kSortKeyDrawTypeBitShift = kSortKeyDrawBitShift - kSortKeyDrawTypeNumBits;
+constexpr uint64_t kSortKeyDrawTypeMask = uint64_t(3)<<kSortKeyDrawTypeBitShift;
-#define SORT_KEY_DRAW_TYPE_PROGRAM (UINT64_C(0)<<SORT_KEY_DRAW_TYPE_BIT_SHIFT)
-#define SORT_KEY_DRAW_TYPE_DEPTH (UINT64_C(1)<<SORT_KEY_DRAW_TYPE_BIT_SHIFT)
-#define SORT_KEY_DRAW_TYPE_SEQUENCE (UINT64_C(2)<<SORT_KEY_DRAW_TYPE_BIT_SHIFT)
+constexpr uint64_t kSortKeyDrawTypeProgram = uint64_t(0)<<kSortKeyDrawTypeBitShift;
+constexpr uint64_t kSortKeyDrawTypeDepth = uint64_t(1)<<kSortKeyDrawTypeBitShift;
+constexpr uint64_t kSortKeyDrawTypeSequence = uint64_t(2)<<kSortKeyDrawTypeBitShift;
//
-#define SORT_KEY_NUM_BITS_TRANS 2
+constexpr uint8_t kSortKeyTransNumBits = 2;
-#define SORT_KEY_DRAW_0_TRANS_SHIFT (SORT_KEY_DRAW_TYPE_BIT_SHIFT - SORT_KEY_NUM_BITS_TRANS)
-#define SORT_KEY_DRAW_0_TRANS_MASK (UINT64_C(0x3)<<SORT_KEY_DRAW_0_TRANS_SHIFT)
+constexpr uint8_t kSortKeyDraw0TransShift = kSortKeyDrawTypeBitShift - kSortKeyTransNumBits;
+constexpr uint64_t kSortKeyDraw0TransMask = uint64_t(0x3)<<kSortKeyDraw0TransShift;
-#define SORT_KEY_DRAW_0_PROGRAM_SHIFT (SORT_KEY_DRAW_0_TRANS_SHIFT - BGFX_CONFIG_SORT_KEY_NUM_BITS_PROGRAM)
-#define SORT_KEY_DRAW_0_PROGRAM_MASK ( (uint64_t(BGFX_CONFIG_MAX_PROGRAMS-1) )<<SORT_KEY_DRAW_0_PROGRAM_SHIFT)
+constexpr uint8_t kSortKeyDraw0ProgramShift = kSortKeyDraw0TransShift - BGFX_CONFIG_SORT_KEY_NUM_BITS_PROGRAM;
+constexpr uint64_t kSortKeyDraw0ProgramMask = uint64_t(BGFX_CONFIG_MAX_PROGRAMS-1)<<kSortKeyDraw0ProgramShift;
-#define SORT_KEY_DRAW_0_DEPTH_SHIFT (SORT_KEY_DRAW_0_PROGRAM_SHIFT - BGFX_CONFIG_SORT_KEY_NUM_BITS_DEPTH)
-#define SORT_KEY_DRAW_0_DEPTH_MASK ( ( (UINT64_C(1)<<BGFX_CONFIG_SORT_KEY_NUM_BITS_DEPTH)-1)<<SORT_KEY_DRAW_0_DEPTH_SHIFT)
+constexpr uint8_t kSortKeyDraw0DepthShift = kSortKeyDraw0ProgramShift - BGFX_CONFIG_SORT_KEY_NUM_BITS_DEPTH;
+constexpr uint64_t kSortKeyDraw0DepthMask = ( (uint64_t(1)<<BGFX_CONFIG_SORT_KEY_NUM_BITS_DEPTH)-1)<<kSortKeyDraw0DepthShift;
//
-#define SORT_KEY_DRAW_1_DEPTH_SHIFT (SORT_KEY_DRAW_TYPE_BIT_SHIFT - BGFX_CONFIG_SORT_KEY_NUM_BITS_DEPTH)
-#define SORT_KEY_DRAW_1_DEPTH_MASK ( ( (UINT64_C(1)<<BGFX_CONFIG_SORT_KEY_NUM_BITS_DEPTH)-1)<<SORT_KEY_DRAW_1_DEPTH_SHIFT)
+constexpr uint8_t kSortKeyDraw1DepthShift = kSortKeyDrawTypeBitShift - BGFX_CONFIG_SORT_KEY_NUM_BITS_DEPTH;
+constexpr uint64_t kSortKeyDraw1DepthMask = ( (uint64_t(1)<<BGFX_CONFIG_SORT_KEY_NUM_BITS_DEPTH)-1)<<kSortKeyDraw1DepthShift;
-#define SORT_KEY_DRAW_1_TRANS_SHIFT (SORT_KEY_DRAW_1_DEPTH_SHIFT - SORT_KEY_NUM_BITS_TRANS)
-#define SORT_KEY_DRAW_1_TRANS_MASK (UINT64_C(0x3)<<SORT_KEY_DRAW_1_TRANS_SHIFT)
+constexpr uint8_t kSortKeyDraw1TransShift = kSortKeyDraw1DepthShift - kSortKeyTransNumBits;
+constexpr uint64_t kSortKeyDraw1TransMask = uint64_t(0x3)<<kSortKeyDraw1TransShift;
-#define SORT_KEY_DRAW_1_PROGRAM_SHIFT (SORT_KEY_DRAW_1_TRANS_SHIFT - BGFX_CONFIG_SORT_KEY_NUM_BITS_PROGRAM)
-#define SORT_KEY_DRAW_1_PROGRAM_MASK ( (uint64_t(BGFX_CONFIG_MAX_PROGRAMS-1) )<<SORT_KEY_DRAW_1_PROGRAM_SHIFT)
+constexpr uint8_t kSortKeyDraw1ProgramShift = kSortKeyDraw1TransShift - BGFX_CONFIG_SORT_KEY_NUM_BITS_PROGRAM;
+constexpr uint64_t kSortKeyDraw1ProgramMask = uint64_t(BGFX_CONFIG_MAX_PROGRAMS-1)<<kSortKeyDraw1ProgramShift;
//
-#define SORT_KEY_DRAW_2_SEQ_SHIFT (SORT_KEY_DRAW_TYPE_BIT_SHIFT - BGFX_CONFIG_SORT_KEY_NUM_BITS_SEQ)
-#define SORT_KEY_DRAW_2_SEQ_MASK ( ( (UINT64_C(1)<<BGFX_CONFIG_SORT_KEY_NUM_BITS_SEQ)-1)<<SORT_KEY_DRAW_2_SEQ_SHIFT)
+constexpr uint8_t kSortKeyDraw2SeqShift = kSortKeyDrawTypeBitShift - BGFX_CONFIG_SORT_KEY_NUM_BITS_SEQ;
+constexpr uint64_t kSortKeyDraw2SeqMask = ( (uint64_t(1)<<BGFX_CONFIG_SORT_KEY_NUM_BITS_SEQ)-1)<<kSortKeyDraw2SeqShift;
-#define SORT_KEY_DRAW_2_TRANS_SHIFT (SORT_KEY_DRAW_2_SEQ_SHIFT - SORT_KEY_NUM_BITS_TRANS)
-#define SORT_KEY_DRAW_2_TRANS_MASK (UINT64_C(0x3)<<SORT_KEY_DRAW_2_TRANS_SHIFT)
+constexpr uint8_t kSortKeyDraw2TransShift = kSortKeyDraw2SeqShift - kSortKeyTransNumBits;
+constexpr uint64_t kSortKeyDraw2TransMask = uint64_t(0x3)<<kSortKeyDraw2TransShift;
-#define SORT_KEY_DRAW_2_PROGRAM_SHIFT (SORT_KEY_DRAW_2_TRANS_SHIFT - BGFX_CONFIG_SORT_KEY_NUM_BITS_PROGRAM)
-#define SORT_KEY_DRAW_2_PROGRAM_MASK ( (uint64_t(BGFX_CONFIG_MAX_PROGRAMS-1) )<<SORT_KEY_DRAW_2_PROGRAM_SHIFT)
+constexpr uint8_t kSortKeyDraw2ProgramShift = kSortKeyDraw2TransShift - BGFX_CONFIG_SORT_KEY_NUM_BITS_PROGRAM;
+constexpr uint64_t kSortKeyDraw2ProgramMask = uint64_t(BGFX_CONFIG_MAX_PROGRAMS-1)<<kSortKeyDraw2ProgramShift;
//
-#define SORT_KEY_COMPUTE_SEQ_SHIFT (SORT_KEY_DRAW_BIT_SHIFT - BGFX_CONFIG_SORT_KEY_NUM_BITS_SEQ)
-#define SORT_KEY_COMPUTE_SEQ_MASK ( ( (UINT64_C(1)<<BGFX_CONFIG_SORT_KEY_NUM_BITS_SEQ)-1)<<SORT_KEY_COMPUTE_SEQ_SHIFT)
+constexpr uint8_t kSortKeyComputeSeqShift = kSortKeyDrawBitShift - BGFX_CONFIG_SORT_KEY_NUM_BITS_SEQ;
+constexpr uint64_t kSortKeyComputeSeqMask = ( (uint64_t(1)<<BGFX_CONFIG_SORT_KEY_NUM_BITS_SEQ)-1)<<kSortKeyComputeSeqShift;
-#define SORT_KEY_COMPUTE_PROGRAM_SHIFT (SORT_KEY_COMPUTE_SEQ_SHIFT - BGFX_CONFIG_SORT_KEY_NUM_BITS_PROGRAM)
-#define SORT_KEY_COMPUTE_PROGRAM_MASK ( (uint64_t(BGFX_CONFIG_MAX_PROGRAMS-1) )<<SORT_KEY_COMPUTE_PROGRAM_SHIFT)
+constexpr uint8_t kSortKeyComputeProgramShift = kSortKeyComputeSeqShift - BGFX_CONFIG_SORT_KEY_NUM_BITS_PROGRAM;
+constexpr uint64_t kSortKeyComputeProgramMask = uint64_t(BGFX_CONFIG_MAX_PROGRAMS-1)<<kSortKeyComputeProgramShift;
- BX_STATIC_ASSERT(BGFX_CONFIG_MAX_VIEWS <= (1<<SORT_KEY_NUM_BITS_VIEW) );
+ BX_STATIC_ASSERT(BGFX_CONFIG_MAX_VIEWS <= (1<<kSortKeyViewNumBits) );
BX_STATIC_ASSERT( (BGFX_CONFIG_MAX_PROGRAMS & (BGFX_CONFIG_MAX_PROGRAMS-1) ) == 0); // Must be power of 2.
BX_STATIC_ASSERT( (0 // Render key mask shouldn't overlap.
- | SORT_KEY_VIEW_MASK
- | SORT_KEY_DRAW_BIT
- | SORT_KEY_DRAW_TYPE_MASK
- | SORT_KEY_DRAW_0_TRANS_MASK
- | SORT_KEY_DRAW_0_PROGRAM_MASK
- | SORT_KEY_DRAW_0_DEPTH_MASK
+ | kSortKeyViewMask
+ | kSortKeyDrawBit
+ | kSortKeyDrawTypeMask
+ | kSortKeyDraw0TransMask
+ | kSortKeyDraw0ProgramMask
+ | kSortKeyDraw0DepthMask
) == (0
- ^ SORT_KEY_VIEW_MASK
- ^ SORT_KEY_DRAW_BIT
- ^ SORT_KEY_DRAW_TYPE_MASK
- ^ SORT_KEY_DRAW_0_TRANS_MASK
- ^ SORT_KEY_DRAW_0_PROGRAM_MASK
- ^ SORT_KEY_DRAW_0_DEPTH_MASK
+ ^ kSortKeyViewMask
+ ^ kSortKeyDrawBit
+ ^ kSortKeyDrawTypeMask
+ ^ kSortKeyDraw0TransMask
+ ^ kSortKeyDraw0ProgramMask
+ ^ kSortKeyDraw0DepthMask
) );
BX_STATIC_ASSERT( (0 // Render key mask shouldn't overlap.
- | SORT_KEY_VIEW_MASK
- | SORT_KEY_DRAW_BIT
- | SORT_KEY_DRAW_TYPE_MASK
- | SORT_KEY_DRAW_1_DEPTH_MASK
- | SORT_KEY_DRAW_1_TRANS_MASK
- | SORT_KEY_DRAW_1_PROGRAM_MASK
+ | kSortKeyViewMask
+ | kSortKeyDrawBit
+ | kSortKeyDrawTypeMask
+ | kSortKeyDraw1DepthMask
+ | kSortKeyDraw1TransMask
+ | kSortKeyDraw1ProgramMask
) == (0
- ^ SORT_KEY_VIEW_MASK
- ^ SORT_KEY_DRAW_BIT
- ^ SORT_KEY_DRAW_TYPE_MASK
- ^ SORT_KEY_DRAW_1_DEPTH_MASK
- ^ SORT_KEY_DRAW_1_TRANS_MASK
- ^ SORT_KEY_DRAW_1_PROGRAM_MASK
+ ^ kSortKeyViewMask
+ ^ kSortKeyDrawBit
+ ^ kSortKeyDrawTypeMask
+ ^ kSortKeyDraw1DepthMask
+ ^ kSortKeyDraw1TransMask
+ ^ kSortKeyDraw1ProgramMask
) );
BX_STATIC_ASSERT( (0 // Render key mask shouldn't overlap.
- | SORT_KEY_VIEW_MASK
- | SORT_KEY_DRAW_BIT
- | SORT_KEY_DRAW_TYPE_MASK
- | SORT_KEY_DRAW_2_SEQ_MASK
- | SORT_KEY_DRAW_2_TRANS_MASK
- | SORT_KEY_DRAW_2_PROGRAM_MASK
+ | kSortKeyViewMask
+ | kSortKeyDrawBit
+ | kSortKeyDrawTypeMask
+ | kSortKeyDraw2SeqMask
+ | kSortKeyDraw2TransMask
+ | kSortKeyDraw2ProgramMask
) == (0
- ^ SORT_KEY_VIEW_MASK
- ^ SORT_KEY_DRAW_BIT
- ^ SORT_KEY_DRAW_TYPE_MASK
- ^ SORT_KEY_DRAW_2_SEQ_MASK
- ^ SORT_KEY_DRAW_2_TRANS_MASK
- ^ SORT_KEY_DRAW_2_PROGRAM_MASK
+ ^ kSortKeyViewMask
+ ^ kSortKeyDrawBit
+ ^ kSortKeyDrawTypeMask
+ ^ kSortKeyDraw2SeqMask
+ ^ kSortKeyDraw2TransMask
+ ^ kSortKeyDraw2ProgramMask
) );
BX_STATIC_ASSERT( (0 // Compute key mask shouldn't overlap.
- | SORT_KEY_VIEW_MASK
- | SORT_KEY_DRAW_BIT
- | SORT_KEY_COMPUTE_SEQ_SHIFT
- | SORT_KEY_COMPUTE_PROGRAM_MASK
+ | kSortKeyViewMask
+ | kSortKeyDrawBit
+ | kSortKeyComputeSeqShift
+ | kSortKeyComputeProgramMask
) == (0
- ^ SORT_KEY_VIEW_MASK
- ^ SORT_KEY_DRAW_BIT
- ^ SORT_KEY_COMPUTE_SEQ_SHIFT
- ^ SORT_KEY_COMPUTE_PROGRAM_MASK
+ ^ kSortKeyViewMask
+ ^ kSortKeyDrawBit
+ ^ kSortKeyComputeSeqShift
+ ^ kSortKeyComputeProgramMask
) );
// | 3 2 1 0|
@@ -1034,49 +1061,61 @@ namespace bgfx
uint64_t encodeDraw(Enum _type)
{
- if (SortDepth == _type)
+ switch (_type)
{
- const uint64_t depth = (uint64_t(m_depth ) << SORT_KEY_DRAW_1_DEPTH_SHIFT ) & SORT_KEY_DRAW_1_DEPTH_MASK;
- const uint64_t program = (uint64_t(m_program) << SORT_KEY_DRAW_1_PROGRAM_SHIFT) & SORT_KEY_DRAW_1_PROGRAM_MASK;
- const uint64_t trans = (uint64_t(m_trans ) << SORT_KEY_DRAW_1_TRANS_SHIFT ) & SORT_KEY_DRAW_1_TRANS_MASK;
- const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
- const uint64_t key = view|SORT_KEY_DRAW_BIT|SORT_KEY_DRAW_TYPE_DEPTH|depth|trans|program;
+ case SortProgram:
+ {
+ const uint64_t depth = (uint64_t(m_depth ) << kSortKeyDraw0DepthShift ) & kSortKeyDraw0DepthMask;
+ const uint64_t program = (uint64_t(m_program.idx) << kSortKeyDraw0ProgramShift) & kSortKeyDraw0ProgramMask;
+ const uint64_t trans = (uint64_t(m_trans ) << kSortKeyDraw0TransShift ) & kSortKeyDraw0TransMask;
+ const uint64_t view = (uint64_t(m_view ) << kSortKeyViewBitShift ) & kSortKeyViewMask;
+ const uint64_t key = view|kSortKeyDrawBit|kSortKeyDrawTypeProgram|trans|program|depth;
- return key;
- }
- else if (SortSequence == _type)
- {
- const uint64_t seq = (uint64_t(m_seq ) << SORT_KEY_DRAW_2_SEQ_SHIFT ) & SORT_KEY_DRAW_2_SEQ_MASK;
- const uint64_t program = (uint64_t(m_program) << SORT_KEY_DRAW_2_PROGRAM_SHIFT) & SORT_KEY_DRAW_2_PROGRAM_MASK;
- const uint64_t trans = (uint64_t(m_trans ) << SORT_KEY_DRAW_2_TRANS_SHIFT ) & SORT_KEY_DRAW_2_TRANS_MASK;
- const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
- const uint64_t key = view|SORT_KEY_DRAW_BIT|SORT_KEY_DRAW_TYPE_SEQUENCE|seq|trans|program;
+ return key;
+ }
+ break;
- BX_CHECK(seq == (uint64_t(m_seq) << SORT_KEY_DRAW_2_SEQ_SHIFT)
- , "SortKey error, sequence is truncated (m_seq: %d)."
- , m_seq
- );
+ case SortDepth:
+ {
+ const uint64_t depth = (uint64_t(m_depth ) << kSortKeyDraw1DepthShift ) & kSortKeyDraw1DepthMask;
+ const uint64_t program = (uint64_t(m_program.idx) << kSortKeyDraw1ProgramShift) & kSortKeyDraw1ProgramMask;
+ const uint64_t trans = (uint64_t(m_trans ) << kSortKeyDraw1TransShift) & kSortKeyDraw1TransMask;
+ const uint64_t view = (uint64_t(m_view ) << kSortKeyViewBitShift ) & kSortKeyViewMask;
+ const uint64_t key = view|kSortKeyDrawBit|kSortKeyDrawTypeDepth|depth|trans|program;
+ return key;
+ }
+ break;
- return key;
- }
+ case SortSequence:
+ {
+ const uint64_t seq = (uint64_t(m_seq ) << kSortKeyDraw2SeqShift ) & kSortKeyDraw2SeqMask;
+ const uint64_t program = (uint64_t(m_program.idx) << kSortKeyDraw2ProgramShift) & kSortKeyDraw2ProgramMask;
+ const uint64_t trans = (uint64_t(m_trans ) << kSortKeyDraw2TransShift ) & kSortKeyDraw2TransMask;
+ const uint64_t view = (uint64_t(m_view ) << kSortKeyViewBitShift ) & kSortKeyViewMask;
+ const uint64_t key = view|kSortKeyDrawBit|kSortKeyDrawTypeSequence|seq|trans|program;
+
+ BX_CHECK(seq == (uint64_t(m_seq) << kSortKeyDraw2SeqShift)
+ , "SortKey error, sequence is truncated (m_seq: %d)."
+ , m_seq
+ );
- const uint64_t depth = (uint64_t(m_depth ) << SORT_KEY_DRAW_0_DEPTH_SHIFT ) & SORT_KEY_DRAW_0_DEPTH_MASK;
- const uint64_t program = (uint64_t(m_program) << SORT_KEY_DRAW_0_PROGRAM_SHIFT) & SORT_KEY_DRAW_0_PROGRAM_MASK;
- const uint64_t trans = (uint64_t(m_trans ) << SORT_KEY_DRAW_0_TRANS_SHIFT ) & SORT_KEY_DRAW_0_TRANS_MASK;
- const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
- const uint64_t key = view|SORT_KEY_DRAW_BIT|SORT_KEY_DRAW_TYPE_PROGRAM|trans|program|depth;
+ return key;
+ }
+ break;
+ }
- return key;
+ BX_CHECK(false, "You should not be here.");
+ return 0;
}
uint64_t encodeCompute()
{
- const uint64_t program = (uint64_t(m_program) << SORT_KEY_COMPUTE_PROGRAM_SHIFT) & SORT_KEY_COMPUTE_PROGRAM_MASK;
- const uint64_t seq = (uint64_t(m_seq ) << SORT_KEY_COMPUTE_SEQ_SHIFT ) & SORT_KEY_COMPUTE_SEQ_MASK;
- const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
+ const uint64_t program = (uint64_t(m_program.idx) << kSortKeyComputeProgramShift) & kSortKeyComputeProgramMask;
+ const uint64_t seq = (uint64_t(m_seq ) << kSortKeyComputeSeqShift ) & kSortKeyComputeSeqMask;
+ const uint64_t view = (uint64_t(m_view ) << kSortKeyViewBitShift ) & kSortKeyViewMask;
const uint64_t key = program|seq|view;
- BX_CHECK(seq == (uint64_t(m_seq) << SORT_KEY_COMPUTE_SEQ_SHIFT)
+ BX_CHECK(seq == (uint64_t(m_seq) << kSortKeyComputeSeqShift)
, "SortKey error, sequence is truncated (m_seq: %d)."
, m_seq
);
@@ -1087,39 +1126,39 @@ namespace bgfx
/// Returns true if item is compute command.
bool decode(uint64_t _key, ViewId _viewRemap[BGFX_CONFIG_MAX_VIEWS])
{
- m_view = _viewRemap[(_key & SORT_KEY_VIEW_MASK) >> SORT_KEY_VIEW_SHIFT];
- if (_key & SORT_KEY_DRAW_BIT)
+ m_view = _viewRemap[(_key & kSortKeyViewMask) >> kSortKeyViewBitShift];
+ if (_key & kSortKeyDrawBit)
{
- uint64_t type = _key & SORT_KEY_DRAW_TYPE_MASK;
- if (type == SORT_KEY_DRAW_TYPE_DEPTH)
+ uint64_t type = _key & kSortKeyDrawTypeMask;
+ if (type == kSortKeyDrawTypeDepth)
{
- m_program = uint16_t( (_key & SORT_KEY_DRAW_1_PROGRAM_MASK) >> SORT_KEY_DRAW_1_PROGRAM_SHIFT);
+ m_program.idx = uint16_t( (_key & kSortKeyDraw1ProgramMask) >> kSortKeyDraw1ProgramShift);
return false;
}
- else if (type == SORT_KEY_DRAW_TYPE_SEQUENCE)
+ else if (type == kSortKeyDrawTypeSequence)
{
- m_program = uint16_t( (_key & SORT_KEY_DRAW_2_PROGRAM_MASK) >> SORT_KEY_DRAW_2_PROGRAM_SHIFT);
+ m_program.idx = uint16_t( (_key & kSortKeyDraw2ProgramMask) >> kSortKeyDraw2ProgramShift);
return false;
}
- m_program = uint16_t( (_key & SORT_KEY_DRAW_0_PROGRAM_MASK) >> SORT_KEY_DRAW_0_PROGRAM_SHIFT);
+ m_program.idx = uint16_t( (_key & kSortKeyDraw0ProgramMask) >> kSortKeyDraw0ProgramShift);
return false; // draw
}
- m_program = uint16_t( (_key & SORT_KEY_COMPUTE_PROGRAM_MASK) >> SORT_KEY_COMPUTE_PROGRAM_SHIFT);
+ m_program.idx = uint16_t( (_key & kSortKeyComputeProgramMask) >> kSortKeyComputeProgramShift);
return true; // compute
}
static ViewId decodeView(uint64_t _key)
{
- return ViewId( (_key & SORT_KEY_VIEW_MASK) >> SORT_KEY_VIEW_SHIFT);
+ return ViewId( (_key & kSortKeyViewMask) >> kSortKeyViewBitShift);
}
static uint64_t remapView(uint64_t _key, ViewId _viewRemap[BGFX_CONFIG_MAX_VIEWS])
{
const ViewId oldView = decodeView(_key);
- const uint64_t view = uint64_t(_viewRemap[oldView]) << SORT_KEY_VIEW_SHIFT;
- const uint64_t key = (_key & ~SORT_KEY_VIEW_MASK) | view;
+ const uint64_t view = uint64_t(_viewRemap[oldView]) << kSortKeyViewBitShift;
+ const uint64_t key = (_key & ~kSortKeyViewMask) | view;
return key;
}
@@ -1127,16 +1166,16 @@ namespace bgfx
{
m_depth = 0;
m_seq = 0;
- m_program = 0;
+ m_program = {0};
m_view = 0;
m_trans = 0;
}
- uint32_t m_depth;
- uint32_t m_seq;
- uint16_t m_program;
- ViewId m_view;
- uint8_t m_trans;
+ uint32_t m_depth;
+ uint32_t m_seq;
+ ProgramHandle m_program;
+ ViewId m_view;
+ uint8_t m_trans;
};
#undef SORT_KEY_RENDER_DRAW
@@ -1492,14 +1531,14 @@ namespace bgfx
{
void clear()
{
- m_startVertex = 0;
- m_handle.idx = kInvalidHandle;
- m_decl.idx = kInvalidHandle;
+ m_startVertex = 0;
+ m_handle.idx = kInvalidHandle;
+ m_layoutHandle.idx = kInvalidHandle;
}
uint32_t m_startVertex;
VertexBufferHandle m_handle;
- VertexDeclHandle m_decl;
+ VertexLayoutHandle m_layoutHandle;
};
BX_ALIGN_DECL_CACHE_LINE(struct) RenderBind
@@ -1537,7 +1576,7 @@ namespace bgfx
m_startIndirect = 0;
m_numIndirect = UINT16_MAX;
m_numMatrices = 1;
- m_submitFlags = BGFX_SUBMIT_EYE_FIRST;
+ m_submitFlags = 0;
m_scissor = UINT16_MAX;
m_streamMask = 0;
m_stream[0].clear();
@@ -1595,7 +1634,7 @@ namespace bgfx
m_numY = 0;
m_numZ = 0;
m_numMatrices = 0;
- m_submitFlags = BGFX_SUBMIT_EYE_FIRST;
+ m_submitFlags = 0;
m_uniformIdx = UINT8_MAX;
m_indirectBuffer.idx = kInvalidHandle;
@@ -1643,11 +1682,13 @@ namespace bgfx
struct IndexBuffer
{
+ String m_name;
uint32_t m_size;
};
struct VertexBuffer
{
+ String m_name;
uint32_t m_size;
uint16_t m_stride;
};
@@ -1669,10 +1710,86 @@ namespace bgfx
uint32_t m_startVertex;
uint32_t m_numVertices;
uint16_t m_stride;
- VertexDeclHandle m_decl;
+ VertexLayoutHandle m_layoutHandle;
uint16_t m_flags;
};
+ struct ShaderRef
+ {
+ UniformHandle* m_uniforms;
+ String m_name;
+ uint32_t m_hashIn;
+ uint32_t m_hashOut;
+ uint16_t m_num;
+ int16_t m_refCount;
+ };
+
+ struct ProgramRef
+ {
+ ShaderHandle m_vsh;
+ ShaderHandle m_fsh;
+ int16_t m_refCount;
+ };
+
+ struct UniformRef
+ {
+ String m_name;
+ UniformType::Enum m_type;
+ uint16_t m_num;
+ int16_t m_refCount;
+ };
+
+ struct TextureRef
+ {
+ void init(
+ BackbufferRatio::Enum _ratio
+ , TextureFormat::Enum _format
+ , uint32_t _storageSize
+ , uint8_t _numMips
+ , uint16_t _numLayers
+ , bool _ptrPending
+ , bool _immutable
+ , bool _rt
+ )
+ {
+ m_ptr = _ptrPending ? (void*)UINTPTR_MAX : NULL;
+ m_storageSize = _storageSize;
+ m_refCount = 1;
+ m_bbRatio = uint8_t(_ratio);
+ m_format = uint8_t(_format);
+ m_numMips = _numMips;
+ m_numLayers = _numLayers;
+ m_owned = false;
+ m_immutable = _immutable;
+ m_rt = _rt;
+ }
+
+ String m_name;
+ void* m_ptr;
+ uint32_t m_storageSize;
+ int16_t m_refCount;
+ uint8_t m_bbRatio;
+ uint8_t m_format;
+ uint8_t m_numMips;
+ uint16_t m_numLayers;
+ bool m_owned;
+ bool m_immutable;
+ bool m_rt;
+ };
+
+ struct FrameBufferRef
+ {
+ String m_name;
+
+ union un
+ {
+ TextureHandle m_th[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
+ void* m_nwh;
+ } un;
+
+ bool m_window;
+ };
+
BX_ALIGN_DECL_CACHE_LINE(struct) View
{
void reset()
@@ -1682,7 +1799,7 @@ namespace bgfx
setClear(BGFX_CLEAR_NONE, 0, 0.0f, 0);
setMode(ViewMode::Default);
setFrameBuffer(BGFX_INVALID_HANDLE);
- setTransform(NULL, NULL, BGFX_VIEW_NONE, NULL);
+ setTransform(NULL, NULL);
}
void setRect(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
@@ -1721,10 +1838,8 @@ namespace bgfx
m_fbh = _handle;
}
- void setTransform(const void* _view, const void* _proj, uint8_t _flags, const void* _proj1)
+ void setTransform(const void* _view, const void* _proj)
{
- m_flags = _flags;
-
if (NULL != _view)
{
bx::memCopy(m_view.un.val, _view, sizeof(Matrix4) );
@@ -1736,20 +1851,11 @@ namespace bgfx
if (NULL != _proj)
{
- bx::memCopy(m_proj[0].un.val, _proj, sizeof(Matrix4) );
+ bx::memCopy(m_proj.un.val, _proj, sizeof(Matrix4) );
}
else
{
- m_proj[0].setIdentity();
- }
-
- if (NULL != _proj1)
- {
- bx::memCopy(m_proj[1].un.val, _proj1, sizeof(Matrix4) );
- }
- else
- {
- bx::memCopy(m_proj[1].un.val, m_proj[0].un.val, sizeof(Matrix4) );
+ m_proj.setIdentity();
}
}
@@ -1757,10 +1863,9 @@ namespace bgfx
Rect m_rect;
Rect m_scissor;
Matrix4 m_view;
- Matrix4 m_proj[2];
+ Matrix4 m_proj;
FrameBufferHandle m_fbh;
uint8_t m_mode;
- uint8_t m_flags;
};
struct FrameCache
@@ -1796,7 +1901,7 @@ namespace bgfx
{
SortKey term;
term.reset();
- term.m_program = kInvalidHandle;
+ term.m_program = BGFX_INVALID_HANDLE;
m_sortKeys[BGFX_CONFIG_MAX_DRAW_CALLS] = term.encodeDraw(SortKey::SortProgram);
m_sortValues[BGFX_CONFIG_MAX_DRAW_CALLS] = BGFX_CONFIG_MAX_DRAW_CALLS;
bx::memSet(m_occlusion, 0xff, sizeof(m_occlusion) );
@@ -1919,9 +2024,9 @@ namespace bgfx
return m_freeIndexBuffer.queue(_handle);
}
- bool free(VertexDeclHandle _handle)
+ bool free(VertexLayoutHandle _handle)
{
- return m_freeVertexDecl.queue(_handle);
+ return m_freeVertexLayout.queue(_handle);
}
bool free(VertexBufferHandle _handle)
@@ -1957,7 +2062,7 @@ namespace bgfx
void resetFreeHandles()
{
m_freeIndexBuffer.reset();
- m_freeVertexDecl.reset();
+ m_freeVertexLayout.reset();
m_freeVertexBuffer.reset();
m_freeShader.reset();
m_freeProgram.reset();
@@ -2055,7 +2160,7 @@ namespace bgfx
};
FreeHandle<IndexBufferHandle, BGFX_CONFIG_MAX_INDEX_BUFFERS> m_freeIndexBuffer;
- FreeHandle<VertexDeclHandle, BGFX_CONFIG_MAX_VERTEX_DECLS> m_freeVertexDecl;
+ FreeHandle<VertexLayoutHandle, BGFX_CONFIG_MAX_VERTEX_LAYOUTS> m_freeVertexLayout;
FreeHandle<VertexBufferHandle, BGFX_CONFIG_MAX_VERTEX_BUFFERS> m_freeVertexBuffer;
FreeHandle<ShaderHandle, BGFX_CONFIG_MAX_SHADERS> m_freeShader;
FreeHandle<ProgramHandle, BGFX_CONFIG_MAX_PROGRAMS> m_freeProgram;
@@ -2229,7 +2334,13 @@ namespace bgfx
m_discard = 0 == numIndices;
}
- void setVertexBuffer(uint8_t _stream, VertexBufferHandle _handle, uint32_t _startVertex, uint32_t _numVertices)
+ void setVertexBuffer(
+ uint8_t _stream
+ , VertexBufferHandle _handle
+ , uint32_t _startVertex
+ , uint32_t _numVertices
+ , VertexLayoutHandle _layoutHandle
+ )
{
BX_CHECK(UINT8_MAX != m_draw.m_streamMask, "");
BX_CHECK(_stream < BGFX_CONFIG_MAX_VERTEX_STREAMS, "Invalid stream %d (max %d).", _stream, BGFX_CONFIG_MAX_VERTEX_STREAMS);
@@ -2238,12 +2349,18 @@ namespace bgfx
Stream& stream = m_draw.m_stream[_stream];
stream.m_startVertex = _startVertex;
stream.m_handle = _handle;
- stream.m_decl.idx = kInvalidHandle;
+ stream.m_layoutHandle = _layoutHandle;
m_numVertices[_stream] = _numVertices;
}
}
- void setVertexBuffer(uint8_t _stream, const DynamicVertexBuffer& _dvb, uint32_t _startVertex, uint32_t _numVertices)
+ void setVertexBuffer(
+ uint8_t _stream
+ , const DynamicVertexBuffer& _dvb
+ , uint32_t _startVertex
+ , uint32_t _numVertices
+ , VertexLayoutHandle _layoutHandle
+ )
{
BX_CHECK(UINT8_MAX != m_draw.m_streamMask, "");
BX_CHECK(_stream < BGFX_CONFIG_MAX_VERTEX_STREAMS, "Invalid stream %d (max %d).", _stream, BGFX_CONFIG_MAX_VERTEX_STREAMS);
@@ -2252,14 +2369,20 @@ namespace bgfx
Stream& stream = m_draw.m_stream[_stream];
stream.m_startVertex = _dvb.m_startVertex + _startVertex;
stream.m_handle = _dvb.m_handle;
- stream.m_decl = _dvb.m_decl;
+ stream.m_layoutHandle = isValid(_layoutHandle) ? _layoutHandle : _dvb.m_layoutHandle;
m_numVertices[_stream] =
bx::min(bx::uint32_imax(0, _dvb.m_numVertices - _startVertex), _numVertices)
;
}
}
- void setVertexBuffer(uint8_t _stream, const TransientVertexBuffer* _tvb, uint32_t _startVertex, uint32_t _numVertices)
+ void setVertexBuffer(
+ uint8_t _stream
+ , const TransientVertexBuffer* _tvb
+ , uint32_t _startVertex
+ , uint32_t _numVertices
+ , VertexLayoutHandle _layoutHandle
+ )
{
BX_CHECK(UINT8_MAX != m_draw.m_streamMask, "");
BX_CHECK(_stream < BGFX_CONFIG_MAX_VERTEX_STREAMS, "Invalid stream %d (max %d).", _stream, BGFX_CONFIG_MAX_VERTEX_STREAMS);
@@ -2268,10 +2391,8 @@ namespace bgfx
Stream& stream = m_draw.m_stream[_stream];
stream.m_startVertex = _tvb->startVertex + _startVertex;
stream.m_handle = _tvb->handle;
- stream.m_decl = _tvb->decl;
- m_numVertices[_stream] =
- bx::min(bx::uint32_imax(0, _tvb->size/_tvb->stride - _startVertex), _numVertices)
- ;
+ stream.m_layoutHandle = isValid(_layoutHandle) ? _layoutHandle : _tvb->layoutHandle;
+ m_numVertices[_stream] = bx::min(bx::uint32_imax(0, _tvb->size/_tvb->stride - _startVertex), _numVertices);
}
}
@@ -2280,10 +2401,10 @@ namespace bgfx
BX_CHECK(0 == m_draw.m_streamMask, "Vertex buffer already set.");
m_draw.m_streamMask = UINT8_MAX;
Stream& stream = m_draw.m_stream[0];
- stream.m_startVertex = 0;
- stream.m_handle.idx = kInvalidHandle;
- stream.m_decl.idx = kInvalidHandle;
- m_numVertices[0] = _numVertices;
+ stream.m_startVertex = 0;
+ stream.m_handle.idx = kInvalidHandle;
+ stream.m_layoutHandle.idx = kInvalidHandle;
+ m_numVertices[0] = _numVertices;
}
void setInstanceDataBuffer(const InstanceDataBuffer* _idb, uint32_t _start, uint32_t _num)
@@ -2323,7 +2444,7 @@ namespace bgfx
if (isValid(_sampler) )
{
uint32_t stage = _stage;
- setUniform(UniformType::Int1, _sampler, &stage, 1);
+ setUniform(UniformType::Sampler, _sampler, &stage, 1);
}
}
@@ -2381,14 +2502,14 @@ namespace bgfx
submit(_id, _program, handle, _depth, _preserveState);
}
- void dispatch(ViewId _id, ProgramHandle _handle, uint32_t _ngx, uint32_t _ngy, uint32_t _ngz, uint8_t _flags);
+ void dispatch(ViewId _id, ProgramHandle _handle, uint32_t _ngx, uint32_t _ngy, uint32_t _ngz);
- void dispatch(ViewId _id, ProgramHandle _handle, IndirectBufferHandle _indirectHandle, uint16_t _start, uint16_t _num, uint8_t _flags)
+ void dispatch(ViewId _id, ProgramHandle _handle, IndirectBufferHandle _indirectHandle, uint16_t _start, uint16_t _num)
{
m_compute.m_indirectBuffer = _indirectHandle;
m_compute.m_startIndirect = _start;
m_compute.m_numIndirect = _num;
- dispatch(_id, _handle, 0, 0, 0, _flags);
+ dispatch(_id, _handle, 0, 0, 0);
}
void blit(ViewId _id, TextureHandle _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, TextureHandle _src, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth);
@@ -2418,15 +2539,15 @@ namespace bgfx
int64_t m_cpuTimeEnd;
};
- struct VertexDeclRef
+ struct VertexLayoutRef
{
- VertexDeclRef()
+ VertexLayoutRef()
{
}
void init()
{
- bx::memSet(m_vertexDeclRef, 0, sizeof(m_vertexDeclRef) );
+ bx::memSet(m_layoutRef, 0, sizeof(m_layoutRef) );
bx::memSet(m_vertexBufferRef, 0xff, sizeof(m_vertexBufferRef) );
bx::memSet(m_dynamicVertexBufferRef, 0xff, sizeof(m_dynamicVertexBufferRef) );
}
@@ -2436,83 +2557,83 @@ namespace bgfx
{
for (uint16_t ii = 0, num = _handleAlloc.getNumHandles(); ii < num; ++ii)
{
- VertexDeclHandle handle = { _handleAlloc.getHandleAt(ii) };
- m_vertexDeclRef[handle.idx] = 0;
- m_vertexDeclMap.removeByHandle(handle.idx);
+ VertexLayoutHandle handle = { _handleAlloc.getHandleAt(ii) };
+ m_layoutRef[handle.idx] = 0;
+ m_layoutMap.removeByHandle(handle.idx);
_handleAlloc.free(handle.idx);
}
- m_vertexDeclMap.reset();
+ m_layoutMap.reset();
}
- VertexDeclHandle find(uint32_t _hash)
+ VertexLayoutHandle find(uint32_t _hash)
{
- VertexDeclHandle handle = { m_vertexDeclMap.find(_hash) };
+ VertexLayoutHandle handle = { m_layoutMap.find(_hash) };
return handle;
}
- void add(VertexDeclHandle _declHandle, uint32_t _hash)
+ void add(VertexLayoutHandle _layoutHandle, uint32_t _hash)
{
- m_vertexDeclRef[_declHandle.idx]++;
- m_vertexDeclMap.insert(_hash, _declHandle.idx);
+ m_layoutRef[_layoutHandle.idx]++;
+ m_layoutMap.insert(_hash, _layoutHandle.idx);
}
- void add(VertexBufferHandle _handle, VertexDeclHandle _declHandle, uint32_t _hash)
+ void add(VertexBufferHandle _handle, VertexLayoutHandle _layoutHandle, uint32_t _hash)
{
BX_CHECK(m_vertexBufferRef[_handle.idx].idx == kInvalidHandle, "");
- m_vertexBufferRef[_handle.idx] = _declHandle;
- m_vertexDeclRef[_declHandle.idx]++;
- m_vertexDeclMap.insert(_hash, _declHandle.idx);
+ m_vertexBufferRef[_handle.idx] = _layoutHandle;
+ m_layoutRef[_layoutHandle.idx]++;
+ m_layoutMap.insert(_hash, _layoutHandle.idx);
}
- void add(DynamicVertexBufferHandle _handle, VertexDeclHandle _declHandle, uint32_t _hash)
+ void add(DynamicVertexBufferHandle _handle, VertexLayoutHandle _layoutHandle, uint32_t _hash)
{
BX_CHECK(m_dynamicVertexBufferRef[_handle.idx].idx == kInvalidHandle, "");
- m_dynamicVertexBufferRef[_handle.idx] = _declHandle;
- m_vertexDeclRef[_declHandle.idx]++;
- m_vertexDeclMap.insert(_hash, _declHandle.idx);
+ m_dynamicVertexBufferRef[_handle.idx] = _layoutHandle;
+ m_layoutRef[_layoutHandle.idx]++;
+ m_layoutMap.insert(_hash, _layoutHandle.idx);
}
- VertexDeclHandle release(VertexDeclHandle _declHandle)
+ VertexLayoutHandle release(VertexLayoutHandle _layoutHandle)
{
- if (isValid(_declHandle) )
+ if (isValid(_layoutHandle) )
{
- m_vertexDeclRef[_declHandle.idx]--;
+ m_layoutRef[_layoutHandle.idx]--;
- if (0 == m_vertexDeclRef[_declHandle.idx])
+ if (0 == m_layoutRef[_layoutHandle.idx])
{
- m_vertexDeclMap.removeByHandle(_declHandle.idx);
- return _declHandle;
+ m_layoutMap.removeByHandle(_layoutHandle.idx);
+ return _layoutHandle;
}
}
return BGFX_INVALID_HANDLE;
}
- VertexDeclHandle release(VertexBufferHandle _handle)
+ VertexLayoutHandle release(VertexBufferHandle _handle)
{
- VertexDeclHandle declHandle = m_vertexBufferRef[_handle.idx];
- declHandle = release(declHandle);
+ VertexLayoutHandle layoutHandle = m_vertexBufferRef[_handle.idx];
+ layoutHandle = release(layoutHandle);
m_vertexBufferRef[_handle.idx].idx = kInvalidHandle;
- return declHandle;
+ return layoutHandle;
}
- VertexDeclHandle release(DynamicVertexBufferHandle _handle)
+ VertexLayoutHandle release(DynamicVertexBufferHandle _handle)
{
- VertexDeclHandle declHandle = m_dynamicVertexBufferRef[_handle.idx];
- declHandle = release(declHandle);
+ VertexLayoutHandle layoutHandle = m_dynamicVertexBufferRef[_handle.idx];
+ layoutHandle = release(layoutHandle);
m_dynamicVertexBufferRef[_handle.idx].idx = kInvalidHandle;
- return declHandle;
+ return layoutHandle;
}
- typedef bx::HandleHashMapT<BGFX_CONFIG_MAX_VERTEX_DECLS*2> VertexDeclMap;
- VertexDeclMap m_vertexDeclMap;
+ typedef bx::HandleHashMapT<BGFX_CONFIG_MAX_VERTEX_LAYOUTS*2> VertexLayoutMap;
+ VertexLayoutMap m_layoutMap;
- uint16_t m_vertexDeclRef[BGFX_CONFIG_MAX_VERTEX_DECLS];
- VertexDeclHandle m_vertexBufferRef[BGFX_CONFIG_MAX_VERTEX_BUFFERS];
- VertexDeclHandle m_dynamicVertexBufferRef[BGFX_CONFIG_MAX_DYNAMIC_VERTEX_BUFFERS];
+ uint16_t m_layoutRef[BGFX_CONFIG_MAX_VERTEX_LAYOUTS];
+ VertexLayoutHandle m_vertexBufferRef[BGFX_CONFIG_MAX_VERTEX_BUFFERS];
+ VertexLayoutHandle m_dynamicVertexBufferRef[BGFX_CONFIG_MAX_DYNAMIC_VERTEX_BUFFERS];
};
// First-fit non-local allocator.
@@ -2649,9 +2770,9 @@ namespace bgfx
virtual void flip() = 0;
virtual void createIndexBuffer(IndexBufferHandle _handle, const Memory* _mem, uint16_t _flags) = 0;
virtual void destroyIndexBuffer(IndexBufferHandle _handle) = 0;
- virtual void createVertexDecl(VertexDeclHandle _handle, const VertexDecl& _decl) = 0;
- virtual void destroyVertexDecl(VertexDeclHandle _handle) = 0;
- virtual void createVertexBuffer(VertexBufferHandle _handle, const Memory* _mem, VertexDeclHandle _declHandle, uint16_t _flags) = 0;
+ virtual void createVertexLayout(VertexLayoutHandle _handle, const VertexLayout& _layout) = 0;
+ virtual void destroyVertexLayout(VertexLayoutHandle _handle) = 0;
+ virtual void createVertexBuffer(VertexBufferHandle _handle, const Memory* _mem, VertexLayoutHandle _layoutHandle, uint16_t _flags) = 0;
virtual void destroyVertexBuffer(VertexBufferHandle _handle) = 0;
virtual void createDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _size, uint16_t _flags) = 0;
virtual void updateDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _offset, uint32_t _size, const Memory* _mem) = 0;
@@ -2680,9 +2801,9 @@ namespace bgfx
virtual void requestScreenShot(FrameBufferHandle _handle, const char* _filePath) = 0;
virtual void updateViewName(ViewId _id, const char* _name) = 0;
virtual void updateUniform(uint16_t _loc, const void* _data, uint32_t _size) = 0;
- virtual void setMarker(const char* _marker, uint32_t _size) = 0;
virtual void invalidateOcclusionQuery(OcclusionQueryHandle _handle) = 0;
- virtual void setName(Handle _handle, const char* _name) = 0;
+ virtual void setMarker(const char* _marker, uint16_t _len) = 0;
+ virtual void setName(Handle _handle, const char* _name, uint16_t _len) = 0;
virtual void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) = 0;
virtual void blitSetup(TextVideoMemBlitter& _blitter) = 0;
virtual void blitRender(TextVideoMemBlitter& _blitter, uint32_t _numIndices) = 0;
@@ -2841,7 +2962,7 @@ namespace bgfx
stats.numTextures = m_textureHandle.getNumHandles();
stats.numUniforms = m_uniformHandle.getNumHandles();
stats.numVertexBuffers = m_vertexBufferHandle.getNumHandles();
- stats.numVertexDecls = m_vertexDeclHandle.getNumHandles();
+ stats.numVertexLayouts = m_layoutHandle.getNumHandles();
stats.textureMemoryUsed = m_textureMemoryUsed;
stats.rtMemoryUsed = m_rtMemoryUsed;
@@ -2865,6 +2986,8 @@ namespace bgfx
cmdbuf.write(handle);
cmdbuf.write(_mem);
cmdbuf.write(_flags);
+
+ setDebugName(convert(handle) );
}
else
{
@@ -2874,6 +2997,18 @@ namespace bgfx
return handle;
}
+ BGFX_API_FUNC(void setName(IndexBufferHandle _handle, const bx::StringView& _name) )
+ {
+ BGFX_MUTEX_SCOPE(m_resourceApiLock);
+
+ BGFX_CHECK_HANDLE("setName", m_indexBufferHandle, _handle);
+
+ IndexBuffer& ref = m_indexBuffers[_handle.idx];
+ ref.m_name.set(_name);
+
+ setName(convert(_handle), _name);
+ }
+
BGFX_API_FUNC(void destroyIndexBuffer(IndexBufferHandle _handle) )
{
BGFX_MUTEX_SCOPE(m_resourceApiLock);
@@ -2882,31 +3017,56 @@ namespace bgfx
bool ok = m_submit->free(_handle); BX_UNUSED(ok);
BX_CHECK(ok, "Index buffer handle %d is already destroyed!", _handle.idx);
+ IndexBuffer& ref = m_indexBuffers[_handle.idx];
+ ref.m_name.clear();
+
CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyIndexBuffer);
cmdbuf.write(_handle);
}
- VertexDeclHandle findVertexDecl(const VertexDecl& _decl)
+ VertexLayoutHandle findVertexLayout(const VertexLayout& _layout)
{
- VertexDeclHandle declHandle = m_declRef.find(_decl.m_hash);
+ VertexLayoutHandle layoutHandle = m_vertexLayoutRef.find(_layout.m_hash);
- if (!isValid(declHandle) )
+ if (!isValid(layoutHandle) )
{
- declHandle.idx = m_vertexDeclHandle.alloc();
- if (!isValid(declHandle) )
+ layoutHandle.idx = m_layoutHandle.alloc();
+ if (!isValid(layoutHandle) )
{
- return declHandle;
+ return layoutHandle;
}
- CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateVertexDecl);
- cmdbuf.write(declHandle);
- cmdbuf.write(_decl);
+ CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateVertexLayout);
+ cmdbuf.write(layoutHandle);
+ cmdbuf.write(_layout);
+ }
+
+ return layoutHandle;
+ }
+
+ BGFX_API_FUNC(VertexLayoutHandle createVertexLayout(const VertexLayout& _layout) )
+ {
+ BGFX_MUTEX_SCOPE(m_resourceApiLock);
+
+ VertexLayoutHandle handle = findVertexLayout(_layout);
+ if (!isValid(handle) )
+ {
+ BX_TRACE("WARNING: Failed to allocate vertex layout handle (BGFX_CONFIG_MAX_VERTEX_LAYOUTS, max: %d).", BGFX_CONFIG_MAX_VERTEX_LAYOUTS);
+ return BGFX_INVALID_HANDLE;
}
- return declHandle;
+ m_vertexLayoutRef.add(handle, _layout.m_hash);
+
+ return handle;
+ }
+
+ BGFX_API_FUNC(void destroyVertexLayout(VertexLayoutHandle _handle) )
+ {
+ BGFX_MUTEX_SCOPE(m_resourceApiLock);
+ m_vertexLayoutRef.release(_handle);
}
- BGFX_API_FUNC(VertexBufferHandle createVertexBuffer(const Memory* _mem, const VertexDecl& _decl, uint16_t _flags) )
+ BGFX_API_FUNC(VertexBufferHandle createVertexBuffer(const Memory* _mem, const VertexLayout& _layout, uint16_t _flags) )
{
BGFX_MUTEX_SCOPE(m_resourceApiLock);
@@ -2914,26 +3074,28 @@ namespace bgfx
if (isValid(handle) )
{
- VertexDeclHandle declHandle = findVertexDecl(_decl);
- if (!isValid(declHandle) )
+ VertexLayoutHandle layoutHandle = findVertexLayout(_layout);
+ if (!isValid(layoutHandle) )
{
- BX_TRACE("WARNING: Failed to allocate vertex decl handle (BGFX_CONFIG_MAX_VERTEX_DECLS, max: %d).", BGFX_CONFIG_MAX_VERTEX_DECLS);
+ BX_TRACE("WARNING: Failed to allocate vertex layout handle (BGFX_CONFIG_MAX_VERTEX_LAYOUTS, max: %d).", BGFX_CONFIG_MAX_VERTEX_LAYOUTS);
m_vertexBufferHandle.free(handle.idx);
return BGFX_INVALID_HANDLE;
}
- m_declRef.add(handle, declHandle, _decl.m_hash);
+ m_vertexLayoutRef.add(handle, layoutHandle, _layout.m_hash);
VertexBuffer& vb = m_vertexBuffers[handle.idx];
vb.m_size = _mem->size;
- vb.m_stride = _decl.m_stride;
+ vb.m_stride = _layout.m_stride;
CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateVertexBuffer);
cmdbuf.write(handle);
cmdbuf.write(_mem);
- cmdbuf.write(declHandle);
+ cmdbuf.write(layoutHandle);
cmdbuf.write(_flags);
+ setDebugName(convert(handle) );
+
return handle;
}
@@ -2943,6 +3105,18 @@ namespace bgfx
return BGFX_INVALID_HANDLE;
}
+ BGFX_API_FUNC(void setName(VertexBufferHandle _handle, const bx::StringView& _name) )
+ {
+ BGFX_MUTEX_SCOPE(m_resourceApiLock);
+
+ BGFX_CHECK_HANDLE("setName", m_vertexBufferHandle, _handle);
+
+ VertexBuffer& ref = m_vertexBuffers[_handle.idx];
+ ref.m_name.set(_name);
+
+ setName(convert(_handle), _name);
+ }
+
BGFX_API_FUNC(void destroyVertexBuffer(VertexBufferHandle _handle) )
{
BGFX_MUTEX_SCOPE(m_resourceApiLock);
@@ -2951,18 +3125,21 @@ namespace bgfx
bool ok = m_submit->free(_handle); BX_UNUSED(ok);
BX_CHECK(ok, "Vertex buffer handle %d is already destroyed!", _handle.idx);
+ VertexBuffer& ref = m_vertexBuffers[_handle.idx];
+ ref.m_name.clear();
+
CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexBuffer);
cmdbuf.write(_handle);
}
void destroyVertexBufferInternal(VertexBufferHandle _handle)
{
- VertexDeclHandle declHandle = m_declRef.release(_handle);
- if (isValid(declHandle) )
+ VertexLayoutHandle layoutHandle = m_vertexLayoutRef.release(_handle);
+ if (isValid(layoutHandle) )
{
- CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexDecl);
- cmdbuf.write(declHandle);
- m_render->free(declHandle);
+ CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexLayout);
+ cmdbuf.write(layoutHandle);
+ m_render->free(layoutHandle);
}
m_vertexBufferHandle.free(_handle.idx);
@@ -3029,6 +3206,8 @@ namespace bgfx
cmdbuf.write(size);
cmdbuf.write(_flags);
+ setDebugName(convert(indexBufferHandle), "Dynamic Index Buffer");
+
ptr = uint64_t(indexBufferHandle.idx) << 32;
}
else
@@ -3172,14 +3351,14 @@ namespace bgfx
return ptr;
}
- BGFX_API_FUNC(DynamicVertexBufferHandle createDynamicVertexBuffer(uint32_t _num, const VertexDecl& _decl, uint16_t _flags) )
+ BGFX_API_FUNC(DynamicVertexBufferHandle createDynamicVertexBuffer(uint32_t _num, const VertexLayout& _layout, uint16_t _flags) )
{
BGFX_MUTEX_SCOPE(m_resourceApiLock);
- VertexDeclHandle declHandle = findVertexDecl(_decl);
- if (!isValid(declHandle) )
+ VertexLayoutHandle layoutHandle = findVertexLayout(_layout);
+ if (!isValid(layoutHandle) )
{
- BX_TRACE("WARNING: Failed to allocate vertex decl handle (BGFX_CONFIG_MAX_VERTEX_DECLS, max: %d).", BGFX_CONFIG_MAX_VERTEX_DECLS);
+ BX_TRACE("WARNING: Failed to allocate vertex layout handle (BGFX_CONFIG_MAX_VERTEX_LAYOUTS, max: %d).", BGFX_CONFIG_MAX_VERTEX_LAYOUTS);
return BGFX_INVALID_HANDLE;
}
@@ -3190,7 +3369,7 @@ namespace bgfx
return BGFX_INVALID_HANDLE;
}
- uint32_t size = bx::strideAlign16(_num*_decl.m_stride, _decl.m_stride);
+ const uint32_t size = bx::strideAlign<16>(_num*_layout.m_stride, _layout.m_stride)+_layout.m_stride;
uint64_t ptr = 0;
if (0 != (_flags & BGFX_BUFFER_COMPUTE_READ_WRITE) )
@@ -3212,6 +3391,8 @@ namespace bgfx
cmdbuf.write(size);
cmdbuf.write(_flags);
+ setDebugName(convert(vertexBufferHandle), "Dynamic Vertex Buffer");
+
ptr = uint64_t(vertexBufferHandle.idx)<<32;
}
else
@@ -3225,25 +3406,25 @@ namespace bgfx
}
DynamicVertexBuffer& dvb = m_dynamicVertexBuffers[handle.idx];
- dvb.m_handle.idx = uint16_t(ptr>>32);
- dvb.m_offset = uint32_t(ptr);
- dvb.m_size = _num * _decl.m_stride;
- dvb.m_startVertex = bx::strideAlign(dvb.m_offset, _decl.m_stride)/_decl.m_stride;
- dvb.m_numVertices = _num;
- dvb.m_stride = _decl.m_stride;
- dvb.m_decl = declHandle;
- dvb.m_flags = _flags;
- m_declRef.add(handle, declHandle, _decl.m_hash);
+ dvb.m_handle.idx = uint16_t(ptr>>32);
+ dvb.m_offset = uint32_t(ptr);
+ dvb.m_size = _num * _layout.m_stride;
+ dvb.m_startVertex = bx::strideAlign(dvb.m_offset, _layout.m_stride)/_layout.m_stride;
+ dvb.m_numVertices = _num;
+ dvb.m_stride = _layout.m_stride;
+ dvb.m_layoutHandle = layoutHandle;
+ dvb.m_flags = _flags;
+ m_vertexLayoutRef.add(handle, layoutHandle, _layout.m_hash);
return handle;
}
- BGFX_API_FUNC(DynamicVertexBufferHandle createDynamicVertexBuffer(const Memory* _mem, const VertexDecl& _decl, uint16_t _flags) )
+ BGFX_API_FUNC(DynamicVertexBufferHandle createDynamicVertexBuffer(const Memory* _mem, const VertexLayout& _layout, uint16_t _flags) )
{
BGFX_MUTEX_SCOPE(m_resourceApiLock);
- uint32_t numVertices = _mem->size/_decl.m_stride;
- DynamicVertexBufferHandle handle = createDynamicVertexBuffer(numVertices, _decl, _flags);
+ uint32_t numVertices = _mem->size/_layout.m_stride;
+ DynamicVertexBufferHandle handle = createDynamicVertexBuffer(numVertices, _layout, _flags);
if (!isValid(handle) )
{
@@ -3271,11 +3452,13 @@ namespace bgfx
m_dynVertexBufferAllocator.free(uint64_t(dvb.m_handle.idx)<<32 | dvb.m_offset);
m_dynVertexBufferAllocator.compact();
- uint64_t ptr = allocDynamicVertexBuffer(_mem->size, dvb.m_flags);
+ const uint32_t size = bx::strideAlign<16>(_mem->size, dvb.m_stride)+dvb.m_stride;
+ const uint64_t ptr = allocDynamicVertexBuffer(size, dvb.m_flags);
+
dvb.m_handle.idx = uint16_t(ptr>>32);
dvb.m_offset = uint32_t(ptr);
- dvb.m_size = _mem->size;
- dvb.m_numVertices = dvb.m_size / dvb.m_stride;
+ dvb.m_size = size;
+ dvb.m_numVertices = _mem->size / dvb.m_stride;
dvb.m_startVertex = bx::strideAlign(dvb.m_offset, dvb.m_stride)/dvb.m_stride;
}
@@ -3307,14 +3490,14 @@ namespace bgfx
void destroyDynamicVertexBufferInternal(DynamicVertexBufferHandle _handle)
{
- VertexDeclHandle declHandle = m_declRef.release(_handle);
- BGFX_CHECK_HANDLE_INVALID_OK("destroyDynamicVertexBufferInternal", m_vertexDeclHandle, declHandle);
+ VertexLayoutHandle layoutHandle = m_vertexLayoutRef.release(_handle);
+ BGFX_CHECK_HANDLE_INVALID_OK("destroyDynamicVertexBufferInternal", m_layoutHandle, layoutHandle);
- if (isValid(declHandle) )
+ if (isValid(layoutHandle) )
{
- CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexDecl);
- cmdbuf.write(declHandle);
- m_render->free(declHandle);
+ CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexLayout);
+ cmdbuf.write(layoutHandle);
+ m_render->free(layoutHandle);
}
DynamicVertexBuffer& dvb = m_dynamicVertexBuffers[_handle.idx];
@@ -3372,6 +3555,8 @@ namespace bgfx
tib->data = (uint8_t *)tib + BX_ALIGN_16(sizeof(TransientIndexBuffer) );
tib->size = _size;
tib->handle = handle;
+
+ setDebugName(convert(handle), "Transient Index Buffer");
}
return tib;
@@ -3400,7 +3585,7 @@ namespace bgfx
_tib->startIndex = bx::strideAlign(offset, 2)/2;
}
- TransientVertexBuffer* createTransientVertexBuffer(uint32_t _size, const VertexDecl* _decl = NULL)
+ TransientVertexBuffer* createTransientVertexBuffer(uint32_t _size, const VertexLayout* _layout = NULL)
{
TransientVertexBuffer* tvb = NULL;
@@ -3410,14 +3595,14 @@ namespace bgfx
if (isValid(handle) )
{
uint16_t stride = 0;
- VertexDeclHandle declHandle = BGFX_INVALID_HANDLE;
+ VertexLayoutHandle layoutHandle = BGFX_INVALID_HANDLE;
- if (NULL != _decl)
+ if (NULL != _layout)
{
- declHandle = findVertexDecl(*_decl);
- m_declRef.add(handle, declHandle, _decl->m_hash);
+ layoutHandle = findVertexLayout(*_layout);
+ m_vertexLayoutRef.add(handle, layoutHandle, _layout->m_hash);
- stride = _decl->m_stride;
+ stride = _layout->m_stride;
}
CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateDynamicVertexBuffer);
@@ -3433,7 +3618,9 @@ namespace bgfx
tvb->startVertex = 0;
tvb->stride = stride;
tvb->handle = handle;
- tvb->decl = declHandle;
+ tvb->layoutHandle = layoutHandle;
+
+ setDebugName(convert(handle), "Transient Vertex Buffer");
}
return tvb;
@@ -3448,32 +3635,32 @@ namespace bgfx
BX_ALIGNED_FREE(g_allocator, _tvb, 16);
}
- BGFX_API_FUNC(void allocTransientVertexBuffer(TransientVertexBuffer* _tvb, uint32_t _num, const VertexDecl& _decl) )
+ BGFX_API_FUNC(void allocTransientVertexBuffer(TransientVertexBuffer* _tvb, uint32_t _num, const VertexLayout& _layout) )
{
BGFX_MUTEX_SCOPE(m_resourceApiLock);
- VertexDeclHandle declHandle = m_declRef.find(_decl.m_hash);
+ VertexLayoutHandle layoutHandle = m_vertexLayoutRef.find(_layout.m_hash);
TransientVertexBuffer& dvb = *m_submit->m_transientVb;
- if (!isValid(declHandle) )
+ if (!isValid(layoutHandle) )
{
- VertexDeclHandle temp = { m_vertexDeclHandle.alloc() };
- declHandle = temp;
- CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateVertexDecl);
- cmdbuf.write(declHandle);
- cmdbuf.write(_decl);
- m_declRef.add(declHandle, _decl.m_hash);
+ VertexLayoutHandle temp = { m_layoutHandle.alloc() };
+ layoutHandle = temp;
+ CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateVertexLayout);
+ cmdbuf.write(layoutHandle);
+ cmdbuf.write(_layout);
+ m_vertexLayoutRef.add(layoutHandle, _layout.m_hash);
}
- uint32_t offset = m_submit->allocTransientVertexBuffer(_num, _decl.m_stride);
+ uint32_t offset = m_submit->allocTransientVertexBuffer(_num, _layout.m_stride);
_tvb->data = &dvb.data[offset];
- _tvb->size = _num * _decl.m_stride;
- _tvb->startVertex = bx::strideAlign(offset, _decl.m_stride)/_decl.m_stride;
- _tvb->stride = _decl.m_stride;
+ _tvb->size = _num * _layout.m_stride;
+ _tvb->startVertex = bx::strideAlign(offset, _layout.m_stride)/_layout.m_stride;
+ _tvb->stride = _layout.m_stride;
_tvb->handle = dvb.handle;
- _tvb->decl = declHandle;
+ _tvb->layoutHandle = layoutHandle;
}
BGFX_API_FUNC(void allocInstanceDataBuffer(InstanceDataBuffer* _idb, uint32_t _num, uint16_t _stride) )
@@ -3647,7 +3834,7 @@ namespace bgfx
bx::read(&reader, regCount, &err);
PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name);
- if (PredefinedUniform::Count == predefined)
+ if (PredefinedUniform::Count == predefined && UniformType::End != UniformType::Enum(type))
{
uniforms[sr.m_num] = createUniform(name, UniformType::Enum(type), regCount);
sr.m_num++;
@@ -3665,6 +3852,8 @@ namespace bgfx
cmdbuf.write(handle);
cmdbuf.write(_mem);
+ setDebugName(convert(handle) );
+
return handle;
}
@@ -3689,12 +3878,21 @@ namespace bgfx
void setName(Handle _handle, const bx::StringView& _name)
{
+ char tmp[1024];
+ uint16_t len = 1+(uint16_t)bx::snprintf(tmp, BX_COUNTOF(tmp), "%sH %d: %.*s", getTypeName(_handle), _handle.idx, _name.getLength(), _name.getPtr() );
+
CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::SetName);
cmdbuf.write(_handle);
- uint16_t len = uint16_t(_name.getLength()+1);
cmdbuf.write(len);
- cmdbuf.write(_name.getPtr(), len-1);
- cmdbuf.write('\0');
+ cmdbuf.write(tmp, len);
+ }
+
+ void setDebugName(Handle _handle, const bx::StringView& _name = "")
+ {
+ if (BX_ENABLED(BGFX_CONFIG_DEBUG) )
+ {
+ setName(_handle, _name);
+ }
}
BGFX_API_FUNC(void setName(ShaderHandle _handle, const bx::StringView& _name) )
@@ -3975,6 +4173,8 @@ namespace bgfx
cmdbuf.write(_flags);
cmdbuf.write(_skip);
+ setDebugName(convert(handle) );
+
return handle;
}
@@ -4237,6 +4437,18 @@ namespace bgfx
return handle;
}
+ BGFX_API_FUNC(void setName(FrameBufferHandle _handle, const bx::StringView& _name) )
+ {
+ BGFX_MUTEX_SCOPE(m_resourceApiLock);
+
+ BGFX_CHECK_HANDLE("setName", m_frameBufferHandle, _handle);
+
+ FrameBufferRef& ref = m_frameBufferRef[_handle.idx];
+ ref.m_name.set(_name);
+
+// setName(convert(_handle), _name);
+ }
+
BGFX_API_FUNC(TextureHandle getTexture(FrameBufferHandle _handle, uint8_t _attachment) )
{
BGFX_MUTEX_SCOPE(m_resourceApiLock);
@@ -4265,6 +4477,8 @@ namespace bgfx
cmdbuf.write(_handle);
FrameBufferRef& ref = m_frameBufferRef[_handle.idx];
+ ref.m_name.clear();
+
if (!ref.m_window)
{
for (uint32_t ii = 0; ii < BX_COUNTOF(ref.un.m_th); ++ii)
@@ -4521,9 +4735,9 @@ namespace bgfx
m_view[_id].setFrameBuffer(_handle);
}
- BGFX_API_FUNC(void setViewTransform(ViewId _id, const void* _view, const void* _proj, uint8_t _flags, const void* _proj1) )
+ BGFX_API_FUNC(void setViewTransform(ViewId _id, const void* _view, const void* _proj) )
{
- m_view[_id].setTransform(_view, _proj, _flags, _proj1);
+ m_view[_id].setTransform(_view, _proj);
}
BGFX_API_FUNC(void resetView(ViewId _id) )
@@ -4709,7 +4923,7 @@ namespace bgfx
bx::HandleAllocT<BGFX_CONFIG_MAX_DYNAMIC_VERTEX_BUFFERS> m_dynamicVertexBufferHandle;
bx::HandleAllocT<BGFX_CONFIG_MAX_INDEX_BUFFERS> m_indexBufferHandle;
- bx::HandleAllocT<BGFX_CONFIG_MAX_VERTEX_DECLS > m_vertexDeclHandle;
+ bx::HandleAllocT<BGFX_CONFIG_MAX_VERTEX_LAYOUTS > m_layoutHandle;
bx::HandleAllocT<BGFX_CONFIG_MAX_VERTEX_BUFFERS> m_vertexBufferHandle;
bx::HandleAllocT<BGFX_CONFIG_MAX_SHADERS> m_shaderHandle;
@@ -4719,94 +4933,21 @@ namespace bgfx
bx::HandleAllocT<BGFX_CONFIG_MAX_UNIFORMS> m_uniformHandle;
bx::HandleAllocT<BGFX_CONFIG_MAX_OCCLUSION_QUERIES> m_occlusionQueryHandle;
- struct ShaderRef
- {
- UniformHandle* m_uniforms;
- String m_name;
- uint32_t m_hashIn;
- uint32_t m_hashOut;
- int16_t m_refCount;
- uint16_t m_num;
- };
-
- struct ProgramRef
- {
- ShaderHandle m_vsh;
- ShaderHandle m_fsh;
- int16_t m_refCount;
- };
-
- struct UniformRef
- {
- String m_name;
- UniformType::Enum m_type;
- uint16_t m_num;
- int16_t m_refCount;
- };
-
- struct TextureRef
- {
- void init(
- BackbufferRatio::Enum _ratio
- , TextureFormat::Enum _format
- , uint32_t _storageSize
- , uint8_t _numMips
- , uint16_t _numLayers
- , bool _ptrPending
- , bool _immutable
- , bool _rt
- )
- {
- m_ptr = _ptrPending ? (void*)UINTPTR_MAX : NULL;
- m_storageSize = _storageSize;
- m_refCount = 1;
- m_bbRatio = uint8_t(_ratio);
- m_format = uint8_t(_format);
- m_numMips = _numMips;
- m_numLayers = _numLayers;
- m_owned = false;
- m_immutable = _immutable;
- m_rt = _rt;
- }
-
- String m_name;
- void* m_ptr;
- uint32_t m_storageSize;
- int16_t m_refCount;
- uint8_t m_bbRatio;
- uint8_t m_format;
- uint8_t m_numMips;
- uint16_t m_numLayers;
- bool m_owned;
- bool m_immutable;
- bool m_rt;
- };
-
- struct FrameBufferRef
- {
- union un
- {
- TextureHandle m_th[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
- void* m_nwh;
- } un;
- bool m_window;
- };
-
typedef bx::HandleHashMapT<BGFX_CONFIG_MAX_UNIFORMS*2> UniformHashMap;
UniformHashMap m_uniformHashMap;
- UniformRef m_uniformRef[BGFX_CONFIG_MAX_UNIFORMS];
+ UniformRef m_uniformRef[BGFX_CONFIG_MAX_UNIFORMS];
typedef bx::HandleHashMapT<BGFX_CONFIG_MAX_SHADERS*2> ShaderHashMap;
ShaderHashMap m_shaderHashMap;
- ShaderRef m_shaderRef[BGFX_CONFIG_MAX_SHADERS];
+ ShaderRef m_shaderRef[BGFX_CONFIG_MAX_SHADERS];
typedef bx::HandleHashMapT<BGFX_CONFIG_MAX_PROGRAMS*2> ProgramHashMap;
ProgramHashMap m_programHashMap;
- ProgramRef m_programRef[BGFX_CONFIG_MAX_PROGRAMS];
+ ProgramRef m_programRef[BGFX_CONFIG_MAX_PROGRAMS];
- TextureRef m_textureRef[BGFX_CONFIG_MAX_TEXTURES];
+ TextureRef m_textureRef[BGFX_CONFIG_MAX_TEXTURES];
FrameBufferRef m_frameBufferRef[BGFX_CONFIG_MAX_FRAME_BUFFERS];
- VertexDeclRef m_declRef;
+ VertexLayoutRef m_vertexLayoutRef;
ViewId m_viewRemap[BGFX_CONFIG_MAX_VIEWS];
uint32_t m_seq[BGFX_CONFIG_MAX_VIEWS];