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

#include <GrVkBuffer.h>

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

Public Member Functions

VkBuffer vkBuffer () const
 
void addMemoryBarrier (VkAccessFlags srcAccessMask, VkAccessFlags dstAccesMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, bool byRegion) const
 
const VkDescriptorSet * uniformDescriptorSet () 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< GrVkBufferMake (GrVkGpu *gpu, size_t size, GrGpuBufferType bufferType, GrAccessPattern accessPattern)
 
- 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 ()
 

Private Member Functions

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

Additional Inherited Members

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

Detailed Description

Definition at line 17 of file GrVkBuffer.h.

Member Function Documentation

◆ addMemoryBarrier()

void GrVkBuffer::addMemoryBarrier ( VkAccessFlags  srcAccessMask,
VkAccessFlags  dstAccesMask,
VkPipelineStageFlags  srcStageMask,
VkPipelineStageFlags  dstStageMask,
bool  byRegion 
) const

Definition at line 270 of file GrVkBuffer.cpp.

274 {
275 VkBufferMemoryBarrier bufferMemoryBarrier = {
277 nullptr, // pNext
278 srcAccessMask, // srcAccessMask
279 dstAccesMask, // dstAccessMask
280 VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
281 VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex
282 fBuffer, // buffer
283 0, // offset
284 this->size(), // size
285 };
286
287 // TODO: restrict to area of buffer we're interested in
288 this->getVkGpu()->addBufferMemoryBarrier(srcStageMask, dstStageMask, byRegion,
289 &bufferMemoryBarrier);
290}
size_t size() const final
Definition GrGpuBuffer.h:34
void addBufferMemoryBarrier(const GrManagedResource *, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, bool byRegion, VkBufferMemoryBarrier *barrier) const
Definition GrVkGpu.cpp:2143
#define VK_QUEUE_FAMILY_IGNORED
@ VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER

◆ Make()

sk_sp< GrVkBuffer > GrVkBuffer::Make ( GrVkGpu gpu,
size_t  size,
GrGpuBufferType  bufferType,
GrAccessPattern  accessPattern 
)
static

Definition at line 69 of file GrVkBuffer.cpp.

