Added ability to configure minimum uniform buffer size.

This commit is contained in:
Branimir Karadžić
2025-10-29 13:52:30 -07:00
committed by Бранимир Караџић
parent 71e0db9369
commit 16cf4f8683
13 changed files with 110 additions and 80 deletions

View File

@@ -1649,8 +1649,9 @@ namespace bgfx
LIMITS(maxOcclusionQueries);
LIMITS(maxEncoders);
LIMITS(minResourceCbSize);
LIMITS(transientVbSize);
LIMITS(transientIbSize);
LIMITS(maxTransientVbSize);
LIMITS(maxTransientIbSize);
LIMITS(minUniformBufferSize);
#undef LIMITS
BX_TRACE("");
@@ -2016,14 +2017,14 @@ namespace bgfx
m_textVideoMemBlitter.init(m_init.resolution.debugTextScale);
m_clearQuad.init();
m_submit->m_transientVb = createTransientVertexBuffer(_init.limits.transientVbSize);
m_submit->m_transientIb = createTransientIndexBuffer(_init.limits.transientIbSize);
m_submit->m_transientVb = createTransientVertexBuffer(_init.limits.maxTransientVbSize);
m_submit->m_transientIb = createTransientIndexBuffer(_init.limits.maxTransientIbSize);
frame();
if (BX_ENABLED(BGFX_CONFIG_MULTITHREADED) )
{
m_submit->m_transientVb = createTransientVertexBuffer(_init.limits.transientVbSize);
m_submit->m_transientIb = createTransientIndexBuffer(_init.limits.transientIbSize);
m_submit->m_transientVb = createTransientVertexBuffer(_init.limits.maxTransientVbSize);
m_submit->m_transientIb = createTransientIndexBuffer(_init.limits.maxTransientIbSize);
frame();
}
@@ -3511,8 +3512,9 @@ namespace bgfx
Init::Limits::Limits()
: maxEncoders(BGFX_CONFIG_DEFAULT_MAX_ENCODERS)
, minResourceCbSize(BGFX_CONFIG_MIN_RESOURCE_COMMAND_BUFFER_SIZE)
, transientVbSize(BGFX_CONFIG_TRANSIENT_VERTEX_BUFFER_SIZE)
, transientIbSize(BGFX_CONFIG_TRANSIENT_INDEX_BUFFER_SIZE)
, maxTransientVbSize(BGFX_CONFIG_MAX_TRANSIENT_VERTEX_BUFFER_SIZE)
, maxTransientIbSize(BGFX_CONFIG_MAX_TRANSIENT_INDEX_BUFFER_SIZE)
, minUniformBufferSize(BGFX_CONFIG_MIN_UNIFORM_BUFFER_SIZE)
{
}
@@ -3606,8 +3608,9 @@ namespace bgfx
g_caps.limits.maxFBAttachments = 1;
g_caps.limits.maxEncoders = init.limits.maxEncoders;
g_caps.limits.minResourceCbSize = init.limits.minResourceCbSize;
g_caps.limits.transientVbSize = init.limits.transientVbSize;
g_caps.limits.transientIbSize = init.limits.transientIbSize;
g_caps.limits.maxTransientVbSize = init.limits.maxTransientVbSize;
g_caps.limits.maxTransientIbSize = init.limits.maxTransientIbSize;
g_caps.limits.minUniformBufferSize = init.limits.minUniformBufferSize;
g_caps.vendorId = init.vendorId;
g_caps.deviceId = init.deviceId;

View File

