Fixed transient vertex buffer when vertex layout allocation fails.

This commit is contained in:
Бранимир Караџић
2021-09-16 18:32:58 -07:00
parent 1a001a67db
commit 227ea05dee
2 changed files with 38 additions and 37 deletions

View File

@@ -4236,7 +4236,14 @@ namespace bgfx
BX_ASSERT(0 < _num, "Requesting 0 vertices."); BX_ASSERT(0 < _num, "Requesting 0 vertices.");
BX_ASSERT(isValid(_layout), "Invalid VertexLayout."); BX_ASSERT(isValid(_layout), "Invalid VertexLayout.");
s_ctx->allocTransientVertexBuffer(_tvb, _num, _layout); VertexLayoutHandle layoutHandle;
{
BGFX_MUTEX_SCOPE(s_ctx->m_resourceApiLock);
layoutHandle = s_ctx->findOrCreateVertexLayout(_layout, true);
}
BX_ASSERT(isValid(layoutHandle), "Failed to allocate vertex layout handle (BGFX_CONFIG_MAX_VERTEX_LAYOUTS, max: %d).", BGFX_CONFIG_MAX_VERTEX_LAYOUTS);
s_ctx->allocTransientVertexBuffer(_tvb, _num, layoutHandle, _layout.m_stride);
BX_ASSERT(_num == _tvb->size / _layout.m_stride BX_ASSERT(_num == _tvb->size / _layout.m_stride
, "Failed to allocate transient vertex buffer (requested %d, available %d). " , "Failed to allocate transient vertex buffer (requested %d, available %d). "

View File

@@ -3195,21 +3195,29 @@ namespace bgfx
cmdbuf.write(_handle); cmdbuf.write(_handle);
} }
VertexLayoutHandle findVertexLayout(const VertexLayout& _layout) VertexLayoutHandle findOrCreateVertexLayout(const VertexLayout& _layout, bool _refCountOnCreation = false)
{ {
VertexLayoutHandle layoutHandle = m_vertexLayoutRef.find(_layout.m_hash); VertexLayoutHandle layoutHandle = m_vertexLayoutRef.find(_layout.m_hash);
if (isValid(layoutHandle) )
{
return layoutHandle;
}
layoutHandle = { m_layoutHandle.alloc() };
if (!isValid(layoutHandle) ) if (!isValid(layoutHandle) )
{ {
layoutHandle.idx = m_layoutHandle.alloc(); BX_TRACE("WARNING: Failed to allocate vertex layout handle (BGFX_CONFIG_MAX_VERTEX_LAYOUTS, max: %d).", BGFX_CONFIG_MAX_VERTEX_LAYOUTS);
if (!isValid(layoutHandle) ) return BGFX_INVALID_HANDLE;
{ }
return layoutHandle;
}
CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateVertexLayout); CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateVertexLayout);
cmdbuf.write(layoutHandle); cmdbuf.write(layoutHandle);
cmdbuf.write(_layout); cmdbuf.write(_layout);
if (_refCountOnCreation)
{
m_vertexLayoutRef.add(layoutHandle, _layout.m_hash);
} }
return layoutHandle; return layoutHandle;
@@ -3219,10 +3227,9 @@ namespace bgfx
{ {
BGFX_MUTEX_SCOPE(m_resourceApiLock); BGFX_MUTEX_SCOPE(m_resourceApiLock);
VertexLayoutHandle handle = findVertexLayout(_layout); VertexLayoutHandle handle = findOrCreateVertexLayout(_layout);
if (!isValid(handle) ) 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 BGFX_INVALID_HANDLE;
} }
@@ -3248,7 +3255,7 @@ namespace bgfx
if (isValid(handle) ) if (isValid(handle) )
{ {
VertexLayoutHandle layoutHandle = findVertexLayout(_layout); VertexLayoutHandle layoutHandle = findOrCreateVertexLayout(_layout);
if (!isValid(layoutHandle) ) if (!isValid(layoutHandle) )
{ {
BX_TRACE("WARNING: Failed to allocate vertex layout handle (BGFX_CONFIG_MAX_VERTEX_LAYOUTS, max: %d).", BGFX_CONFIG_MAX_VERTEX_LAYOUTS); BX_TRACE("WARNING: Failed to allocate vertex layout handle (BGFX_CONFIG_MAX_VERTEX_LAYOUTS, max: %d).", BGFX_CONFIG_MAX_VERTEX_LAYOUTS);
@@ -3558,7 +3565,7 @@ namespace bgfx
{ {
BGFX_MUTEX_SCOPE(m_resourceApiLock); BGFX_MUTEX_SCOPE(m_resourceApiLock);
VertexLayoutHandle layoutHandle = findVertexLayout(_layout); VertexLayoutHandle layoutHandle = findOrCreateVertexLayout(_layout);
if (!isValid(layoutHandle) ) if (!isValid(layoutHandle) )
{ {
BX_TRACE("WARNING: Failed to allocate vertex layout handle (BGFX_CONFIG_MAX_VERTEX_LAYOUTS, max: %d).", BGFX_CONFIG_MAX_VERTEX_LAYOUTS); BX_TRACE("WARNING: Failed to allocate vertex layout handle (BGFX_CONFIG_MAX_VERTEX_LAYOUTS, max: %d).", BGFX_CONFIG_MAX_VERTEX_LAYOUTS);
@@ -3791,7 +3798,7 @@ namespace bgfx
if (NULL != _layout) if (NULL != _layout)
{ {
layoutHandle = findVertexLayout(*_layout); layoutHandle = findOrCreateVertexLayout(*_layout);
m_vertexLayoutRef.add(handle, layoutHandle, _layout->m_hash); m_vertexLayoutRef.add(handle, layoutHandle, _layout->m_hash);
stride = _layout->m_stride; stride = _layout->m_stride;
@@ -3830,32 +3837,19 @@ namespace bgfx
BX_ALIGNED_FREE(g_allocator, _tvb, 16); BX_ALIGNED_FREE(g_allocator, _tvb, 16);
} }
BGFX_API_FUNC(void allocTransientVertexBuffer(TransientVertexBuffer* _tvb, uint32_t _num, const VertexLayout& _layout) ) BGFX_API_FUNC(void allocTransientVertexBuffer(TransientVertexBuffer* _tvb, uint32_t _num, VertexLayoutHandle _layoutHandle, uint16_t _stride) )
{ {
BGFX_MUTEX_SCOPE(m_resourceApiLock); BGFX_MUTEX_SCOPE(m_resourceApiLock);
VertexLayoutHandle layoutHandle = m_vertexLayoutRef.find(_layout.m_hash); const uint32_t offset = m_submit->allocTransientVertexBuffer(_num, _stride);
const TransientVertexBuffer& dvb = *m_submit->m_transientVb;
TransientVertexBuffer& dvb = *m_submit->m_transientVb; _tvb->data = &dvb.data[offset];
_tvb->size = _num * _stride;
if (!isValid(layoutHandle) ) _tvb->startVertex = bx::strideAlign(offset, _stride)/_stride;
{ _tvb->stride = _stride;
VertexLayoutHandle temp = { m_layoutHandle.alloc() }; _tvb->handle = dvb.handle;
layoutHandle = temp; _tvb->layoutHandle = _layoutHandle;
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, _layout.m_stride);
_tvb->data = &dvb.data[offset];
_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->layoutHandle = layoutHandle;
} }
BGFX_API_FUNC(void allocInstanceDataBuffer(InstanceDataBuffer* _idb, uint32_t _num, uint16_t _stride) ) BGFX_API_FUNC(void allocInstanceDataBuffer(InstanceDataBuffer* _idb, uint32_t _num, uint16_t _stride) )