aboutsummaryrefslogtreecommitdiff
path: root/src/libANGLE/renderer/vulkan/RendererVk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libANGLE/renderer/vulkan/RendererVk.cpp')
-rw-r--r--src/libANGLE/renderer/vulkan/RendererVk.cpp37
1 files changed, 25 insertions, 12 deletions
diff --git a/src/libANGLE/renderer/vulkan/RendererVk.cpp b/src/libANGLE/renderer/vulkan/RendererVk.cpp
index ce4dde5a9a..0302ccc2ba 100644
--- a/src/libANGLE/renderer/vulkan/RendererVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RendererVk.cpp
@@ -1408,8 +1408,6 @@ RendererVk::RendererVk()
mDefaultUniformBufferSize(kPreferredDefaultUniformBufferSize),
mDevice(VK_NULL_HANDLE),
mDeviceLost(false),
- mCoherentStagingBufferMemoryTypeIndex(kInvalidMemoryTypeIndex),
- mNonCoherentStagingBufferMemoryTypeIndex(kInvalidMemoryTypeIndex),
mStagingBufferAlignment(1),
mHostVisibleVertexConversionBufferMemoryTypeIndex(kInvalidMemoryTypeIndex),
mDeviceLocalVertexConversionBufferMemoryTypeIndex(kInvalidMemoryTypeIndex),
@@ -1425,6 +1423,7 @@ RendererVk::RendererVk()
{
VkFormatProperties invalid = {0, 0, kInvalidFormatFeatureFlags};
mFormatProperties.fill(invalid);
+ mStagingBufferMemoryTypeIndex.fill(kInvalidMemoryTypeIndex);
// We currently don't have any big-endian devices in the list of supported platforms. There are
// a number of places in the Vulkan backend that make this assumption. This assertion is made
@@ -2000,17 +1999,30 @@ angle::Result RendererVk::initializeMemoryAllocator(DisplayVk *displayVk)
// Uncached coherent staging buffer
VkMemoryPropertyFlags preferredFlags = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
- ANGLE_VK_TRY(displayVk, mAllocator.findMemoryTypeIndexForBufferInfo(
- createInfo, requiredFlags, preferredFlags, persistentlyMapped,
- &mCoherentStagingBufferMemoryTypeIndex));
- ASSERT(mCoherentStagingBufferMemoryTypeIndex != kInvalidMemoryTypeIndex);
+ ANGLE_VK_TRY(displayVk,
+ mAllocator.findMemoryTypeIndexForBufferInfo(
+ createInfo, requiredFlags, preferredFlags, persistentlyMapped,
+ &mStagingBufferMemoryTypeIndex[vk::MemoryCoherency::UnCachedCoherent]));
+ ASSERT(mStagingBufferMemoryTypeIndex[vk::MemoryCoherency::UnCachedCoherent] !=
+ kInvalidMemoryTypeIndex);
+
+ // Cached coherent staging buffer
+ preferredFlags = VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
+ ANGLE_VK_TRY(displayVk,
+ mAllocator.findMemoryTypeIndexForBufferInfo(
+ createInfo, requiredFlags, preferredFlags, persistentlyMapped,
+ &mStagingBufferMemoryTypeIndex[vk::MemoryCoherency::CachedCoherent]));
+ ASSERT(mStagingBufferMemoryTypeIndex[vk::MemoryCoherency::CachedCoherent] !=
+ kInvalidMemoryTypeIndex);
- // Cached (b/219974369) Non-coherent staging buffer
+ // Cached Non-coherent staging buffer
preferredFlags = VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
- ANGLE_VK_TRY(displayVk, mAllocator.findMemoryTypeIndexForBufferInfo(
- createInfo, requiredFlags, preferredFlags, persistentlyMapped,
- &mNonCoherentStagingBufferMemoryTypeIndex));
- ASSERT(mNonCoherentStagingBufferMemoryTypeIndex != kInvalidMemoryTypeIndex);
+ ANGLE_VK_TRY(displayVk,
+ mAllocator.findMemoryTypeIndexForBufferInfo(
+ createInfo, requiredFlags, preferredFlags, persistentlyMapped,
+ &mStagingBufferMemoryTypeIndex[vk::MemoryCoherency::CachedNonCoherent]));
+ ASSERT(mStagingBufferMemoryTypeIndex[vk::MemoryCoherency::CachedNonCoherent] !=
+ kInvalidMemoryTypeIndex);
// Alignment
mStagingBufferAlignment =
@@ -2037,7 +2049,8 @@ angle::Result RendererVk::initializeMemoryAllocator(DisplayVk *displayVk)
// Host visible and non-coherent vertex conversion buffer, which is the same as non-coherent
// staging buffer
- mHostVisibleVertexConversionBufferMemoryTypeIndex = mNonCoherentStagingBufferMemoryTypeIndex;
+ mHostVisibleVertexConversionBufferMemoryTypeIndex =
+ mStagingBufferMemoryTypeIndex[vk::MemoryCoherency::CachedNonCoherent];
// We may use compute shader to do conversion, so we must meet
// minStorageBufferOffsetAlignment requirement as well. Also take into account non-coherent