summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngine
diff options
context:
space:
mode:
authorazhirnov <zh1dron@gmail.com>2020-10-25 12:53:05 +0000
committerazhirnov <zh1dron@gmail.com>2020-10-25 13:08:57 +0000
commit7f26e40e0898391a32e6a05d91ef1a217d885668 (patch)
tree3236316d1a752e5dbbfae863f8180ff994b31d70 /Graphics/GraphicsEngine
parentMerge branch 'master' into ray_tracing (diff)
downloadDiligentCore-7f26e40e0898391a32e6a05d91ef1a217d885668.tar.gz
DiligentCore-7f26e40e0898391a32e6a05d91ef1a217d885668.zip
PSO refactoring for ray tracing
Diffstat (limited to 'Graphics/GraphicsEngine')
-rw-r--r--Graphics/GraphicsEngine/include/PipelineStateBase.hpp212
-rw-r--r--Graphics/GraphicsEngine/interface/APIInfo.h120
-rw-r--r--Graphics/GraphicsEngine/interface/Constants.h4
-rw-r--r--Graphics/GraphicsEngine/interface/GraphicsTypes.h15
-rw-r--r--Graphics/GraphicsEngine/interface/PipelineState.h92
-rw-r--r--Graphics/GraphicsEngine/interface/RenderDevice.h42
-rw-r--r--Graphics/GraphicsEngine/interface/Shader.h7
-rw-r--r--Graphics/GraphicsEngine/src/APIInfo.cpp4
-rw-r--r--Graphics/GraphicsEngine/src/PipelineStateBase.cpp58
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