blob: ce9bce69df115bc51445e16bcd29eafff8ba5a9a [file]
/*
* Copyright 2022 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "src/gpu/graphite/vk/VulkanQueueManager.h"
#include "src/gpu/graphite/GpuWorkSubmission.h"
#include "src/gpu/graphite/vk/VulkanCommandBuffer.h"
#include "src/gpu/graphite/vk/VulkanResourceProvider.h"
#include "src/gpu/graphite/vk/VulkanSharedContext.h"
namespace skgpu::graphite {
VulkanQueueManager::VulkanQueueManager(VkQueue queue, const SharedContext* sharedContext)
: QueueManager(sharedContext)
, fQueue(queue) {
}
const VulkanSharedContext* VulkanQueueManager::vkSharedContext() const {
return static_cast<const VulkanSharedContext*>(fSharedContext);
}
std::unique_ptr<CommandBuffer> VulkanQueueManager::getNewCommandBuffer(
ResourceProvider* resourceProvider, Protected isProtected) {
VulkanResourceProvider* vkResourceProvider =
static_cast<VulkanResourceProvider*>(resourceProvider);
auto cmdBuffer = VulkanCommandBuffer::Make(this->vkSharedContext(),
vkResourceProvider,
isProtected);
return cmdBuffer;
}
class VulkanWorkSubmission final : public GpuWorkSubmission {
public:
VulkanWorkSubmission(std::unique_ptr<CommandBuffer> cmdBuffer,
std::unique_ptr<CommandBuffer> protectedCmdBuffer,
QueueManager* queueManager)
: GpuWorkSubmission(std::move(cmdBuffer), std::move(protectedCmdBuffer), queueManager) {}
VulkanWorkSubmission(std::unique_ptr<CommandBuffer> cmdBuffer, QueueManager* queueManager)
: GpuWorkSubmission(std::move(cmdBuffer), queueManager) {}
~VulkanWorkSubmission() override {}
private:
bool onIsFinished(const SharedContext*) override {
if (this->commandBuffer() &&
!static_cast<VulkanCommandBuffer*>(this->commandBuffer())->isFinished()) {
return false;
}
if (this->protectedCommandBuffer() &&
!static_cast<VulkanCommandBuffer*>(this->protectedCommandBuffer())->isFinished()) {
return false;
}
return true;
}
void onWaitUntilFinished(const SharedContext*) override {
if (this->commandBuffer()) {
static_cast<VulkanCommandBuffer*>(this->commandBuffer())->waitUntilFinished();
}
if (this->protectedCommandBuffer()) {
static_cast<VulkanCommandBuffer*>(this->protectedCommandBuffer())->waitUntilFinished();
}
}
};
QueueManager::OutstandingSubmission VulkanQueueManager::onSubmitToGpu(
const SubmitInfo& submitInfo) {
if (!fCurrentCommandBuffer && !fCurrentProtectedCommandBuffer) {
SKIA_LOG_W("VulkanQueueManager::onSubmitToGpu - no command buffers to submit");
return nullptr;
}
auto onFailure = [this]() {
fCurrentCommandBuffer.reset();
fCurrentProtectedCommandBuffer.reset();
};
if (fCurrentCommandBuffer) {
VulkanCommandBuffer* vkCmdBuffer =
static_cast<VulkanCommandBuffer*>(fCurrentCommandBuffer.get());
if (!vkCmdBuffer->submit(fQueue, submitInfo,
/*includeFence=*/!fCurrentProtectedCommandBuffer)) {
SKIA_LOG_E("VulkanQueueManager::onSubmitToGpu - unprotected submission failed!");
onFailure();
return nullptr;
}
}
if (fCurrentProtectedCommandBuffer) {
VulkanCommandBuffer* vkCmdBuffer =
static_cast<VulkanCommandBuffer*>(fCurrentProtectedCommandBuffer.get());
if (!vkCmdBuffer->submit(fQueue, submitInfo, /*includeFence=*/true)) {
SKIA_LOG_E("VulkanQueueManager::onSubmitToGpu - protected submission failed!");
onFailure();
return nullptr;
}
}
return std::make_unique<VulkanWorkSubmission>(std::move(fCurrentCommandBuffer),
std::move(fCurrentProtectedCommandBuffer),
this);
}
} // namespace skgpu::graphite