diff options
| author | azhirnov <zh1dron@gmail.com> | 2020-10-25 12:53:05 +0000 |
|---|---|---|
| committer | azhirnov <zh1dron@gmail.com> | 2020-10-25 13:08:57 +0000 |
| commit | 7f26e40e0898391a32e6a05d91ef1a217d885668 (patch) | |
| tree | 3236316d1a752e5dbbfae863f8180ff994b31d70 /Graphics/GraphicsEngine | |
| parent | Merge branch 'master' into ray_tracing (diff) | |
| download | DiligentCore-7f26e40e0898391a32e6a05d91ef1a217d885668.tar.gz DiligentCore-7f26e40e0898391a32e6a05d91ef1a217d885668.zip | |
PSO refactoring for ray tracing
Diffstat (limited to 'Graphics/GraphicsEngine')
| -rw-r--r-- | Graphics/GraphicsEngine/include/PipelineStateBase.hpp | 212 | ||||
| -rw-r--r-- | Graphics/GraphicsEngine/interface/APIInfo.h | 120 | ||||
| -rw-r--r-- | Graphics/GraphicsEngine/interface/Constants.h | 4 | ||||
| -rw-r--r-- | Graphics/GraphicsEngine/interface/GraphicsTypes.h | 15 | ||||
| -rw-r--r-- | Graphics/GraphicsEngine/interface/PipelineState.h | 92 | ||||
| -rw-r--r-- | Graphics/GraphicsEngine/interface/RenderDevice.h | 42 | ||||
| -rw-r--r-- | Graphics/GraphicsEngine/interface/Shader.h | 7 | ||||
| -rw-r--r-- | Graphics/GraphicsEngine/src/APIInfo.cpp | 4 | ||||
| -rw-r--r-- | Graphics/GraphicsEngine/src/PipelineStateBase.cpp | 58 |
9 files changed, 431 insertions, 123 deletions
diff --git a/Graphics/GraphicsEngine/include/PipelineStateBase.hpp b/Graphics/GraphicsEngine/include/PipelineStateBase.hpp index 1effd32f..42b3e16a 100644 --- a/Graphics/GraphicsEngine/include/PipelineStateBase.hpp +++ b/Graphics/GraphicsEngine/include/PipelineStateBase.hpp @@ -39,12 +39,14 @@ #include "EngineMemory.h" #include "GraphicsAccessories.hpp" #include "LinearAllocator.hpp" +#include "HashUtils.hpp" namespace Diligent { void ValidateGraphicsPipelineCreateInfo(const GraphicsPipelineStateCreateInfo& CreateInfo) noexcept(false); void ValidateComputePipelineCreateInfo(const ComputePipelineStateCreateInfo& CreateInfo) noexcept(false); +void ValidateRayTracingPipelineCreateInfo(const RayTracingPipelineStateCreateInfo& CreateInfo) noexcept(false); void CorrectGraphicsPipelineDesc(GraphicsPipelineDesc& GraphicsPipeline) noexcept; @@ -108,6 +110,20 @@ public: ValidateComputePipelineCreateInfo(ComputePipelineCI); } + /// \param pRefCounters - Reference counters object that controls the lifetime of this PSO + /// \param pDevice - Pointer to the device. + /// \param RayTracingPipelineCI - Ray tracing pipeline create information. + /// \param bIsDeviceInternal - Flag indicating if the pipeline state is an internal device object and + /// must not keep a strong reference to the device. + PipelineStateBase(IReferenceCounters* pRefCounters, + RenderDeviceImplType* pDevice, + const RayTracingPipelineStateCreateInfo& RayTracingPipelineCI, + bool bIsDeviceInternal = false) : + PipelineStateBase{pRefCounters, pDevice, RayTracingPipelineCI.PSODesc, bIsDeviceInternal} + { + ValidateRayTracingPipelineCreateInfo(ComputePipelineCI); + } + ~PipelineStateBase() { @@ -130,6 +146,15 @@ public: */ } + void Destruct() + { + if (this->m_Desc.IsRayTracingPipeline() && m_pRayTracingPipelineData) + { + m_pRayTracingPipelineData->~RayTracingPipelineData(); + m_pRayTracingPipelineData = nullptr; + } + } + IMPLEMENT_QUERY_INTERFACE_IN_PLACE(IID_PipelineState, TDeviceObjectBase) Uint32 GetBufferStride(Uint32 BufferSlot) const @@ -159,7 +184,58 @@ public: return *m_pGraphicsPipelineDesc; } + virtual const RayTracingPipelineDesc& DILIGENT_CALL_TYPE GetRayTracingPipelineDesc() const override final + { + VERIFY_EXPR(this->m_Desc.IsRayTracingPipeline()); + VERIFY_EXPR(m_pRayTracingPipelineData != nullptr); + return m_pRayTracingPipelineData->Desc; + } + + virtual Uint32 DILIGENT_CALL_TYPE GetShaderGroupCount() const override final + { + VERIFY_EXPR(this->m_Desc.IsRayTracingPipeline()); + VERIFY_EXPR(m_pRayTracingPipelineData != nullptr); + return static_cast<Uint32>(m_pRayTracingPipelineData->NameToGroupIndex.size()); + } + + static constexpr Uint32 InvalidShaderGroupIndex = ~0u; + + virtual Uint32 DILIGENT_CALL_TYPE GetShaderGroupIndex(const char* Name) const override final + { + VERIFY_EXPR(Name != nullptr && Name[0] != '\0'); + VERIFY_EXPR(this->m_Desc.IsRayTracingPipeline()); + VERIFY_EXPR(m_pRayTracingPipelineData != nullptr); + + auto iter = m_pRayTracingPipelineData->NameToGroupIndex.find(Name); + if (iter != m_pRayTracingPipelineData->NameToGroupIndex.end()) + return iter->second; + + UNEXPECTED("Can't find shader group with specified name"); + return InvalidShaderGroupIndex; + } + + inline void CopyShaderHandle(const char* Name, void* pData, Uint32 DataSize) const + { + VERIFY_EXPR(Name != nullptr && Name[0] != '\0'); + VERIFY_EXPR(this->m_Desc.IsRayTracingPipeline()); + VERIFY_EXPR(m_pRayTracingPipelineData != nullptr); + + const auto ShaderHandleSize = m_pRayTracingPipelineData->ShaderHandleSize; + VERIFY_EXPR(ShaderHandleSize <= DataSize); + + auto iter = m_pRayTracingPipelineData->NameToGroupIndex.find(Name); + if (iter != m_pRayTracingPipelineData->NameToGroupIndex.end()) + { + VERIFY_EXPR(ShaderHandleSize * (iter->second + 1) <= m_pRayTracingPipelineData->ShaderDataSize); + std::memcpy(pData, &m_pRayTracingPipelineData->Shaders[ShaderHandleSize * iter->second], ShaderHandleSize); + return; + } + UNEXPECTED("Can't find shader group with specified name"); + } + protected: + using TNameToGroupIndexMap = std::unordered_map<HashMapStringKey, Uint32, HashMapStringKey::Hasher>; + Int8 GetStaticVariableCountHelper(SHADER_TYPE ShaderType, const std::array<Int8, MAX_SHADERS_IN_PIPELINE>& ResourceLayoutIndex) const { if (!IsConsistentShaderType(ShaderType, this->m_Desc.PipelineType)) @@ -237,6 +313,9 @@ protected: } MemPool.AddSpace<Uint32>(m_BufferSlotsUsed); + + static_assert(std::is_trivially_destructible<decltype(*this->m_pGraphicsPipelineDesc)>::value, "add destructor for this object"); + static_assert(std::is_trivially_destructible<decltype(*InputLayout.LayoutElements)>::value, "add destructor for this object"); } void ReserveSpaceForPipelineDesc(const ComputePipelineStateCreateInfo& CreateInfo, @@ -245,12 +324,40 @@ protected: ReserveResourceLayout(CreateInfo.PSODesc.ResourceLayout, MemPool); } + void ReserveSpaceForPipelineDesc(const RayTracingPipelineStateCreateInfo& CreateInfo, + Uint32 ShaderHandleSize, + LinearAllocator& MemPool) const noexcept + { + ReserveResourceLayout(CreateInfo.PSODesc.ResourceLayout, MemPool); + + for (Uint32 i = 0; i < CreateInfo.GeneralShaderCount; ++i) + { + MemPool.AddSpaceForString(CreateInfo.pGeneralShaders[i].Name); + } + for (Uint32 i = 0; i < CreateInfo.TriangleHitShaderCount; ++i) + { + MemPool.AddSpaceForString(CreateInfo.pTriangleHitShaders[i].Name); + } + for (Uint32 i = 0; i < CreateInfo.ProceduralHitShaderCount; ++i) + { + MemPool.AddSpaceForString(CreateInfo.pProceduralHitShaders[i].Name); + } + + size_t RTDataSize = sizeof(RayTracingPipelineData); + // reserve size for shader handles + RTDataSize += ShaderHandleSize * (CreateInfo.GeneralShaderCount + CreateInfo.TriangleHitShaderCount + CreateInfo.ProceduralHitShaderCount); + // 1 byte reserved to avoid compiler errors on zero sized arrays + RTDataSize -= sizeof(RayTracingPipelineData::Shaders); + MemPool.AddSpace(RTDataSize, alignof(RayTracingPipelineData)); + } + template <typename ShaderImplType, typename TShaderStages> void ExtractShaders(const GraphicsPipelineStateCreateInfo& CreateInfo, TShaderStages& ShaderStages) { VERIFY(m_NumShaderStages == 0, "The number of shader stages is not zero! ExtractShaders must only be called once."); + VERIFY_EXPR(this->m_Desc.IsAnyGraphicsPipeline()); ShaderStages.clear(); auto AddShaderStage = [&](IShader* pShader) { @@ -297,6 +404,7 @@ protected: TShaderStages& ShaderStages) { VERIFY(m_NumShaderStages == 0, "The number of shader stages is not zero! ExtractShaders must only be called once."); + VERIFY_EXPR(this->m_Desc.IsComputePipeline()); ShaderStages.clear(); @@ -310,6 +418,70 @@ protected: VERIFY_EXPR(!ShaderStages.empty() && ShaderStages.size() == m_NumShaderStages); } + template <typename ShaderImplType, typename TShaderStages> + void ExtractShaders(const RayTracingPipelineStateCreateInfo& CreateInfo, + TShaderStages& ShaderStages) + { + VERIFY(m_NumShaderStages == 0, "The number of shader stages is not zero! ExtractShaders must only be called once."); + VERIFY_EXPR(this->m_Desc.IsRayTracingPipeline()); + + std::unordered_set<IShader*> UniqueShaders; + + auto AddShaderStage = [&ShaderStages, &UniqueShaders](IShader* pShader) { + if (pShader != nullptr && UniqueShaders.insert(pShader).second) + { + auto ShaderType = pShader->GetDesc().ShaderType; + ShaderStages[GetShaderTypePipelineIndex(ShaderType, PIPELINE_TYPE_RAY_TRACING)].Append(ValidatedCast<ShaderImplType>(pShader)); + } + }; + + ShaderStages.clear(); + ShaderStages.resize(6); + ShaderStages[GetShaderTypePipelineIndex(SHADER_TYPE_RAY_GEN, PIPELINE_TYPE_RAY_TRACING)].Type = SHADER_TYPE_RAY_GEN; + ShaderStages[GetShaderTypePipelineIndex(SHADER_TYPE_RAY_MISS, PIPELINE_TYPE_RAY_TRACING)].Type = SHADER_TYPE_RAY_MISS; + ShaderStages[GetShaderTypePipelineIndex(SHADER_TYPE_RAY_CLOSEST_HIT, PIPELINE_TYPE_RAY_TRACING)].Type = SHADER_TYPE_RAY_CLOSEST_HIT; + ShaderStages[GetShaderTypePipelineIndex(SHADER_TYPE_RAY_ANY_HIT, PIPELINE_TYPE_RAY_TRACING)].Type = SHADER_TYPE_RAY_ANY_HIT; + ShaderStages[GetShaderTypePipelineIndex(SHADER_TYPE_RAY_INTERSECTION, PIPELINE_TYPE_RAY_TRACING)].Type = SHADER_TYPE_RAY_INTERSECTION; + ShaderStages[GetShaderTypePipelineIndex(SHADER_TYPE_CALLABLE, PIPELINE_TYPE_RAY_TRACING)].Type = SHADER_TYPE_CALLABLE; + + for (Uint32 i = 0; i < CreateInfo.GeneralShaderCount; ++i) + { + AddShaderStage(CreateInfo.pGeneralShaders[i].pShader); + } + for (Uint32 i = 0; i < CreateInfo.TriangleHitShaderCount; ++i) + { + AddShaderStage(CreateInfo.pTriangleHitShaders[i].pClosestHitShader); + AddShaderStage(CreateInfo.pTriangleHitShaders[i].pAnyHitShader); + } + for (Uint32 i = 0; i < CreateInfo.ProceduralHitShaderCount; ++i) + { + AddShaderStage(CreateInfo.pProceduralHitShaders[i].pIntersectionShader); + AddShaderStage(CreateInfo.pProceduralHitShaders[i].pClosestHitShader); + AddShaderStage(CreateInfo.pProceduralHitShaders[i].pAnyHitShader); + } + + if (ShaderStages[GetShaderTypePipelineIndex(SHADER_TYPE_RAY_GEN, PIPELINE_TYPE_RAY_TRACING)].Count() == 0) + LOG_ERROR_AND_THROW("At least one shader with type SHADER_TYPE_RAY_GEN must be provided"); + + if (ShaderStages[GetShaderTypePipelineIndex(SHADER_TYPE_RAY_MISS, PIPELINE_TYPE_RAY_TRACING)].Count() == 0) + LOG_ERROR_AND_THROW("At least one shader with type SHADER_TYPE_RAY_MISS must be provided"); + + // remove empty stages + for (auto iter = ShaderStages.begin(); iter != ShaderStages.end();) + { + if (iter->Count() == 0) + { + iter = ShaderStages.erase(iter); + continue; + } + + m_ShaderStageTypes[m_NumShaderStages++] = iter->Type; + ++iter; + } + + VERIFY_EXPR(!ShaderStages.empty() && ShaderStages.size() == m_NumShaderStages); + } + void InitializePipelineDesc(const GraphicsPipelineStateCreateInfo& CreateInfo, LinearAllocator& MemPool) @@ -447,6 +619,28 @@ protected: CopyResourceLayout(CreateInfo.PSODesc.ResourceLayout, this->m_Desc.ResourceLayout, MemPool); } + void InitializePipelineDesc(const RayTracingPipelineStateCreateInfo& CreateInfo, + Uint32 ShaderHandleSize, + TNameToGroupIndexMap&& NameToGroupIndex, + LinearAllocator& MemPool) noexcept + { + CopyResourceLayout(CreateInfo.PSODesc.ResourceLayout, this->m_Desc.ResourceLayout, MemPool); + + size_t RTDataSize = sizeof(RayTracingPipelineData); + // reserve size for shader handles + const Uint32 ShaderDataSize = ShaderHandleSize * (CreateInfo.GeneralShaderCount + CreateInfo.TriangleHitShaderCount + CreateInfo.ProceduralHitShaderCount); + RTDataSize += ShaderDataSize; + // 1 byte reserved to avoid compiler errors on zero sized arrays + RTDataSize -= sizeof(RayTracingPipelineData::Shaders); + + this->m_pRayTracingPipelineData = static_cast<RayTracingPipelineData*>(MemPool.Allocate(RTDataSize, alignof(RayTracingPipelineData))); + new (this->m_pRayTracingPipelineData) RayTracingPipelineData{}; + this->m_pRayTracingPipelineData->ShaderHandleSize = ShaderHandleSize; + this->m_pRayTracingPipelineData->Desc = CreateInfo.RayTracingPipeline; + this->m_pRayTracingPipelineData->ShaderDataSize = ShaderDataSize; + this->m_pRayTracingPipelineData->NameToGroupIndex = std::move(NameToGroupIndex); + } + private: static void ReserveResourceLayout(const PipelineResourceLayoutDesc& SrcLayout, LinearAllocator& MemPool) noexcept { @@ -469,6 +663,9 @@ private: MemPool.AddSpaceForString(SrcLayout.ImmutableSamplers[i].SamplerOrTextureName); } } + + static_assert(std::is_trivially_destructible<decltype(*SrcLayout.Variables)>::value, "add destructor for this object"); + static_assert(std::is_trivially_destructible<decltype(*SrcLayout.ImmutableSamplers)>::value, "add destructor for this object"); } static void CopyResourceLayout(const PipelineResourceLayoutDesc& SrcLayout, PipelineResourceLayoutDesc& DstLayout, LinearAllocator& MemPool) @@ -525,7 +722,20 @@ protected: RefCntAutoPtr<IRenderPass> m_pRenderPass; ///< Strong reference to the render pass object - GraphicsPipelineDesc* m_pGraphicsPipelineDesc = nullptr; + struct RayTracingPipelineData + { + RayTracingPipelineDesc Desc; + TNameToGroupIndexMap NameToGroupIndex; + Uint32 ShaderHandleSize; + Uint32 ShaderDataSize; + Uint8 Shaders[1]; + }; + + union + { + GraphicsPipelineDesc* m_pGraphicsPipelineDesc; + RayTracingPipelineData* m_pRayTracingPipelineData; + }; }; } // namespace Diligent diff --git a/Graphics/GraphicsEngine/interface/APIInfo.h b/Graphics/GraphicsEngine/interface/APIInfo.h index 0ecbd92b..9b502659 100644 --- a/Graphics/GraphicsEngine/interface/APIInfo.h +++ b/Graphics/GraphicsEngine/interface/APIInfo.h @@ -39,65 +39,67 @@ DILIGENT_BEGIN_NAMESPACE(Diligent) /// Diligent API Info. This tructure can be used to verify API compatibility. struct APIInfo { - size_t StructSize DEFAULT_INITIALIZER(0); - int APIVersion DEFAULT_INITIALIZER(0); - size_t RenderTargetBlendDescSize DEFAULT_INITIALIZER(0); - size_t BlendStateDescSize DEFAULT_INITIALIZER(0); - size_t BufferDescSize DEFAULT_INITIALIZER(0); - size_t BufferDataSize DEFAULT_INITIALIZER(0); - size_t BufferFormatSize DEFAULT_INITIALIZER(0); - size_t BufferViewDescSize DEFAULT_INITIALIZER(0); - size_t StencilOpDescSize DEFAULT_INITIALIZER(0); - size_t DepthStencilStateDescSize DEFAULT_INITIALIZER(0); - size_t SamplerCapsSize DEFAULT_INITIALIZER(0); - size_t TextureCapsSize DEFAULT_INITIALIZER(0); - size_t DeviceCapsSize DEFAULT_INITIALIZER(0); - size_t DrawAttribsSize DEFAULT_INITIALIZER(0); - size_t DispatchComputeAttribsSize DEFAULT_INITIALIZER(0); - size_t ViewportSize DEFAULT_INITIALIZER(0); - size_t RectSize DEFAULT_INITIALIZER(0); - size_t CopyTextureAttribsSize DEFAULT_INITIALIZER(0); - size_t DeviceObjectAttribsSize DEFAULT_INITIALIZER(0); - size_t GraphicsAdapterInfoSize DEFAULT_INITIALIZER(0); - size_t DisplayModeAttribsSize DEFAULT_INITIALIZER(0); - size_t SwapChainDescSize DEFAULT_INITIALIZER(0); - size_t FullScreenModeDescSize DEFAULT_INITIALIZER(0); - size_t EngineCreateInfoSize DEFAULT_INITIALIZER(0); - size_t EngineGLCreateInfoSize DEFAULT_INITIALIZER(0); - size_t EngineD3D11CreateInfoSize DEFAULT_INITIALIZER(0); - size_t EngineD3D12CreateInfoSize DEFAULT_INITIALIZER(0); - size_t EngineVkCreateInfoSize DEFAULT_INITIALIZER(0); - size_t EngineMtlCreateInfoSize DEFAULT_INITIALIZER(0); - size_t BoxSize DEFAULT_INITIALIZER(0); - size_t TextureFormatAttribsSize DEFAULT_INITIALIZER(0); - size_t TextureFormatInfoSize DEFAULT_INITIALIZER(0); - size_t TextureFormatInfoExtSize DEFAULT_INITIALIZER(0); - size_t StateTransitionDescSize DEFAULT_INITIALIZER(0); - size_t LayoutElementSize DEFAULT_INITIALIZER(0); - size_t InputLayoutDescSize DEFAULT_INITIALIZER(0); - size_t SampleDescSize DEFAULT_INITIALIZER(0); - size_t ShaderResourceVariableDescSize DEFAULT_INITIALIZER(0); - size_t ImmutableSamplerDescSize DEFAULT_INITIALIZER(0); - size_t PipelineResourceLayoutDescSize DEFAULT_INITIALIZER(0); - size_t GraphicsPipelineDescSize DEFAULT_INITIALIZER(0); - size_t GraphicsPipelineStateCreateInfoSize DEFAULT_INITIALIZER(0); - size_t ComputePipelineStateCreateInfoSize DEFAULT_INITIALIZER(0); - size_t PipelineStateDescSize DEFAULT_INITIALIZER(0); - size_t RasterizerStateDescSize DEFAULT_INITIALIZER(0); - size_t ResourceMappingEntrySize DEFAULT_INITIALIZER(0); - size_t ResourceMappingDescSize DEFAULT_INITIALIZER(0); - size_t SamplerDescSize DEFAULT_INITIALIZER(0); - size_t ShaderDescSize DEFAULT_INITIALIZER(0); - size_t ShaderMacroSize DEFAULT_INITIALIZER(0); - size_t ShaderCreateInfoSize DEFAULT_INITIALIZER(0); - size_t ShaderResourceDescSize DEFAULT_INITIALIZER(0); - size_t DepthStencilClearValueSize DEFAULT_INITIALIZER(0); - size_t OptimizedClearValueSize DEFAULT_INITIALIZER(0); - size_t TextureDescSize DEFAULT_INITIALIZER(0); - size_t TextureSubResDataSize DEFAULT_INITIALIZER(0); - size_t TextureDataSize DEFAULT_INITIALIZER(0); - size_t MappedTextureSubresourceSize DEFAULT_INITIALIZER(0); - size_t TextureViewDescSize DEFAULT_INITIALIZER(0); + size_t StructSize DEFAULT_INITIALIZER(0); + int APIVersion DEFAULT_INITIALIZER(0); + size_t RenderTargetBlendDescSize DEFAULT_INITIALIZER(0); + size_t BlendStateDescSize DEFAULT_INITIALIZER(0); + size_t BufferDescSize DEFAULT_INITIALIZER(0); + size_t BufferDataSize DEFAULT_INITIALIZER(0); + size_t BufferFormatSize DEFAULT_INITIALIZER(0); + size_t BufferViewDescSize DEFAULT_INITIALIZER(0); + size_t StencilOpDescSize DEFAULT_INITIALIZER(0); + size_t DepthStencilStateDescSize DEFAULT_INITIALIZER(0); + size_t SamplerCapsSize DEFAULT_INITIALIZER(0); + size_t TextureCapsSize DEFAULT_INITIALIZER(0); + size_t DeviceCapsSize DEFAULT_INITIALIZER(0); + size_t DrawAttribsSize DEFAULT_INITIALIZER(0); + size_t DispatchComputeAttribsSize DEFAULT_INITIALIZER(0); + size_t ViewportSize DEFAULT_INITIALIZER(0); + size_t RectSize DEFAULT_INITIALIZER(0); + size_t CopyTextureAttribsSize DEFAULT_INITIALIZER(0); + size_t DeviceObjectAttribsSize DEFAULT_INITIALIZER(0); + size_t GraphicsAdapterInfoSize DEFAULT_INITIALIZER(0); + size_t DisplayModeAttribsSize DEFAULT_INITIALIZER(0); + size_t SwapChainDescSize DEFAULT_INITIALIZER(0); + size_t FullScreenModeDescSize DEFAULT_INITIALIZER(0); + size_t EngineCreateInfoSize DEFAULT_INITIALIZER(0); + size_t EngineGLCreateInfoSize DEFAULT_INITIALIZER(0); + size_t EngineD3D11CreateInfoSize DEFAULT_INITIALIZER(0); + size_t EngineD3D12CreateInfoSize DEFAULT_INITIALIZER(0); + size_t EngineVkCreateInfoSize DEFAULT_INITIALIZER(0); + size_t EngineMtlCreateInfoSize DEFAULT_INITIALIZER(0); + size_t BoxSize DEFAULT_INITIALIZER(0); + size_t TextureFormatAttribsSize DEFAULT_INITIALIZER(0); + size_t TextureFormatInfoSize DEFAULT_INITIALIZER(0); + size_t TextureFormatInfoExtSize DEFAULT_INITIALIZER(0); + size_t StateTransitionDescSize DEFAULT_INITIALIZER(0); + size_t LayoutElementSize DEFAULT_INITIALIZER(0); + size_t InputLayoutDescSize DEFAULT_INITIALIZER(0); + size_t SampleDescSize DEFAULT_INITIALIZER(0); + size_t ShaderResourceVariableDescSize DEFAULT_INITIALIZER(0); + size_t ImmutableSamplerDescSize DEFAULT_INITIALIZER(0); + size_t PipelineResourceLayoutDescSize DEFAULT_INITIALIZER(0); + size_t PipelineStateDescSize DEFAULT_INITIALIZER(0); + size_t GraphicsPipelineDescSize DEFAULT_INITIALIZER(0); + size_t GraphicsPipelineStateCreateInfoSize DEFAULT_INITIALIZER(0); + size_t ComputePipelineStateCreateInfoSize DEFAULT_INITIALIZER(0); + size_t RayTracingPipelineDescSize DEFAULT_INITIALIZER(0); + size_t RayTracingPipelineStateCreateInfoSize DEFAULT_INITIALIZER(0); + size_t RasterizerStateDescSize DEFAULT_INITIALIZER(0); + size_t ResourceMappingEntrySize DEFAULT_INITIALIZER(0); + size_t ResourceMappingDescSize DEFAULT_INITIALIZER(0); + size_t SamplerDescSize DEFAULT_INITIALIZER(0); + size_t ShaderDescSize DEFAULT_INITIALIZER(0); + size_t ShaderMacroSize DEFAULT_INITIALIZER(0); + size_t ShaderCreateInfoSize DEFAULT_INITIALIZER(0); + size_t ShaderResourceDescSize DEFAULT_INITIALIZER(0); + size_t DepthStencilClearValueSize DEFAULT_INITIALIZER(0); + size_t OptimizedClearValueSize DEFAULT_INITIALIZER(0); + size_t TextureDescSize DEFAULT_INITIALIZER(0); + size_t TextureSubResDataSize DEFAULT_INITIALIZER(0); + size_t TextureDataSize DEFAULT_INITIALIZER(0); + size_t MappedTextureSubresourceSize DEFAULT_INITIALIZER(0); + size_t TextureViewDescSize DEFAULT_INITIALIZER(0); }; typedef struct APIInfo APIInfo; diff --git a/Graphics/GraphicsEngine/interface/Constants.h b/Graphics/GraphicsEngine/interface/Constants.h index 9cd45c4d..b00f2de2 100644 --- a/Graphics/GraphicsEngine/interface/Constants.h +++ b/Graphics/GraphicsEngine/interface/Constants.h @@ -51,8 +51,8 @@ static const Uint32 MAX_RENDER_TARGETS = DILIGENT_MAX_RENDER_TARGETS; static const Uint32 MAX_VIEWPORTS = DILIGENT_MAX_VIEWPORTS; /// Maximum number of shader stages in a pipeline. -/// (Vertex, Hull, Domain, Geometry, Pixel) or (Amplification, Mesh, Pixel), or (Compute) -static const Uint32 MAX_SHADERS_IN_PIPELINE = 5; +/// (Vertex, Hull, Domain, Geometry, Pixel) or (Amplification, Mesh, Pixel), or (Compute) or (RayGen, Miss, ClosestHit, AnyHit, Intersection, Callable) +static const Uint32 MAX_SHADERS_IN_PIPELINE = 6; // clang-format on diff --git a/Graphics/GraphicsEngine/interface/GraphicsTypes.h b/Graphics/GraphicsEngine/interface/GraphicsTypes.h index 85dbcff6..10a84f1d 100644 --- a/Graphics/GraphicsEngine/interface/GraphicsTypes.h +++ b/Graphics/GraphicsEngine/interface/GraphicsTypes.h @@ -2117,6 +2117,7 @@ struct VulkanDescriptorPoolSize Uint32 NumUniformTexelBufferDescriptors DEFAULT_INITIALIZER(0); Uint32 NumStorageTexelBufferDescriptors DEFAULT_INITIALIZER(0); Uint32 NumInputAttachmentDescriptors DEFAULT_INITIALIZER(0); + Uint32 NumAccelStructDescriptors DEFAULT_INITIALIZER(0); #if DILIGENT_CPP_INTERFACE VulkanDescriptorPoolSize()noexcept {} @@ -2130,7 +2131,8 @@ struct VulkanDescriptorPoolSize Uint32 _NumStorageBufferDescriptors, Uint32 _NumUniformTexelBufferDescriptors, Uint32 _NumStorageTexelBufferDescriptors, - Uint32 _NumInputAttachmentDescriptors)noexcept : + Uint32 _NumInputAttachmentDescriptors, + Uint32 _NumAccelStructDescriptors)noexcept : MaxDescriptorSets {_MaxDescriptorSets }, NumSeparateSamplerDescriptors {_NumSeparateSamplerDescriptors }, NumCombinedSamplerDescriptors {_NumCombinedSamplerDescriptors }, @@ -2140,7 +2142,8 @@ struct VulkanDescriptorPoolSize NumStorageBufferDescriptors {_NumStorageBufferDescriptors }, NumUniformTexelBufferDescriptors{_NumUniformTexelBufferDescriptors}, NumStorageTexelBufferDescriptors{_NumStorageTexelBufferDescriptors}, - NumInputAttachmentDescriptors {_NumInputAttachmentDescriptors } + NumInputAttachmentDescriptors {_NumInputAttachmentDescriptors }, + NumAccelStructDescriptors {_NumAccelStructDescriptors } { // On clang aggregate initialization fails to compile if // structure members have default initializers @@ -2178,8 +2181,8 @@ struct EngineVkCreateInfo DILIGENT_DERIVE(EngineCreateInfo) /// the engine creates another one. VulkanDescriptorPoolSize MainDescriptorPoolSize #if DILIGENT_CPP_INTERFACE - //Max SepSm CmbSm SmpImg StrImg UB SB UTxB StTxB InptAtt - {8192, 1024, 8192, 8192, 1024, 4096, 4096, 1024, 1024, 256} + //Max SepSm CmbSm SmpImg StrImg UB SB UTxB StTxB InptAtt AccelSt + {8192, 1024, 8192, 8192, 1024, 4096, 4096, 1024, 1024, 256, 256} #endif ; @@ -2190,8 +2193,8 @@ struct EngineVkCreateInfo DILIGENT_DERIVE(EngineCreateInfo) VulkanDescriptorPoolSize DynamicDescriptorPoolSize #if DILIGENT_CPP_INTERFACE - //Max SepSm CmbSm SmpImg StrImg UB SB UTxB StTxB InptAtt - {2048, 256, 2048, 2048, 256, 1024, 1024, 256, 256, 64} + //Max SepSm CmbSm SmpImg StrImg UB SB UTxB StTxB InptAtt AccelSt + {2048, 256, 2048, 2048, 256, 1024, 1024, 256, 256, 64, 64} #endif ; diff --git a/Graphics/GraphicsEngine/interface/PipelineState.h b/Graphics/GraphicsEngine/interface/PipelineState.h index f953b851..e45dc703 100644 --- a/Graphics/GraphicsEngine/interface/PipelineState.h +++ b/Graphics/GraphicsEngine/interface/PipelineState.h @@ -215,24 +215,14 @@ struct GraphicsPipelineDesc typedef struct GraphicsPipelineDesc GraphicsPipelineDesc; -/// Compute pipeline state description - -/// This structure describes the compute pipeline state and is part of the PipelineStateDesc structure. -struct ComputePipelineDesc -{ - /// Compute shader to be used with the pipeline - IShader* pCS DEFAULT_INITIALIZER(nullptr); -}; -typedef struct ComputePipelineDesc ComputePipelineDesc; - /// AZ TODO struct RayTracingGeneralShaderGroup { /// AZ TODO - const char* Name DEFAULT_INITIALIZER(nullptr); + const char* Name DEFAULT_INITIALIZER(nullptr); /// AZ TODO - IShader* Shader DEFAULT_INITIALIZER(nullptr); + IShader* pShader DEFAULT_INITIALIZER(nullptr); }; typedef struct RayTracingGeneralShaderGroup RayTracingGeneralShaderGroup; @@ -240,13 +230,13 @@ typedef struct RayTracingGeneralShaderGroup RayTracingGeneralShaderGroup; struct RayTracingTriangleHitShaderGroup { /// AZ TODO - const char* Name DEFAULT_INITIALIZER(nullptr); + const char* Name DEFAULT_INITIALIZER(nullptr); /// AZ TODO - IShader* ClosestHitShader DEFAULT_INITIALIZER(nullptr); + IShader* pClosestHitShader DEFAULT_INITIALIZER(nullptr); /// AZ TODO - IShader* AnyHitShader DEFAULT_INITIALIZER(nullptr); // can be null + IShader* pAnyHitShader DEFAULT_INITIALIZER(nullptr); // can be null }; typedef struct RayTracingTriangleHitShaderGroup RayTracingTriangleHitShaderGroup; @@ -254,16 +244,16 @@ typedef struct RayTracingTriangleHitShaderGroup RayTracingTriangleHitShaderGroup struct RayTracingProceduralHitShaderGroup { /// AZ TODO - const char* Name DEFAULT_INITIALIZER(nullptr); + const char* Name DEFAULT_INITIALIZER(nullptr); /// AZ TODO - IShader* IntersectionShader DEFAULT_INITIALIZER(nullptr); + IShader* pIntersectionShader DEFAULT_INITIALIZER(nullptr); /// AZ TODO - IShader* ClosestHitShader DEFAULT_INITIALIZER(nullptr); // can be null + IShader* pClosestHitShader DEFAULT_INITIALIZER(nullptr); // can be null /// AZ TODO - IShader* AnyHitShader DEFAULT_INITIALIZER(nullptr); // can be null + IShader* pAnyHitShader DEFAULT_INITIALIZER(nullptr); // can be null }; typedef struct RayTracingProceduralHitShaderGroup RayTracingProceduralHitShaderGroup; @@ -271,25 +261,7 @@ typedef struct RayTracingProceduralHitShaderGroup RayTracingProceduralHitShaderG struct RayTracingPipelineDesc { /// AZ TODO - const RayTracingGeneralShaderGroup* pGeneralShaders DEFAULT_INITIALIZER(nullptr); - - /// AZ TODO - const RayTracingTriangleHitShaderGroup* pTriangleHitShaders DEFAULT_INITIALIZER(nullptr); - - /// AZ TODO - const RayTracingProceduralHitShaderGroup* pProceduralHitShaders DEFAULT_INITIALIZER(nullptr); - - /// AZ TODO - Uint16 GeneralShaderCount DEFAULT_INITIALIZER(0); - - /// AZ TODO - Uint16 TriangleHitShaderCount DEFAULT_INITIALIZER(0); - - /// AZ TODO - Uint16 ProceduralHitShaderCount DEFAULT_INITIALIZER(0); - - /// AZ TODO - Uint8 MaxRecursionDepth DEFAULT_INITIALIZER(0); // must be 0..31 (check current device limits) + Uint8 MaxRecursionDepth DEFAULT_INITIALIZER(0); // must be 0..31 (check current device limits) }; typedef struct RayTracingPipelineDesc RayTracingPipelineDesc; @@ -308,6 +280,8 @@ DILIGENT_TYPED_ENUM(PIPELINE_TYPE, Uint8) /// Ray tracing pipeline, which is used by IDeviceContext::TraceRays(). PIPELINE_TYPE_RAY_TRACING, + + PIPELINE_TYPE_LAST = PIPELINE_TYPE_RAY_TRACING }; @@ -332,6 +306,7 @@ struct PipelineStateDesc DILIGENT_DERIVE(DeviceObjectAttribs) #if DILIGENT_CPP_INTERFACE bool IsAnyGraphicsPipeline() const { return PipelineType == PIPELINE_TYPE_GRAPHICS || PipelineType == PIPELINE_TYPE_MESH; } bool IsComputePipeline() const { return PipelineType == PIPELINE_TYPE_COMPUTE; } + bool IsRayTracingPipeline() const { return PipelineType == PIPELINE_TYPE_RAY_TRACING; } #endif }; typedef struct PipelineStateDesc PipelineStateDesc; @@ -420,6 +395,33 @@ struct ComputePipelineStateCreateInfo DILIGENT_DERIVE(PipelineStateCreateInfo) typedef struct ComputePipelineStateCreateInfo ComputePipelineStateCreateInfo; +/// Ray tracing pipeline state description. +struct RayTracingPipelineStateCreateInfo DILIGENT_DERIVE(PipelineStateCreateInfo) + + /// AZ TODO + RayTracingPipelineDesc RayTracingPipeline; + + /// AZ TODO + const RayTracingGeneralShaderGroup* pGeneralShaders DEFAULT_INITIALIZER(nullptr); + + /// AZ TODO + const RayTracingTriangleHitShaderGroup* pTriangleHitShaders DEFAULT_INITIALIZER(nullptr); // can be null + + /// AZ TODO + const RayTracingProceduralHitShaderGroup* pProceduralHitShaders DEFAULT_INITIALIZER(nullptr); // can be null + + /// AZ TODO + Uint16 GeneralShaderCount DEFAULT_INITIALIZER(0); + + /// AZ TODO + Uint16 TriangleHitShaderCount DEFAULT_INITIALIZER(0); + + /// AZ TODO + Uint16 ProceduralHitShaderCount DEFAULT_INITIALIZER(0); +}; +typedef struct RayTracingPipelineStateCreateInfo RayTracingPipelineStateCreateInfo; + + // {06084AE5-6A71-4FE8-84B9-395DD489A28C} static const struct INTERFACE_ID IID_PipelineState = {0x6084ae5, 0x6a71, 0x4fe8, {0x84, 0xb9, 0x39, 0x5d, 0xd4, 0x89, 0xa2, 0x8c}}; @@ -444,6 +446,10 @@ DILIGENT_BEGIN_INTERFACE(IPipelineState, IDeviceObject) /// Returns the graphics pipeline description used to create the object. /// This method must only be called for a graphics or mesh pipeline. VIRTUAL const GraphicsPipelineDesc REF METHOD(GetGraphicsPipelineDesc)(THIS) CONST PURE; + + /// Returns the ray tracing pipeline description used to create the object. + /// This method must only be called for a ray tracing pipeline. + VIRTUAL const RayTracingPipelineDesc REF METHOD(GetRayTracingPipelineDesc)(THIS) CONST PURE; /// Binds resources for all shaders in the pipeline state @@ -522,6 +528,13 @@ DILIGENT_BEGIN_INTERFACE(IPipelineState, IDeviceObject) /// into account vertex shader input layout, number of outputs, etc. VIRTUAL bool METHOD(IsCompatibleWith)(THIS_ const struct IPipelineState* pPSO) CONST PURE; + + /// AZ TODO + VIRTUAL Uint32 METHOD(GetShaderGroupIndex)(THIS_ + const char* Name) CONST PURE; + + /// AZ TODO + VIRTUAL Uint32 METHOD(GetShaderGroupCount)(THIS) CONST PURE; }; DILIGENT_END_INTERFACE @@ -534,12 +547,15 @@ DILIGENT_END_INTERFACE # define IPipelineState_GetDesc(This) (const struct PipelineStateDesc*)IDeviceObject_GetDesc(This) # define IPipelineState_GetGraphicsPipelineDesc(This) CALL_IFACE_METHOD(PipelineState, GetGraphicsPipelineDesc, This) +# define IPipelineState_GetRayTracingPipelineDesc(This) CALL_IFACE_METHOD(PipelineState, GetRayTracingPipelineDesc, This) # define IPipelineState_BindStaticResources(This, ...) CALL_IFACE_METHOD(PipelineState, BindStaticResources, This, __VA_ARGS__) # define IPipelineState_GetStaticVariableCount(This, ...) CALL_IFACE_METHOD(PipelineState, GetStaticVariableCount, This, __VA_ARGS__) # define IPipelineState_GetStaticVariableByName(This, ...) CALL_IFACE_METHOD(PipelineState, GetStaticVariableByName, This, __VA_ARGS__) # define IPipelineState_GetStaticVariableByIndex(This, ...) CALL_IFACE_METHOD(PipelineState, GetStaticVariableByIndex, This, __VA_ARGS__) # define IPipelineState_CreateShaderResourceBinding(This, ...) CALL_IFACE_METHOD(PipelineState, CreateShaderResourceBinding, This, __VA_ARGS__) # define IPipelineState_IsCompatibleWith(This, ...) CALL_IFACE_METHOD(PipelineState, IsCompatibleWith, This, __VA_ARGS__) +# define IPipelineState_GetShaderGroupIndex(This, ...) CALL_IFACE_METHOD(PipelineState, GetShaderGroupIndex, This, __VA_ARGS__) +# define IPipelineState_GetShaderGroupCount(This) CALL_IFACE_METHOD(PipelineState, GetShaderGroupCount, This) // clang-format on diff --git a/Graphics/GraphicsEngine/interface/RenderDevice.h b/Graphics/GraphicsEngine/interface/RenderDevice.h index 19d98a94..49ab30e7 100644 --- a/Graphics/GraphicsEngine/interface/RenderDevice.h +++ b/Graphics/GraphicsEngine/interface/RenderDevice.h @@ -177,6 +177,17 @@ DILIGENT_BEGIN_INTERFACE(IRenderDevice, IObject) VIRTUAL void METHOD(CreateComputePipelineState)(THIS_ const ComputePipelineStateCreateInfo REF PSOCreateInfo, IPipelineState** ppPipelineState) PURE; + + /// Creates a new ray tracing pipeline state object + + /// \param [in] PSOCreateInfo - Ray tracing pipeline state create info, see Diligent::RayTracingPipelineStateCreateInfo for details. + /// \param [out] ppPipelineState - Address of the memory location where the pointer to the + /// pipeline state interface will be stored. + /// The function calls AddRef(), so that the new object will contain + /// one reference. + VIRTUAL void METHOD(CreateRayTracingPipelineState)(THIS_ + const RayTracingPipelineStateCreateInfo REF PSOCreateInfo, + IPipelineState** ppPipelineState) PURE; /// Creates a new fence object @@ -322,21 +333,22 @@ DILIGENT_END_INTERFACE // clang-format off -# define IRenderDevice_CreateBuffer(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateBuffer, This, __VA_ARGS__) -# define IRenderDevice_CreateShader(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateShader, This, __VA_ARGS__) -# define IRenderDevice_CreateTexture(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateTexture, This, __VA_ARGS__) -# define IRenderDevice_CreateSampler(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateSampler, This, __VA_ARGS__) -# define IRenderDevice_CreateResourceMapping(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateResourceMapping, This, __VA_ARGS__) -# define IRenderDevice_CreateGraphicsPipelineState(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateGraphicsPipelineState, This, __VA_ARGS__) -# define IRenderDevice_CreateComputePipelineState(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateComputePipelineState, This, __VA_ARGS__) -# define IRenderDevice_CreateFence(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateFence, This, __VA_ARGS__) -# define IRenderDevice_CreateQuery(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateQuery, This, __VA_ARGS__) -# define IRenderDevice_GetDeviceCaps(This) CALL_IFACE_METHOD(RenderDevice, GetDeviceCaps, This) -# define IRenderDevice_GetTextureFormatInfo(This, ...) CALL_IFACE_METHOD(RenderDevice, GetTextureFormatInfo, This, __VA_ARGS__) -# define IRenderDevice_GetTextureFormatInfoExt(This, ...) CALL_IFACE_METHOD(RenderDevice, GetTextureFormatInfoExt, This, __VA_ARGS__) -# define IRenderDevice_ReleaseStaleResources(This, ...) CALL_IFACE_METHOD(RenderDevice, ReleaseStaleResources, This, __VA_ARGS__) -# define IRenderDevice_IdleGPU(This) CALL_IFACE_METHOD(RenderDevice, IdleGPU, This) -# define IRenderDevice_GetEngineFactory(This) CALL_IFACE_METHOD(RenderDevice, GetEngineFactory, This) +# define IRenderDevice_CreateBuffer(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateBuffer, This, __VA_ARGS__) +# define IRenderDevice_CreateShader(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateShader, This, __VA_ARGS__) +# define IRenderDevice_CreateTexture(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateTexture, This, __VA_ARGS__) +# define IRenderDevice_CreateSampler(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateSampler, This, __VA_ARGS__) +# define IRenderDevice_CreateResourceMapping(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateResourceMapping, This, __VA_ARGS__) +# define IRenderDevice_CreateGraphicsPipelineState(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateGraphicsPipelineState, This, __VA_ARGS__) +# define IRenderDevice_CreateComputePipelineState(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateComputePipelineState, This, __VA_ARGS__) +# define IRenderDevice_CreateRayTracingPipelineState(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateRayTracingPipelineState, This, __VA_ARGS__) +# define IRenderDevice_CreateFence(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateFence, This, __VA_ARGS__) +# define IRenderDevice_CreateQuery(This, ...) CALL_IFACE_METHOD(RenderDevice, CreateQuery, This, __VA_ARGS__) +# define IRenderDevice_GetDeviceCaps(This) CALL_IFACE_METHOD(RenderDevice, GetDeviceCaps, This) +# define IRenderDevice_GetTextureFormatInfo(This, ...) CALL_IFACE_METHOD(RenderDevice, GetTextureFormatInfo, This, __VA_ARGS__) +# define IRenderDevice_GetTextureFormatInfoExt(This, ...) CALL_IFACE_METHOD(RenderDevice, GetTextureFormatInfoExt, This, __VA_ARGS__) +# define IRenderDevice_ReleaseStaleResources(This, ...) CALL_IFACE_METHOD(RenderDevice, ReleaseStaleResources, This, __VA_ARGS__) +# define IRenderDevice_IdleGPU(This) CALL_IFACE_METHOD(RenderDevice, IdleGPU, This) +# define IRenderDevice_GetEngineFactory(This) CALL_IFACE_METHOD(RenderDevice, GetEngineFactory, This) // clang-format on diff --git a/Graphics/GraphicsEngine/interface/Shader.h b/Graphics/GraphicsEngine/interface/Shader.h index 950ecc77..28e0bb17 100644 --- a/Graphics/GraphicsEngine/interface/Shader.h +++ b/Graphics/GraphicsEngine/interface/Shader.h @@ -109,6 +109,8 @@ DILIGENT_TYPED_ENUM(SHADER_COMPILER, Uint32) /// Legacy HLSL compiler (FXC) for Direct3D11 and Direct3D12 supporting shader models up to 5.1. SHADER_COMPILER_FXC, + + SHADER_COMPILER_LAST = SHADER_COMPILER_FXC }; @@ -354,7 +356,10 @@ DILIGENT_TYPED_ENUM(SHADER_RESOURCE_TYPE, Uint8) /// Input attachment in a render pass SHADER_RESOURCE_TYPE_INPUT_ATTACHMENT, - SHADER_RESOURCE_TYPE_LAST = SHADER_RESOURCE_TYPE_INPUT_ATTACHMENT + /// AZ TODO + SHADER_RESOURCE_TYPE_ACCEL_STRUCT, + + SHADER_RESOURCE_TYPE_LAST = SHADER_RESOURCE_TYPE_ACCEL_STRUCT }; // clang-format on diff --git a/Graphics/GraphicsEngine/src/APIInfo.cpp b/Graphics/GraphicsEngine/src/APIInfo.cpp index e4111327..4facdec4 100644 --- a/Graphics/GraphicsEngine/src/APIInfo.cpp +++ b/Graphics/GraphicsEngine/src/APIInfo.cpp @@ -89,10 +89,12 @@ static APIInfo InitAPIInfo() INIT_STRUCTURE_SIZE(ShaderResourceVariableDesc); INIT_STRUCTURE_SIZE(ImmutableSamplerDesc); INIT_STRUCTURE_SIZE(PipelineResourceLayoutDesc); + INIT_STRUCTURE_SIZE(PipelineStateDesc); INIT_STRUCTURE_SIZE(GraphicsPipelineDesc); INIT_STRUCTURE_SIZE(GraphicsPipelineStateCreateInfo); INIT_STRUCTURE_SIZE(ComputePipelineStateCreateInfo); - INIT_STRUCTURE_SIZE(PipelineStateDesc); + INIT_STRUCTURE_SIZE(RayTracingPipelineDesc); + INIT_STRUCTURE_SIZE(RayTracingPipelineStateCreateInfo); INIT_STRUCTURE_SIZE(RasterizerStateDesc); INIT_STRUCTURE_SIZE(ResourceMappingEntry); INIT_STRUCTURE_SIZE(ResourceMappingDesc); diff --git a/Graphics/GraphicsEngine/src/PipelineStateBase.cpp b/Graphics/GraphicsEngine/src/PipelineStateBase.cpp index fedc332d..9bd422db 100644 --- a/Graphics/GraphicsEngine/src/PipelineStateBase.cpp +++ b/Graphics/GraphicsEngine/src/PipelineStateBase.cpp @@ -248,6 +248,64 @@ void ValidateComputePipelineCreateInfo(const ComputePipelineStateCreateInfo& Cre VALIDATE_SHADER_TYPE(CreateInfo.pCS, SHADER_TYPE_COMPUTE, "compute"); } + +void ValidateRayTracingPipelineCreateInfo(const RayTracingPipelineStateCreateInfo& CreateInfo) noexcept(false) +{ +#ifdef DILIGENT_DEVELOPMENT + const auto& PSODesc = CreateInfo.PSODesc; + if (PSODesc.PipelineType != PIPELINE_TYPE_RAY_TRACING) + LOG_PSO_ERROR_AND_THROW("Pipeline type must be RAY_TRACING"); + + for (Uint32 i = 0; i < CreateInfo.GeneralShaderCount; ++i) + { + const auto& Group = CreateInfo.pGeneralShaders[i]; + if (Group.pShader == nullptr) + LOG_PSO_ERROR_AND_THROW("pGeneralShaders[", i, "].pShader must not be null"); + if (Group.Name == nullptr) + LOG_PSO_ERROR_AND_THROW("pGeneralShaders[", i, "].Name must not be null"); + + switch (Group.pShader->GetDesc().ShaderType) + { + case SHADER_TYPE_RAY_GEN: + case SHADER_TYPE_RAY_MISS: + case SHADER_TYPE_RAY_CLOSEST_HIT: break; + default: + LOG_ERROR_AND_THROW(GetShaderTypeLiteralName(Group.pShader->GetDesc().ShaderType), " is not a valid type for ray tracing general shader"); + } + } + + for (Uint32 i = 0; i < CreateInfo.TriangleHitShaderCount; ++i) + { + const auto& Group = CreateInfo.pTriangleHitShaders[i]; + if (Group.pClosestHitShader == nullptr) + LOG_PSO_ERROR_AND_THROW("pTriangleHitShaders[", i, "].pClosestHitShader must not be null"); + if (Group.Name == nullptr) + LOG_PSO_ERROR_AND_THROW("pTriangleHitShaders[", i, "].Name must not be null"); + + VALIDATE_SHADER_TYPE(Group.pClosestHitShader, SHADER_TYPE_RAY_CLOSEST_HIT, "ray tracing triangle closes hit"); + + if (Group.pAnyHitShader != nullptr) + VALIDATE_SHADER_TYPE(Group.pAnyHitShader, SHADER_TYPE_RAY_ANY_HIT, "ray tracing triangle any hit"); + } + + for (Uint32 i = 0; i < CreateInfo.ProceduralHitShaderCount; ++i) + { + const auto& Group = CreateInfo.pProceduralHitShaders[i]; + if (Group.pIntersectionShader == nullptr) + LOG_PSO_ERROR_AND_THROW("pProceduralHitShaders[", i, "].pIntersectionShader must not be null"); + if (Group.Name == nullptr) + LOG_PSO_ERROR_AND_THROW("pProceduralHitShaders[", i, "].Name must not be null"); + + VALIDATE_SHADER_TYPE(Group.pIntersectionShader, SHADER_TYPE_RAY_INTERSECTION, "ray tracing procedural intersection"); + + if (Group.pClosestHitShader != nullptr) + VALIDATE_SHADER_TYPE(Group.pClosestHitShader, SHADER_TYPE_RAY_CLOSEST_HIT, "ray tracing procedural closest hit"); + if (Group.pAnyHitShader != nullptr) + VALIDATE_SHADER_TYPE(Group.pAnyHitShader, SHADER_TYPE_RAY_ANY_HIT, "ray tracing procedural any hit"); + } +#endif // DILIGENT_DEVELOPMENT +} + #undef VALIDATE_SHADER_TYPE #undef LOG_PSO_ERROR_AND_THROW |
