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