Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Private Member Functions | List of all members
skgpu::graphite::VulkanBuffer Class Referencefinal

#include <VulkanBuffer.h>

Inheritance diagram for skgpu::graphite::VulkanBuffer:
skgpu::graphite::Buffer skgpu::graphite::Resource

Public Member Functions

void freeGpuData () override
 
VkBuffer vkBuffer () const
 
VkBufferUsageFlags bufferUsageFlags () const
 
void setBufferAccess (VulkanCommandBuffer *buffer, VkAccessFlags dstAccessMask, VkPipelineStageFlags dstStageMask) const
 
- Public Member Functions inherited from skgpu::graphite::Buffer
size_t size () const
 
void * map ()
 
void asyncMap (GpuFinishedProc=nullptr, GpuFinishedContext=nullptr)
 
void unmap ()
 
bool isMapped () const
 
virtual bool isUnmappable () const
 
const char * getResourceType () const override
 
- Public Member Functions inherited from skgpu::graphite::Resource
 Resource (const Resource &)=delete
 
 Resource (Resource &&)=delete
 
Resourceoperator= (const Resource &)=delete
 
Resourceoperator= (Resource &&)=delete
 
void ref () const
 
void unref () const
 
void refCommandBuffer () const
 
void unrefCommandBuffer () const
 
Ownership ownership () const
 
skgpu::Budgeted budgeted () const
 
size_t gpuMemorySize () const
 
UniqueID uniqueID () const
 
std::string getLabel () const
 
void setLabel (std::string_view label)
 
bool wasDestroyed () const
 
const GraphiteResourceKeykey () const
 
void setKey (const GraphiteResourceKey &key)
 
void dumpMemoryStatistics (SkTraceMemoryDump *traceMemoryDump) const
 
virtual void prepareForReturnToCache (const std::function< void()> &takeRef)
 

Static Public Member Functions

static sk_sp< BufferMake (const VulkanSharedContext *, size_t, BufferType, AccessPattern, std::string_view label)
 

Private Member Functions

void onMap () override
 
void onUnmap () override
 

Additional Inherited Members

- Protected Member Functions inherited from skgpu::graphite::Buffer
 Buffer (const SharedContext *sharedContext, size_t size, std::string_view label, bool commandBufferRefsAsUsageRefs=false)
 
- Protected Member Functions inherited from skgpu::graphite::Resource
 Resource (const SharedContext *, Ownership, skgpu::Budgeted, size_t gpuMemorySize, std::string_view label, bool commandBufferRefsAsUsageRefs=false)
 
virtual ~Resource ()
 
const SharedContextsharedContext () const
 
virtual void invokeReleaseProc ()
 
virtual void onDumpMemoryStatistics (SkTraceMemoryDump *traceMemoryDump, const char *dumpName) const
 
void setDeleteASAP ()
 
- Protected Attributes inherited from skgpu::graphite::Buffer
void * fMapPtr = nullptr
 

Detailed Description

Definition at line 19 of file VulkanBuffer.h.

Member Function Documentation

◆ bufferUsageFlags()

VkBufferUsageFlags skgpu::graphite::VulkanBuffer::bufferUsageFlags ( ) const
inline

Definition at line 28 of file VulkanBuffer.h.

28{ return fBufferUsageFlags; }

◆ freeGpuData()

void skgpu::graphite::VulkanBuffer::freeGpuData ( )
overridevirtual

Implements skgpu::graphite::Resource.

Definition at line 166 of file VulkanBuffer.cpp.

