Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Protected Member Functions | Private Member Functions | List of all members
GrMtlBuffer Class Reference

#include <GrMtlBuffer.h>

Inheritance diagram for GrMtlBuffer:
GrGpuBuffer GrGpuResource GrBuffer GrIORef< GrGpuResource > SkNoncopyable

Public Member Functions

 ~GrMtlBuffer () override
 
id< MTLBuffer > mtlBuffer () const
 
- Public Member Functions inherited from GrGpuBuffer
GrAccessPattern accessPattern () const
 
size_t size () const final
 
void ref () const final
 
void unref () const final
 
void * map ()
 
void unmap ()
 
bool isMapped () const
 
bool isCpuBuffer () const final
 
bool clearToZero ()
 
bool updateData (const void *src, size_t offset, size_t size, bool preserve)
 
GrGpuBufferType intendedType () const
 
- Public Member Functions inherited from GrGpuResource
bool wasDestroyed () const
 
const GrDirectContextgetContext () const
 
GrDirectContextgetContext ()
 
size_t gpuMemorySize () const
 
UniqueID uniqueID () const
 
const skgpu::UniqueKeygetUniqueKey () const
 
std::string getLabel () const
 
void setLabel (std::string_view label)
 
CacheAccess cacheAccess ()
 
const CacheAccess cacheAccess () const
 
ProxyAccess proxyAccess ()
 
ResourcePriv resourcePriv ()
 
const ResourcePriv resourcePriv () const
 
virtual void dumpMemoryStatistics (SkTraceMemoryDump *traceMemoryDump) const
 
- Public Member Functions inherited from GrIORef< GrGpuResource >
bool unique () const
 
void ref () const
 
void unref () const
 
void refCommandBuffer () const
 
void unrefCommandBuffer () const
 
- Public Member Functions inherited from SkNoncopyable
 SkNoncopyable ()=default
 
 SkNoncopyable (SkNoncopyable &&)=default
 
SkNoncopyableoperator= (SkNoncopyable &&)=default
 
- Public Member Functions inherited from GrBuffer
 GrBuffer (const GrBuffer &)=delete
 
GrBufferoperator= (const GrBuffer &)=delete
 
virtual ~GrBuffer ()=default
 

Static Public Member Functions

static sk_sp< GrMtlBufferMake (GrMtlGpu *, size_t size, GrGpuBufferType intendedType, GrAccessPattern)
 
- Static Public Member Functions inherited from GrGpuBuffer
static void ComputeScratchKeyForDynamicBuffer (size_t size, GrGpuBufferType, skgpu::ScratchKey *)
 
- Static Public Member Functions inherited from GrGpuResource
static uint32_t CreateUniqueID ()
 

Protected Member Functions

 GrMtlBuffer (GrMtlGpu *, size_t size, GrGpuBufferType intendedType, GrAccessPattern, std::string_view label)
 
void onAbandon () override
 
void onRelease () override
 
- Protected Member Functions inherited from GrGpuBuffer
 GrGpuBuffer (GrGpu *, size_t sizeInBytes, GrGpuBufferType, GrAccessPattern, std::string_view label)
 
- Protected Member Functions inherited from GrGpuResource
void registerWithCache (skgpu::Budgeted)
 
void registerWithCacheWrapped (GrWrapCacheable)
 
 GrGpuResource (GrGpu *, std::string_view label)
 
virtual ~GrGpuResource ()
 
GrGpugetGpu () const
 
virtual void setMemoryBacking (SkTraceMemoryDump *, const SkString &) const
 
SkString getResourceName () const
 
void dumpMemoryStatisticsPriv (SkTraceMemoryDump *traceMemoryDump, const SkString &resourceName, const char *type, size_t size) const
 
- Protected Member Functions inherited from GrIORef< GrGpuResource >
 GrIORef ()
 
bool internalHasRef () const
 
bool internalHasNoCommandBufferUsages () const
 
void addInitialRef () const
 
- Protected Member Functions inherited from GrBuffer
 GrBuffer ()=default
 

Private Member Functions

void onMap (MapType) override
 
bool onClearToZero () override
 
void onUnmap (MapType) override
 
bool onUpdateData (const void *src, size_t offset, size_t size, bool preserve) override
 
void onSetLabel () override
 

Additional Inherited Members

- Public Types inherited from GrIORef< GrGpuResource >
enum  LastRemovedRef
 
- Protected Types inherited from GrGpuBuffer
enum class  MapType { kRead , kWriteDiscard }
 
- Protected Attributes inherited from GrGpuBuffer
void * fMapPtr
 

Detailed Description

Definition at line 19 of file GrMtlBuffer.h.

