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
14class 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 */
20class GrVkBuffer : public SkNoncopyable {
21public:
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
47protected:
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
81private:
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