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 "GrVkResource.h" 12 #include "vk/GrVkDefines.h" 13 #include "vk/GrVkTypes.h" 14 15 class GrVkGpu; 16 17 /** 18 * This class serves as the base of GrVk*Buffer classes. It was written to avoid code 19 * duplication in those classes. 20 */ 21 class GrVkBuffer : public SkNoncopyable { 22 public: 23 virtual ~GrVkBuffer() { 24 // either release or abandon should have been called by the owner of this object. 25 SkASSERT(!fResource); 26 delete [] (unsigned char*)fMapPtr; 27 } 28 29 VkBuffer buffer() const { return fResource->fBuffer; } 30 const GrVkAlloc& alloc() const { return fResource->fAlloc; } 31 const GrVkRecycledResource* resource() const { return fResource; } 32 size_t size() const { return fDesc.fSizeInBytes; } 33 VkDeviceSize offset() const { return fOffset; } 34 35 void addMemoryBarrier(const GrVkGpu* gpu, 36 VkAccessFlags srcAccessMask, 37 VkAccessFlags dstAccessMask, 38 VkPipelineStageFlags srcStageMask, 39 VkPipelineStageFlags dstStageMask, 40 bool byRegion) const; 41 42 enum Type { 43 kVertex_Type, 44 kIndex_Type, 45 kUniform_Type, 46 kCopyRead_Type, 47 kCopyWrite_Type, 48 }; 49 50 protected: 51 struct Desc { 52 size_t fSizeInBytes; 53 Type fType; // vertex buffer, index buffer, etc. 54 bool fDynamic; 55 }; 56 57 class Resource : public GrVkRecycledResource { 58 public: 59 Resource(VkBuffer buf, const GrVkAlloc& alloc, Type type) 60 : INHERITED(), fBuffer(buf), fAlloc(alloc), fType(type) {} 61 62 #ifdef SK_TRACE_VK_RESOURCES 63 void dumpInfo() const override { 64 SkDebugf("GrVkBuffer: %d (%d refs)\n", fBuffer, this->getRefCnt()); 65 } 66 #endif 67 VkBuffer fBuffer; 68 GrVkAlloc fAlloc; 69 Type fType; 70 71 private: 72 void freeGPUData(const GrVkGpu* gpu) const override; 73 74 void onRecycle(GrVkGpu* gpu) const override { this->unref(gpu); } 75 76 typedef GrVkRecycledResource INHERITED; 77 }; 78 79 // convenience routine for raw buffer creation 80 static const Resource* Create(const GrVkGpu* gpu, 81 const Desc& descriptor); 82 83 GrVkBuffer(const Desc& desc, const GrVkBuffer::Resource* resource) 84 : fDesc(desc), fResource(resource), fOffset(0), fMapPtr(nullptr) { 85 } 86 87 void* vkMap(GrVkGpu* gpu) { 88 this->internalMap(gpu, fDesc.fSizeInBytes); 89 return fMapPtr; 90 } 91 void vkUnmap(GrVkGpu* gpu) { this->internalUnmap(gpu, this->size()); } 92 93 // If the caller passes in a non null createdNewBuffer, this function will set the bool to true 94 // if it creates a new VkBuffer to upload the data to. 95 bool vkUpdateData(GrVkGpu* gpu, const void* src, size_t srcSizeInBytes, 96 bool* createdNewBuffer = nullptr); 97 98 void vkAbandon(); 99 void vkRelease(const GrVkGpu* gpu); 100 101 private: 102 virtual const Resource* createResource(GrVkGpu* gpu, 103 const Desc& descriptor) { 104 return Create(gpu, descriptor); 105 } 106 107 void internalMap(GrVkGpu* gpu, size_t size, bool* createdNewBuffer = nullptr); 108 void internalUnmap(GrVkGpu* gpu, size_t size); 109 110 void validate() const; 111 bool vkIsMapped() const; 112 113 Desc fDesc; 114 const Resource* fResource; 115 VkDeviceSize fOffset; 116 void* fMapPtr; 117 118 typedef SkNoncopyable INHERITED; 119 }; 120 121 #endif 122