Add RenderPipelineLayout
This commit is contained in:
@@ -30,7 +30,7 @@ namespace Nz
|
||||
template<typename T> std::size_t CountOf(const T& c);
|
||||
template<typename T> void HashCombine(std::size_t& seed, const T& v);
|
||||
template<typename T> T ReverseBits(T integer);
|
||||
template<typename T> auto UnderlyingCast(T value) -> std::underlying_type_t<T>;
|
||||
template<typename T> constexpr auto UnderlyingCast(T value) -> std::underlying_type_t<T>;
|
||||
|
||||
template<typename T>
|
||||
struct AlwaysFalse : std::false_type {};
|
||||
|
||||
@@ -196,7 +196,7 @@ namespace Nz
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
auto UnderlyingCast(T value) -> std::underlying_type_t<T>
|
||||
constexpr auto UnderlyingCast(T value) -> std::underlying_type_t<T>
|
||||
{
|
||||
return static_cast<std::underlying_type_t<T>>(value);
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include <Nazara/Renderer/Renderer.hpp>
|
||||
#include <Nazara/Renderer/RendererImpl.hpp>
|
||||
#include <Nazara/Renderer/RenderPipeline.hpp>
|
||||
#include <Nazara/Renderer/RenderPipelineLayout.hpp>
|
||||
#include <Nazara/Renderer/RenderStates.hpp>
|
||||
#include <Nazara/Renderer/RenderSurface.hpp>
|
||||
#include <Nazara/Renderer/RenderWindow.hpp>
|
||||
|
||||
@@ -60,6 +60,7 @@ namespace Nz
|
||||
Max = Vertex
|
||||
};
|
||||
|
||||
template<>
|
||||
struct EnumAsFlags<ShaderStageType>
|
||||
{
|
||||
static constexpr ShaderStageType max = ShaderStageType::Max;
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <Nazara/Renderer/Config.hpp>
|
||||
#include <Nazara/Renderer/Enums.hpp>
|
||||
#include <Nazara/Renderer/RenderPipeline.hpp>
|
||||
#include <Nazara/Renderer/RenderPipelineLayout.hpp>
|
||||
#include <Nazara/Utility/AbstractBuffer.hpp>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
@@ -28,6 +29,7 @@ namespace Nz
|
||||
|
||||
virtual std::unique_ptr<AbstractBuffer> InstantiateBuffer(Buffer* parent, BufferType type) = 0;
|
||||
virtual std::unique_ptr<RenderPipeline> InstantiateRenderPipeline(RenderPipelineInfo pipelineInfo) = 0;
|
||||
virtual std::shared_ptr<RenderPipelineLayout> InstantiateRenderPipelineLayout(RenderPipelineLayoutInfo pipelineLayoutInfo) = 0;
|
||||
virtual std::shared_ptr<ShaderStageImpl> InstantiateShaderStage(ShaderStageType type, ShaderLanguage lang, const void* source, std::size_t sourceSize) = 0;
|
||||
std::shared_ptr<ShaderStageImpl> InstantiateShaderStage(ShaderStageType type, ShaderLanguage lang, const std::filesystem::path& sourcePath);
|
||||
};
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#define NAZARA_RENDERPIPELINE_HPP
|
||||
|
||||
#include <Nazara/Utility/Enums.hpp>
|
||||
#include <Nazara/Renderer/RenderPipelineLayout.hpp>
|
||||
#include <Nazara/Renderer/RenderStates.hpp>
|
||||
//#include <Nazara/Renderer/Shader.hpp>
|
||||
|
||||
@@ -15,7 +16,15 @@ namespace Nz
|
||||
{
|
||||
struct RenderPipelineInfo : RenderStates
|
||||
{
|
||||
/*ShaderConstRef shader;*/
|
||||
struct VertexBufferData
|
||||
{
|
||||
std::size_t binding;
|
||||
VertexDeclarationConstRef declaration;
|
||||
};
|
||||
|
||||
std::shared_ptr<RenderPipelineLayout> pipelineLayout;
|
||||
std::vector<std::shared_ptr<ShaderStageImpl>> shaderStages;
|
||||
std::vector<VertexBufferData> vertexBuffers;
|
||||
};
|
||||
|
||||
class NAZARA_RENDERER_API RenderPipeline
|
||||
|
||||
40
include/Nazara/Renderer/RenderPipelineLayout.hpp
Normal file
40
include/Nazara/Renderer/RenderPipelineLayout.hpp
Normal file
@@ -0,0 +1,40 @@
|
||||
// Copyright (C) 2020 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Renderer module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_RENDERPIPELINELAYOUT_HPP
|
||||
#define NAZARA_RENDERPIPELINELAYOUT_HPP
|
||||
|
||||
#include <Nazara/Renderer/Config.hpp>
|
||||
#include <Nazara/Renderer/Enums.hpp>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
struct RenderPipelineLayoutInfo
|
||||
{
|
||||
struct Binding
|
||||
{
|
||||
std::string name; //< FIXME: wtf is this?
|
||||
ShaderBindingType type;
|
||||
ShaderStageTypeFlags shaderStageFlags;
|
||||
unsigned int index;
|
||||
};
|
||||
|
||||
std::vector<Binding> bindings;
|
||||
};
|
||||
|
||||
class NAZARA_RENDERER_API RenderPipelineLayout
|
||||
{
|
||||
public:
|
||||
RenderPipelineLayout() = default;
|
||||
virtual ~RenderPipelineLayout();
|
||||
};
|
||||
}
|
||||
|
||||
#include <Nazara/Renderer/RenderPipelineLayout.inl>
|
||||
|
||||
#endif // NAZARA_RENDERPIPELINELAYOUT_HPP
|
||||
13
include/Nazara/Renderer/RenderPipelineLayout.inl
Normal file
13
include/Nazara/Renderer/RenderPipelineLayout.inl
Normal file
@@ -0,0 +1,13 @@
|
||||
// Copyright (C) 2020 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Renderer module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Renderer/RenderPipelineLayout.hpp>
|
||||
#include <Nazara/Core/Error.hpp>
|
||||
#include <Nazara/Renderer/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
}
|
||||
|
||||
#include <Nazara/Renderer/DebugOff.hpp>
|
||||
@@ -37,15 +37,6 @@ namespace Nz
|
||||
UInt32 writeMask = 0xFFFFFFFF;
|
||||
} stencilBack, stencilFront;
|
||||
|
||||
struct VertexBufferData
|
||||
{
|
||||
std::size_t binding;
|
||||
VertexDeclarationConstRef declaration;
|
||||
};
|
||||
|
||||
std::vector<std::shared_ptr<ShaderStageImpl>> shaderStages;
|
||||
std::vector<VertexBufferData> vertexBuffers;
|
||||
|
||||
bool blending = false;
|
||||
bool colorWrite = true;
|
||||
bool depthBuffer = false;
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <Nazara/VulkanRenderer/VulkanDevice.hpp>
|
||||
#include <Nazara/VulkanRenderer/VulkanRenderer.hpp>
|
||||
#include <Nazara/VulkanRenderer/VulkanRenderPipeline.hpp>
|
||||
#include <Nazara/VulkanRenderer/VulkanRenderPipelineLayout.hpp>
|
||||
#include <Nazara/VulkanRenderer/VulkanShaderStage.hpp>
|
||||
#include <Nazara/VulkanRenderer/VulkanSurface.hpp>
|
||||
#include <Nazara/VulkanRenderer/Wrapper.hpp>
|
||||
|
||||
@@ -20,7 +20,9 @@ namespace Nz
|
||||
inline VkPolygonMode ToVulkan(FaceFilling faceFilling);
|
||||
inline VkPrimitiveTopology ToVulkan(PrimitiveMode primitiveMode);
|
||||
inline VkCompareOp ToVulkan(RendererComparison comparison);
|
||||
inline VkDescriptorType ToVulkan(ShaderBindingType bindingType);
|
||||
inline VkShaderStageFlagBits ToVulkan(ShaderStageType stageType);
|
||||
inline VkShaderStageFlags ToVulkan(ShaderStageTypeFlags stageType);
|
||||
inline VkStencilOp ToVulkan(StencilOperation stencilOp);
|
||||
inline VkVertexInputRate ToVulkan(VertexInputRate inputRate);
|
||||
|
||||
|
||||
@@ -95,6 +95,18 @@ namespace Nz
|
||||
return VK_COMPARE_OP_NEVER;
|
||||
}
|
||||
|
||||
VkDescriptorType ToVulkan(ShaderBindingType bindingType)
|
||||
{
|
||||
switch (bindingType)
|
||||
{
|
||||
case ShaderBindingType::Texture: return VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
case ShaderBindingType::UniformBuffer: return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
}
|
||||
|
||||
NazaraError("Unhandled ShaderBindingType 0x" + String::Number(UnderlyingCast(bindingType), 16));
|
||||
return VK_DESCRIPTOR_TYPE_SAMPLER;
|
||||
}
|
||||
|
||||
VkShaderStageFlagBits ToVulkan(ShaderStageType stageType)
|
||||
{
|
||||
switch (stageType)
|
||||
@@ -103,10 +115,25 @@ namespace Nz
|
||||
case ShaderStageType::Vertex: return VK_SHADER_STAGE_VERTEX_BIT;
|
||||
}
|
||||
|
||||
NazaraError("Unhandled ShaderStageType 0x" + String::Number(static_cast<std::size_t>(stageType), 16));
|
||||
NazaraError("Unhandled ShaderStageType 0x" + String::Number(UnderlyingCast(stageType), 16));
|
||||
return {};
|
||||
}
|
||||
|
||||
VkShaderStageFlags ToVulkan(ShaderStageTypeFlags stageType)
|
||||
{
|
||||
VkShaderStageFlags shaderStageBits = 0;
|
||||
|
||||
if (stageType.Test(ShaderStageType::Fragment))
|
||||
shaderStageBits |= VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||
|
||||
if (stageType.Test(ShaderStageType::Vertex))
|
||||
shaderStageBits |= VK_SHADER_STAGE_VERTEX_BIT;
|
||||
|
||||
static_assert(UnderlyingCast(ShaderStageType::Max) + 1 == 2);
|
||||
|
||||
return shaderStageBits;
|
||||
}
|
||||
|
||||
VkStencilOp ToVulkan(StencilOperation stencilOp)
|
||||
{
|
||||
switch (stencilOp)
|
||||
|
||||
@@ -25,6 +25,7 @@ namespace Nz
|
||||
|
||||
std::unique_ptr<AbstractBuffer> InstantiateBuffer(Buffer* parent, BufferType type) override;
|
||||
std::unique_ptr<RenderPipeline> InstantiateRenderPipeline(RenderPipelineInfo pipelineInfo) override;
|
||||
std::shared_ptr<RenderPipelineLayout> InstantiateRenderPipelineLayout(RenderPipelineLayoutInfo pipelineLayoutInfo) override;
|
||||
std::shared_ptr<ShaderStageImpl> InstantiateShaderStage(ShaderStageType type, ShaderLanguage lang, const void* source, std::size_t sourceSize) override;
|
||||
|
||||
VulkanDevice& operator=(const VulkanDevice&) = delete;
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#include <Nazara/Renderer/RenderPipeline.hpp>
|
||||
#include <Nazara/VulkanRenderer/Config.hpp>
|
||||
#include <Nazara/VulkanRenderer/Wrapper/Device.hpp>
|
||||
#include <Nazara/VulkanRenderer/Wrapper/Pipeline.hpp>
|
||||
#include <Nazara/VulkanRenderer/Wrapper/RenderPass.hpp>
|
||||
#include <vector>
|
||||
|
||||
namespace Nz
|
||||
@@ -23,6 +25,8 @@ namespace Nz
|
||||
VulkanRenderPipeline(Vk::DeviceHandle device, RenderPipelineInfo pipelineInfo);
|
||||
~VulkanRenderPipeline() = default;
|
||||
|
||||
VkPipeline Get(const Vk::RenderPass& renderPass);
|
||||
|
||||
static std::vector<VkPipelineColorBlendAttachmentState> BuildColorBlendAttachmentStateList(const RenderPipelineInfo& pipelineInfo);
|
||||
static VkPipelineColorBlendStateCreateInfo BuildColorBlendInfo(const RenderPipelineInfo& pipelineInfo, const std::vector<VkPipelineColorBlendAttachmentState>& attachmentState);
|
||||
static VkPipelineDepthStencilStateCreateInfo BuildDepthStencilInfo(const RenderPipelineInfo& pipelineInfo);
|
||||
@@ -64,9 +68,9 @@ namespace Nz
|
||||
};
|
||||
|
||||
private:
|
||||
|
||||
|
||||
std::unordered_map<VkRenderPass, Vk::Pipeline> m_pipelines;
|
||||
Vk::DeviceHandle m_device;
|
||||
CreateInfo m_pipelineCreateInfo;
|
||||
RenderPipelineInfo m_pipelineInfo;
|
||||
};
|
||||
}
|
||||
|
||||
41
include/Nazara/VulkanRenderer/VulkanRenderPipelineLayout.hpp
Normal file
41
include/Nazara/VulkanRenderer/VulkanRenderPipelineLayout.hpp
Normal file
@@ -0,0 +1,41 @@
|
||||
// Copyright (C) 2020 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Renderer module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_VULKANRENDERER_VULKANRENDERPIPELINELAYOUT_HPP
|
||||
#define NAZARA_VULKANRENDERER_VULKANRENDERPIPELINELAYOUT_HPP
|
||||
|
||||
#include <Nazara/Prerequisites.hpp>
|
||||
#include <Nazara/Renderer/RenderPipelineLayout.hpp>
|
||||
#include <Nazara/VulkanRenderer/Config.hpp>
|
||||
#include <Nazara/VulkanRenderer/Wrapper/DescriptorSetLayout.hpp>
|
||||
#include <Nazara/VulkanRenderer/Wrapper/PipelineLayout.hpp>
|
||||
#include <Nazara/VulkanRenderer/Wrapper/Device.hpp>
|
||||
#include <vector>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class NAZARA_VULKANRENDERER_API VulkanRenderPipelineLayout : public RenderPipelineLayout
|
||||
{
|
||||
public:
|
||||
VulkanRenderPipelineLayout() = default;
|
||||
~VulkanRenderPipelineLayout() = default;
|
||||
|
||||
bool Create(Vk::DeviceHandle device, RenderPipelineLayoutInfo layoutInfo);
|
||||
|
||||
inline const Vk::DescriptorSetLayout& GetDescriptorSetLayout() const;
|
||||
inline const Vk::PipelineLayout& GetPipelineLayout() const;
|
||||
|
||||
private:
|
||||
Vk::DeviceHandle m_device;
|
||||
Vk::DescriptorSetLayout m_descriptorSetLayout;
|
||||
Vk::PipelineLayout m_pipelineLayout;
|
||||
RenderPipelineLayoutInfo m_layoutInfo;
|
||||
};
|
||||
}
|
||||
|
||||
#include <Nazara/VulkanRenderer/VulkanRenderPipelineLayout.inl>
|
||||
|
||||
#endif // NAZARA_VULKANRENDERER_VULKANRENDERPIPELINE_HPP
|
||||
21
include/Nazara/VulkanRenderer/VulkanRenderPipelineLayout.inl
Normal file
21
include/Nazara/VulkanRenderer/VulkanRenderPipelineLayout.inl
Normal file
@@ -0,0 +1,21 @@
|
||||
// Copyright (C) 2020 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Vulkan Renderer"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/VulkanRenderer/VulkanRenderPipelineLayout.hpp>
|
||||
#include <Nazara/VulkanRenderer/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
inline const Vk::DescriptorSetLayout& VulkanRenderPipelineLayout::GetDescriptorSetLayout() const
|
||||
{
|
||||
return m_descriptorSetLayout;
|
||||
}
|
||||
|
||||
inline const Vk::PipelineLayout& VulkanRenderPipelineLayout::GetPipelineLayout() const
|
||||
{
|
||||
return m_pipelineLayout;
|
||||
}
|
||||
}
|
||||
|
||||
#include <Nazara/VulkanRenderer/DebugOff.hpp>
|
||||
@@ -24,6 +24,10 @@ namespace Nz
|
||||
PipelineLayout(PipelineLayout&&) = default;
|
||||
~PipelineLayout() = default;
|
||||
|
||||
using DeviceObject::Create;
|
||||
bool Create(DeviceHandle device, VkDescriptorSetLayout layout, VkPipelineLayoutCreateFlags flags = 0);
|
||||
bool Create(DeviceHandle device, UInt32 layoutCount, const VkDescriptorSetLayout* layouts, VkPipelineLayoutCreateFlags flags = 0);
|
||||
|
||||
PipelineLayout& operator=(const PipelineLayout&) = delete;
|
||||
PipelineLayout& operator=(PipelineLayout&&) = delete;
|
||||
|
||||
|
||||
@@ -9,6 +9,26 @@ namespace Nz
|
||||
{
|
||||
namespace Vk
|
||||
{
|
||||
inline bool PipelineLayout::Create(DeviceHandle device, VkDescriptorSetLayout layout, VkPipelineLayoutCreateFlags flags)
|
||||
{
|
||||
return Create(std::move(device), 1U, &layout, flags);
|
||||
}
|
||||
|
||||
inline bool PipelineLayout::Create(DeviceHandle device, UInt32 layoutCount, const VkDescriptorSetLayout* layouts, VkPipelineLayoutCreateFlags flags)
|
||||
{
|
||||
VkPipelineLayoutCreateInfo createInfo = {
|
||||
VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
|
||||
nullptr,
|
||||
flags,
|
||||
layoutCount,
|
||||
layouts,
|
||||
0U,
|
||||
nullptr
|
||||
};
|
||||
|
||||
return Create(std::move(device), createInfo);
|
||||
}
|
||||
|
||||
inline VkResult PipelineLayout::CreateHelper(const DeviceHandle& device, const VkPipelineLayoutCreateInfo* createInfo, const VkAllocationCallbacks* allocator, VkPipelineLayout* handle)
|
||||
{
|
||||
return device->vkCreatePipelineLayout(*device, createInfo, allocator, handle);
|
||||
|
||||
Reference in New Issue
Block a user