1#include <RendererFoundation/Resources/ResourceFormats.h>
2#include <RendererVulkan/Utils/ConversionUtilsVulkan.h>
9 return texDesc.m_uiArraySize > 1 || viewDesc.m_uiFirstArraySlice > 0;
21 case plGALMSAASampleCount::None:
22 return vk::SampleCountFlagBits::e1;
23 case plGALMSAASampleCount::TwoSamples:
24 return vk::SampleCountFlagBits::e2;
25 case plGALMSAASampleCount::FourSamples:
26 return vk::SampleCountFlagBits::e4;
27 case plGALMSAASampleCount::EightSamples:
28 return vk::SampleCountFlagBits::e8;
30 PL_ASSERT_NOT_IMPLEMENTED;
31 return vk::SampleCountFlagBits::e1;
39 case plGALPresentMode::Immediate:
41 if (supportedModes.
Contains(vk::PresentModeKHR::eImmediate))
42 return vk::PresentModeKHR::eImmediate;
43 else if (supportedModes.
Contains(vk::PresentModeKHR::eMailbox))
44 return vk::PresentModeKHR::eMailbox;
46 return vk::PresentModeKHR::eFifo;
48 case plGALPresentMode::VSync:
49 return vk::PresentModeKHR::eFifo;
51 PL_ASSERT_NOT_IMPLEMENTED;
52 return vk::PresentModeKHR::eFifo;
58 vk::ImageSubresourceRange range;
59 plGALResourceFormat::Enum viewFormat = viewDesc.m_OverrideViewFormat == plGALResourceFormat::Invalid ? texDesc.m_Format : viewDesc.m_OverrideViewFormat;
61 range.setBaseMipLevel(viewDesc.m_uiMipLevel).setLevelCount(1).setBaseArrayLayer(viewDesc.m_uiFirstSlice).setLayerCount(viewDesc.m_uiSliceCount);
67 vk::ImageSubresourceRange range;
69 const bool bIsArrayView = IsArrayViewInternal(texDesc, viewDesc);
71 plGALResourceFormat::Enum viewFormat = viewDesc.m_OverrideViewFormat == plGALResourceFormat::Invalid ? texDesc.m_Format : viewDesc.m_OverrideViewFormat;
73 if (viewFormat == plGALResourceFormat::D24S8)
75 range.aspectMask |= vk::ImageAspectFlagBits::eStencil;
77 range.baseMipLevel = viewDesc.m_uiMostDetailedMipLevel;
78 range.levelCount =
plMath::Min(viewDesc.m_uiMipLevelsToUse, texDesc.m_uiMipLevelCount - range.baseMipLevel);
80 switch (texDesc.m_Type)
82 case plGALTextureType::Texture2D:
83 case plGALTextureType::Texture2DProxy:
84 case plGALTextureType::Texture2DShared:
85 range.layerCount = viewDesc.m_uiArraySize;
86 range.baseArrayLayer = viewDesc.m_uiFirstArraySlice;
88 case plGALTextureType::TextureCube:
89 range.baseArrayLayer = viewDesc.m_uiFirstArraySlice;
90 range.layerCount = viewDesc.m_uiArraySize * 6;
92 case plGALTextureType::Texture3D:
96 PL_ASSERT_NOT_IMPLEMENTED;
104 vk::ImageSubresourceRange range;
106 const bool bIsArrayView = IsArrayViewInternal(texDesc, viewDesc);
108 plGALResourceFormat::Enum viewFormat = viewDesc.m_OverrideViewFormat == plGALResourceFormat::Invalid ? texDesc.m_Format : viewDesc.m_OverrideViewFormat;
110 if (viewFormat == plGALResourceFormat::D24S8)
112 range.aspectMask |= vk::ImageAspectFlagBits::eStencil;
116 range.levelCount = 1;
119 switch (texDesc.m_Type)
121 case plGALTextureType::Texture2D:
122 case plGALTextureType::Texture2DProxy:
123 case plGALTextureType::Texture2DShared:
126 case plGALTextureType::TextureCube:
129 case plGALTextureType::Texture3D:
132 PL_ASSERT_NOT_IMPLEMENTED;
140 PL_ASSERT_NOT_IMPLEMENTED;
145PL_ALWAYS_INLINE vk::ImageSubresourceRange plConversionUtilsVulkan::GetSubresourceRange(
146 const vk::ImageSubresourceLayers& layers)
148 vk::ImageSubresourceRange range;
149 range.aspectMask = layers.aspectMask;
150 range.baseMipLevel = layers.mipLevel;
151 range.levelCount = 1;
152 range.baseArrayLayer = layers.baseArrayLayer;
153 range.layerCount = layers.layerCount;
157PL_ALWAYS_INLINE vk::ImageViewType plConversionUtilsVulkan::GetImageViewType(
plEnum<plGALTextureType> texType,
bool bIsArrayView)
161 case plGALTextureType::Texture2D:
162 case plGALTextureType::Texture2DProxy:
163 case plGALTextureType::Texture2DShared:
166 return vk::ImageViewType::e2D;
170 return vk::ImageViewType::e2DArray;
172 case plGALTextureType::TextureCube:
175 return vk::ImageViewType::eCube;
179 return vk::ImageViewType::eCubeArray;
181 case plGALTextureType::Texture3D:
182 return vk::ImageViewType::e3D;
185 PL_ASSERT_NOT_IMPLEMENTED;
186 return vk::ImageViewType::e1D;
190PL_ALWAYS_INLINE
bool plConversionUtilsVulkan::IsDepthFormat(vk::Format format)
194 case vk::Format::eD16Unorm:
195 case vk::Format::eD32Sfloat:
196 case vk::Format::eD16UnormS8Uint:
197 case vk::Format::eD24UnormS8Uint:
198 case vk::Format::eD32SfloatS8Uint:
205PL_ALWAYS_INLINE
bool plConversionUtilsVulkan::IsStencilFormat(vk::Format format)
209 case vk::Format::eS8Uint:
210 case vk::Format::eD16UnormS8Uint:
211 case vk::Format::eD24UnormS8Uint:
212 case vk::Format::eD32SfloatS8Uint:
219PL_ALWAYS_INLINE vk::ImageLayout plConversionUtilsVulkan::GetDefaultLayout(vk::Format format)
221 return IsDepthFormat(format) ? vk::ImageLayout::eDepthStencilReadOnlyOptimal : vk::ImageLayout::eShaderReadOnlyOptimal;
228 case plGALPrimitiveTopology::Points:
229 return vk::PrimitiveTopology::ePointList;
230 case plGALPrimitiveTopology::Lines:
231 return vk::PrimitiveTopology::eLineList;
232 case plGALPrimitiveTopology::Triangles:
233 return vk::PrimitiveTopology::eTriangleList;
235 PL_ASSERT_NOT_IMPLEMENTED;
236 return vk::PrimitiveTopology::ePointList;
240PL_ALWAYS_INLINE vk::ShaderStageFlagBits plConversionUtilsVulkan::GetShaderStage(plGALShaderStage::Enum stage)
244 case plGALShaderStage::VertexShader:
245 return vk::ShaderStageFlagBits::eVertex;
246 case plGALShaderStage::HullShader:
247 return vk::ShaderStageFlagBits::eTessellationControl;
248 case plGALShaderStage::DomainShader:
249 return vk::ShaderStageFlagBits::eTessellationEvaluation;
250 case plGALShaderStage::GeometryShader:
251 return vk::ShaderStageFlagBits::eGeometry;
252 case plGALShaderStage::PixelShader:
253 return vk::ShaderStageFlagBits::eFragment;
255 PL_ASSERT_NOT_IMPLEMENTED;
257 case plGALShaderStage::ComputeShader:
258 return vk::ShaderStageFlagBits::eCompute;
262PL_ALWAYS_INLINE vk::PipelineStageFlags plConversionUtilsVulkan::GetPipelineStage(plGALShaderStage::Enum stage)
266 case plGALShaderStage::VertexShader:
267 return vk::PipelineStageFlagBits::eVertexShader;
268 case plGALShaderStage::HullShader:
269 return vk::PipelineStageFlagBits::eTessellationControlShader;
270 case plGALShaderStage::DomainShader:
271 return vk::PipelineStageFlagBits::eTessellationEvaluationShader;
272 case plGALShaderStage::GeometryShader:
273 return vk::PipelineStageFlagBits::eGeometryShader;
274 case plGALShaderStage::PixelShader:
275 return vk::PipelineStageFlagBits::eFragmentShader;
277 PL_ASSERT_NOT_IMPLEMENTED;
279 case plGALShaderStage::ComputeShader:
280 return vk::PipelineStageFlagBits::eComputeShader;
284PL_ALWAYS_INLINE vk::PipelineStageFlags plConversionUtilsVulkan::GetPipelineStage(vk::ShaderStageFlags flags)
286 vk::PipelineStageFlags res;
287 if (flags & vk::ShaderStageFlagBits::eVertex)
288 res |= vk::PipelineStageFlagBits::eVertexShader;
289 if (flags & vk::ShaderStageFlagBits::eTessellationControl)
290 res |= vk::PipelineStageFlagBits::eTessellationControlShader;
291 if (flags & vk::ShaderStageFlagBits::eTessellationEvaluation)
292 res |= vk::PipelineStageFlagBits::eTessellationEvaluationShader;
293 if (flags & vk::ShaderStageFlagBits::eGeometry)
294 res |= vk::PipelineStageFlagBits::eGeometryShader;
295 if (flags & vk::ShaderStageFlagBits::eFragment)
296 res |= vk::PipelineStageFlagBits::eFragmentShader;
297 if (flags & vk::ShaderStageFlagBits::eCompute)
298 res |= vk::PipelineStageFlagBits::eComputeShader;
307 case plGALShaderResourceType::Unknown:
308 PL_REPORT_FAILURE(
"Unknown descriptor type");
310 case plGALShaderResourceType::PushConstants:
311 PL_REPORT_FAILURE(
"Push constants should never appear as shader resources");
314 return vk::DescriptorType::eSampler;
316 return vk::DescriptorType::eUniformBuffer;
318 return vk::DescriptorType::eSampledImage;
320 return vk::DescriptorType::eCombinedImageSampler;
322 return vk::DescriptorType::eUniformTexelBuffer;
324 return vk::DescriptorType::eStorageBuffer;
326 return vk::DescriptorType::eStorageImage;
328 return vk::DescriptorType::eStorageTexelBuffer;
330 return vk::DescriptorType::eStorageBuffer;
333 return vk::DescriptorType::eMutableVALVE;
338 return (vk::ShaderStageFlagBits)stages.
GetValue();
343 vk::PipelineStageFlags res;
344 for (
int i = 0; i < plGALShaderStage::ENUM_COUNT; ++i)
346 plGALShaderStageFlags::Enum flag = plGALShaderStageFlags::MakeFromShaderStage((plGALShaderStage::Enum)i);
347 if (stages.
IsSet(flag))
349 res |= GetPipelineStage((plGALShaderStage::Enum)i);
355static_assert((plUInt32)vk::ShaderStageFlagBits::eVertex == (plUInt32)plGALShaderStageFlags::VertexShader);
356static_assert((plUInt32)vk::ShaderStageFlagBits::eTessellationControl == (plUInt32)plGALShaderStageFlags::HullShader);
357static_assert((plUInt32)vk::ShaderStageFlagBits::eTessellationEvaluation == (plUInt32)plGALShaderStageFlags::DomainShader);
358static_assert((plUInt32)vk::ShaderStageFlagBits::eGeometry == (plUInt32)plGALShaderStageFlags::GeometryShader);
359static_assert((plUInt32)vk::ShaderStageFlagBits::eFragment == (plUInt32)plGALShaderStageFlags::PixelShader);
360static_assert((plUInt32)vk::ShaderStageFlagBits::eCompute == (plUInt32)plGALShaderStageFlags::ComputeShader);
bool Contains(const T &value) const
Checks whether the given value can be found in the array. O(n) complexity.
Definition ArrayBase_inl.h:191
Definition DynamicArray.h:81
constexpr PL_ALWAYS_INLINE T Min(T f1, T f2)
Returns the smaller value, f1 or f2.
Definition Math_inl.h:27
The plBitflags class allows you to work with type-safe bitflags.
Definition Bitflags.h:82
PL_ALWAYS_INLINE StorageType GetValue() const
Returns the stored value as the underlying integer type.
Definition Bitflags.h:199
PL_ALWAYS_INLINE bool IsSet(Enum flag) const
Checks if certain flags are set within the bitfield.
Definition Bitflags.h:127
A custom enum implementation that allows to define the underlying storage type to control its memory ...
Definition Enum.h:37
Definition Descriptors.h:220
Enum
Definition Enumerations.h:12
@ TextureRW
Read-write texture view. When set, plGALShaderTextureType is also set. HLSL: RWTexture*.
Definition Enumerations.h:39
@ StructuredBufferRW
Read-write array of structs. HLSL: RWStructuredBuffer<T>, RWByteAddressBuffer, AppendStructuredBuffer...
Definition Enumerations.h:43
@ ConstantBuffer
Read-only struct (plGALBufferHandle). HLSL: cbuffer, ConstantBuffer.
Definition Enumerations.h:18
@ StructuredBuffer
Read-only array of structs. HLSL: StructuredBuffer<T>, ByteAddressBuffer.
Definition Enumerations.h:32
@ Sampler
Texture sampler (plGALSamplerStateHandle). HLSL: SamplerState, SamplerComparisonState.
Definition Enumerations.h:15
@ Texture
Read-only texture view. When set, plGALShaderTextureType is also set. HLSL: Texture*.
Definition Enumerations.h:26
@ TextureAndSampler
Read-only texture view with attached sampler. When set, plGALShaderTextureType is also set....
Definition Enumerations.h:28
@ TexelBuffer
Read-only texel buffer. It's like a 1D texture. HLSL: Buffer.
Definition Enumerations.h:30
@ TexelBufferRW
Read-write texel buffer. It's like a 1D texture. HLSL: RWBuffer.
Definition Enumerations.h:41
Definition Descriptors.h:177
Definition Descriptors.h:201
Definition Descriptors.h:234
plUInt16 m_uiMipLevelToUse
Which MipLevel is accessed with this UAV.
Definition Descriptors.h:238
plUInt32 m_uiArraySize
Number of depth slices for 3D textures.
Definition Descriptors.h:237
plUInt32 m_uiFirstArraySlice
First depth slice for 3D Textures.
Definition Descriptors.h:236