blob: 232de176ce3eca9b672f55f5eee8e9d046a02363 [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
jvanverthdb379092016-07-07 11:18:46 -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; }
jvanverthdb379092016-07-07 11:18:46 -070031 size_t size() const { return fDesc.fSizeInBytes; }
32 VkDeviceSize offset() const { return fOffset; }
Greg Daniel164a9f02016-02-22 09:56:40 -050033
34 void addMemoryBarrier(const GrVkGpu* gpu,
35 VkAccessFlags srcAccessMask,
36 VkAccessFlags dstAccessMask,
37 VkPipelineStageFlags srcStageMask,
38 VkPipelineStageFlags dstStageMask,
39 bool byRegion) const;
40
41 enum Type {
42 kVertex_Type,
43 kIndex_Type,
44 kUniform_Type,
45 kCopyRead_Type,
46 kCopyWrite_Type,
47 };
48
49protected:
50 struct Desc {
51 size_t fSizeInBytes;
52 Type fType; // vertex buffer, index buffer, etc.
53 bool fDynamic;
54 };
55
56 class Resource : public GrVkResource {
57 public:
jvanverth6b6ffc42016-06-13 14:28:07 -070058 Resource(VkBuffer buf, const GrVkAlloc& alloc, Type type)
59 : INHERITED(), fBuffer(buf), fAlloc(alloc), fType(type) {}
Greg Daniel164a9f02016-02-22 09:56:40 -050060
jvanverth7ec92412016-07-06 09:24:57 -070061#ifdef SK_TRACE_VK_RESOURCES
62 void dumpInfo() const override {
63 SkDebugf("GrVkBuffer: %d (%d refs)\n", fBuffer, this->getRefCnt());
64 }
65#endif
jvanverth6b6ffc42016-06-13 14:28:07 -070066 VkBuffer fBuffer;
67 GrVkAlloc fAlloc;
68 Type fType;
jvanverth1e305ba2016-06-01 09:39:15 -070069
Greg Daniel164a9f02016-02-22 09:56:40 -050070 private:
egdaniel50ead532016-07-13 14:23:26 -070071 void freeGPUData(const GrVkGpu* gpu) const override;
Greg Daniel164a9f02016-02-22 09:56:40 -050072
73 typedef GrVkResource INHERITED;
74 };
75
76 // convenience routine for raw buffer creation
77 static const Resource* Create(const GrVkGpu* gpu,
78 const Desc& descriptor);
79
80 GrVkBuffer(const Desc& desc, const GrVkBuffer::Resource* resource)
jvanverthdb379092016-07-07 11:18:46 -070081 : fDesc(desc), fResource(resource), fOffset(0), fMapPtr(nullptr) {
Greg Daniel164a9f02016-02-22 09:56:40 -050082 }
83
84 void* vkMap(const GrVkGpu* gpu);
jvanverth069c4642016-07-06 12:56:11 -070085 void vkUnmap(GrVkGpu* gpu);
egdaniel7cbffda2016-04-08 13:27:53 -070086 // If the caller passes in a non null createdNewBuffer, this function will set the bool to true
87 // if it creates a new VkBuffer to upload the data to.
jvanvertha584de92016-06-30 09:10:52 -070088 bool vkUpdateData(GrVkGpu* gpu, const void* src, size_t srcSizeInBytes,
egdaniel7cbffda2016-04-08 13:27:53 -070089 bool* createdNewBuffer = nullptr);
Greg Daniel164a9f02016-02-22 09:56:40 -050090
91 void vkAbandon();
92 void vkRelease(const GrVkGpu* gpu);
93
94private:
95 void validate() const;
96 bool vkIsMapped() const;
97
98 Desc fDesc;
99 const Resource* fResource;
jvanverthdb379092016-07-07 11:18:46 -0700100 VkDeviceSize fOffset;
Greg Daniel164a9f02016-02-22 09:56:40 -0500101 void* fMapPtr;
102
jvanverthe50f3e72016-03-28 07:03:06 -0700103 typedef SkNoncopyable INHERITED;
Greg Daniel164a9f02016-02-22 09:56:40 -0500104};
105
106#endif