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