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:
parent
80c5b61e26
commit
3b833988fe
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user