Constructor & Destructor Documentation

◆ ~GrMtlBuffer()

GrMtlBuffer::~GrMtlBuffer ( )
override

Definition at line 81 of file GrMtlBuffer.mm.

81 {
82 SkASSERT(!fMtlBuffer);
84}
#define SkASSERT(cond)
Definition SkAssert.h:116
void * fMapPtr

◆ GrMtlBuffer()

GrMtlBuffer::GrMtlBuffer ( GrMtlGpu gpu,
size_t  size,
GrGpuBufferType  intendedType,
GrAccessPattern  accessPattern,
std::string_view  label 
)
protected

Definition at line 49 of file GrMtlBuffer.mm.

51 : INHERITED(gpu, size, intendedType, accessPattern, label)
52 , fIsDynamic(accessPattern != kStatic_GrAccessPattern) {
53 NSUInteger options = 0;
54 if (@available(macOS 10.11, iOS 9.0, tvOS 9.0, *)) {
55 if (fIsDynamic) {
56#ifdef SK_BUILD_FOR_MAC
57 if (gpu->mtlCaps().isMac()) {
58 options |= MTLResourceStorageModeManaged;
59 } else {
60 options |= MTLResourceStorageModeShared;
61 }
62#else
63 options |= MTLResourceStorageModeShared;
64#endif
65 } else {
66 options |= MTLResourceStorageModePrivate;
67 }
68 }
69
71 fMtlBuffer = size == 0 ? nil :
72 [gpu->device() newBufferWithLength: size
74#ifdef SK_ENABLE_MTL_DEBUG_INFO
75 fMtlBuffer.label = kBufferTypeNames[(int)intendedType];
76#endif
78 VALIDATE();
79}
const char * options
#define VALIDATE()
@ kStatic_GrAccessPattern
static constexpr size_t SkAlignTo(size_t x, size_t alignment)
Definition SkAlign.h:33
Type::kYUV Type::kRGBA() int(0.7 *637)
size_t size() const final
Definition GrGpuBuffer.h:34
GrGpuBufferType intendedType() const
Definition GrGpuBuffer.h:99
GrAccessPattern accessPattern() const
Definition GrGpuBuffer.h:32
void registerWithCache(skgpu::Budgeted)
bool isMac() const
Definition GrMtlCaps.h:89
size_t getMinBufferAlignment() const
Definition GrMtlCaps.h:92
const GrMtlCaps & mtlCaps() const
Definition GrMtlGpu.h:47
id< MTLDevice > device() const
Definition GrMtlGpu.h:49

Member Function Documentation

◆ Make()

GR_NORETAIN_BEGIN sk_sp< GrMtlBuffer > GrMtlBuffer::Make ( GrMtlGpu gpu,
size_t  size,
GrGpuBufferType  intendedType,
GrAccessPattern  accessPattern 
)
static

Definition at line 38 of file GrMtlBuffer.mm.

41 {
42 return sk_sp<GrMtlBuffer>(new GrMtlBuffer(gpu,
43 size,
46 /*label=*/"MakeMtlBuffer"));
47}

◆ mtlBuffer()

id< MTLBuffer > GrMtlBuffer::mtlBuffer ( ) const
inline

Definition at line 28 of file GrMtlBuffer.h.

28{ return fMtlBuffer; }

◆ onAbandon()

void GrMtlBuffer::onAbandon ( )
overrideprotectedvirtual

Overridden to abandon any internal handles, ptrs, etc to backend API resources. This may be called when the underlying 3D context is no longer valid and so no backend API calls should be made.

Reimplemented from GrGpuResource.

Definition at line 135 of file GrMtlBuffer.mm.

135 {
136 fMtlBuffer = nil;
137 fMapPtr = nullptr;
138 VALIDATE();
140}
virtual void onAbandon()

◆ onClearToZero()

bool GrMtlBuffer::onClearToZero ( )
overrideprivatevirtual

Implements GrGpuBuffer.

Definition at line 186 of file GrMtlBuffer.mm.

186 {
187 SkASSERT(fMtlBuffer);
188 GrMtlCommandBuffer* cmdBuffer = this->mtlGpu()->commandBuffer();
189 id<MTLBlitCommandEncoder> GR_NORETAIN blitCmdEncoder = cmdBuffer->getBlitCommandEncoder();
190 if (!blitCmdEncoder) {
191 return false;
192 }
193
194 NSRange range{0, this->size()};
195 [blitCmdEncoder fillBuffer: fMtlBuffer range: range value: 0];
196
197 cmdBuffer->addGrBuffer(sk_ref_sp(this));
198
199 return true;
200}
sk_sp< T > sk_ref_sp(T *obj)
Definition SkRefCnt.h:381
void addGrBuffer(sk_sp< const GrBuffer > buffer)
id< MTLBlitCommandEncoder > getBlitCommandEncoder()
GrMtlCommandBuffer * commandBuffer()
Definition GrMtlGpu.mm:187
uint8_t value

◆ onMap()

void GrMtlBuffer::onMap ( MapType  )
overrideprivatevirtual

Implements GrGpuBuffer.

Definition at line 178 of file GrMtlBuffer.mm.

178 {
179 this->internalMap();
180}

◆ onRelease()

void GrMtlBuffer::onRelease ( )
overrideprotectedvirtual

Overridden to free GPU resources in the backend API.

Reimplemented from GrGpuResource.

Definition at line 142 of file GrMtlBuffer.mm.

142 {
143 if (!this->wasDestroyed()) {
144 VALIDATE();
145 fMtlBuffer = nil;
146 fMapPtr = nullptr;
147 VALIDATE();
148 }
150}
bool wasDestroyed() const
virtual void onRelease()

◆ onSetLabel()

void GrMtlBuffer::onSetLabel ( )
overrideprivatevirtual

Reimplemented from GrGpuBuffer.

Definition at line 215 of file GrMtlBuffer.mm.

215 {
216 SkASSERT(fMtlBuffer);
217 if (!this->getLabel().empty()) {
218 NSString* labelStr = @(this->getLabel().c_str());
219 fMtlBuffer.label = [@"_Skia_" stringByAppendingString:labelStr];
220 }
221}
std::string getLabel() const
EMSCRIPTEN_KEEPALIVE void empty()

◆ onUnmap()

void GrMtlBuffer::onUnmap ( MapType  type)
overrideprivatevirtual

Implements GrGpuBuffer.

Definition at line 182 of file GrMtlBuffer.mm.

182 {
183 this->internalUnmap(0, type == MapType::kWriteDiscard ? this-> size() : 0);
184}

◆ onUpdateData()

bool GrMtlBuffer::onUpdateData ( const void *  src,
size_t  offset,
size_t  size,
bool  preserve 
)
overrideprivatevirtual

Implements GrGpuBuffer.

Definition at line 86 of file GrMtlBuffer.mm.

86 {
87 if (fIsDynamic) {
88 this->internalMap();
89 if (!fMapPtr) {
90 return false;
91 }
92 memcpy(SkTAddOffset<void>(fMapPtr, offset), src, size);
93 this->internalUnmap(offset, size);
94 return true;
95 }
96 // Update via transfer buffer.
97
98 // We have to respect the transfer alignment. So we may transfer some extra bytes before and
99 // after the region to be updated.
100 size_t transferAlignment = this->getGpu()->caps()->transferFromBufferToBufferAlignment();
101 size_t r = offset%transferAlignment;
102 SkASSERT(!preserve || r == 0); // We can't push extra bytes when preserving.
103
104 offset -= r;
105 size_t transferSize = SkAlignTo(size + r, transferAlignment);
106
108 slice = this->mtlGpu()->stagingBufferManager()->allocateStagingBufferSlice(
109 transferSize, this->mtlGpu()->mtlCaps().getMinBufferAlignment());
110 if (!slice.fBuffer) {
111 return false;
112 }
113 memcpy(SkTAddOffset<void>(slice.fOffsetMapPtr, r), src, size);
114
115 GrMtlCommandBuffer* cmdBuffer = this->mtlGpu()->commandBuffer();
116 id<MTLBlitCommandEncoder> GR_NORETAIN blitCmdEncoder = cmdBuffer->getBlitCommandEncoder();
117 if (!blitCmdEncoder) {
118 return false;
119 }
120 GrMtlBuffer* mtlBuffer = static_cast<GrMtlBuffer*>(slice.fBuffer);
121 id<MTLBuffer> transferBuffer = mtlBuffer->mtlBuffer();
122 [blitCmdEncoder copyFromBuffer: transferBuffer
123 sourceOffset: slice.fOffset
124 toBuffer: fMtlBuffer
125 destinationOffset: offset
126 size: transferSize];
127 return true;
128}
size_t transferFromBufferToBufferAlignment() const
Definition GrCaps.h:244
GrGpu * getGpu() const
const GrCaps * caps() const
Definition GrGpu.h:73
id< MTLBuffer > mtlBuffer() const
Definition GrMtlBuffer.h:28
GrStagingBufferManager * stagingBufferManager() override
Definition GrMtlGpu.h:53
Slice allocateStagingBufferSlice(size_t size, size_t requiredAlignment=1)
Point offset

The documentation for this class was generated from the following files: