1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-15 07:29:17 +01:00

[dxvk] Fix buffer usage flags in commitGraphicsBarriers

Only checking for one single usage flag is incorrect since
buffers can have both the storage buffer and storage texel
buffer usage bits set.
This commit is contained in:
Philip Rebohle 2019-10-13 03:16:30 +02:00
parent 950ea21b83
commit b67e5809ba
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99

View File

@ -4363,6 +4363,10 @@ namespace dxvk {
void DxvkContext::commitGraphicsBarriers() { void DxvkContext::commitGraphicsBarriers() {
auto layout = m_state.gp.pipeline->layout(); auto layout = m_state.gp.pipeline->layout();
constexpr auto storageBufferUsage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
| VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
constexpr auto storageImageUsage = VK_IMAGE_USAGE_STORAGE_BIT;
bool requiresBarrier = false; bool requiresBarrier = false;
for (uint32_t i = 0; i < layout->bindingCount() && !requiresBarrier; i++) { for (uint32_t i = 0; i < layout->bindingCount() && !requiresBarrier; i++) {
@ -4381,7 +4385,7 @@ namespace dxvk {
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
if (slot.bufferSlice.defined() if (slot.bufferSlice.defined()
&& slot.bufferSlice.bufferInfo().usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) { && slot.bufferSlice.bufferInfo().usage & storageBufferUsage) {
srcAccess = m_gfxBarriers.getBufferAccess( srcAccess = m_gfxBarriers.getBufferAccess(
slot.bufferSlice.getSliceHandle()); slot.bufferSlice.getSliceHandle());
@ -4400,7 +4404,7 @@ namespace dxvk {
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
if (slot.bufferView != nullptr if (slot.bufferView != nullptr
&& slot.bufferView->bufferInfo().usage & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) { && slot.bufferView->bufferInfo().usage & storageBufferUsage) {
srcAccess = m_gfxBarriers.getBufferAccess( srcAccess = m_gfxBarriers.getBufferAccess(
slot.bufferView->getSliceHandle()); slot.bufferView->getSliceHandle());
@ -4420,7 +4424,7 @@ namespace dxvk {
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
if (slot.imageView != nullptr if (slot.imageView != nullptr
&& slot.imageView->imageInfo().usage & VK_IMAGE_USAGE_STORAGE_BIT) { && slot.imageView->imageInfo().usage & storageImageUsage) {
srcAccess = m_gfxBarriers.getImageAccess( srcAccess = m_gfxBarriers.getImageAccess(
slot.imageView->image(), slot.imageView->image(),
slot.imageView->imageSubresources()); slot.imageView->imageSubresources());