1 /* 2 * Copyright 2021 Google LLC 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 #ifndef GrVkBuffer_DEFINED 9 #define GrVkBuffer_DEFINED 10 11 #include "include/gpu/vk/GrVkTypes.h" 12 #include "src/gpu/ganesh/GrGpuBuffer.h" 13 14 class GrVkDescriptorSet; 15 class GrVkGpu; 16 17 class GrVkBuffer : public GrGpuBuffer { 18 public: 19 static sk_sp<GrVkBuffer> Make(GrVkGpu* gpu, 20 size_t size, 21 GrGpuBufferType bufferType, 22 GrAccessPattern accessPattern); 23 vkBuffer()24 VkBuffer vkBuffer() const { return fBuffer; } 25 26 void addMemoryBarrier(VkAccessFlags srcAccessMask, 27 VkAccessFlags dstAccesMask, 28 VkPipelineStageFlags srcStageMask, 29 VkPipelineStageFlags dstStageMask, 30 bool byRegion) const; 31 32 // If the buffer is a uniform buffer, return the descriptor set for that buffer. It is not valid 33 // to call this on non uniform buffers. 34 const VkDescriptorSet* uniformDescriptorSet() const; 35 36 private: 37 GrVkBuffer(GrVkGpu* gpu, 38 size_t sizeInBytes, 39 GrGpuBufferType bufferType, 40 GrAccessPattern accessPattern, 41 VkBuffer buffer, 42 const skgpu::VulkanAlloc& alloc, 43 const GrVkDescriptorSet* uniformDescriptorSet, 44 std::string_view label); 45 isVkMappable()46 bool isVkMappable() const { return fAlloc.fFlags & skgpu::VulkanAlloc::kMappable_Flag; } 47 vkIsMapped()48 bool vkIsMapped() const { return SkToBool(fMapPtr); } 49 void vkMap(size_t readOffset, size_t readSize); 50 void vkUnmap(size_t flushOffset, size_t flushSize); 51 void copyCpuDataToGpuBuffer(const void* srcData, size_t offset, size_t size); 52 53 void onMap(MapType) override; 54 void onUnmap(MapType) override; 55 bool onClearToZero() override; 56 bool onUpdateData(const void* src, size_t offset, size_t size, bool preserve) override; 57 58 void vkRelease(); 59 60 void onAbandon() override; 61 void onRelease() override; 62 63 GrVkGpu* getVkGpu() const; 64 65 VkBuffer fBuffer; 66 skgpu::VulkanAlloc fAlloc; 67 68 const GrVkDescriptorSet* fUniformDescriptorSet; 69 70 using INHERITED = GrGpuBuffer; 71 }; 72 73 #endif 74