76 lines
2.4 KiB
C++
76 lines
2.4 KiB
C++
// =============================================
|
|
// Aster: pipeline_helpers.h
|
|
// Copyright (c) 2020-2025 Anish Bhobe
|
|
// =============================================
|
|
|
|
#pragma once
|
|
|
|
#include <aster/aster.h>
|
|
|
|
#include <EASTL/vector.h>
|
|
#include <slang.h>
|
|
#include <variant>
|
|
|
|
namespace systems
|
|
{
|
|
class Device;
|
|
|
|
struct PipelineCreationError
|
|
{
|
|
std::variant<std::monostate, vk::Result, SlangResult> m_Data;
|
|
|
|
std::string What();
|
|
i32 Value();
|
|
|
|
operator bool() const;
|
|
|
|
PipelineCreationError(vk::Result res);
|
|
PipelineCreationError(SlangResult res);
|
|
PipelineCreationError();
|
|
};
|
|
|
|
vk::ShaderStageFlagBits SlangToVulkanShaderStage(SlangStage stage);
|
|
|
|
namespace _internal
|
|
{
|
|
struct PipelineLayoutBuilder
|
|
{
|
|
Device *m_Device;
|
|
eastl::vector<vk::DescriptorSetLayout> m_DescriptorSetLayouts;
|
|
eastl::vector<vk::PushConstantRange> m_PushConstants;
|
|
vk::ShaderStageFlags m_Stage;
|
|
|
|
explicit PipelineLayoutBuilder(Device *device, vk::DescriptorSetLayout bindlessLayout = {});
|
|
|
|
[[nodiscard]] vk::PipelineLayout Build();
|
|
|
|
[[nodiscard]] vk::DescriptorSetLayout
|
|
CreateDescriptorSetLayout(vk::DescriptorSetLayoutCreateInfo const &createInfo) const;
|
|
void AddDescriptorSetForParameterBlock(slang::TypeLayoutReflection *layout);
|
|
void AddPushConstantRangeForConstantBuffer(slang::TypeLayoutReflection *layout);
|
|
void AddSubObjectRange(slang::TypeLayoutReflection *layout, i64 subObjectRangeIndex);
|
|
void AddSubObjectRanges(slang::TypeLayoutReflection *layout);
|
|
};
|
|
|
|
struct DescriptorLayoutBuilder
|
|
{
|
|
PipelineLayoutBuilder *m_PipelineLayoutBuilder;
|
|
eastl::vector<vk::DescriptorSetLayoutBinding> m_LayoutBindings;
|
|
u32 m_SetIndex;
|
|
|
|
vk::ShaderStageFlags &Stage() const;
|
|
explicit DescriptorLayoutBuilder(PipelineLayoutBuilder *pipelineLayoutBuilder);
|
|
|
|
void AddGlobalScopeParameters(slang::ProgramLayout *layout);
|
|
void AddEntryPointParameters(slang::ProgramLayout *layout);
|
|
void AddEntryPointParameters(slang::EntryPointLayout *layout);
|
|
void AddAutomaticallyIntroducedUniformBuffer();
|
|
void AddRanges(slang::TypeLayoutReflection *layout);
|
|
void AddRangesForParamBlockElement(slang::TypeLayoutReflection *layout);
|
|
void AddDescriptorRange(slang::TypeLayoutReflection *layout, i64 relativeSetIndex, i64 rangeIndex);
|
|
void AddDescriptorRanges(slang::TypeLayoutReflection *layout);
|
|
void Build();
|
|
};
|
|
} // namespace _internal
|
|
} // namespace systems
|