@@ -1478,7 +1478,7 @@ namespace bgfx
class UniformBuffer
{
public:
static UniformBuffer* create(uint32_t _size = 1<<20)
static UniformBuffer* create(uint32_t _size) // = BGFX_CONFIG_UNIFORM_BUFFER_SIZE)
{
const uint32_t structSize = sizeof(UniformBuffer)-sizeof(UniformBuffer::m_buffer);
@@ -2191,7 +2191,7 @@ namespace bgfx
for (uint32_t ii = 0; ii < num; ++ii)
{
m_uniformBuffer[ii] = UniformBuffer::create();
m_uniformBuffer[ii] = UniformBuffer::create(g_caps.limits.minUniformBufferSize);
}
}
@@ -2247,7 +2247,7 @@ namespace bgfx
{
const uint32_t offset = bx::strideAlign(m_iboffset, _indexSize);
uint32_t iboffset = offset + _num*_indexSize;
iboffset = bx::min<uint32_t>(iboffset, g_caps.limits.transientIbSize);
iboffset = bx::min<uint32_t>(iboffset, g_caps.limits.maxTransientIbSize);
const uint32_t num = (iboffset-offset)/_indexSize;
return num;
}
@@ -2266,7 +2266,7 @@ namespace bgfx
{
uint32_t offset = bx::strideAlign(m_vboffset, _stride);
uint32_t vboffset = offset + _num * _stride;
vboffset = bx::min<uint32_t>(vboffset, g_caps.limits.transientVbSize);
vboffset = bx::min<uint32_t>(vboffset, g_caps.limits.maxTransientVbSize);
uint32_t num = (vboffset-offset)/_stride;
return num;
}

View File

@@ -321,37 +321,46 @@ static_assert(bx::isPowerOf2(BGFX_CONFIG_MAX_VIEWS), "BGFX_CONFIG_MAX_VIEWS must
# define BGFX_CONFIG_MIN_RESOURCE_COMMAND_BUFFER_SIZE (64<<10)
#endif // BGFX_CONFIG_MIN_RESOURCE_COMMAND_BUFFER_SIZE
#ifndef BGFX_CONFIG_TRANSIENT_VERTEX_BUFFER_SIZE
# define BGFX_CONFIG_TRANSIENT_VERTEX_BUFFER_SIZE (6<<20)
#endif // BGFX_CONFIG_TRANSIENT_VERTEX_BUFFER_SIZE
#ifndef BGFX_CONFIG_MAX_TRANSIENT_VERTEX_BUFFER_SIZE
/// Maximum transient vertex buffer size. There is no growth, and all transient
/// vertices must fit into this buffer.
# define BGFX_CONFIG_MAX_TRANSIENT_VERTEX_BUFFER_SIZE (6<<20)
#endif // BGFX_CONFIG_MAX_TRANSIENT_VERTEX_BUFFER_SIZE
#ifndef BGFX_CONFIG_TRANSIENT_INDEX_BUFFER_SIZE
# define BGFX_CONFIG_TRANSIENT_INDEX_BUFFER_SIZE (2<<20)
#endif // BGFX_CONFIG_TRANSIENT_INDEX_BUFFER_SIZE
#ifndef BGFX_CONFIG_MAX_TRANSIENT_INDEX_BUFFER_SIZE
/// Maximum transient index buffer size. There is no growth, and all transient
/// indices must fit into this buffer.
# define BGFX_CONFIG_MAX_TRANSIENT_INDEX_BUFFER_SIZE (2<<20)
#endif // BGFX_CONFIG_MAX_TRANSIENT_INDEX_BUFFER_SIZE
#ifndef BGFX_CONFIG_PER_FRAME_SCRATCH_STAGING_BUFFER_SIZE
#ifndef BGFX_CONFIG_MIN_UNIFORM_BUFFER_SIZE
/// Mimumum uniform buffer size. This buffer will resize on demand.
# define BGFX_CONFIG_MIN_UNIFORM_BUFFER_SIZE (1<<20)
#endif // BGFX_CONFIG_MIN_UNIFORM_BUFFER_SIZE
#ifndef BGFX_CONFIG_CACHED_DEVICE_MEMORY_ALLOCATIONS_SIZE
/// Amount of allowed memory allocations left on device to use for recycling during
/// later allocations. This can be beneficial in case the driver is slow allocating memory
/// on the device.
/// Note: Currently only used by the Vulkan backend.
# define BGFX_CONFIG_CACHED_DEVICE_MEMORY_ALLOCATIONS_SIZE (128 << 20)
#endif // BGFX_CONFIG_CACHED_DEVICE_MEMORY_ALLOCATIONS_SIZE
#ifndef BGFX_CONFIG_MAX_STAGING_SCRATCH_BUFFER_SIZE
/// The threshold of data size above which the staging scratch buffer will
/// not be used, but instead a separate device memory allocation will take
/// place to stage the data for copying to device.
# define BGFX_CONFIG_MAX_STAGING_SCRATCH_BUFFER_SIZE (16 << 20)
#endif // BGFX_CONFIG_MAX_STAGING_SCRATCH_BUFFER_SIZE
#ifndef BGFX_CONFIG_MAX_SCRATCH_STAGING_BUFFER_PER_FRAME_SIZE
/// Amount of scratch buffer size (per in-flight frame) that will be reserved
/// for staging data for copying to the device (such as vertex buffer data,
/// texture data, etc). This buffer will be used instead of allocating memory
/// on device separately for every data copy.
/// Note: Currently only used by the Vulkan backend.
# define BGFX_CONFIG_PER_FRAME_SCRATCH_STAGING_BUFFER_SIZE (32<<20)
#endif
#ifndef BGFX_CONFIG_MAX_BYTES_CACHED_DEVICE_MEMORY_ALLOCATIONS
/// Amount of allowed memory allocations left on device to use for recycling during
/// later allocations. This can be beneficial in case the driver is slow allocating memory
/// on the device.
/// Note: Currently only used by the Vulkan backend.
# define BGFX_CONFIG_MAX_BYTES_CACHED_DEVICE_MEMORY_ALLOCATIONS (128 << 20)
#endif
#ifndef BGFX_CONFIG_MAX_STAGING_SIZE_FOR_SCRATCH_BUFFER
/// The threshold of data size above which the staging scratch buffer will
/// not be used, but instead a separate device memory allocation will take
/// place to stage the data for copying to device.
# define BGFX_CONFIG_MAX_STAGING_SIZE_FOR_SCRATCH_BUFFER (16 << 20)
#endif
# define BGFX_CONFIG_MAX_SCRATCH_STAGING_BUFFER_PER_FRAME_SIZE (32<<20)
#endif // BGFX_CONFIG_MAX_SCRATCH_STAGING_BUFFER_PER_FRAME_SIZE
#ifndef BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT
# define BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT 5

View File

@@ -2026,7 +2026,7 @@ VK_IMPORT_DEVICE
for (uint32_t ii = 0; ii < m_numFramesInFlight; ++ii)
{
BX_TRACE("Create scratch staging buffer %d", ii);
m_scratchStagingBuffer[ii].createStaging(BGFX_CONFIG_PER_FRAME_SCRATCH_STAGING_BUFFER_SIZE);
m_scratchStagingBuffer[ii].createStaging(BGFX_CONFIG_MAX_SCRATCH_STAGING_BUFFER_PER_FRAME_SIZE);
}
}
@@ -4524,7 +4524,7 @@ VK_IMPORT_DEVICE
StagingBufferVK result;
ScratchBufferVK &scratch = m_scratchStagingBuffer[m_cmd.m_currentFrameInFlight];
if (_size <= BGFX_CONFIG_MAX_STAGING_SIZE_FOR_SCRATCH_BUFFER)
if (_size <= BGFX_CONFIG_MAX_STAGING_SCRATCH_BUFFER_SIZE)
{
const uint32_t scratchOffset = scratch.alloc(_size, _align);
@@ -4750,7 +4750,7 @@ VK_DESTROY
}
totalSizeCached += _alloc.size;
while (totalSizeCached > BGFX_CONFIG_MAX_BYTES_CACHED_DEVICE_MEMORY_ALLOCATIONS)
while (totalSizeCached > BGFX_CONFIG_CACHED_DEVICE_MEMORY_ALLOCATIONS_SIZE)
{
BX_ASSERT(lru.getNumHandles() > 0, "Memory badly counted.");
uint16_t handle = lru.getBack();