xref: /aosp_15_r20/external/skia/src/gpu/graphite/vk/VulkanQueueManager.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/vk/VulkanQueueManager.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/GpuWorkSubmission.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/vk/VulkanCommandBuffer.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/vk/VulkanResourceProvider.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/vk/VulkanSharedContext.h"
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
16*c8dee2aaSAndroid Build Coastguard Worker 
VulkanQueueManager(VkQueue queue,const SharedContext * sharedContext)17*c8dee2aaSAndroid Build Coastguard Worker VulkanQueueManager::VulkanQueueManager(VkQueue queue, const SharedContext* sharedContext)
18*c8dee2aaSAndroid Build Coastguard Worker         : QueueManager(sharedContext)
19*c8dee2aaSAndroid Build Coastguard Worker         , fQueue(queue) {
20*c8dee2aaSAndroid Build Coastguard Worker }
21*c8dee2aaSAndroid Build Coastguard Worker 
vkSharedContext() const22*c8dee2aaSAndroid Build Coastguard Worker const VulkanSharedContext* VulkanQueueManager::vkSharedContext() const {
23*c8dee2aaSAndroid Build Coastguard Worker     return static_cast<const VulkanSharedContext*>(fSharedContext);
24*c8dee2aaSAndroid Build Coastguard Worker }
25*c8dee2aaSAndroid Build Coastguard Worker 
getNewCommandBuffer(ResourceProvider * resourceProvider,Protected isProtected)26*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<CommandBuffer> VulkanQueueManager::getNewCommandBuffer(
27*c8dee2aaSAndroid Build Coastguard Worker         ResourceProvider* resourceProvider, Protected isProtected) {
28*c8dee2aaSAndroid Build Coastguard Worker     VulkanResourceProvider* vkResourceProvider =
29*c8dee2aaSAndroid Build Coastguard Worker             static_cast<VulkanResourceProvider*>(resourceProvider);
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker     auto cmdBuffer = VulkanCommandBuffer::Make(this->vkSharedContext(),
32*c8dee2aaSAndroid Build Coastguard Worker                                                vkResourceProvider,
33*c8dee2aaSAndroid Build Coastguard Worker                                                isProtected);
34*c8dee2aaSAndroid Build Coastguard Worker     return cmdBuffer;
35*c8dee2aaSAndroid Build Coastguard Worker }
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker class VulkanWorkSubmission final : public GpuWorkSubmission {
38*c8dee2aaSAndroid Build Coastguard Worker public:
VulkanWorkSubmission(std::unique_ptr<CommandBuffer> cmdBuffer,QueueManager * queueManager)39*c8dee2aaSAndroid Build Coastguard Worker     VulkanWorkSubmission(std::unique_ptr<CommandBuffer> cmdBuffer, QueueManager* queueManager)
40*c8dee2aaSAndroid Build Coastguard Worker         : GpuWorkSubmission(std::move(cmdBuffer), queueManager) {}
~VulkanWorkSubmission()41*c8dee2aaSAndroid Build Coastguard Worker     ~VulkanWorkSubmission() override {}
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker private:
onIsFinished(const SharedContext *)44*c8dee2aaSAndroid Build Coastguard Worker     bool onIsFinished(const SharedContext*) override {
45*c8dee2aaSAndroid Build Coastguard Worker         return static_cast<VulkanCommandBuffer*>(this->commandBuffer())->isFinished();
46*c8dee2aaSAndroid Build Coastguard Worker     }
onWaitUntilFinished(const SharedContext *)47*c8dee2aaSAndroid Build Coastguard Worker     void onWaitUntilFinished(const SharedContext*) override {
48*c8dee2aaSAndroid Build Coastguard Worker         return static_cast<VulkanCommandBuffer*>(this->commandBuffer())->waitUntilFinished();
49*c8dee2aaSAndroid Build Coastguard Worker     }
50*c8dee2aaSAndroid Build Coastguard Worker };
51*c8dee2aaSAndroid Build Coastguard Worker 
onSubmitToGpu()52*c8dee2aaSAndroid Build Coastguard Worker QueueManager::OutstandingSubmission VulkanQueueManager::onSubmitToGpu() {
53*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fCurrentCommandBuffer);
54*c8dee2aaSAndroid Build Coastguard Worker     VulkanCommandBuffer* vkCmdBuffer =
55*c8dee2aaSAndroid Build Coastguard Worker             static_cast<VulkanCommandBuffer*>(fCurrentCommandBuffer.get());
56*c8dee2aaSAndroid Build Coastguard Worker     if (!vkCmdBuffer->submit(fQueue)) {
57*c8dee2aaSAndroid Build Coastguard Worker         fCurrentCommandBuffer->callFinishedProcs(/*success=*/false);
58*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
59*c8dee2aaSAndroid Build Coastguard Worker     }
60*c8dee2aaSAndroid Build Coastguard Worker 
61*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<GpuWorkSubmission> submission(
62*c8dee2aaSAndroid Build Coastguard Worker             new VulkanWorkSubmission(std::move(fCurrentCommandBuffer), this));
63*c8dee2aaSAndroid Build Coastguard Worker     return submission;
64*c8dee2aaSAndroid Build Coastguard Worker }
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite
67