Allocated texture, shader and dynamic buffer tables in blocks as handles are used. (#4024)

This commit is contained in:
Branimir Karadžić
2026-10-04 15:45:00 +00:00
committed by GitHub
parent aa10f3accb
commit 01e69a6307
9 changed files with 493 additions and 269 deletions
+45 -46
View File
@@ -898,6 +898,8 @@ namespace bgfx { namespace d3d12
bool init(const Init& _init)
{
m_frameBuffers.alloc(kMainFrameBufferIdx);
struct ErrorState
{
enum Enum
@@ -2137,25 +2139,13 @@ namespace bgfx { namespace d3d12
m_pipelineStateCache.invalidate();
m_lastPso = NULL;
for (uint32_t ii = 0; ii < BX_COUNTOF(m_indexBuffers); ++ii)
{
m_indexBuffers[ii].destroy();
}
m_indexBuffers.each([](BufferD3D12& _indexBuffer) { _indexBuffer.destroy(); });
for (uint32_t ii = 0; ii < BX_COUNTOF(m_vertexBuffers); ++ii)
{
m_vertexBuffers[ii].destroy();
}
m_vertexBuffers.each([](VertexBufferD3D12& _vertexBuffer) { _vertexBuffer.destroy(); });
for (uint32_t ii = 0; ii < BX_COUNTOF(m_shaders); ++ii)
{
m_shaders[ii].destroy();
}
m_shaders.each([](ShaderD3D12& _shader) { _shader.destroy(); });
for (uint32_t ii = 0; ii < BX_COUNTOF(m_textures); ++ii)
{
m_textures[ii].destroy();
}
m_textures.each([](TextureD3D12& _texture) { _texture.destroy(); });
#if BX_PLATFORM_WINDOWS
dumpInfoQueue();
@@ -2393,12 +2383,13 @@ namespace bgfx { namespace d3d12
void createIndexBuffer(IndexBufferHandle _handle, const Memory* _mem, uint16_t _flags) override
{
m_indexBuffers[_handle.idx].create(_mem->size, _mem->data, _flags, false);
m_indexBuffers.alloc(_handle.idx).create(_mem->size, _mem->data, _flags, false);
}
void destroyIndexBuffer(IndexBufferHandle _handle) override
{
m_indexBuffers[_handle.idx].destroy();
m_indexBuffers.release(_handle.idx);
}
void createVertexLayout(VertexLayoutHandle _handle, const VertexLayout& _layout) override
@@ -2414,17 +2405,18 @@ namespace bgfx { namespace d3d12
void createVertexBuffer(VertexBufferHandle _handle, const Memory* _mem, VertexLayoutHandle _layoutHandle, uint16_t _flags) override
{
m_vertexBuffers[_handle.idx].create(_mem->size, _mem->data, _layoutHandle, _flags);
m_vertexBuffers.alloc(_handle.idx).create(_mem->size, _mem->data, _layoutHandle, _flags);
}
void destroyVertexBuffer(VertexBufferHandle _handle) override
{
m_vertexBuffers[_handle.idx].destroy();
m_vertexBuffers.release(_handle.idx);
}
void createDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _size, uint16_t _flags) override
{
m_indexBuffers[_handle.idx].create(_size, NULL, _flags, false);
m_indexBuffers.alloc(_handle.idx).create(_size, NULL, _flags, false);
}
void updateDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _offset, uint32_t _size, const Memory* _mem) override
@@ -2435,12 +2427,13 @@ namespace bgfx { namespace d3d12
void destroyDynamicIndexBuffer(IndexBufferHandle _handle) override
{
m_indexBuffers[_handle.idx].destroy();
m_indexBuffers.release(_handle.idx);
}
void createDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _size, uint16_t _flags) override
{
VertexLayoutHandle layoutHandle = BGFX_INVALID_HANDLE;
m_vertexBuffers[_handle.idx].create(_size, NULL, layoutHandle, _flags);
m_vertexBuffers.alloc(_handle.idx).create(_size, NULL, layoutHandle, _flags);
}
void updateDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _offset, uint32_t _size, const Memory* _mem) override
@@ -2451,31 +2444,34 @@ namespace bgfx { namespace d3d12
void destroyDynamicVertexBuffer(VertexBufferHandle _handle) override
{
m_vertexBuffers[_handle.idx].destroy();
m_vertexBuffers.release(_handle.idx);
}
void createShader(ShaderHandle _handle, const Memory* _mem) override
{
m_shaders[_handle.idx].create(_mem);
m_shaders.alloc(_handle.idx).create(_mem);
}
void destroyShader(ShaderHandle _handle) override
{
m_shaders[_handle.idx].destroy();
m_shaders.release(_handle.idx);
}
void createProgram(ProgramHandle _handle, ShaderHandle _vsh, ShaderHandle _fsh) override
{
m_program[_handle.idx].create(&m_shaders[_vsh.idx], isValid(_fsh) ? &m_shaders[_fsh.idx] : NULL);
m_program.alloc(_handle.idx).create(&m_shaders[_vsh.idx], isValid(_fsh) ? &m_shaders[_fsh.idx] : NULL);
}
void destroyProgram(ProgramHandle _handle) override
{
m_program[_handle.idx].destroy();
m_program.release(_handle.idx);
}
void* createTexture(TextureHandle _handle, const Memory* _mem, uint64_t _flags, uint8_t _skip, uint64_t _external) override
{
return m_textures[_handle.idx].create(_mem, _flags, _skip, _external);
return m_textures.alloc(_handle.idx).create(_mem, _flags, _skip, _external);
}
void updateTexture(TextureHandle _handle, uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem) override
@@ -2807,11 +2803,12 @@ namespace bgfx { namespace d3d12
void destroyTexture(TextureHandle _handle) override
{
m_textures[_handle.idx].destroy();
m_textures.release(_handle.idx);
}
void createFrameBuffer(FrameBufferHandle _handle, uint8_t _num, const Attachment* _attachment) override
{
m_frameBuffers[_handle.idx].create(_num, _attachment);
m_frameBuffers.alloc(_handle.idx).create(_num, _attachment);
}
void createFrameBuffer(FrameBufferHandle _handle, const SwapChain& _desc) override
@@ -2830,7 +2827,7 @@ namespace bgfx { namespace d3d12
uint16_t denseIdx = m_numWindows++;
m_windows[denseIdx] = _handle;
m_frameBuffers[_handle.idx].create(denseIdx, _desc);
m_frameBuffers.alloc(_handle.idx).create(denseIdx, _desc);
}
void resizeFrameBuffer(FrameBufferHandle _handle, const SwapChain& _desc) override
@@ -2863,6 +2860,7 @@ namespace bgfx { namespace d3d12
}
uint16_t denseIdx = frameBuffer.destroy();
m_frameBuffers.release(_handle.idx);
if (UINT16_MAX != denseIdx)
{
--m_numWindows;
@@ -3180,10 +3178,7 @@ namespace bgfx { namespace d3d12
{
finishAll();
for (uint32_t ii = 0; ii < BX_COUNTOF(m_frameBuffers); ++ii)
{
m_frameBuffers[ii].preReset();
}
m_frameBuffers.each([](FrameBufferD3D12& _frameBuffer) { _frameBuffer.preReset(); });
invalidateCache();
@@ -3198,10 +3193,7 @@ namespace bgfx { namespace d3d12
mainFrameBuffer().m_desc = m_mainSwapChain;
for (uint32_t ii = 0; ii < BX_COUNTOF(m_frameBuffers); ++ii)
{
m_frameBuffers[ii].postReset();
}
m_frameBuffers.each([](FrameBufferD3D12& _frameBuffer) { _frameBuffer.postReset(); });
// capturePostReset();
}
@@ -4574,13 +4566,13 @@ namespace bgfx { namespace d3d12
DxgiSwapChainDesc m_scd;
uint32_t m_maxAnisotropy;
BufferD3D12 m_indexBuffers[BGFX_CONFIG_MAX_INDEX_BUFFERS];
VertexBufferD3D12 m_vertexBuffers[BGFX_CONFIG_MAX_VERTEX_BUFFERS];
ShaderD3D12 m_shaders[BGFX_CONFIG_MAX_SHADERS];
ProgramD3D12 m_program[BGFX_CONFIG_MAX_PROGRAMS];
TextureD3D12 m_textures[BGFX_CONFIG_MAX_TEXTURES];
HandleArenaT<BufferD3D12, BGFX_CONFIG_MAX_INDEX_BUFFERS> m_indexBuffers;
HandleArenaT<VertexBufferD3D12, BGFX_CONFIG_MAX_VERTEX_BUFFERS> m_vertexBuffers;
HandleArenaT<ShaderD3D12, BGFX_CONFIG_MAX_SHADERS> m_shaders;
HandleArenaT<ProgramD3D12, BGFX_CONFIG_MAX_PROGRAMS> m_program;
HandleArenaT<TextureD3D12, BGFX_CONFIG_MAX_TEXTURES> m_textures;
VertexLayout m_vertexLayouts[BGFX_CONFIG_MAX_VERTEX_LAYOUTS];
FrameBufferD3D12 m_frameBuffers[BGFX_CONFIG_MAX_FRAME_BUFFERS+1];
HandleArenaT<FrameBufferD3D12, BGFX_CONFIG_MAX_FRAME_BUFFERS+1> m_frameBuffers;
Matrix4 m_predefinedUniforms[PredefinedUniform::Count];
StateCacheT<ID3D12PipelineState*> m_pipelineStateCache;
@@ -4933,7 +4925,7 @@ namespace bgfx { namespace d3d12
if (0 == _texture.m_srvHandle.ptr)
{
D3D12_CPU_DESCRIPTOR_HANDLE cached = getCPUHandleHeapStart(s_renderD3D12->m_textureSrvHeap);
cached.ptr += uint32_t(&_texture - s_renderD3D12->m_textures) * m_incrementSize;
cached.ptr += s_renderD3D12->m_textures.indexOf(_texture) * m_incrementSize;
device->CreateShaderResourceView(resource, srvd, cached);
_texture.m_srvHandle = cached;
}
@@ -6673,7 +6665,7 @@ namespace bgfx { namespace d3d12
;
BX_TRACE("Texture %3d: %s (requested: %s), %dx%d%s RT[%c], BO[%c], CW[%c]%s."
, this - s_renderD3D12->m_textures
, s_renderD3D12->m_textures.indexOf(*this)
, getName( (TextureFormat::Enum)m_textureFormat)
, getName( (TextureFormat::Enum)m_requestedFormat)
, ti.width
@@ -6964,7 +6956,7 @@ namespace bgfx { namespace d3d12
m_flags |= BGFX_SAMPLER_INTERNAL_SHARED;
m_state = D3D12_RESOURCE_STATE_COMMON;
s_renderD3D12->m_cmd.addExternal({ uint16_t(this - s_renderD3D12->m_textures) });
s_renderD3D12->m_cmd.addExternal({ s_renderD3D12->m_textures.indexOf(*this) });
}
else
{
@@ -7127,7 +7119,7 @@ namespace bgfx { namespace d3d12
if (external)
{
s_renderD3D12->m_cmd.removeExternal({ uint16_t(this - s_renderD3D12->m_textures) });
s_renderD3D12->m_cmd.removeExternal({ s_renderD3D12->m_textures.indexOf(*this) });
}
else
{
@@ -7937,7 +7929,7 @@ namespace bgfx { namespace d3d12
#if BX_PLATFORM_WINDOWS
ID3D12Device* device = s_renderD3D12->m_device;
const FrameBufferHandle fbh = { uint16_t(this - s_renderD3D12->m_frameBuffers) };
const FrameBufferHandle fbh = { s_renderD3D12->m_frameBuffers.indexOf(*this) };
const DxgiSwapChainDesc scd = getSwapChainDesc();
if (1 < scd.sampleDesc.Count
@@ -8208,7 +8200,7 @@ namespace bgfx { namespace d3d12
D3D12_CPU_DESCRIPTOR_HANDLE rtvDescriptor = getCPUHandleHeapStart(s_renderD3D12->m_rtvDescriptorHeap);
uint32_t rtvDescriptorSize = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
uint32_t fbhIdx = (uint32_t)(this - s_renderD3D12->m_frameBuffers);
uint32_t fbhIdx = s_renderD3D12->m_frameBuffers.indexOf(*this);
rtvDescriptor.ptr += fbhIdx * BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS * rtvDescriptorSize;
m_width = 0;
@@ -8414,7 +8406,7 @@ namespace bgfx { namespace d3d12
void FrameBufferD3D12::clear(ID3D12GraphicsCommandList* _commandList, const Clear& _clear, const float _palette[][4], const D3D12_RECT* _rect, uint32_t _num)
{
ID3D12Device* device = s_renderD3D12->m_device;
FrameBufferHandle fbh = { (uint16_t)(this - s_renderD3D12->m_frameBuffers) };
FrameBufferHandle fbh = { s_renderD3D12->m_frameBuffers.indexOf(*this) };
D3D12_CPU_DESCRIPTOR_HANDLE rtv = s_renderD3D12->getRtv(fbh);
uint32_t rtvDescriptorSize = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
@@ -9436,6 +9428,13 @@ namespace bgfx { namespace d3d12
void RendererContextD3D12::submit(Frame* _render, const ClearQuad& /*_clearQuad*/, const MipGen& _mipGen, TextVideoMemBlitter& _textVideoMemBlitter)
{
m_indexBuffers.freeUnused();
m_vertexBuffers.freeUnused();
m_shaders.freeUnused();
m_program.freeUnused();
m_textures.freeUnused();
m_frameBuffers.freeUnused();
m_mipGen = &_mipGen;
if (m_lost
|| updateResolution(_render->m_mainSwapChain, _render->m_reset) )