1// Copyright 2018 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef VK_RENDER_PASS_HPP_
16#define VK_RENDER_PASS_HPP_
17
18#include "VkObject.hpp"
19
20#include <vector>
21
22namespace vk
23{
24
25class RenderPass : public Object<RenderPass, VkRenderPass>
26{
27public:
28 RenderPass(const VkRenderPassCreateInfo* pCreateInfo, void* mem);
29 void destroy(const VkAllocationCallbacks* pAllocator);
30
31 static size_t ComputeRequiredAllocationSize(const VkRenderPassCreateInfo* pCreateInfo);
32
33 void getRenderAreaGranularity(VkExtent2D* pGranularity) const;
34
35 uint32_t getAttachmentCount() const
36 {
37 return attachmentCount;
38 }
39
40 VkAttachmentDescription getAttachment(uint32_t attachmentIndex) const
41 {
42 return attachments[attachmentIndex];
43 }
44
45 uint32_t getSubpassCount() const
46 {
47 return subpassCount;
48 }
49
50 VkSubpassDescription const& getSubpass(uint32_t subpassIndex) const
51 {
52 return subpasses[subpassIndex];
53 }
54
55 uint32_t getDependencyCount() const
56 {
57 return dependencyCount;
58 }
59
60 VkSubpassDependency getDependency(uint32_t i) const
61 {
62 return dependencies[i];
63 }
64
65 bool isAttachmentUsed(uint32_t i) const
66 {
67 return attachmentFirstUse[i] >= 0;
68 }
69
70 uint32_t getViewMask(uint32_t subpassIndex) const
71 {
72 return viewMasks ? viewMasks[subpassIndex] : 1;
73 }
74
75 bool isMultiView() const
76 {
77 return viewMasks != nullptr;
78 }
79
80 uint32_t getAttachmentViewMask(uint32_t attachmentIndex) const
81 {
82 return attachmentViewMasks[attachmentIndex];
83 }
84
85private:
86 uint32_t attachmentCount = 0;
87 VkAttachmentDescription* attachments = nullptr;
88 uint32_t subpassCount = 0;
89 VkSubpassDescription* subpasses = nullptr;
90 uint32_t dependencyCount = 0;
91 VkSubpassDependency* dependencies = nullptr;
92 int* attachmentFirstUse = nullptr;
93 uint32_t* viewMasks = nullptr;
94 uint32_t* attachmentViewMasks = nullptr;
95
96 void MarkFirstUse(int attachment, int subpass);
97};
98
99static inline RenderPass* Cast(VkRenderPass object)
100{
101 return RenderPass::Cast(object);
102}
103
104} // namespace vk
105
106#endif // VK_RENDER_PASS_HPP_