72 {
73 VkBuffer buffer;
75
76 // The only time we don't require mappable buffers is when we have a static access pattern and
77 // we're on a device where gpu only memory has faster reads on the gpu than memory that is also
78 // mappable on the cpu. Protected memory always uses mappable buffers.
79 bool requiresMappable = gpu->protectedContext() ||
83
85 BufferUsage allocUsage;
86
87 // create the buffer object
88 VkBufferCreateInfo bufInfo;
89 memset(&bufInfo, 0, sizeof(VkBufferCreateInfo));
91 bufInfo.flags = 0;
92 bufInfo.size = size;
93 // To support SkMesh buffer updates we make Vertex and Index buffers capable of being transfer
94 // dsts.
95 switch (bufferType) {
98 allocUsage = requiresMappable ? BufferUsage::kCpuWritesGpuReads : BufferUsage::kGpuOnly;
99 break;
102 allocUsage = requiresMappable ? BufferUsage::kCpuWritesGpuReads : BufferUsage::kGpuOnly;
103 break;
106 allocUsage = requiresMappable ? BufferUsage::kCpuWritesGpuReads : BufferUsage::kGpuOnly;
107 break;
110 allocUsage = BufferUsage::kCpuWritesGpuReads;
111 break;
114 allocUsage = BufferUsage::kTransfersFromCpuToGpu;
115 break;
118 allocUsage = BufferUsage::kTransfersFromGpuToCpu;
119 break;
120 }
121 // We may not always get a mappable buffer for non dynamic access buffers. Thus we set the
122 // transfer dst usage bit in case we need to do a copy to write data.
123 // TODO: It doesn't really hurt setting this extra usage flag, but maybe we can narrow the scope
124 // of buffers we set it on more than just not dynamic.
125 if (!requiresMappable) {
127 }
128
130 bufInfo.queueFamilyIndexCount = 0;
131 bufInfo.pQueueFamilyIndices = nullptr;
132
133 VkResult err;
134 err = VK_CALL(gpu, CreateBuffer(gpu->device(), &bufInfo, nullptr, &buffer));
135 if (err) {
136 return nullptr;
137 }
138
139 bool shouldPersistentlyMapCpuToGpu = gpu->vkCaps().shouldPersistentlyMapCpuToGpuBuffers();
140 auto checkResult = [gpu, allocUsage, shouldPersistentlyMapCpuToGpu](VkResult result) {
141 GR_VK_LOG_IF_NOT_SUCCESS(gpu, result, "skgpu::VulkanMemory::AllocBufferMemory "
142 "(allocUsage:%d, shouldPersistentlyMapCpuToGpu:%d)",
143 (int)allocUsage, (int)shouldPersistentlyMapCpuToGpu);
144 return gpu->checkVkResult(result);
145 };
146 auto allocator = gpu->memoryAllocator();
148 buffer,
149 allocUsage,
150 shouldPersistentlyMapCpuToGpu,
151 checkResult,
152 &alloc)) {
153 VK_CALL(gpu, DestroyBuffer(gpu->device(), buffer, nullptr));
154 return nullptr;
155 }
156
157 // Bind buffer
158 GR_VK_CALL_RESULT(gpu, err, BindBufferMemory(gpu->device(),
159 buffer,
160 alloc.fMemory,
161 alloc.fOffset));
162 if (err) {
164 VK_CALL(gpu, DestroyBuffer(gpu->device(), buffer, nullptr));
165 return nullptr;
166 }
167
168 // If this is a uniform buffer we must setup a descriptor set
169 const GrVkDescriptorSet* uniformDescSet = nullptr;
170 if (bufferType == GrGpuBufferType::kUniform) {
171 uniformDescSet = make_uniform_desc_set(gpu, buffer, size);
172 if (!uniformDescSet) {
173 VK_CALL(gpu, DestroyBuffer(gpu->device(), buffer, nullptr));
175 return nullptr;
176 }
177 }
178
179 return sk_sp<GrVkBuffer>(new GrVkBuffer(
180 gpu, size, bufferType, accessPattern, buffer, alloc, uniformDescSet,
181 /*label=*/"MakeVkBuffer"));
182}
@ kDynamic_GrAccessPattern
@ kStream_GrAccessPattern
#define VK_CALL(GPU, X)
static const GrVkDescriptorSet * make_uniform_desc_set(GrVkGpu *gpu, VkBuffer buffer, size_t size)
#define GR_VK_LOG_IF_NOT_SUCCESS(GPU, RESULT, X,...)
Definition GrVkUtil.h:28
#define GR_VK_CALL_RESULT(GPU, RESULT, X)
Definition GrVkUtil.h:35
GrAccessPattern accessPattern() const
Definition GrGpuBuffer.h:32
bool shouldPersistentlyMapCpuToGpuBuffers() const
Definition GrVkCaps.h:198
bool gpuOnlyBuffersMorePerformant() const
Definition GrVkCaps.h:193
const GrVkCaps & vkCaps() const
Definition GrVkGpu.h:61
VkDevice device() const
Definition GrVkGpu.h:71
bool protectedContext() const
Definition GrVkGpu.h:81
bool checkVkResult(VkResult)
Definition GrVkGpu.cpp:2675
skgpu::VulkanMemoryAllocator * memoryAllocator() const
Definition GrVkGpu.h:68
static const uint8_t buffer[]
GAsyncResult * result
void FreeBufferMemory(VulkanMemoryAllocator *, const VulkanAlloc &alloc)
bool AllocBufferMemory(VulkanMemoryAllocator *, VkBuffer buffer, skgpu::VulkanMemoryAllocator::BufferUsage, bool shouldPersistentlyMapCpuToGpu, const std::function< CheckResult > &, VulkanAlloc *alloc)
VulkanMemoryAllocator::BufferUsage BufferUsage
VkDeviceSize size
uint32_t queueFamilyIndexCount
const uint32_t * pQueueFamilyIndices
VkBufferCreateFlags flags
VkStructureType sType
VkBufferUsageFlags usage
VkSharingMode sharingMode
VkDeviceMemory fMemory
Definition VulkanTypes.h:38
VkDeviceSize fOffset
Definition VulkanTypes.h:39
@ VK_SHARING_MODE_EXCLUSIVE
@ VK_BUFFER_USAGE_TRANSFER_DST_BIT
@ VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT
@ VK_BUFFER_USAGE_INDEX_BUFFER_BIT
@ VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
@ VK_BUFFER_USAGE_VERTEX_BUFFER_BIT
@ VK_BUFFER_USAGE_TRANSFER_SRC_BIT
VkResult
@ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO

