|
@@ -3292,9 +3292,9 @@ namespace bgfx
|
|
|
if (ptr == NonLocalAllocator::kInvalidBlock)
|
|
if (ptr == NonLocalAllocator::kInvalidBlock)
|
|
|
{
|
|
{
|
|
|
IndexBufferHandle indexBufferHandle = { m_indexBufferHandle.alloc() };
|
|
IndexBufferHandle indexBufferHandle = { m_indexBufferHandle.alloc() };
|
|
|
- BX_WARN(isValid(indexBufferHandle), "Failed to allocate index buffer handle.");
|
|
|
|
|
if (!isValid(indexBufferHandle) )
|
|
if (!isValid(indexBufferHandle) )
|
|
|
{
|
|
{
|
|
|
|
|
+ BX_TRACE("Failed to allocate index buffer handle.");
|
|
|
return NonLocalAllocator::kInvalidBlock;
|
|
return NonLocalAllocator::kInvalidBlock;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -3315,50 +3315,49 @@ namespace bgfx
|
|
|
return ptr;
|
|
return ptr;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ uint64_t allocIndexBuffer(uint32_t _size, uint16_t _flags)
|
|
|
|
|
+ {
|
|
|
|
|
+ IndexBufferHandle indexBufferHandle = { m_indexBufferHandle.alloc() };
|
|
|
|
|
+ if (!isValid(indexBufferHandle) )
|
|
|
|
|
+ {
|
|
|
|
|
+ BX_TRACE("Failed to allocate index buffer handle.");
|
|
|
|
|
+ return NonLocalAllocator::kInvalidBlock;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ IndexBuffer& ib = m_indexBuffers[indexBufferHandle.idx];
|
|
|
|
|
+ ib.m_size = _size;
|
|
|
|
|
+
|
|
|
|
|
+ CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateDynamicIndexBuffer);
|
|
|
|
|
+ cmdbuf.write(indexBufferHandle);
|
|
|
|
|
+ cmdbuf.write(_size);
|
|
|
|
|
+ cmdbuf.write(_flags);
|
|
|
|
|
+
|
|
|
|
|
+ setDebugName(convert(indexBufferHandle), "Dynamic Index Buffer");
|
|
|
|
|
+
|
|
|
|
|
+ return uint64_t(indexBufferHandle.idx) << 32;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
BGFX_API_FUNC(DynamicIndexBufferHandle createDynamicIndexBuffer(uint32_t _num, uint16_t _flags) )
|
|
BGFX_API_FUNC(DynamicIndexBufferHandle createDynamicIndexBuffer(uint32_t _num, uint16_t _flags) )
|
|
|
{
|
|
{
|
|
|
BGFX_MUTEX_SCOPE(m_resourceApiLock);
|
|
BGFX_MUTEX_SCOPE(m_resourceApiLock);
|
|
|
|
|
|
|
|
DynamicIndexBufferHandle handle = { m_dynamicIndexBufferHandle.alloc() };
|
|
DynamicIndexBufferHandle handle = { m_dynamicIndexBufferHandle.alloc() };
|
|
|
- BX_WARN(isValid(handle), "Failed to allocate dynamic index buffer handle.");
|
|
|
|
|
if (!isValid(handle) )
|
|
if (!isValid(handle) )
|
|
|
{
|
|
{
|
|
|
|
|
+ BX_TRACE("Failed to allocate dynamic index buffer handle.");
|
|
|
return handle;
|
|
return handle;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const uint32_t indexSize = 0 == (_flags & BGFX_BUFFER_INDEX32) ? 2 : 4;
|
|
const uint32_t indexSize = 0 == (_flags & BGFX_BUFFER_INDEX32) ? 2 : 4;
|
|
|
const uint32_t size = bx::alignUp(_num*indexSize, 16);
|
|
const uint32_t size = bx::alignUp(_num*indexSize, 16);
|
|
|
|
|
|
|
|
- uint64_t ptr = 0;
|
|
|
|
|
- if (0 != (_flags & BGFX_BUFFER_COMPUTE_READ_WRITE) )
|
|
|
|
|
- {
|
|
|
|
|
- IndexBufferHandle indexBufferHandle = { m_indexBufferHandle.alloc() };
|
|
|
|
|
- if (!isValid(indexBufferHandle) )
|
|
|
|
|
- {
|
|
|
|
|
- m_dynamicIndexBufferHandle.free(handle.idx);
|
|
|
|
|
- return BGFX_INVALID_HANDLE;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- IndexBuffer& ib = m_indexBuffers[indexBufferHandle.idx];
|
|
|
|
|
- ib.m_size = size;
|
|
|
|
|
-
|
|
|
|
|
- CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateDynamicIndexBuffer);
|
|
|
|
|
- cmdbuf.write(indexBufferHandle);
|
|
|
|
|
- cmdbuf.write(size);
|
|
|
|
|
- cmdbuf.write(_flags);
|
|
|
|
|
-
|
|
|
|
|
- setDebugName(convert(indexBufferHandle), "Dynamic Index Buffer");
|
|
|
|
|
-
|
|
|
|
|
- ptr = uint64_t(indexBufferHandle.idx) << 32;
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
|
|
+ const uint64_t ptr = (0 != (_flags & BGFX_BUFFER_COMPUTE_READ_WRITE) ) ?
|
|
|
|
|
+ allocIndexBuffer(size, _flags) :
|
|
|
|
|
+ allocDynamicIndexBuffer(size, _flags);
|
|
|
|
|
+ if (ptr == NonLocalAllocator::kInvalidBlock)
|
|
|
{
|
|
{
|
|
|
- ptr = allocDynamicIndexBuffer(size, _flags);
|
|
|
|
|
- if (ptr == NonLocalAllocator::kInvalidBlock)
|
|
|
|
|
- {
|
|
|
|
|
- m_dynamicIndexBufferHandle.free(handle.idx);
|
|
|
|
|
- return BGFX_INVALID_HANDLE;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ m_dynamicIndexBufferHandle.free(handle.idx);
|
|
|
|
|
+ return BGFX_INVALID_HANDLE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
DynamicIndexBuffer& dib = m_dynamicIndexBuffers[handle.idx];
|
|
DynamicIndexBuffer& dib = m_dynamicIndexBuffers[handle.idx];
|
|
@@ -3405,8 +3404,10 @@ namespace bgfx
|
|
|
{
|
|
{
|
|
|
m_dynIndexBufferAllocator.free(uint64_t(dib.m_handle.idx)<<32 | dib.m_offset);
|
|
m_dynIndexBufferAllocator.free(uint64_t(dib.m_handle.idx)<<32 | dib.m_offset);
|
|
|
m_dynIndexBufferAllocator.compact();
|
|
m_dynIndexBufferAllocator.compact();
|
|
|
-
|
|
|
|
|
- uint64_t ptr = allocDynamicIndexBuffer(_mem->size, dib.m_flags);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ const uint64_t ptr = (0 != (dib.m_flags & BGFX_BUFFER_COMPUTE_READ) ) ?
|
|
|
|
|
+ allocIndexBuffer(_mem->size, dib.m_flags) :
|
|
|
|
|
+ allocDynamicIndexBuffer(_mem->size, dib.m_flags);
|
|
|
dib.m_handle.idx = uint16_t(ptr>>32);
|
|
dib.m_handle.idx = uint16_t(ptr>>32);
|
|
|
dib.m_offset = uint32_t(ptr);
|
|
dib.m_offset = uint32_t(ptr);
|
|
|
dib.m_size = _mem->size;
|
|
dib.m_size = _mem->size;
|
|
@@ -3468,9 +3469,9 @@ namespace bgfx
|
|
|
if (ptr == NonLocalAllocator::kInvalidBlock)
|
|
if (ptr == NonLocalAllocator::kInvalidBlock)
|
|
|
{
|
|
{
|
|
|
VertexBufferHandle vertexBufferHandle = { m_vertexBufferHandle.alloc() };
|
|
VertexBufferHandle vertexBufferHandle = { m_vertexBufferHandle.alloc() };
|
|
|
- BX_WARN(isValid(vertexBufferHandle), "Failed to allocate dynamic vertex buffer handle.");
|
|
|
|
|
if (!isValid(vertexBufferHandle) )
|
|
if (!isValid(vertexBufferHandle) )
|
|
|
{
|
|
{
|
|
|
|
|
+ BX_TRACE("Failed to allocate dynamic vertex buffer handle.");
|
|
|
return NonLocalAllocator::kInvalidBlock;
|
|
return NonLocalAllocator::kInvalidBlock;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -3492,6 +3493,30 @@ namespace bgfx
|
|
|
return ptr;
|
|
return ptr;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ uint64_t allocVertexBuffer(uint32_t _size, uint16_t _flags)
|
|
|
|
|
+ {
|
|
|
|
|
+ VertexBufferHandle vertexBufferHandle = { m_vertexBufferHandle.alloc() };
|
|
|
|
|
+
|
|
|
|
|
+ if (!isValid(vertexBufferHandle) )
|
|
|
|
|
+ {
|
|
|
|
|
+ BX_TRACE("WARNING: Failed to allocate vertex buffer handle (BGFX_CONFIG_MAX_VERTEX_BUFFERS, max: %d).", BGFX_CONFIG_MAX_VERTEX_BUFFERS);
|
|
|
|
|
+ return NonLocalAllocator::kInvalidBlock;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ VertexBuffer& vb = m_vertexBuffers[vertexBufferHandle.idx];
|
|
|
|
|
+ vb.m_size = _size;
|
|
|
|
|
+ vb.m_stride = 0;
|
|
|
|
|
+
|
|
|
|
|
+ CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateDynamicVertexBuffer);
|
|
|
|
|
+ cmdbuf.write(vertexBufferHandle);
|
|
|
|
|
+ cmdbuf.write(_size);
|
|
|
|
|
+ cmdbuf.write(_flags);
|
|
|
|
|
+
|
|
|
|
|
+ setDebugName(convert(vertexBufferHandle), "Dynamic Vertex Buffer");
|
|
|
|
|
+
|
|
|
|
|
+ return uint64_t(vertexBufferHandle.idx)<<32;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
BGFX_API_FUNC(DynamicVertexBufferHandle createDynamicVertexBuffer(uint32_t _num, const VertexLayout& _layout, uint16_t _flags) )
|
|
BGFX_API_FUNC(DynamicVertexBufferHandle createDynamicVertexBuffer(uint32_t _num, const VertexLayout& _layout, uint16_t _flags) )
|
|
|
{
|
|
{
|
|
|
BGFX_MUTEX_SCOPE(m_resourceApiLock);
|
|
BGFX_MUTEX_SCOPE(m_resourceApiLock);
|
|
@@ -3512,38 +3537,14 @@ namespace bgfx
|
|
|
|
|
|
|
|
const uint32_t size = bx::strideAlign<16>(_num*_layout.m_stride, _layout.m_stride)+_layout.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) )
|
|
|
|
|
- {
|
|
|
|
|
- VertexBufferHandle vertexBufferHandle = { m_vertexBufferHandle.alloc() };
|
|
|
|
|
- if (!isValid(vertexBufferHandle) )
|
|
|
|
|
- {
|
|
|
|
|
- m_dynamicVertexBufferHandle.free(handle.idx);
|
|
|
|
|
- BX_TRACE("WARNING: Failed to allocate vertex buffer handle (BGFX_CONFIG_MAX_VERTEX_BUFFERS, max: %d).", BGFX_CONFIG_MAX_VERTEX_BUFFERS);
|
|
|
|
|
- return BGFX_INVALID_HANDLE;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ const uint64_t ptr = (0 != (_flags & BGFX_BUFFER_COMPUTE_READ_WRITE)) ?
|
|
|
|
|
+ allocVertexBuffer(size, _flags) :
|
|
|
|
|
+ allocDynamicVertexBuffer(size, _flags);
|
|
|
|
|
|
|
|
- VertexBuffer& vb = m_vertexBuffers[vertexBufferHandle.idx];
|
|
|
|
|
- vb.m_size = size;
|
|
|
|
|
- vb.m_stride = 0;
|
|
|
|
|
-
|
|
|
|
|
- CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateDynamicVertexBuffer);
|
|
|
|
|
- cmdbuf.write(vertexBufferHandle);
|
|
|
|
|
- cmdbuf.write(size);
|
|
|
|
|
- cmdbuf.write(_flags);
|
|
|
|
|
-
|
|
|
|
|
- setDebugName(convert(vertexBufferHandle), "Dynamic Vertex Buffer");
|
|
|
|
|
-
|
|
|
|
|
- ptr = uint64_t(vertexBufferHandle.idx)<<32;
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
|
|
+ if (ptr == NonLocalAllocator::kInvalidBlock)
|
|
|
{
|
|
{
|
|
|
- ptr = allocDynamicVertexBuffer(size, _flags);
|
|
|
|
|
- if (ptr == NonLocalAllocator::kInvalidBlock)
|
|
|
|
|
- {
|
|
|
|
|
- m_dynamicVertexBufferHandle.free(handle.idx);
|
|
|
|
|
- return BGFX_INVALID_HANDLE;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ m_dynamicVertexBufferHandle.free(handle.idx);
|
|
|
|
|
+ return BGFX_INVALID_HANDLE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
DynamicVertexBuffer& dvb = m_dynamicVertexBuffers[handle.idx];
|
|
DynamicVertexBuffer& dvb = m_dynamicVertexBuffers[handle.idx];
|
|
@@ -3594,7 +3595,10 @@ namespace bgfx
|
|
|
m_dynVertexBufferAllocator.compact();
|
|
m_dynVertexBufferAllocator.compact();
|
|
|
|
|
|
|
|
const uint32_t size = bx::strideAlign<16>(_mem->size, dvb.m_stride)+dvb.m_stride;
|
|
const uint32_t size = bx::strideAlign<16>(_mem->size, dvb.m_stride)+dvb.m_stride;
|
|
|
- const uint64_t ptr = allocDynamicVertexBuffer(size, dvb.m_flags);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ const uint64_t ptr = (0 != (dvb.m_flags & BGFX_BUFFER_COMPUTE_READ)) ?
|
|
|
|
|
+ allocVertexBuffer(size, dvb.m_flags) :
|
|
|
|
|
+ allocDynamicVertexBuffer(size, dvb.m_flags);
|
|
|
|
|
|
|
|
dvb.m_handle.idx = uint16_t(ptr>>32);
|
|
dvb.m_handle.idx = uint16_t(ptr>>32);
|
|
|
dvb.m_offset = uint32_t(ptr);
|
|
dvb.m_offset = uint32_t(ptr);
|