1*c8dee2aaSAndroid Build Coastguard Worker/* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google Inc. 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/MtlBuffer.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker#include "include/private/base/SkAlign.h" 11*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/mtl/MtlSharedContext.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Workernamespace skgpu::graphite { 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Workersk_sp<Buffer> MtlBuffer::Make(const MtlSharedContext* sharedContext, 16*c8dee2aaSAndroid Build Coastguard Worker size_t size, 17*c8dee2aaSAndroid Build Coastguard Worker BufferType type, 18*c8dee2aaSAndroid Build Coastguard Worker AccessPattern accessPattern) { 19*c8dee2aaSAndroid Build Coastguard Worker if (size <= 0) { 20*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 21*c8dee2aaSAndroid Build Coastguard Worker } 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker NSUInteger options = 0; 24*c8dee2aaSAndroid Build Coastguard Worker if (@available(macOS 10.11, iOS 9.0, tvOS 9.0, *)) { 25*c8dee2aaSAndroid Build Coastguard Worker if (accessPattern == AccessPattern::kHostVisible) { 26*c8dee2aaSAndroid Build Coastguard Worker#ifdef SK_BUILD_FOR_MAC 27*c8dee2aaSAndroid Build Coastguard Worker const MtlCaps& mtlCaps = sharedContext->mtlCaps(); 28*c8dee2aaSAndroid Build Coastguard Worker if (mtlCaps.isMac()) { 29*c8dee2aaSAndroid Build Coastguard Worker options |= MTLResourceStorageModeManaged; 30*c8dee2aaSAndroid Build Coastguard Worker } else { 31*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(mtlCaps.isApple()); 32*c8dee2aaSAndroid Build Coastguard Worker options |= MTLResourceStorageModeShared; 33*c8dee2aaSAndroid Build Coastguard Worker } 34*c8dee2aaSAndroid Build Coastguard Worker#else 35*c8dee2aaSAndroid Build Coastguard Worker options |= MTLResourceStorageModeShared; 36*c8dee2aaSAndroid Build Coastguard Worker#endif 37*c8dee2aaSAndroid Build Coastguard Worker } else { 38*c8dee2aaSAndroid Build Coastguard Worker options |= MTLResourceStorageModePrivate; 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker sk_cfp<id<MTLBuffer>> buffer([sharedContext->device() newBufferWithLength:size 43*c8dee2aaSAndroid Build Coastguard Worker options:options]); 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<Buffer>(new MtlBuffer(sharedContext, size, std::move(buffer))); 46*c8dee2aaSAndroid Build Coastguard Worker} 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard WorkerMtlBuffer::MtlBuffer(const MtlSharedContext* sharedContext, 49*c8dee2aaSAndroid Build Coastguard Worker size_t size, 50*c8dee2aaSAndroid Build Coastguard Worker sk_cfp<id<MTLBuffer>> buffer) 51*c8dee2aaSAndroid Build Coastguard Worker : Buffer(sharedContext, 52*c8dee2aaSAndroid Build Coastguard Worker size, 53*c8dee2aaSAndroid Build Coastguard Worker Protected::kNo) // Metal doesn't support protected memory 54*c8dee2aaSAndroid Build Coastguard Worker , fBuffer(std::move(buffer)) {} 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Workervoid MtlBuffer::onMap() { 57*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fBuffer); 58*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!this->isMapped()); 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker if ((*fBuffer).storageMode == MTLStorageModePrivate) { 61*c8dee2aaSAndroid Build Coastguard Worker return; 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker fMapPtr = static_cast<char*>((*fBuffer).contents); 65*c8dee2aaSAndroid Build Coastguard Worker} 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Workervoid MtlBuffer::onUnmap() { 68*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fBuffer); 69*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->isMapped()); 70*c8dee2aaSAndroid Build Coastguard Worker#ifdef SK_BUILD_FOR_MAC 71*c8dee2aaSAndroid Build Coastguard Worker if ((*fBuffer).storageMode == MTLStorageModeManaged) { 72*c8dee2aaSAndroid Build Coastguard Worker [*fBuffer didModifyRange: NSMakeRange(0, this->size())]; 73*c8dee2aaSAndroid Build Coastguard Worker } 74*c8dee2aaSAndroid Build Coastguard Worker#endif 75*c8dee2aaSAndroid Build Coastguard Worker fMapPtr = nullptr; 76*c8dee2aaSAndroid Build Coastguard Worker} 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Workervoid MtlBuffer::freeGpuData() { 79*c8dee2aaSAndroid Build Coastguard Worker fBuffer.reset(); 80*c8dee2aaSAndroid Build Coastguard Worker} 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Workervoid MtlBuffer::setBackendLabel(char const* label) { 83*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(label); 84*c8dee2aaSAndroid Build Coastguard Worker#ifdef SK_ENABLE_MTL_DEBUG_INFO 85*c8dee2aaSAndroid Build Coastguard Worker NSString* labelStr = @(label); 86*c8dee2aaSAndroid Build Coastguard Worker this->mtlBuffer().label = labelStr; 87*c8dee2aaSAndroid Build Coastguard Worker#endif 88*c8dee2aaSAndroid Build Coastguard Worker} 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker} // namespace skgpu::graphite 91