mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-07 16:54:14 +01:00
[dxvk] Implement framebuffer cache
Reduces the number of object allocations per frame.
This commit is contained in:
parent
a987b729a7
commit
2abe2132a6
@ -4004,7 +4004,7 @@ namespace dxvk {
|
|||||||
const VkClearValue* clearValues) {
|
const VkClearValue* clearValues) {
|
||||||
const DxvkFramebufferSize fbSize = framebufferInfo.size();
|
const DxvkFramebufferSize fbSize = framebufferInfo.size();
|
||||||
|
|
||||||
Rc<DxvkFramebuffer> framebuffer = m_device->createFramebuffer(framebufferInfo);
|
Rc<DxvkFramebuffer> framebuffer = this->lookupFramebuffer(framebufferInfo);
|
||||||
|
|
||||||
VkRect2D renderArea;
|
VkRect2D renderArea;
|
||||||
renderArea.offset = VkOffset2D { 0, 0 };
|
renderArea.offset = VkOffset2D { 0, 0 };
|
||||||
@ -5347,6 +5347,18 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Rc<DxvkFramebuffer> DxvkContext::lookupFramebuffer(
|
||||||
|
const DxvkFramebufferInfo& framebufferInfo) {
|
||||||
|
DxvkFramebufferKey key = framebufferInfo.key();
|
||||||
|
size_t idx = key.hash() % m_framebufferCache.size();
|
||||||
|
|
||||||
|
if (m_framebufferCache[idx] == nullptr || !m_framebufferCache[idx]->key().eq(key))
|
||||||
|
m_framebufferCache[idx] = m_device->createFramebuffer(framebufferInfo);
|
||||||
|
|
||||||
|
return m_framebufferCache[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Rc<DxvkBuffer> DxvkContext::createZeroBuffer(
|
Rc<DxvkBuffer> DxvkContext::createZeroBuffer(
|
||||||
VkDeviceSize size) {
|
VkDeviceSize size) {
|
||||||
if (m_zeroBuffer != nullptr && m_zeroBuffer->info().size >= size)
|
if (m_zeroBuffer != nullptr && m_zeroBuffer->info().size >= size)
|
||||||
|
@ -1108,6 +1108,7 @@ namespace dxvk {
|
|||||||
std::array<DxvkShaderResourceSlot, MaxNumResourceSlots> m_rc;
|
std::array<DxvkShaderResourceSlot, MaxNumResourceSlots> m_rc;
|
||||||
std::array<DxvkGraphicsPipeline*, 4096> m_gpLookupCache = { };
|
std::array<DxvkGraphicsPipeline*, 4096> m_gpLookupCache = { };
|
||||||
std::array<DxvkComputePipeline*, 256> m_cpLookupCache = { };
|
std::array<DxvkComputePipeline*, 256> m_cpLookupCache = { };
|
||||||
|
std::array<Rc<DxvkFramebuffer>, 512> m_framebufferCache = { };
|
||||||
|
|
||||||
void blitImageFb(
|
void blitImageFb(
|
||||||
const Rc<DxvkImage>& dstImage,
|
const Rc<DxvkImage>& dstImage,
|
||||||
@ -1353,6 +1354,9 @@ namespace dxvk {
|
|||||||
|
|
||||||
DxvkComputePipeline* lookupComputePipeline(
|
DxvkComputePipeline* lookupComputePipeline(
|
||||||
const DxvkComputePipelineShaders& shaders);
|
const DxvkComputePipelineShaders& shaders);
|
||||||
|
|
||||||
|
Rc<DxvkFramebuffer> lookupFramebuffer(
|
||||||
|
const DxvkFramebufferInfo& framebufferInfo);
|
||||||
|
|
||||||
Rc<DxvkBuffer> createZeroBuffer(
|
Rc<DxvkBuffer> createZeroBuffer(
|
||||||
VkDeviceSize size);
|
VkDeviceSize size);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user