166 {
167 if (fMapPtr) {
168 this->internalUnmap(0, this->size());
169 fMapPtr = nullptr;
170 }
171
172 const VulkanSharedContext* sharedContext =
173 static_cast<const VulkanSharedContext*>(this->sharedContext());
174 SkASSERT(fBuffer);
175 SkASSERT(fAlloc.fMemory && fAlloc.fBackendMemory);
176 VULKAN_CALL(sharedContext->interface(),
177 DestroyBuffer(sharedContext->device(), fBuffer, nullptr));
178 fBuffer = VK_NULL_HANDLE;
179
180 skgpu::VulkanMemory::FreeBufferMemory(sharedContext->memoryAllocator(), fAlloc);
181 fAlloc.fMemory = VK_NULL_HANDLE;
182 fAlloc.fBackendMemory = 0;
183}
#define SkASSERT(cond)
Definition SkAssert.h:116
#define VULKAN_CALL(IFACE, X)
size_t size() const
Definition Buffer.h:19
const SharedContext * sharedContext() const
Definition Resource.h:187
void FreeBufferMemory(VulkanMemoryAllocator *, const VulkanAlloc &alloc)
VulkanBackendMemory fBackendMemory
Definition VulkanTypes.h:43
VkDeviceMemory fMemory
Definition VulkanTypes.h:38
#define VK_NULL_HANDLE
Definition vulkan_core.h:46

◆ Make()

sk_sp< Buffer > skgpu::graphite::VulkanBuffer::Make ( const VulkanSharedContext sharedContext,
size_t  size,
BufferType  type,
AccessPattern  accessPattern,
std::string_view  label 
)
static

Definition at line 17 of file VulkanBuffer.cpp.

21 {
22 if (size <= 0) {
23 return nullptr;
24 }
25 VkBuffer buffer;
27
28 // The only time we don't require mappable buffers is when we're on a device where gpu only
29 // memory has faster reads on the gpu than memory that is also mappable on the cpu. Protected
30 // memory always uses mappable buffers.
31 bool requiresMappable = sharedContext->isProtected() == Protected::kYes ||
32 accessPattern == AccessPattern::kHostVisible ||
33 !sharedContext->vulkanCaps().gpuOnlyBuffersMorePerformant();
34
36
37 // The default usage captures use cases besides transfer buffers. GPU-only buffers are preferred
38 // unless mappability is required.
39 BufferUsage allocUsage =
40 requiresMappable ? BufferUsage::kCpuWritesGpuReads : BufferUsage::kGpuOnly;
41
42 // Create the buffer object
43 VkBufferCreateInfo bufInfo;
44 memset(&bufInfo, 0, sizeof(VkBufferCreateInfo));
46 bufInfo.flags = 0;
47 bufInfo.size = size;
48
49 // To support SkMesh buffer updates we make Vertex and Index buffers capable of being transfer
50 // dsts. To support rtAdjust uniform buffer updates, we make host-visible uniform buffers also
51 // capable of being transfer dsts.
52 switch (type) {
55 break;
58 break;
61 break;
63 bufInfo.usage =
65 break;
68 break;
71 break;
74 allocUsage = BufferUsage::kCpuWritesGpuReads;
75 break;
78 allocUsage = BufferUsage::kTransfersFromCpuToGpu;
79 break;
82 allocUsage = BufferUsage::kTransfersFromGpuToCpu;
83 break;
84 }
85
86 // We may not always get a mappable buffer for non-dynamic access buffers. Thus we set the
87 // transfer dst usage bit in case we need to do a copy to write data. It doesn't really hurt
88 // to set this extra usage flag, but we could narrow the scope of buffers we set it on more than
89 // just not dynamic.
90 if (!requiresMappable || accessPattern == AccessPattern::kGpuOnly) {
92 }
93
95 bufInfo.queueFamilyIndexCount = 0;
96 bufInfo.pQueueFamilyIndices = nullptr;
97
100 result,
101 CreateBuffer(sharedContext->device(),
102 &bufInfo,
103 nullptr, /*const VkAllocationCallbacks*/
104 &buffer));
105 if (result != VK_SUCCESS) {
106 return nullptr;
107 }
108
109 auto allocator = sharedContext->memoryAllocator();
110 bool shouldPersistentlyMapCpuToGpu =
111 sharedContext->vulkanCaps().shouldPersistentlyMapCpuToGpuBuffers();
112 //AllocBufferMemory
113 auto checkResult = [](VkResult result) {
114 return result == VK_SUCCESS;
115 };
117 buffer,
118 allocUsage,
119 shouldPersistentlyMapCpuToGpu,
120 checkResult,
121 &alloc)) {
122 VULKAN_CALL(sharedContext->interface(), DestroyBuffer(sharedContext->device(),
123 buffer,
124 /*const VkAllocationCallbacks*=*/nullptr));
125 return nullptr;
126 }
127
128 // Bind buffer
131 result,
132 BindBufferMemory(sharedContext->device(), buffer, alloc.fMemory, alloc.fOffset));
133 if (result != VK_SUCCESS) {
135 VULKAN_CALL(sharedContext->interface(), DestroyBuffer(sharedContext->device(),
136 buffer,
137 /*const VkAllocationCallbacks*=*/nullptr));
138 return nullptr;
139 }
140
141 return sk_sp<Buffer>(new VulkanBuffer(sharedContext,
142 size,
143 type,
144 accessPattern,
145 std::move(buffer),
146 alloc,
147 bufInfo.usage,
148 std::move(label)));
149}
#define VULKAN_CALL_RESULT(SHARED_CONTEXT, RESULT, X)
static const uint8_t buffer[]
GAsyncResult * result
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
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_STORAGE_BUFFER_BIT
@ VK_BUFFER_USAGE_TRANSFER_SRC_BIT
VkResult
@ VK_SUCCESS
@ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO

