1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00

[dxvk] Use staging buffer for gamma ramp uploads

This commit is contained in:
Philip Rebohle 2022-02-12 14:26:42 +01:00
parent 80c5b61e26
commit 3b833988fe
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 32 additions and 9 deletions

View File

@ -73,11 +73,31 @@ namespace dxvk {
void DxvkSwapchainBlitter::setGammaRamp( void DxvkSwapchainBlitter::setGammaRamp(
uint32_t cpCount, uint32_t cpCount,
const DxvkGammaCp* cpData) { const DxvkGammaCp* cpData) {
m_gammaRamp.resize(cpCount); VkDeviceSize size = cpCount * sizeof(*cpData);
for (uint32_t i = 0; i < cpCount; i++) if (cpCount) {
m_gammaRamp[i] = cpData[i]; if (m_gammaBuffer == nullptr || m_gammaBuffer->info().size < size) {
DxvkBufferCreateInfo bufInfo;
bufInfo.size = size;
bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
bufInfo.stages = VK_PIPELINE_STAGE_TRANSFER_BIT;
bufInfo.access = VK_ACCESS_TRANSFER_READ_BIT;
m_gammaBuffer = m_device->createBuffer(bufInfo,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
}
if (!m_gammaSlice.handle)
m_gammaSlice = m_gammaBuffer->allocSlice();
std::memcpy(m_gammaSlice.mapPtr, cpData, size);
} else {
m_gammaBuffer = nullptr;
m_gammaSlice = DxvkBufferSliceHandle();
}
m_gammaCpCount = cpCount;
m_gammaDirty = true; m_gammaDirty = true;
} }
@ -210,7 +230,7 @@ namespace dxvk {
void DxvkSwapchainBlitter::updateGammaTexture(DxvkContext* ctx) { void DxvkSwapchainBlitter::updateGammaTexture(DxvkContext* ctx) {
uint32_t n = uint32_t(m_gammaRamp.size()); uint32_t n = m_gammaCpCount;
if (n) { if (n) {
// Reuse existing image if possible // Reuse existing image if possible
@ -248,13 +268,14 @@ namespace dxvk {
m_gammaView = m_device->createImageView(m_gammaImage, viewInfo); m_gammaView = m_device->createImageView(m_gammaImage, viewInfo);
} }
ctx->updateImage(m_gammaImage, ctx->invalidateBuffer(m_gammaBuffer, m_gammaSlice);
ctx->copyBufferToImage(m_gammaImage,
VkImageSubresourceLayers { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }, VkImageSubresourceLayers { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 },
VkOffset3D { 0, 0, 0 }, VkOffset3D { 0, 0, 0 },
VkExtent3D { n, 1, 1 }, VkExtent3D { n, 1, 1 },
m_gammaRamp.data(), m_gammaBuffer, 0, 0, 0);
sizeof(DxvkGammaCp) * n,
sizeof(DxvkGammaCp) * n); m_gammaSlice = DxvkBufferSliceHandle();
} else { } else {
m_gammaImage = nullptr; m_gammaImage = nullptr;
m_gammaView = nullptr; m_gammaView = nullptr;

View File

@ -76,10 +76,12 @@ namespace dxvk {
Rc<DxvkShader> m_fsResolve; Rc<DxvkShader> m_fsResolve;
Rc<DxvkShader> m_vs; Rc<DxvkShader> m_vs;
Rc<DxvkBuffer> m_gammaBuffer;
Rc<DxvkImage> m_gammaImage; Rc<DxvkImage> m_gammaImage;
Rc<DxvkImageView> m_gammaView; Rc<DxvkImageView> m_gammaView;
uint32_t m_gammaCpCount = 0;
bool m_gammaDirty = false; bool m_gammaDirty = false;
std::vector<DxvkGammaCp> m_gammaRamp; DxvkBufferSliceHandle m_gammaSlice = { };
Rc<DxvkImage> m_resolveImage; Rc<DxvkImage> m_resolveImage;
Rc<DxvkImageView> m_resolveView; Rc<DxvkImageView> m_resolveView;