diff options
Diffstat (limited to 'src/libANGLE/renderer/vulkan/RendererVk.cpp')
-rw-r--r-- | src/libANGLE/renderer/vulkan/RendererVk.cpp | 37 |
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 |