1 /*
2  * Copyright 2015 Google Inc.
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 "vk/GrVkInterface.h"
12 #include "GrVkResource.h"
13 
14 class GrVkGpu;
15 
16 /**
17  * This class serves as the base of GrVk*Buffer classes. It was written to avoid code
18  * duplication in those classes.
19  */
20 class GrVkBuffer : public SkNoncopyable {
21 public:
~GrVkBuffer()22     ~GrVkBuffer() {
23         // either release or abandon should have been called by the owner of this object.
24         SkASSERT(!fResource);
25     }
26 
buffer()27     VkBuffer       buffer() const { return fResource->fBuffer; }
alloc()28     VkDeviceMemory alloc() const { return fResource->fAlloc; }
resource()29     const GrVkResource* resource() const { return fResource; }
size()30     size_t         size() const { return fDesc.fSizeInBytes; }
31 
32     void addMemoryBarrier(const GrVkGpu* gpu,
33                           VkAccessFlags srcAccessMask,
34                           VkAccessFlags dstAccessMask,
35                           VkPipelineStageFlags srcStageMask,
36                           VkPipelineStageFlags dstStageMask,
37                           bool byRegion) const;
38 
39     enum Type {
40         kVertex_Type,
41         kIndex_Type,
42         kUniform_Type,
43         kCopyRead_Type,
44         kCopyWrite_Type,
45     };
46 
47 protected:
48     struct Desc {
49         size_t      fSizeInBytes;
50         Type        fType;         // vertex buffer, index buffer, etc.
51         bool        fDynamic;
52     };
53 
54     class Resource : public GrVkResource {
55     public:
Resource(VkBuffer buf,VkDeviceMemory alloc)56         Resource(VkBuffer buf, VkDeviceMemory alloc) : INHERITED(), fBuffer(buf), fAlloc(alloc) {}
57 
58         VkBuffer fBuffer;
59         VkDeviceMemory fAlloc;
60     private:
61         void freeGPUData(const GrVkGpu* gpu) const;
62 
63         typedef GrVkResource INHERITED;
64     };
65 
66     // convenience routine for raw buffer creation
67     static const Resource* Create(const GrVkGpu* gpu,
68                                   const Desc& descriptor);
69 
GrVkBuffer(const Desc & desc,const GrVkBuffer::Resource * resource)70     GrVkBuffer(const Desc& desc, const GrVkBuffer::Resource* resource)
71         : fDesc(desc), fResource(resource), fMapPtr(nullptr) {
72     }
73 
74     void* vkMap(const GrVkGpu* gpu);
75     void vkUnmap(const GrVkGpu* gpu);
76     bool vkUpdateData(const GrVkGpu* gpu, const void* src, size_t srcSizeInBytes);
77 
78     void vkAbandon();
79     void vkRelease(const GrVkGpu* gpu);
80 
81 private:
82     void validate() const;
83     bool vkIsMapped() const;
84 
85     Desc                    fDesc;
86     const Resource*         fResource;
87     void*                   fMapPtr;
88 
89     typedef SkRefCnt INHERITED;
90 };
91 
92 #endif
93