Hash :
c75bd915
Author :
Date :
2024-12-10T23:01:44
Vulkan: Remove asyncCommandQueue It's been years and it never showed an advantage. In the meantime, performance without this feature seems close to native drivers (i.e. the feature has lost its appeal) and it's frequently a source of complication and bugs. Bug: angleproject:42262955 Bug: angleproject:42265241 Bug: angleproject:42265934 Bug: angleproject:42265368 Bug: angleproject:42265738 Bug: angleproject:42266015 Bug: angleproject:377503738 Bug: angleproject:42265678 Bug: angleproject:173004081 Change-Id: Id8d7588fdbc397c28c1dd18aafa1f64cbe77806f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6084760 Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Reviewed-by: mohan maiya <m.maiya@samsung.com> Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
//
// Copyright 2023 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// SecondaryCommandPool:
// A class for allocating Command Buffers for VulkanSecondaryCommandBuffer.
//
#ifndef LIBANGLE_RENDERER_VULKAN_SECONDARYCOMMANDPOOL_H_
#define LIBANGLE_RENDERER_VULKAN_SECONDARYCOMMANDPOOL_H_
#include "common/FixedQueue.h"
#include "common/SimpleMutex.h"
#include "libANGLE/renderer/vulkan/vk_command_buffer_utils.h"
#include "libANGLE/renderer/vulkan/vk_wrapper.h"
namespace rx
{
namespace vk
{
class Context;
class VulkanSecondaryCommandBuffer;
// VkCommandPool must be externally synchronized when its Command Buffers are: allocated, freed,
// reset, or recorded. This class ensures that Command Buffers are freed from the thread that
// recording commands (Context thread).
class SecondaryCommandPool final : angle::NonCopyable
{
public:
SecondaryCommandPool();
~SecondaryCommandPool();
angle::Result init(Context *context, uint32_t queueFamilyIndex, ProtectionType protectionType);
void destroy(VkDevice device);
bool valid() const { return mCommandPool.valid(); }
// Call only from the Context thread that owns the SecondaryCommandPool instance.
angle::Result allocate(Context *context, VulkanSecondaryCommandBuffer *buffer);
// Single threaded - use external synchronization.
void collect(VulkanSecondaryCommandBuffer *buffer);
private:
static constexpr size_t kFixedQueueLimit = 100u;
// Context thread access members.
void freeCollectedBuffers(VkDevice device);
// Use single pool for now.
CommandPool mCommandPool;
// Other thread access members.
// Fast lock free queue for processing buffers while new may be added from the other thread.
angle::FixedQueue<VkCommandBuffer> mCollectedBuffers;
// Overflow vector to use in cases when FixedQueue is filled.
std::vector<VkCommandBuffer> mCollectedBuffersOverflow;
angle::SimpleMutex mOverflowMutex;
std::atomic<bool> mHasOverflow;
};
} // namespace vk
} // namespace rx
#endif // LIBANGLE_RENDERER_VULKAN_SECONDARYCOMMANDPOOL_H_