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/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 
24     static sk_sp<GrVkBuffer> MakeFromOHNativeBuffer(GrVkGpu* gpu,
25                                                     OH_NativeBuffer *nativeBuffer,
26                                                     size_t bufferSize,
27                                                     GrGpuBufferType bufferType,
28                                                     GrAccessPattern accessPattern);
29 
30     // OH ISSUE: Integrate Destroy and Free
31     static void DestroyAndFreeBufferMemory(const GrVkGpu* gpu, const GrVkAlloc& alloc, const VkBuffer& buffer);
32 
vkBuffer() const33     VkBuffer vkBuffer() const { return fBuffer; }
34 
35     void addMemoryBarrier(VkAccessFlags srcAccessMask,
36                           VkAccessFlags dstAccesMask,
37                           VkPipelineStageFlags srcStageMask,
38                           VkPipelineStageFlags dstStageMask,
39                           bool byRegion) const;
40 
41     // If the buffer is a uniform buffer, return the descriptor set for that buffer. It is not valid
42     // to call this on non uniform buffers.
43     const VkDescriptorSet* uniformDescriptorSet() const;
44 
45 private:
46     GrVkBuffer(GrVkGpu* gpu,
47                 size_t sizeInBytes,
48                 GrGpuBufferType bufferType,
49                 GrAccessPattern accessPattern,
50                 VkBuffer buffer,
51                 const GrVkAlloc& alloc,
52                 const GrVkDescriptorSet* uniformDescriptorSet);
53 
isVkMappable() const54     bool isVkMappable() const { return fAlloc.fFlags & GrVkAlloc::kMappable_Flag; }
55 
vkIsMapped() const56     bool vkIsMapped() const { return SkToBool(fMapPtr); }
57     void vkMap(size_t size);
58     void vkUnmap(size_t size);
59     void copyCpuDataToGpuBuffer(const void* srcData, size_t size);
60 
61 
62     void onMap() override;
63     void onUnmap() override;
64     bool onUpdateData(const void* src, size_t srcSizeInBytes) override;
65 
66     void vkRelease();
67 
68     void onAbandon() override;
69     void onRelease() override;
70 
71     GrVkGpu* getVkGpu() const;
72 
73     VkBuffer fBuffer;
74     GrVkAlloc fAlloc;
75 
76     const GrVkDescriptorSet* fUniformDescriptorSet;
77 
78     using INHERITED = GrGpuBuffer;
79 };
80 
81 #endif
82