◆ onAbandon()

void GrVkBuffer::onAbandon ( )
overrideprivatevirtual

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 322 of file GrVkBuffer.cpp.

322 {
323 this->vkRelease();
325}
virtual void onAbandon()

◆ onClearToZero()

bool GrVkBuffer::onClearToZero ( )
overrideprivatevirtual

Implements GrGpuBuffer.

Definition at line 335 of file GrVkBuffer.cpp.

335{ return this->getVkGpu()->zeroBuffer(sk_ref_sp(this)); }
sk_sp< T > sk_ref_sp(T *obj)
Definition SkRefCnt.h:381
bool zeroBuffer(sk_sp< GrGpuBuffer >)
Definition GrVkGpu.cpp:1265

◆ onMap()

void GrVkBuffer::onMap ( MapType  type)
overrideprivatevirtual

Implements GrGpuBuffer.

Definition at line 327 of file GrVkBuffer.cpp.

327 {
328 this->vkMap(0, type == MapType::kRead ? this->size() : 0);
329}

◆ onRelease()

void GrVkBuffer::onRelease ( )
overrideprivatevirtual

Overridden to free GPU resources in the backend API.

Reimplemented from GrGpuResource.

Definition at line 317 of file GrVkBuffer.cpp.

317 {
318 this->vkRelease();
320}
virtual void onRelease()

◆ onUnmap()

void GrVkBuffer::onUnmap ( MapType  type)
overrideprivatevirtual

Implements GrGpuBuffer.

Definition at line 331 of file GrVkBuffer.cpp.

331 {
332 this->vkUnmap(0, type == MapType::kWriteDiscard ? this->size() : 0);
333}

◆ onUpdateData()

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

Implements GrGpuBuffer.

Definition at line 337 of file GrVkBuffer.cpp.

337 {
338 if (this->isVkMappable()) {
339 // We won't be reading the mapped memory so pass an empty range.
340 this->vkMap(0, 0);
341 if (!fMapPtr) {
342 return false;
343 }
344 memcpy(SkTAddOffset<void>(fMapPtr, offset), src, size);
345 // We only need to flush the updated portion so pass the true range here.
346 this->vkUnmap(offset, size);
347 fMapPtr = nullptr;
348 } else {
349 this->copyCpuDataToGpuBuffer(src, offset, size);
350 }
351 return true;
352}
void * fMapPtr
Point offset

◆ uniformDescriptorSet()

const VkDescriptorSet * GrVkBuffer::uniformDescriptorSet ( ) const

Definition at line 359 of file GrVkBuffer.cpp.

359 {
360 SkASSERT(fUniformDescriptorSet);
361 return fUniformDescriptorSet->descriptorSet();
362}
#define SkASSERT(cond)
Definition SkAssert.h:116
const VkDescriptorSet * descriptorSet() const

◆ vkBuffer()

VkBuffer GrVkBuffer::vkBuffer ( ) const
inline

Definition at line 24 of file GrVkBuffer.h.

24{ return fBuffer; }

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