◆ onMap()

void skgpu::graphite::VulkanBuffer::onMap ( )
overrideprivatevirtual

Implements skgpu::graphite::Buffer.

Definition at line 249 of file VulkanBuffer.cpp.

249 {
250 SkASSERT(fBuffer);
251 SkASSERT(!this->isMapped());
252
253 this->internalMap(0, fBufferUsedForCPURead ? this->size() : 0);
254}
bool isMapped() const
Definition Buffer.h:30

◆ onUnmap()

void skgpu::graphite::VulkanBuffer::onUnmap ( )
overrideprivatevirtual

Implements skgpu::graphite::Buffer.

Definition at line 256 of file VulkanBuffer.cpp.

256 {
257 SkASSERT(fBuffer);
258 SkASSERT(this->isMapped());
259 this->internalUnmap(0, fBufferUsedForCPURead ? 0 : this->size());
260}

◆ setBufferAccess()

void skgpu::graphite::VulkanBuffer::setBufferAccess ( VulkanCommandBuffer buffer,
VkAccessFlags  dstAccessMask,
VkPipelineStageFlags  dstStageMask 
) const

Definition at line 262 of file VulkanBuffer.cpp.

264 {
265 // TODO: fill out other cases where we need a barrier
266 if (dstAccessMask == VK_ACCESS_HOST_READ_BIT ||
267 dstAccessMask == VK_ACCESS_TRANSFER_WRITE_BIT ||
268 dstAccessMask == VK_ACCESS_UNIFORM_READ_BIT) {
269 VkPipelineStageFlags srcStageMask =
270 VulkanBuffer::AccessMaskToPipelineSrcStageFlags(fCurrentAccessMask);
271
272 VkBufferMemoryBarrier bufferMemoryBarrier = {
274 nullptr, // pNext
275 fCurrentAccessMask, // srcAccessMask
276 dstAccessMask, // dstAccessMask
277 VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
278 VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex
279 fBuffer, // buffer
280 0, // offset
281 this->size(), // size
282 };
283 cmdBuffer->addBufferMemoryBarrier(srcStageMask, dstStageMask, &bufferMemoryBarrier);
284 }
285
286 fCurrentAccessMask = dstAccessMask;
287}
VkFlags VkPipelineStageFlags
@ VK_ACCESS_HOST_READ_BIT
@ VK_ACCESS_TRANSFER_WRITE_BIT
@ VK_ACCESS_UNIFORM_READ_BIT
#define VK_QUEUE_FAMILY_IGNORED
@ VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER

◆ vkBuffer()

VkBuffer skgpu::graphite::VulkanBuffer::vkBuffer ( ) const
inline

Definition at line 27 of file VulkanBuffer.h.

27{ return fBuffer; }

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