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