diff options
Diffstat (limited to '3rdparty/bgfx/src/bgfx_p.h')
-rw-r--r-- | 3rdparty/bgfx/src/bgfx_p.h | 989 |
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]; |