Vulkan: Rename getShareGroupVk to getShareGroup
+ other miscellaneous clean up
Bug: angleproject:7375
Change-Id: I25690860478a2fd181a67ce2b6cb4d7aac7dbaa7
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3700197
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Yuxin Hu <yuxinhu@google.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 6d102ec..32f292c 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -541,7 +541,7 @@
"Render pass closed due to graphics pipeline change while transform feedback is active"},
{RenderPassClosureReason::BufferWriteThenMap,
"Render pass closed due to mapping buffer being written to by said render pass"},
- {RenderPassClosureReason::BufferUseThenOutOfRPRead,
+ {RenderPassClosureReason::BufferWriteThenOutOfRPRead,
"Render pass closed due to non-render-pass read of buffer that was written to in render pass"},
{RenderPassClosureReason::BufferUseThenOutOfRPWrite,
"Render pass closed due to non-render-pass write of buffer that was used in render pass"},
@@ -3056,9 +3056,9 @@
angle::Result ContextVk::submitFrame(const vk::Semaphore *signalSemaphore, Serial *submitSerialOut)
{
- getShareGroupVk()->acquireResourceUseList(
+ getShareGroup()->acquireResourceUseList(
std::move(mOutsideRenderPassCommands->releaseResourceUseList()));
- getShareGroupVk()->acquireResourceUseList(
+ getShareGroup()->acquireResourceUseList(
std::move(mRenderPassCommands->releaseResourceUseList()));
ANGLE_TRY(submitCommands(signalSemaphore, submitSerialOut));
@@ -3072,7 +3072,7 @@
angle::Result ContextVk::submitFrameOutsideCommandBufferOnly(Serial *submitSerialOut)
{
ANGLE_TRACE_EVENT0("gpu.angle", "ContextVk::submitFrameOutsideCommandBufferOnly");
- getShareGroupVk()->acquireResourceUseList(
+ getShareGroup()->acquireResourceUseList(
std::move(mOutsideRenderPassCommands->releaseResourceUseList()));
return submitCommands(nullptr, submitSerialOut);
@@ -3102,7 +3102,7 @@
std::move(mWaitSemaphoreStageMasks), signalSemaphore,
std::move(mCurrentGarbage), &mCommandPools, submitSerialOut));
- getShareGroupVk()->releaseResourceUseLists(*submitSerialOut);
+ getShareGroup()->releaseResourceUseLists(*submitSerialOut);
// Now that we have processed resourceUseList, some of pending garbage may no longer pending
// and should be moved to garbage list.
mRenderer->cleanupPendingSubmissionGarbage();
@@ -7035,7 +7035,7 @@
flushDescriptorSetUpdates();
- getShareGroupVk()->acquireResourceUseList(
+ getShareGroup()->acquireResourceUseList(
std::move(mRenderPassCommands->releaseResourceUseList()));
ANGLE_TRY(mRenderer->flushRenderPassCommands(this, hasProtectedContent(), *renderPass,
@@ -7249,7 +7249,7 @@
flushDescriptorSetUpdates();
- getShareGroupVk()->acquireResourceUseList(
+ getShareGroup()->acquireResourceUseList(
std::move(mOutsideRenderPassCommands->releaseResourceUseList()));
ANGLE_TRY(mRenderer->flushOutsideRPCommands(this, hasProtectedContent(),
@@ -7580,7 +7580,8 @@
{
if (mRenderPassCommands->usesBufferForWrite(*bufferAccess.buffer))
{
- return flushCommandsAndEndRenderPass(RenderPassClosureReason::BufferUseThenOutOfRPRead);
+ return flushCommandsAndEndRenderPass(
+ RenderPassClosureReason::BufferWriteThenOutOfRPRead);
}
else if (mOutsideRenderPassCommands->usesBufferForWrite(*bufferAccess.buffer))
{
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.h b/src/libANGLE/renderer/vulkan/ContextVk.h
index 805c63c..056d86c 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.h
+++ b/src/libANGLE/renderer/vulkan/ContextVk.h
@@ -253,7 +253,7 @@
GLsizei stride);
// ShareGroup
- ShareGroupVk *getShareGroupVk() { return mShareGroupVk; }
+ ShareGroupVk *getShareGroup() { return mShareGroupVk; }
PipelineLayoutCache &getPipelineLayoutCache()
{
return mShareGroupVk->getPipelineLayoutCache();
diff --git a/src/libANGLE/renderer/vulkan/DisplayVk.cpp b/src/libANGLE/renderer/vulkan/DisplayVk.cpp
index 5f55bdc..b5b1170 100644
--- a/src/libANGLE/renderer/vulkan/DisplayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/DisplayVk.cpp
@@ -417,10 +417,9 @@
mRenderer->getFeatures().populateFeatureList(features);
}
-ShareGroupVk::ShareGroupVk()
+ShareGroupVk::ShareGroupVk() : mOrphanNonEmptyBufferBlock(false)
{
- mLastPruneTime = angle::GetCurrentSystemTime();
- mOrphanNonEmptyBufferBlock = false;
+ mLastPruneTime = angle::GetCurrentSystemTime();
}
void ShareGroupVk::addContext(ContextVk *contextVk)
diff --git a/src/libANGLE/renderer/vulkan/RendererVk.cpp b/src/libANGLE/renderer/vulkan/RendererVk.cpp
index f34ce59..95ec9c3 100644
--- a/src/libANGLE/renderer/vulkan/RendererVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RendererVk.cpp
@@ -403,7 +403,7 @@
"SYNC-HAZARD-READ_AFTER_WRITE",
"type: VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC",
},
- // Coherent framebuffer fetch is enabled on some platforms that are known apriori to have the
+ // Coherent framebuffer fetch is enabled on some platforms that are known a priori to have the
// needed behavior, even though this is not specified in the Vulkan spec. These generate
// syncval errors that are benign on those platforms.
// http://anglebug.com/6870
diff --git a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
index 6dbab1e..8abb31f 100644
--- a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
+++ b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
@@ -1398,7 +1398,11 @@
if (samples > 1)
{
- const VkImageUsageFlags usage = kSurfaceVkColorImageUsageFlags;
+ VkImageUsageFlags usage = kSurfaceVkColorImageUsageFlags;
+ if (NeedsInputAttachmentUsage(renderer->getFeatures()))
+ {
+ usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
+ }
// Create a multisampled image that will be rendered to, and then resolved to a swapchain
// image. The actual VkImage is created with rotated coordinates to make it easier to do
diff --git a/src/libANGLE/renderer/vulkan/SyncVk.cpp b/src/libANGLE/renderer/vulkan/SyncVk.cpp
index c648848..5382d8e 100644
--- a/src/libANGLE/renderer/vulkan/SyncVk.cpp
+++ b/src/libANGLE/renderer/vulkan/SyncVk.cpp
@@ -183,7 +183,7 @@
// Cannot reach here from EGL syncs, because serial should already be valid.
ASSERT(contextVk != nullptr);
- const ContextVkSet &shareContextSet = contextVk->getShareGroupVk()->getContexts();
+ const ContextVkSet &shareContextSet = contextVk->getShareGroup()->getContexts();
for (ContextVk *ctx : shareContextSet)
{
ANGLE_TRY(ctx->flushCommandsAndEndRenderPassIfDeferredSyncInit(reason));
@@ -269,7 +269,7 @@
ResourceUseList resourceUseList;
retain(&resourceUseList);
- contextVk->getShareGroupVk()->acquireResourceUseList(std::move(resourceUseList));
+ contextVk->getShareGroup()->acquireResourceUseList(std::move(resourceUseList));
Serial serialOut;
// exportFd is exporting VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR type handle which
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.cpp b/src/libANGLE/renderer/vulkan/TextureVk.cpp
index 77ec9aa..9edae19 100644
--- a/src/libANGLE/renderer/vulkan/TextureVk.cpp
+++ b/src/libANGLE/renderer/vulkan/TextureVk.cpp
@@ -33,13 +33,15 @@
{
namespace
{
-constexpr VkImageUsageFlags kDrawStagingImageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
- VK_IMAGE_USAGE_TRANSFER_DST_BIT;
-
-constexpr VkImageUsageFlags kTransferStagingImageFlags =
+constexpr VkImageUsageFlags kTransferImageFlags =
VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+constexpr VkImageUsageFlags kColorAttachmentImageFlags =
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
+
+constexpr VkImageUsageFlags kDrawStagingImageFlags =
+ kTransferImageFlags | kColorAttachmentImageFlags;
+
constexpr VkFormatFeatureFlags kBlitFeatureFlags =
VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
@@ -1053,7 +1055,7 @@
ANGLE_TRY(stagingImage->get().init2DStaging(
contextVk, mState.hasProtectedContent(), renderer->getMemoryProperties(),
gl::Extents(sourceBox.width, sourceBox.height, 1), dstFormat.getIntendedFormatID(),
- dstFormat.getActualImageFormatID(getRequiredImageAccess()), kTransferStagingImageFlags,
+ dstFormat.getActualImageFormatID(getRequiredImageAccess()), kTransferImageFlags,
layerCount));
access.onImageTransferWrite(gl::LevelIndex(0), 1, 0, layerCount, VK_IMAGE_ASPECT_COLOR_BIT,
@@ -1344,8 +1346,7 @@
mImageCreateFlags = createFlags;
constexpr VkImageUsageFlags kRenderableUsageFlags =
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
- VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
+ kColorAttachmentImageFlags | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
if ((usageFlags | kRenderableUsageFlags) != 0)
{
mRequiredImageAccess = vk::ImageAccess::Renderable;
@@ -1509,8 +1510,7 @@
void TextureVk::initImageUsageFlags(ContextVk *contextVk, angle::FormatID actualFormatID)
{
- mImageUsageFlags = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
- VK_IMAGE_USAGE_SAMPLED_BIT;
+ mImageUsageFlags = kTransferImageFlags | VK_IMAGE_USAGE_SAMPLED_BIT;
// If the image has depth/stencil support, add those as possible usage.
RendererVk *renderer = contextVk->getRenderer();
@@ -1527,8 +1527,7 @@
else if (renderer->hasImageFormatFeatureBits(actualFormatID,
VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT))
{
- mImageUsageFlags |=
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
+ mImageUsageFlags |= kColorAttachmentImageFlags;
}
}
@@ -2055,8 +2054,8 @@
ANGLE_TRY(stagingImage->get().initStaging(
contextVk, mState.hasProtectedContent(), renderer->getMemoryProperties(),
srcImage->getType(), srcImage->getExtents(), srcImage->getIntendedFormatID(),
- srcImage->getActualFormatID(), srcImage->getSamples(), kTransferStagingImageFlags,
- levelCount, layerCount));
+ srcImage->getActualFormatID(), srcImage->getSamples(), kTransferImageFlags, levelCount,
+ layerCount));
// Copy the src image wholly into the staging image
const VkImageAspectFlags aspectFlags = srcImage->getAspectFlags();
diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
index 80942b9..374e7ff 100644
--- a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
@@ -4455,6 +4455,11 @@
mRenderPass.destroy(device);
}
+void RenderPassHelper::release(ContextVk *contextVk)
+{
+ contextVk->addGarbage(&mRenderPass);
+}
+
const RenderPass &RenderPassHelper::getRenderPass() const
{
return mRenderPass;
@@ -5311,6 +5316,18 @@
mPayload.clear();
}
+void RenderPassCache::clear(ContextVk *contextVk)
+{
+ for (auto &outerIt : mPayload)
+ {
+ for (auto &innerIt : outerIt.second)
+ {
+ innerIt.second.release(contextVk);
+ }
+ }
+ mPayload.clear();
+}
+
angle::Result RenderPassCache::addRenderPass(ContextVk *contextVk,
const vk::RenderPassDesc &desc,
vk::RenderPass **renderPassOut)
diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.h b/src/libANGLE/renderer/vulkan/vk_cache_utils.h
index ccfc05c..7f919c1 100644
--- a/src/libANGLE/renderer/vulkan/vk_cache_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.h
@@ -1513,6 +1513,7 @@
RenderPassHelper &operator=(RenderPassHelper &&other);
void destroy(VkDevice device);
+ void release(ContextVk *contextVk);
const RenderPass &getRenderPass() const;
RenderPass &getRenderPass();
@@ -1735,6 +1736,7 @@
~RenderPassCache();
void destroy(RendererVk *rendererVk);
+ void clear(ContextVk *contextVk);
ANGLE_INLINE angle::Result getCompatibleRenderPass(ContextVk *contextVk,
const vk::RenderPassDesc &desc,
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
index c2d4916..db486a7 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
@@ -2752,7 +2752,7 @@
}
mInFlightBuffers.clear();
- contextVk->getShareGroupVk()->acquireResourceUseList(std::move(resourceUseList));
+ contextVk->getShareGroup()->acquireResourceUseList(std::move(resourceUseList));
}
void DynamicBuffer::destroy(RendererVk *renderer)
@@ -3534,7 +3534,7 @@
ASSERT(poolIndex < mPools.size() && mPools[poolIndex].freedCount < mPoolSize);
ResourceUseList resourceUseList;
mPools[poolIndex].retain(&resourceUseList);
- contextVk->getShareGroupVk()->acquireResourceUseList(std::move(resourceUseList));
+ contextVk->getShareGroup()->acquireResourceUseList(std::move(resourceUseList));
++mPools[poolIndex].freedCount;
}
@@ -5261,7 +5261,7 @@
{
if (contextVk && mImageSerial.valid())
{
- const ContextVkSet &shareContextSet = contextVk->getShareGroupVk()->getContexts();
+ const ContextVkSet &shareContextSet = contextVk->getShareGroup()->getContexts();
for (ContextVk *ctx : shareContextSet)
{
ctx->finalizeImageLayout(this);
diff --git a/src/libANGLE/renderer/vulkan/vk_utils.h b/src/libANGLE/renderer/vulkan/vk_utils.h
index c8f2755..44a89dc 100644
--- a/src/libANGLE/renderer/vulkan/vk_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_utils.h
@@ -1479,7 +1479,7 @@
// Use of resource after render pass
BufferWriteThenMap,
- BufferUseThenOutOfRPRead,
+ BufferWriteThenOutOfRPRead,
BufferUseThenOutOfRPWrite,
ImageUseThenOutOfRPRead,
ImageUseThenOutOfRPWrite,
diff --git a/src/tests/gl_tests/FramebufferFetchTest.cpp b/src/tests/gl_tests/FramebufferFetchTest.cpp
index 2cbc238..a81a0a0 100644
--- a/src/tests/gl_tests/FramebufferFetchTest.cpp
+++ b/src/tests/gl_tests/FramebufferFetchTest.cpp
@@ -2054,6 +2054,20 @@
ASSERT_GL_NO_ERROR();
}
+// Verify that calling glFramebufferFetchBarrierEXT without an open render pass is ok.
+TEST_P(FramebufferFetchES31, BarrierBeforeDraw)
+{
+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch") ||
+ !IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
+
+ ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
+
+ glFramebufferFetchBarrierEXT();
+ drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
+
+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+}
+
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferFetchES31);
ANGLE_INSTANTIATE_TEST_ES31(FramebufferFetchES31);
} // namespace angle