mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[dxvk] Descriptor set updates now use descriptor type info
This fixes an issue where the wrong resource would be used for a descriptor set update if multiple resources have been bound to a single resource slot.
This commit is contained in:
parent
78cb021f77
commit
793ea6d914
@ -850,30 +850,44 @@ namespace dxvk {
|
|||||||
// TODO recreate resource views if the underlying
|
// TODO recreate resource views if the underlying
|
||||||
// resource was marked as dirty after invalidation
|
// resource was marked as dirty after invalidation
|
||||||
for (uint32_t i = 0; i < layout->bindingCount(); i++) {
|
for (uint32_t i = 0; i < layout->bindingCount(); i++) {
|
||||||
const uint32_t slot = layout->binding(i).slot;
|
const auto& binding = layout->binding(i);
|
||||||
const auto& res = m_rc[slot];
|
const auto& res = m_rc[binding.slot];
|
||||||
|
|
||||||
if (res.sampler != nullptr) {
|
switch (binding.type) {
|
||||||
m_descriptors[i].image.sampler = res.sampler->handle();
|
case VK_DESCRIPTOR_TYPE_SAMPLER:
|
||||||
m_descriptors[i].image.imageView = VK_NULL_HANDLE;
|
m_descriptors[i].image.sampler = res.sampler->handle();
|
||||||
m_descriptors[i].image.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
m_descriptors[i].image.imageView = VK_NULL_HANDLE;
|
||||||
|
m_descriptors[i].image.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
|
|
||||||
|
m_cmd->trackResource(res.sampler);
|
||||||
|
break;
|
||||||
|
|
||||||
m_cmd->trackResource(res.sampler);
|
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
|
||||||
} else if (res.imageView != nullptr) {
|
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
|
||||||
m_descriptors[i].image.sampler = VK_NULL_HANDLE;
|
m_descriptors[i].image.sampler = VK_NULL_HANDLE;
|
||||||
m_descriptors[i].image.imageView = res.imageView->handle();
|
m_descriptors[i].image.imageView = res.imageView->handle();
|
||||||
m_descriptors[i].image.imageLayout = res.imageView->imageInfo().layout;
|
m_descriptors[i].image.imageLayout = res.imageView->imageInfo().layout;
|
||||||
|
|
||||||
|
m_cmd->trackResource(res.imageView);
|
||||||
|
m_cmd->trackResource(res.imageView->image());
|
||||||
|
break;
|
||||||
|
|
||||||
m_cmd->trackResource(res.imageView);
|
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
|
||||||
m_cmd->trackResource(res.imageView->image());
|
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
|
||||||
} else if (res.bufferView != nullptr) {
|
m_descriptors[i].texelBuffer = res.bufferView->handle();
|
||||||
m_descriptors[i].texelBuffer = res.bufferView->handle();
|
|
||||||
|
m_cmd->trackResource(res.bufferView);
|
||||||
|
m_cmd->trackResource(res.bufferView->buffer()->resource());
|
||||||
|
break;
|
||||||
|
|
||||||
m_cmd->trackResource(res.bufferView);
|
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
||||||
m_cmd->trackResource(res.bufferView->buffer()->resource());
|
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
||||||
} else if (res.bufferSlice.handle() != VK_NULL_HANDLE) {
|
m_descriptors[i].buffer = res.bufferSlice.descriptorInfo();
|
||||||
m_descriptors[i].buffer = res.bufferSlice.descriptorInfo();
|
m_cmd->trackResource(res.bufferSlice.resource());
|
||||||
m_cmd->trackResource(res.bufferSlice.resource());
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Logger::err(str::format("DxvkContext: Unhandled descriptor type: ", binding.type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user