• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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