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 R32SignedFloat: return vk::Format::eR32Sfloat;
19 case R32G32SignedFloat: return vk::Format::eR32G32Sfloat;
20 case R32G32B32SignedFloat: return vk::Format::eR32G32B32Sfloat;
21 case R32G32B32A32SignedFloat: return vk::Format::eR32G32B32A32Sfloat;
22 case R16SignedFloat: return vk::Format::eR16Sfloat;
23 case R16G16SignedFloat: return vk::Format::eR16G16Sfloat;
24 case R16G16B16SignedFloat: return vk::Format::eR16G16B16Sfloat;
25 case R16G16B16A16SignedFloat: return vk::Format::eR16G16B16A16Sfloat;
26 case R32Uint: return vk::Format::eR32Uint;
27 case R16Uint: return vk::Format::eR16Uint;
28 case D32SignedFloat: return vk::Format::eD32Sfloat;
29 case Undefined:
30 default:
31 return vk::Format::eUndefined;
32 }
33 }
34 inline vk::BufferUsageFlags vkBufferUsageFromRHIBufferUsage(RHIBufferUsage usage) {
36 vk::BufferUsageFlags flags{};
37 if (usage & VertexBuffer) flags |= vk::BufferUsageFlagBits::eVertexBuffer;
38 if (usage & IndexBuffer) flags |= vk::BufferUsageFlagBits::eIndexBuffer;
39 if (usage & UniformBuffer) flags |= vk::BufferUsageFlagBits::eUniformBuffer;
40 if (usage & StorageBuffer) flags |= vk::BufferUsageFlagBits::eStorageBuffer;
41 if (usage & IndirectBuffer) flags |= vk::BufferUsageFlagBits::eIndirectBuffer;
42 if (usage & TransferSource) flags |= vk::BufferUsageFlagBits::eTransferSrc;
43 if (usage & TransferDestination) flags |= vk::BufferUsageFlagBits::eTransferDst;
44 return flags;
45 }
46
49 vk::AccessFlags2 flags{};
50 if (state & RenderTargetWrite) flags |= vk::AccessFlagBits2::eColorAttachmentWrite;
51 if (state & RenderTargetRead) flags |= vk::AccessFlagBits2::eColorAttachmentRead;
52 if (state & DepthStencilWrite) flags |= vk::AccessFlagBits2::eDepthStencilAttachmentWrite;
53 if (state & DepthStencilRead) flags |= vk::AccessFlagBits2::eDepthStencilAttachmentRead;
54 if (state & TransferWrite) flags |= vk::AccessFlagBits2::eTransferWrite;
55 if (state & TransferRead) flags |= vk::AccessFlagBits2::eTransferRead;
56 if (state & ShaderWrite) flags |= vk::AccessFlagBits2::eShaderWrite;
57 if (state & ShaderRead) flags |= vk::AccessFlagBits2::eShaderRead;
58 if (state & UniformRead) flags |= vk::AccessFlagBits2::eUniformRead;
59 if (state & HostWrite) flags |= vk::AccessFlagBits2::eHostWrite;
60 if (state & HostRead) flags |= vk::AccessFlagBits2::eHostRead;
61 return flags;
62 }
63
64 inline vk::ImageLayout vkImageLayoutFromRHITextureLayout(RHITextureLayout layout) {
65 switch (layout) {
66 case RHITextureLayout::Undefined: return vk::ImageLayout::eUndefined;
67 case RHITextureLayout::General: return vk::ImageLayout::eGeneral;
68 case RHITextureLayout::RenderTarget: return vk::ImageLayout::eColorAttachmentOptimal;
69 case RHITextureLayout::DepthStencil: return vk::ImageLayout::eDepthStencilAttachmentOptimal;
70 case RHITextureLayout::Present: return vk::ImageLayout::ePresentSrcKHR;
71 case RHITextureLayout::TransferDst: return vk::ImageLayout::eTransferDstOptimal;
72 case RHITextureLayout::TransferSrc: return vk::ImageLayout::eTransferSrcOptimal;
73 case RHITextureLayout::ShaderReadOnly: return vk::ImageLayout::eShaderReadOnlyOptimal;
74 default:
75 return vk::ImageLayout::eUndefined;
76 }
77 }
78
79 inline vk::PipelineStageFlags vkPipelineStageFlagsFromRHIPipelineStage(RHIPipelineStage stage) {
81 vk::PipelineStageFlags flags{};
82 if (stage & DrawIndirect) flags |= vk::PipelineStageFlagBits::eDrawIndirect;
83 if (stage & FragmentShader) flags |= vk::PipelineStageFlagBits::eFragmentShader;
84 if (stage & VertexShader) flags |= vk::PipelineStageFlagBits::eVertexShader;
85 if (stage & ComputeShader) flags |= vk::PipelineStageFlagBits::eComputeShader;
86 if (stage & RayTracingShader) flags |= vk::PipelineStageFlagBits::eRayTracingShaderKHR;
87 if (stage & MeshShader) flags |= vk::PipelineStageFlagBits::eMeshShaderEXT;
88 if (stage & RenderTargetOutput) flags |= vk::PipelineStageFlagBits::eColorAttachmentOutput;
89 if (stage & Transfer) flags |= vk::PipelineStageFlagBits::eTransfer;
90 if (stage & EarlyFragmentTests) flags |= vk::PipelineStageFlagBits::eEarlyFragmentTests;
91 if (stage & LateFragmentTests) flags |= vk::PipelineStageFlagBits::eLateFragmentTests;
92 if (stage & TopOfPipe) flags |= vk::PipelineStageFlagBits::eTopOfPipe;
93 if (stage & BottomOfPipe) flags |= vk::PipelineStageFlagBits::eBottomOfPipe;
94 if (stage & AllGraphics) flags |= vk::PipelineStageFlagBits::eAllGraphics;
95 if (stage & Host) flags |= vk::PipelineStageFlagBits::eHost;
96 return flags;
97 }
98
99 inline vk::PipelineStageFlags2 vkPipelineStageFlags2FromRHIPipelineStage(RHIPipelineStage stage) {
101 vk::PipelineStageFlags2 flags{};
102 if (stage & DrawIndirect) flags |= vk::PipelineStageFlagBits2::eDrawIndirect;
103 if (stage & FragmentShader) flags |= vk::PipelineStageFlagBits2::eFragmentShader;
104 if (stage & VertexShader) flags |= vk::PipelineStageFlagBits2::eVertexShader;
105 if (stage & ComputeShader) flags |= vk::PipelineStageFlagBits2::eComputeShader;
106 if (stage & RayTracingShader) flags |= vk::PipelineStageFlagBits2::eRayTracingShaderKHR;
107 if (stage & MeshShader) flags |= vk::PipelineStageFlagBits2::eMeshShaderEXT;
108 if (stage & TaskShader) flags |= vk::PipelineStageFlagBits2::eTaskShaderEXT;
109 if (stage & RenderTargetOutput) flags |= vk::PipelineStageFlagBits2::eColorAttachmentOutput;
110 if (stage & Transfer) flags |= vk::PipelineStageFlagBits2::eTransfer;
111 if (stage & EarlyFragmentTests) flags |= vk::PipelineStageFlagBits2::eEarlyFragmentTests;
112 if (stage & LateFragmentTests) flags |= vk::PipelineStageFlagBits2::eLateFragmentTests;
113 if (stage & TopOfPipe) flags |= vk::PipelineStageFlagBits2::eTopOfPipe;
114 if (stage & BottomOfPipe) flags |= vk::PipelineStageFlagBits2::eBottomOfPipe;
115 if (stage & AllGraphics) flags |= vk::PipelineStageFlagBits2::eAllGraphics;
116 if (stage & Host) flags |= vk::PipelineStageFlagBits2::eHost;
117 return flags;
118 }
119
120 inline vk::ShaderStageFlags vkShaderStageFlagsFromRHIShaderStage(RHIShaderStage stage) {
122 vk::ShaderStageFlags flags{};
123 if (stage == All) return vk::ShaderStageFlagBits::eAll;
124 if (stage & Vertex) flags |= vk::ShaderStageFlagBits::eVertex;
125 if (stage & Fragment) flags |= vk::ShaderStageFlagBits::eFragment;
126 if (stage & Compute) flags |= vk::ShaderStageFlagBits::eCompute;
127 if (stage & RayGeneration) flags |= vk::ShaderStageFlagBits::eRaygenKHR;
128 if (stage & RayAnyHit) flags |= vk::ShaderStageFlagBits::eAnyHitKHR;
129 if (stage & RayClosestHit) flags |= vk::ShaderStageFlagBits::eClosestHitKHR;
130 if (stage & RayMiss) flags |= vk::ShaderStageFlagBits::eMissKHR;
131 if (stage & RayIntersection) flags |= vk::ShaderStageFlagBits::eIntersectionKHR;
132 if (stage & Task) flags |= vk::ShaderStageFlagBits::eTaskEXT;
133 if (stage & Mesh) flags |= vk::ShaderStageFlagBits::eMeshEXT;
134 return flags;
135 }
136
139 switch (type)
140 {
141 case Sampler:
142 return vk::DescriptorType::eSampler;
143 case SampledImage:
144 return vk::DescriptorType::eSampledImage;
145 case StorageImage:
146 return vk::DescriptorType::eStorageImage;
147 case StorageBuffer:
148 return vk::DescriptorType::eStorageBuffer;
149 default:
150 case UniformBuffer:
151 return vk::DescriptorType::eUniformBuffer;
152 }
153 }
154
156 switch (type) {
157 case RHIDevicePipelineType::Compute: return vk::PipelineBindPoint::eCompute;
158 default:
159 case RHIDevicePipelineType::Graphics: return vk::PipelineBindPoint::eGraphics;
160 }
161 }
162
163 inline vk::ImageUsageFlags vkImageUsageFlagsFromRHITextureUsage(RHITextureUsage usage) {
165 vk::ImageUsageFlags flags{};
166 if (usage & RenderTarget) flags |= vk::ImageUsageFlagBits::eColorAttachment;
167 if (usage & DepthStencil) flags |= vk::ImageUsageFlagBits::eDepthStencilAttachment;
168 if (usage & SampledImage) flags |= vk::ImageUsageFlagBits::eSampled;
169 if (usage & StorageImage) flags |= vk::ImageUsageFlagBits::eStorage;
170 if (usage & TransferSource) flags |= vk::ImageUsageFlagBits::eTransferSrc;
171 if (usage & TransferDestination) flags |= vk::ImageUsageFlagBits::eTransferDst;
172 return flags;
173 }
174
175 inline vk::SampleCountFlagBits vkSampleCountFlagFromRHIMultisampleCount(RHIMultisampleCount count) {
177 switch (count) {
178 case E2: return vk::SampleCountFlagBits::e2;
179 case E4: return vk::SampleCountFlagBits::e4;
180 case E8: return vk::SampleCountFlagBits::e8;
181 case E16: return vk::SampleCountFlagBits::e16;
182 case E1:
183 default:
184 return vk::SampleCountFlagBits::e1;
185 }
186 }
187
190 vk::ImageAspectFlags flags{};
191 if (aspect & Color) flags |= vk::ImageAspectFlagBits::eColor;
192 if (aspect & Depth) flags |= vk::ImageAspectFlagBits::eDepth;
193 if (aspect & Stencil) flags |= vk::ImageAspectFlagBits::eStencil;
194 return flags;
195 }
196
197}
std::unique_ptr< T, StlDeleter< T > > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:161
Low-level Rendering Hardware Interface (RHI) abstractions.
Definition Application.hpp:5
MeshShader
Definition Common.hpp:198
RayTracingShader
Definition Common.hpp:197
vk::AccessFlags2 vkAccessFlagsFromRHIResourceAccess(RHIResourceAccess state)
Definition Common.hpp:47
IndexBuffer
Definition Common.hpp:213
FragmentShader
Definition Common.hpp:195
vk::SampleCountFlagBits vkSampleCountFlagFromRHIMultisampleCount(RHIMultisampleCount count)
Definition Common.hpp:175
RHIDevicePipelineType
Definition Common.hpp:84
RHITextureLayout
Definition Common.hpp:99
Task
Definition Common.hpp:157
Depth
Definition Common.hpp:234
vk::ImageAspectFlags vkImageAspectFlagFromRHITextureAspect(RHITextureAspectFlag aspect)
Definition Common.hpp:188
vk::PipelineBindPoint vkPipelineBindPointFromRHIDevicePipelineType(RHIDevicePipelineType type)
Definition Common.hpp:155
UniformRead
Definition Common.hpp:185
VertexShader
Definition Common.hpp:194
RayGeneration
Definition Common.hpp:147
vk::DescriptorType vkDescriptorTypeFromRHIDescriptorType(RHIDescriptorType type)
Definition Common.hpp:137
TopOfPipe
Definition Common.hpp:207
RenderTargetOutput
Definition Common.hpp:200
All
Definition Common.hpp:160
Compute
Definition Common.hpp:145
Host
Definition Common.hpp:205
RenderTargetRead
Definition Common.hpp:178
ComputeShader
Definition Common.hpp:196
vk::ImageLayout vkImageLayoutFromRHITextureLayout(RHITextureLayout layout)
Definition Common.hpp:64
Color
Definition Common.hpp:233
EarlyFragmentTests
Definition Common.hpp:202
TransferRead
Definition Common.hpp:182
TransferSource
Definition Common.hpp:219
vk::Format vkFormatFromRHIFormat(RHIResourceFormat format)
Definition Common.hpp:11
vk::ImageUsageFlags vkImageUsageFlagsFromRHITextureUsage(RHITextureUsage usage)
Definition Common.hpp:163
UniformBuffer
Definition Common.hpp:215
ShaderRead
Definition Common.hpp:184
TaskShader
Definition Common.hpp:199
VertexBuffer
Definition Common.hpp:212
HostRead
Definition Common.hpp:187
StorageBuffer
Definition Common.hpp:217
vk::ShaderStageFlags vkShaderStageFlagsFromRHIShaderStage(RHIShaderStage stage)
Definition Common.hpp:120
DepthStencil
Definition Common.hpp:225
vk::PipelineStageFlags vkPipelineStageFlagsFromRHIPipelineStage(RHIPipelineStage stage)
Definition Common.hpp:79
Transfer
Definition Common.hpp:201
RayAnyHit
Definition Common.hpp:149
RHIDescriptorType
Definition Common.hpp:116
LateFragmentTests
Definition Common.hpp:203
RayClosestHit
Definition Common.hpp:151
HostWrite
Definition Common.hpp:186
RHIResourceFormat
Definition Common.hpp:20
BottomOfPipe
Definition Common.hpp:208
RenderTargetWrite
Definition Common.hpp:177
DepthStencilWrite
Definition Common.hpp:179
Mesh
Definition Common.hpp:159
Stencil
Definition Common.hpp:235
TransferDestination
Definition Common.hpp:220
vk::PipelineStageFlags2 vkPipelineStageFlags2FromRHIPipelineStage(RHIPipelineStage stage)
Definition Common.hpp:99
Bits vkFlagsToBits(vk::Flags< Bits > flags)
Definition Common.hpp:8
ShaderWrite
Definition Common.hpp:183
TransferWrite
Definition Common.hpp:181
RayMiss
Definition Common.hpp:153
RHIMultisampleCount
Definition Common.hpp:132
DepthStencilRead
Definition Common.hpp:180
SampledImage
Definition Common.hpp:226
Fragment
Definition Common.hpp:143
DrawIndirect
Definition Common.hpp:193
IndirectBuffer
Definition Common.hpp:218
RenderTarget
Definition Common.hpp:224
StorageImage
Definition Common.hpp:227
Vertex
Definition Common.hpp:141
AllGraphics
Definition Common.hpp:206
RayIntersection
Definition Common.hpp:155
vk::BufferUsageFlags vkBufferUsageFromRHIBufferUsage(RHIBufferUsage usage)
Definition Common.hpp:34