Foundation
Loading...
Searching...
No Matches
Common.hpp
Go to the documentation of this file.
1#pragma once
2#define VULKAN_HPP_NO_CONSTRUCTORS
3#include <vulkan/vulkan.hpp>
4#include <vulkan/vulkan_raii.hpp>
5
6#include <RHICore/Common.hpp>
7namespace Foundation::RHI {
8 template<typename Bits> inline Bits vkFlagsToBits(vk::Flags<Bits> flags) {
9 return static_cast<Bits>(static_cast<std::underlying_type_t<Bits>>(flags));
10 }
11 inline vk::Format vkFormatFromRHIFormat(RHIResourceFormat format) {
13 switch (format) {
14 case R8G8B8A8Unorm: return vk::Format::eR8G8B8A8Unorm;
15 case R8G8B8A8Srgb: return vk::Format::eR8G8B8A8Srgb;
16 case B8G8R8A8Unrom: return vk::Format::eB8G8R8A8Unorm;
17 case B8G8R8A8Srgb: return vk::Format::eB8G8R8A8Srgb;
18 case A2R10G10B10Unorm: return vk::Format::eA2B10G10R10UnormPack32;
19 case A2R10G10B10Snorm: return vk::Format::eA2B10G10R10SnormPack32;
20 case B10G11R11Ufloat: return vk::Format::eB10G11R11UfloatPack32;
21 case R32SignedFloat: return vk::Format::eR32Sfloat;
22 case R32G32SignedFloat: return vk::Format::eR32G32Sfloat;
23 case R32G32B32SignedFloat: return vk::Format::eR32G32B32Sfloat;
24 case R32G32B32A32SignedFloat: return vk::Format::eR32G32B32A32Sfloat;
25 case R16SignedFloat: return vk::Format::eR16Sfloat;
26 case R16G16SignedFloat: return vk::Format::eR16G16Sfloat;
27 case R16G16B16SignedFloat: return vk::Format::eR16G16B16Sfloat;
28 case R16G16B16A16SignedFloat: return vk::Format::eR16G16B16A16Sfloat;
29 case R32Uint: return vk::Format::eR32Uint;
30 case R16Uint: return vk::Format::eR16Uint;
31 case D32SignedFloat: return vk::Format::eD32Sfloat;
32 case Bc1RgbUnorm: return vk::Format::eBc1RgbUnormBlock;
33 case Bc1RgbSrgb: return vk::Format::eBc1RgbSrgbBlock;
34 case Bc1RgbaUnorm: return vk::Format::eBc1RgbaUnormBlock;
35 case Bc1RgbaSrgb: return vk::Format::eBc1RgbaSrgbBlock;
36 case Bc2Unorm: return vk::Format::eBc2UnormBlock;
37 case Bc2Srgb: return vk::Format::eBc2SrgbBlock;
38 case Bc3Unorm: return vk::Format::eBc3UnormBlock;
39 case Bc3Srgb: return vk::Format::eBc3SrgbBlock;
40 case Bc4Unorm: return vk::Format::eBc4UnormBlock;
41 case Bc4Snorm: return vk::Format::eBc4SnormBlock;
42 case Bc5Unorm: return vk::Format::eBc5UnormBlock;
43 case Bc5Snorm: return vk::Format::eBc5SnormBlock;
44 case Bc6HUfloat: return vk::Format::eBc6HUfloatBlock;
45 case Bc6HSfloat: return vk::Format::eBc6HSfloatBlock;
46 case Bc7Unorm: return vk::Format::eBc7UnormBlock;
47 case Bc7Srgb: return vk::Format::eBc7SrgbBlock;
48 case Undefined:
49 default:
50 return vk::Format::eUndefined;
51 }
52 }
53 inline vk::BufferUsageFlags vkBufferUsageFromRHIBufferUsage(RHIBufferUsage usage) {
55 vk::BufferUsageFlags flags{};
56 if (usage & VertexBuffer) flags |= vk::BufferUsageFlagBits::eVertexBuffer;
57 if (usage & IndexBuffer) flags |= vk::BufferUsageFlagBits::eIndexBuffer;
58 if (usage & UniformBuffer) flags |= vk::BufferUsageFlagBits::eUniformBuffer;
59 if (usage & StorageBuffer) flags |= vk::BufferUsageFlagBits::eStorageBuffer;
60 if (usage & IndirectBuffer) flags |= vk::BufferUsageFlagBits::eIndirectBuffer;
61 if (usage & TransferSource) flags |= vk::BufferUsageFlagBits::eTransferSrc;
62 if (usage & TransferDestination) flags |= vk::BufferUsageFlagBits::eTransferDst;
63 return flags;
64 }
65
68 vk::AccessFlags2 flags{};
69 if (state & RenderTargetWrite) flags |= vk::AccessFlagBits2::eColorAttachmentWrite;
70 if (state & RenderTargetRead) flags |= vk::AccessFlagBits2::eColorAttachmentRead;
71 if (state & DepthStencilWrite) flags |= vk::AccessFlagBits2::eDepthStencilAttachmentWrite;
72 if (state & DepthStencilRead) flags |= vk::AccessFlagBits2::eDepthStencilAttachmentRead;
73 if (state & TransferWrite) flags |= vk::AccessFlagBits2::eTransferWrite;
74 if (state & TransferRead) flags |= vk::AccessFlagBits2::eTransferRead;
75 if (state & ShaderWrite) flags |= vk::AccessFlagBits2::eShaderWrite;
76 if (state & ShaderRead) flags |= vk::AccessFlagBits2::eShaderRead;
77 if (state & UniformRead) flags |= vk::AccessFlagBits2::eUniformRead;
78 if (state & HostWrite) flags |= vk::AccessFlagBits2::eHostWrite;
79 if (state & HostRead) flags |= vk::AccessFlagBits2::eHostRead;
80 return flags;
81 }
82
83 inline vk::ImageLayout vkImageLayoutFromRHITextureLayout(RHITextureLayout layout) {
84 switch (layout) {
85 case RHITextureLayout::Undefined: return vk::ImageLayout::eUndefined;
86 case RHITextureLayout::General: return vk::ImageLayout::eGeneral;
87 case RHITextureLayout::RenderTarget: return vk::ImageLayout::eColorAttachmentOptimal;
88 case RHITextureLayout::DepthStencil: return vk::ImageLayout::eDepthStencilAttachmentOptimal;
89 case RHITextureLayout::Present: return vk::ImageLayout::ePresentSrcKHR;
90 case RHITextureLayout::TransferDst: return vk::ImageLayout::eTransferDstOptimal;
91 case RHITextureLayout::TransferSrc: return vk::ImageLayout::eTransferSrcOptimal;
92 case RHITextureLayout::ShaderReadOnly: return vk::ImageLayout::eShaderReadOnlyOptimal;
93 default:
94 return vk::ImageLayout::eUndefined;
95 }
96 }
97
98 inline vk::PipelineStageFlags vkPipelineStageFlagsFromRHIPipelineStage(RHIPipelineStage stage) {
100 vk::PipelineStageFlags flags{};
101 if (stage & DrawIndirect) flags |= vk::PipelineStageFlagBits::eDrawIndirect;
102 if (stage & FragmentShader) flags |= vk::PipelineStageFlagBits::eFragmentShader;
103 if (stage & VertexShader) flags |= vk::PipelineStageFlagBits::eVertexShader;
104 if (stage & ComputeShader) flags |= vk::PipelineStageFlagBits::eComputeShader;
105 if (stage & RayTracingShader) flags |= vk::PipelineStageFlagBits::eRayTracingShaderKHR;
106 if (stage & MeshShader) flags |= vk::PipelineStageFlagBits::eMeshShaderEXT;
107 if (stage & RenderTargetOutput) flags |= vk::PipelineStageFlagBits::eColorAttachmentOutput;
108 if (stage & Transfer) flags |= vk::PipelineStageFlagBits::eTransfer;
109 if (stage & EarlyFragmentTests) flags |= vk::PipelineStageFlagBits::eEarlyFragmentTests;
110 if (stage & LateFragmentTests) flags |= vk::PipelineStageFlagBits::eLateFragmentTests;
111 if (stage & TopOfPipe) flags |= vk::PipelineStageFlagBits::eTopOfPipe;
112 if (stage & BottomOfPipe) flags |= vk::PipelineStageFlagBits::eBottomOfPipe;
113 if (stage & AllGraphics) flags |= vk::PipelineStageFlagBits::eAllGraphics;
114 if (stage & Host) flags |= vk::PipelineStageFlagBits::eHost;
115 return flags;
116 }
117
118 inline vk::PipelineStageFlags2 vkPipelineStageFlags2FromRHIPipelineStage(RHIPipelineStage stage) {
120 vk::PipelineStageFlags2 flags{};
121 if (stage & DrawIndirect) flags |= vk::PipelineStageFlagBits2::eDrawIndirect;
122 if (stage & FragmentShader) flags |= vk::PipelineStageFlagBits2::eFragmentShader;
123 if (stage & VertexShader) flags |= vk::PipelineStageFlagBits2::eVertexShader;
124 if (stage & ComputeShader) flags |= vk::PipelineStageFlagBits2::eComputeShader;
125 if (stage & RayTracingShader) flags |= vk::PipelineStageFlagBits2::eRayTracingShaderKHR;
126 if (stage & MeshShader) flags |= vk::PipelineStageFlagBits2::eMeshShaderEXT;
127 if (stage & TaskShader) flags |= vk::PipelineStageFlagBits2::eTaskShaderEXT;
128 if (stage & RenderTargetOutput) flags |= vk::PipelineStageFlagBits2::eColorAttachmentOutput;
129 if (stage & Transfer) flags |= vk::PipelineStageFlagBits2::eTransfer;
130 if (stage & EarlyFragmentTests) flags |= vk::PipelineStageFlagBits2::eEarlyFragmentTests;
131 if (stage & LateFragmentTests) flags |= vk::PipelineStageFlagBits2::eLateFragmentTests;
132 if (stage & TopOfPipe) flags |= vk::PipelineStageFlagBits2::eTopOfPipe;
133 if (stage & BottomOfPipe) flags |= vk::PipelineStageFlagBits2::eBottomOfPipe;
134 if (stage & AllGraphics) flags |= vk::PipelineStageFlagBits2::eAllGraphics;
135 if (stage & Host) flags |= vk::PipelineStageFlagBits2::eHost;
136 return flags;
137 }
138
139 inline vk::ShaderStageFlags vkShaderStageFlagsFromRHIShaderStage(RHIShaderStage stage) {
141 vk::ShaderStageFlags flags{};
142 if (stage == All) return vk::ShaderStageFlagBits::eAll;
143 if (stage & Vertex) flags |= vk::ShaderStageFlagBits::eVertex;
144 if (stage & Fragment) flags |= vk::ShaderStageFlagBits::eFragment;
145 if (stage & Compute) flags |= vk::ShaderStageFlagBits::eCompute;
146 if (stage & RayGeneration) flags |= vk::ShaderStageFlagBits::eRaygenKHR;
147 if (stage & RayAnyHit) flags |= vk::ShaderStageFlagBits::eAnyHitKHR;
148 if (stage & RayClosestHit) flags |= vk::ShaderStageFlagBits::eClosestHitKHR;
149 if (stage & RayMiss) flags |= vk::ShaderStageFlagBits::eMissKHR;
150 if (stage & RayIntersection) flags |= vk::ShaderStageFlagBits::eIntersectionKHR;
151 if (stage & Task) flags |= vk::ShaderStageFlagBits::eTaskEXT;
152 if (stage & Mesh) flags |= vk::ShaderStageFlagBits::eMeshEXT;
153 return flags;
154 }
155
158 switch (type)
159 {
160 case Sampler:
161 return vk::DescriptorType::eSampler;
162 case SampledImage:
163 return vk::DescriptorType::eSampledImage;
164 case StorageImage:
165 return vk::DescriptorType::eStorageImage;
166 case StorageBuffer:
167 return vk::DescriptorType::eStorageBuffer;
168 default:
169 case UniformBuffer:
170 return vk::DescriptorType::eUniformBuffer;
171 }
172 }
173
175 switch (type) {
176 case RHIDevicePipelineType::Compute: return vk::PipelineBindPoint::eCompute;
177 default:
178 case RHIDevicePipelineType::Graphics: return vk::PipelineBindPoint::eGraphics;
179 }
180 }
181
182 inline vk::ImageUsageFlags vkImageUsageFlagsFromRHITextureUsage(RHITextureUsage usage) {
184 vk::ImageUsageFlags flags{};
185 if (usage & RenderTarget) flags |= vk::ImageUsageFlagBits::eColorAttachment;
186 if (usage & DepthStencil) flags |= vk::ImageUsageFlagBits::eDepthStencilAttachment;
187 if (usage & SampledImage) flags |= vk::ImageUsageFlagBits::eSampled;
188 if (usage & StorageImage) flags |= vk::ImageUsageFlagBits::eStorage;
189 if (usage & TransferSource) flags |= vk::ImageUsageFlagBits::eTransferSrc;
190 if (usage & TransferDestination) flags |= vk::ImageUsageFlagBits::eTransferDst;
191 return flags;
192 }
193
194 inline vk::SampleCountFlagBits vkSampleCountFlagFromRHIMultisampleCount(RHIMultisampleCount count) {
196 switch (count) {
197 case E2: return vk::SampleCountFlagBits::e2;
198 case E4: return vk::SampleCountFlagBits::e4;
199 case E8: return vk::SampleCountFlagBits::e8;
200 case E16: return vk::SampleCountFlagBits::e16;
201 case E1:
202 default:
203 return vk::SampleCountFlagBits::e1;
204 }
205 }
206
209 vk::ImageAspectFlags flags{};
210 if (aspect & Color) flags |= vk::ImageAspectFlagBits::eColor;
211 if (aspect & Depth) flags |= vk::ImageAspectFlagBits::eDepth;
212 if (aspect & Stencil) flags |= vk::ImageAspectFlagBits::eStencil;
213 return flags;
214 }
215
216}
T * Construct(Allocator *resource, Args &&...args)
Convenience placement new with object of type T using a Foundation::Core::Allocator.
Definition Allocator.hpp:149
Low-level Rendering Hardware Interface (RHI) abstractions.
Definition Application.hpp:4
MeshShader
Definition Common.hpp:255
RayTracingShader
Definition Common.hpp:254
vk::AccessFlags2 vkAccessFlagsFromRHIResourceAccess(RHIResourceAccess state)
Definition Common.hpp:66
IndexBuffer
Definition Common.hpp:270
FragmentShader
Definition Common.hpp:252
vk::SampleCountFlagBits vkSampleCountFlagFromRHIMultisampleCount(RHIMultisampleCount count)
Definition Common.hpp:194
RHITextureLayout
Definition Common.hpp:144
Task
Definition Common.hpp:214
Depth
Definition Common.hpp:291
vk::ImageAspectFlags vkImageAspectFlagFromRHITextureAspect(RHITextureAspectFlag aspect)
Definition Common.hpp:207
vk::PipelineBindPoint vkPipelineBindPointFromRHIDevicePipelineType(RHIDevicePipelineType type)
Definition Common.hpp:174
UniformRead
Definition Common.hpp:242
VertexShader
Definition Common.hpp:251
RayGeneration
Definition Common.hpp:204
vk::DescriptorType vkDescriptorTypeFromRHIDescriptorType(RHIDescriptorType type)
Definition Common.hpp:156
TopOfPipe
Definition Common.hpp:264
RenderTargetOutput
Definition Common.hpp:257
All
Definition Common.hpp:217
Compute
Definition Common.hpp:124
Host
Definition Common.hpp:262
RenderTargetRead
Definition Common.hpp:235
ComputeShader
Definition Common.hpp:253
vk::ImageLayout vkImageLayoutFromRHITextureLayout(RHITextureLayout layout)
Definition Common.hpp:83
Color
Definition Common.hpp:290
EarlyFragmentTests
Definition Common.hpp:259
TransferRead
Definition Common.hpp:239
TransferSource
Definition Common.hpp:276
vk::Format vkFormatFromRHIFormat(RHIResourceFormat format)
Definition Common.hpp:11
vk::ImageUsageFlags vkImageUsageFlagsFromRHITextureUsage(RHITextureUsage usage)
Definition Common.hpp:182
UniformBuffer
Definition Common.hpp:272
ShaderRead
Definition Common.hpp:241
TaskShader
Definition Common.hpp:256
VertexBuffer
Definition Common.hpp:269
HostRead
Definition Common.hpp:244
StorageBuffer
Definition Common.hpp:274
vk::ShaderStageFlags vkShaderStageFlagsFromRHIShaderStage(RHIShaderStage stage)
Definition Common.hpp:139
DepthStencil
Definition Common.hpp:282
vk::PipelineStageFlags vkPipelineStageFlagsFromRHIPipelineStage(RHIPipelineStage stage)
Definition Common.hpp:98
Transfer
Definition Common.hpp:125
RayAnyHit
Definition Common.hpp:206
RHIDescriptorType
Definition Common.hpp:173
LateFragmentTests
Definition Common.hpp:260
RayClosestHit
Definition Common.hpp:208
HostWrite
Definition Common.hpp:243
RHIResourceFormat
Definition Common.hpp:20
BottomOfPipe
Definition Common.hpp:265
RenderTargetWrite
Definition Common.hpp:234
DepthStencilWrite
Definition Common.hpp:236
Mesh
Definition Common.hpp:216
Stencil
Definition Common.hpp:292
TransferDestination
Definition Common.hpp:277
vk::PipelineStageFlags2 vkPipelineStageFlags2FromRHIPipelineStage(RHIPipelineStage stage)
Definition Common.hpp:118
Bits vkFlagsToBits(vk::Flags< Bits > flags)
Definition Common.hpp:8
ShaderWrite
Definition Common.hpp:240
TransferWrite
Definition Common.hpp:238
RayMiss
Definition Common.hpp:210
RHIMultisampleCount
Definition Common.hpp:189
DepthStencilRead
Definition Common.hpp:237
SampledImage
Definition Common.hpp:283
Fragment
Definition Common.hpp:200
DrawIndirect
Definition Common.hpp:250
IndirectBuffer
Definition Common.hpp:275
RenderTarget
Definition Common.hpp:281
StorageImage
Definition Common.hpp:284
Vertex
Definition Common.hpp:198
AllGraphics
Definition Common.hpp:263
RayIntersection
Definition Common.hpp:212
vk::BufferUsageFlags vkBufferUsageFromRHIBufferUsage(RHIBufferUsage usage)
Definition Common.hpp:53