1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-20 19:54:19 +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(
uint32_t cpCount,
const DxvkGammaCp* cpData) {
m_gammaRamp.resize(cpCount);
VkDeviceSize size = cpCount * sizeof(*cpData);
for (uint32_t i = 0; i < cpCount; i++)
m_gammaRamp[i] = cpData[i];
if (cpCount) {
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;
}
@ -210,7 +230,7 @@ namespace dxvk {
void DxvkSwapchainBlitter::updateGammaTexture(DxvkContext* ctx) {
uint32_t n = uint32_t(m_gammaRamp.size());
uint32_t n = m_gammaCpCount;
if (n) {
// Reuse existing image if possible
@ -248,13 +268,14 @@ namespace dxvk {
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 },
VkOffset3D { 0, 0, 0 },
VkExtent3D { n, 1, 1 },
m_gammaRamp.data(),
sizeof(DxvkGammaCp) * n,
sizeof(DxvkGammaCp) * n);
m_gammaBuffer, 0, 0, 0);
m_gammaSlice = DxvkBufferSliceHandle();
} else {
m_gammaImage = nullptr;
m_gammaView = nullptr;

View File

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