blob: bb053ccce0df332dbdce0ef4e551742ebb077ea7 [file] [log] [blame]
Greg Daniel164a9f02016-02-22 09:56:40 -05001/*
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
Greg Daniel164a9f02016-02-22 09:56:40 -050011#include "GrVkResource.h"
jvanverthe50f3e72016-03-28 07:03:06 -070012#include "vk/GrVkDefines.h"
jvanverth1e305ba2016-06-01 09:39:15 -070013#include "vk/GrVkTypes.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050014
15class 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 */
21class GrVkBuffer : public SkNoncopyable {
22public:
23 ~GrVkBuffer() {
24 // either release or abandon should have been called by the owner of this object.
25 SkASSERT(!fResource);
26 }
27
jvanverth1e305ba2016-06-01 09:39:15 -070028 VkBuffer buffer() const { return fResource->fBuffer; }
29 const GrVkAlloc& alloc() const { return fResource->fAlloc; }
Greg Daniel164a9f02016-02-22 09:56:40 -050030 const GrVkResource* resource() const { return fResource; }
31 size_t size() const { return fDesc.fSizeInBytes; }
32
33 void addMemoryBarrier(const GrVkGpu* gpu,
34 VkAccessFlags srcAccessMask,
35 VkAccessFlags dstAccessMask,
36 VkPipelineStageFlags srcStageMask,
37 VkPipelineStageFlags dstStageMask,
38 bool byRegion) const;
39
40 enum Type {
41 kVertex_Type,
42 kIndex_Type,
43 kUniform_Type,
44 kCopyRead_Type,
45 kCopyWrite_Type,
46 };
47
48protected:
49 struct Desc {
50 size_t fSizeInBytes;
51 Type fType; // vertex buffer, index buffer, etc.
52 bool fDynamic;
53 };
54
55 class Resource : public GrVkResource {
56 public:
jvanverth6b6ffc42016-06-13 14:28:07 -070057 Resource(VkBuffer buf, const GrVkAlloc& alloc, Type type)
58 : INHERITED(), fBuffer(buf), fAlloc(alloc), fType(type) {}
Greg Daniel164a9f02016-02-22 09:56:40 -050059
jvanverth7ec92412016-07-06 09:24:57 -070060#ifdef SK_TRACE_VK_RESOURCES
61 void dumpInfo() const override {
62 SkDebugf("GrVkBuffer: %d (%d refs)\n", fBuffer, this->getRefCnt());
63 }
64#endif
jvanverth6b6ffc42016-06-13 14:28:07 -070065 VkBuffer fBuffer;
66 GrVkAlloc fAlloc;
67 Type fType;
jvanverth1e305ba2016-06-01 09:39:15 -070068
Greg Daniel164a9f02016-02-22 09:56:40 -050069 private:
70 void freeGPUData(const GrVkGpu* gpu) const;
71
72 typedef GrVkResource INHERITED;
73 };
74
75 // convenience routine for raw buffer creation
76 static const Resource* Create(const GrVkGpu* gpu,
77 const Desc& descriptor);
78
79 GrVkBuffer(const Desc& desc, const GrVkBuffer::Resource* resource)
80 : fDesc(desc), fResource(resource), fMapPtr(nullptr) {
81 }
82
83 void* vkMap(const GrVkGpu* gpu);
84 void vkUnmap(const GrVkGpu* gpu);
egdaniel7cbffda2016-04-08 13:27:53 -070085 // If the caller passes in a non null createdNewBuffer, this function will set the bool to true
86 // if it creates a new VkBuffer to upload the data to.
jvanvertha584de92016-06-30 09:10:52 -070087 bool vkUpdateData(GrVkGpu* gpu, const void* src, size_t srcSizeInBytes,
egdaniel7cbffda2016-04-08 13:27:53 -070088 bool* createdNewBuffer = nullptr);
Greg Daniel164a9f02016-02-22 09:56:40 -050089
90 void vkAbandon();
91 void vkRelease(const GrVkGpu* gpu);
92
93private:
94 void validate() const;
95 bool vkIsMapped() const;
96
97 Desc fDesc;
98 const Resource* fResource;
99 void* fMapPtr;
100
jvanverthe50f3e72016-03-28 07:03:06 -0700101 typedef SkNoncopyable INHERITED;
Greg Daniel164a9f02016-02-22 09:56:40 -0500102};
103
104#endif