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/mtl/MtlQueueManager.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/mtl/MtlCommandBuffer.h" 12*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/mtl/MtlResourceProvider.h" 13*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/mtl/MtlSharedContext.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Workernamespace skgpu::graphite { 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard WorkerMtlQueueManager::MtlQueueManager(sk_cfp<id<MTLCommandQueue>> queue, 18*c8dee2aaSAndroid Build Coastguard Worker const SharedContext* sharedContext) 19*c8dee2aaSAndroid Build Coastguard Worker : QueueManager(sharedContext) 20*c8dee2aaSAndroid Build Coastguard Worker , fQueue(std::move(queue)) 21*c8dee2aaSAndroid Build Coastguard Worker{ 22*c8dee2aaSAndroid Build Coastguard Worker} 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Workerconst MtlSharedContext* MtlQueueManager::mtlSharedContext() const { 25*c8dee2aaSAndroid Build Coastguard Worker return static_cast<const MtlSharedContext*>(fSharedContext); 26*c8dee2aaSAndroid Build Coastguard Worker} 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Workerstd::unique_ptr<CommandBuffer> MtlQueueManager::getNewCommandBuffer( 29*c8dee2aaSAndroid Build Coastguard Worker ResourceProvider* resourceProvider, Protected) { 30*c8dee2aaSAndroid Build Coastguard Worker MtlResourceProvider* mtlResourceProvider = static_cast<MtlResourceProvider*>(resourceProvider); 31*c8dee2aaSAndroid Build Coastguard Worker auto cmdBuffer = MtlCommandBuffer::Make(fQueue.get(), 32*c8dee2aaSAndroid Build Coastguard Worker this->mtlSharedContext(), 33*c8dee2aaSAndroid Build Coastguard Worker mtlResourceProvider); 34*c8dee2aaSAndroid Build Coastguard Worker return cmdBuffer; 35*c8dee2aaSAndroid Build Coastguard Worker} 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Workerclass MtlWorkSubmission final : public GpuWorkSubmission { 38*c8dee2aaSAndroid Build Coastguard Workerpublic: 39*c8dee2aaSAndroid Build Coastguard Worker MtlWorkSubmission(std::unique_ptr<CommandBuffer> cmdBuffer, QueueManager* queueManager) 40*c8dee2aaSAndroid Build Coastguard Worker : GpuWorkSubmission(std::move(cmdBuffer), queueManager) {} 41*c8dee2aaSAndroid Build Coastguard Worker ~MtlWorkSubmission() override {} 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Workerprivate: 44*c8dee2aaSAndroid Build Coastguard Worker bool onIsFinished(const SharedContext*) override { 45*c8dee2aaSAndroid Build Coastguard Worker return static_cast<MtlCommandBuffer*>(this->commandBuffer())->isFinished(); 46*c8dee2aaSAndroid Build Coastguard Worker } 47*c8dee2aaSAndroid Build Coastguard Worker void onWaitUntilFinished(const SharedContext*) override { 48*c8dee2aaSAndroid Build Coastguard Worker return static_cast<MtlCommandBuffer*>(this->commandBuffer())->waitUntilFinished(); 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker}; 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard WorkerQueueManager::OutstandingSubmission MtlQueueManager::onSubmitToGpu() { 53*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fCurrentCommandBuffer); 54*c8dee2aaSAndroid Build Coastguard Worker MtlCommandBuffer* mtlCmdBuffer = static_cast<MtlCommandBuffer*>(fCurrentCommandBuffer.get()); 55*c8dee2aaSAndroid Build Coastguard Worker if (!mtlCmdBuffer->commit()) { 56*c8dee2aaSAndroid Build Coastguard Worker fCurrentCommandBuffer->callFinishedProcs(/*success=*/false); 57*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 58*c8dee2aaSAndroid Build Coastguard Worker } 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GpuWorkSubmission> submission( 61*c8dee2aaSAndroid Build Coastguard Worker new MtlWorkSubmission(std::move(fCurrentCommandBuffer), this)); 62*c8dee2aaSAndroid Build Coastguard Worker return submission; 63*c8dee2aaSAndroid Build Coastguard Worker} 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker#if defined(GPU_TEST_UTILS) 66*c8dee2aaSAndroid Build Coastguard Workervoid MtlQueueManager::startCapture() { 67*c8dee2aaSAndroid Build Coastguard Worker if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) { 68*c8dee2aaSAndroid Build Coastguard Worker // TODO: add newer Metal interface as well 69*c8dee2aaSAndroid Build Coastguard Worker MTLCaptureManager* captureManager = [MTLCaptureManager sharedCaptureManager]; 70*c8dee2aaSAndroid Build Coastguard Worker if (captureManager.isCapturing) { 71*c8dee2aaSAndroid Build Coastguard Worker return; 72*c8dee2aaSAndroid Build Coastguard Worker } 73*c8dee2aaSAndroid Build Coastguard Worker if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)) { 74*c8dee2aaSAndroid Build Coastguard Worker MTLCaptureDescriptor* captureDescriptor = [[MTLCaptureDescriptor alloc] init]; 75*c8dee2aaSAndroid Build Coastguard Worker captureDescriptor.captureObject = fQueue.get(); 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker NSError *error; 78*c8dee2aaSAndroid Build Coastguard Worker if (![captureManager startCaptureWithDescriptor: captureDescriptor error:&error]) 79*c8dee2aaSAndroid Build Coastguard Worker { 80*c8dee2aaSAndroid Build Coastguard Worker NSLog(@"Failed to start capture, error %@", error); 81*c8dee2aaSAndroid Build Coastguard Worker } 82*c8dee2aaSAndroid Build Coastguard Worker } else { 83*c8dee2aaSAndroid Build Coastguard Worker [captureManager startCaptureWithCommandQueue: fQueue.get()]; 84*c8dee2aaSAndroid Build Coastguard Worker } 85*c8dee2aaSAndroid Build Coastguard Worker } 86*c8dee2aaSAndroid Build Coastguard Worker} 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Workervoid MtlQueueManager::stopCapture() { 89*c8dee2aaSAndroid Build Coastguard Worker if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) { 90*c8dee2aaSAndroid Build Coastguard Worker MTLCaptureManager* captureManager = [MTLCaptureManager sharedCaptureManager]; 91*c8dee2aaSAndroid Build Coastguard Worker if (captureManager.isCapturing) { 92*c8dee2aaSAndroid Build Coastguard Worker [captureManager stopCapture]; 93*c8dee2aaSAndroid Build Coastguard Worker } 94*c8dee2aaSAndroid Build Coastguard Worker } 95*c8dee2aaSAndroid Build Coastguard Worker} 96*c8dee2aaSAndroid Build Coastguard Worker#endif 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker} // namespace skgpu::graphite 99