1/* 2 * Copyright 2021 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "src/gpu/graphite/mtl/MtlBuffer.h" 9 10#include "include/private/base/SkAlign.h" 11#include "src/gpu/graphite/mtl/MtlSharedContext.h" 12 13namespace skgpu::graphite { 14 15sk_sp<Buffer> MtlBuffer::Make(const MtlSharedContext* sharedContext, 16 size_t size, 17 BufferType type, 18 AccessPattern accessPattern) { 19 if (size <= 0) { 20 return nullptr; 21 } 22 23 NSUInteger options = 0; 24 if (@available(macOS 10.11, iOS 9.0, tvOS 9.0, *)) { 25 if (accessPattern == AccessPattern::kHostVisible) { 26#ifdef SK_BUILD_FOR_MAC 27 const MtlCaps& mtlCaps = sharedContext->mtlCaps(); 28 if (mtlCaps.isMac()) { 29 options |= MTLResourceStorageModeManaged; 30 } else { 31 SkASSERT(mtlCaps.isApple()); 32 options |= MTLResourceStorageModeShared; 33 } 34#else 35 options |= MTLResourceStorageModeShared; 36#endif 37 } else { 38 options |= MTLResourceStorageModePrivate; 39 } 40 } 41 42 sk_cfp<id<MTLBuffer>> buffer([sharedContext->device() newBufferWithLength:size 43 options:options]); 44 45 return sk_sp<Buffer>(new MtlBuffer(sharedContext, size, std::move(buffer))); 46} 47 48MtlBuffer::MtlBuffer(const MtlSharedContext* sharedContext, 49 size_t size, 50 sk_cfp<id<MTLBuffer>> buffer) 51 : Buffer(sharedContext, size), fBuffer(std::move(buffer)) {} 52 53void MtlBuffer::onMap() { 54 SkASSERT(fBuffer); 55 SkASSERT(!this->isMapped()); 56 57 if ((*fBuffer).storageMode == MTLStorageModePrivate) { 58 return; 59 } 60 61 fMapPtr = static_cast<char*>((*fBuffer).contents); 62} 63 64void MtlBuffer::onUnmap() { 65 SkASSERT(fBuffer); 66 SkASSERT(this->isMapped()); 67#ifdef SK_BUILD_FOR_MAC 68 if ((*fBuffer).storageMode == MTLStorageModeManaged) { 69 [*fBuffer didModifyRange: NSMakeRange(0, this->size())]; 70 } 71#endif 72 fMapPtr = nullptr; 73} 74 75void MtlBuffer::freeGpuData() { 76 fBuffer.reset(); 77} 78 79void MtlBuffer::setBackendLabel(char const* label) { 80 SkASSERT(label); 81#ifdef SK_ENABLE_MTL_DEBUG_INFO 82 NSString* labelStr = @(label); 83 this->mtlBuffer().label = labelStr; 84#endif 85} 86 87} // namespace skgpu::graphite 88