Home | History | Annotate | Download | only in vk
      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:
     22     ~GrVkBuffer() {
     23         // either release or abandon should have been called by the owner of this object.
     24         SkASSERT(!fResource);
     25     }
     26 
     27     VkBuffer       buffer() const { return fResource->fBuffer; }
     28     VkDeviceMemory alloc() const { return fResource->fAlloc; }
     29     const GrVkResource* resource() const { return fResource; }
     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:
     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 
     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