Renderer: Add pipeline and texture sampler info validation
This commit is contained in:
parent
8458301a64
commit
552dfbc01e
|
|
@ -32,6 +32,7 @@ namespace Nz
|
|||
std::unique_ptr<GL::Context> CreateContext(const GL::ContextParams& params, WindowHandle handle) const;
|
||||
|
||||
const RenderDeviceInfo& GetDeviceInfo() const override;
|
||||
const RenderDeviceFeatures& GetEnabledFeatures() const override;
|
||||
inline const GL::Context& GetReferenceContext() const;
|
||||
|
||||
std::shared_ptr<AbstractBuffer> InstantiateBuffer(BufferType type) override;
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ namespace Nz
|
|||
class NAZARA_OPENGLRENDERER_API OpenGLTextureSampler : public TextureSampler
|
||||
{
|
||||
public:
|
||||
OpenGLTextureSampler(OpenGLDevice& device, const TextureSamplerInfo& samplerInfo);
|
||||
OpenGLTextureSampler(OpenGLDevice& device, TextureSamplerInfo samplerInfo);
|
||||
OpenGLTextureSampler(const OpenGLTextureSampler&) = delete;
|
||||
OpenGLTextureSampler(OpenGLTextureSampler&&) = delete;
|
||||
~OpenGLTextureSampler() = default;
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ namespace Nz
|
|||
virtual ~RenderDevice();
|
||||
|
||||
virtual const RenderDeviceInfo& GetDeviceInfo() const = 0;
|
||||
virtual const RenderDeviceFeatures& GetEnabledFeatures() const = 0;
|
||||
|
||||
virtual std::shared_ptr<AbstractBuffer> InstantiateBuffer(BufferType type) = 0;
|
||||
virtual std::shared_ptr<CommandPool> InstantiateCommandPool(QueueType queueType) = 0;
|
||||
|
|
@ -50,6 +51,8 @@ namespace Nz
|
|||
virtual std::shared_ptr<TextureSampler> InstantiateTextureSampler(const TextureSamplerInfo& params) = 0;
|
||||
|
||||
virtual bool IsTextureFormatSupported(PixelFormat format, TextureUsage usage) const = 0;
|
||||
|
||||
static void ValidateFeatures(const RenderDeviceFeatures& supportedFeatures, RenderDeviceFeatures& enabledFeatures);
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@ namespace Nz
|
|||
inline bool operator!=(const TextureSamplerInfo& samplerInfo) const;
|
||||
};
|
||||
|
||||
class RenderDevice;
|
||||
|
||||
class NAZARA_RENDERER_API TextureSampler
|
||||
{
|
||||
public:
|
||||
|
|
@ -38,6 +40,9 @@ namespace Nz
|
|||
|
||||
TextureSampler& operator=(const TextureSampler&) = delete;
|
||||
TextureSampler& operator=(TextureSampler&&) = delete;
|
||||
|
||||
protected:
|
||||
static void ValidateSamplerInfo(const RenderDevice& device, TextureSamplerInfo& samplerInfo);
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,12 +18,13 @@ namespace Nz
|
|||
class NAZARA_VULKANRENDERER_API VulkanDevice : public RenderDevice, public Vk::Device
|
||||
{
|
||||
public:
|
||||
inline VulkanDevice(Vk::Instance& instance, RenderDeviceInfo renderDeviceInfo);
|
||||
inline VulkanDevice(Vk::Instance& instance, const RenderDeviceFeatures& enabledFeatures, RenderDeviceInfo renderDeviceInfo);
|
||||
VulkanDevice(const VulkanDevice&) = delete;
|
||||
VulkanDevice(VulkanDevice&&) = delete; ///TODO?
|
||||
~VulkanDevice();
|
||||
|
||||
const RenderDeviceInfo& GetDeviceInfo() const override;
|
||||
const RenderDeviceFeatures& GetEnabledFeatures() const override;
|
||||
|
||||
std::shared_ptr<AbstractBuffer> InstantiateBuffer(BufferType type) override;
|
||||
std::shared_ptr<CommandPool> InstantiateCommandPool(QueueType queueType) override;
|
||||
|
|
@ -42,6 +43,7 @@ namespace Nz
|
|||
VulkanDevice& operator=(VulkanDevice&&) = delete; ///TODO?
|
||||
|
||||
private:
|
||||
RenderDeviceFeatures m_enabledFeatures;
|
||||
RenderDeviceInfo m_renderDeviceInfo;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,8 +7,9 @@
|
|||
|
||||
namespace Nz
|
||||
{
|
||||
inline VulkanDevice::VulkanDevice(Vk::Instance& instance, RenderDeviceInfo renderDeviceInfo) :
|
||||
inline VulkanDevice::VulkanDevice(Vk::Instance& instance, const RenderDeviceFeatures& enabledFeatures, RenderDeviceInfo renderDeviceInfo) :
|
||||
Device(instance),
|
||||
m_enabledFeatures(enabledFeatures),
|
||||
m_renderDeviceInfo(std::move(renderDeviceInfo))
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,12 +19,14 @@
|
|||
|
||||
namespace Nz
|
||||
{
|
||||
class VulkanDevice;
|
||||
|
||||
class NAZARA_VULKANRENDERER_API VulkanRenderPipeline : public RenderPipeline
|
||||
{
|
||||
public:
|
||||
struct CreateInfo;
|
||||
|
||||
VulkanRenderPipeline(Vk::Device& device, RenderPipelineInfo pipelineInfo);
|
||||
VulkanRenderPipeline(VulkanDevice& device, RenderPipelineInfo pipelineInfo);
|
||||
~VulkanRenderPipeline() = default;
|
||||
|
||||
VkPipeline Get(const VulkanRenderPass& renderPass, std::size_t subpassIndex) const;
|
||||
|
|
|
|||
|
|
@ -13,10 +13,12 @@
|
|||
|
||||
namespace Nz
|
||||
{
|
||||
class VulkanDevice;
|
||||
|
||||
class NAZARA_VULKANRENDERER_API VulkanTextureSampler : public TextureSampler
|
||||
{
|
||||
public:
|
||||
VulkanTextureSampler(Vk::Device& device, TextureSamplerInfo samplerInfo);
|
||||
VulkanTextureSampler(VulkanDevice& device, TextureSamplerInfo samplerInfo);
|
||||
VulkanTextureSampler(const VulkanTextureSampler&) = delete;
|
||||
VulkanTextureSampler(VulkanTextureSampler&&) = delete;
|
||||
~VulkanTextureSampler() = default;
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ namespace Nz
|
|||
|
||||
OpenGLDevice::~OpenGLDevice()
|
||||
{
|
||||
// Free context first as it will unregister itself from m_contexts
|
||||
m_referenceContext.reset();
|
||||
}
|
||||
|
||||
|
|
@ -95,6 +96,12 @@ namespace Nz
|
|||
return m_deviceInfo;
|
||||
}
|
||||
|
||||
const RenderDeviceFeatures& OpenGLDevice::GetEnabledFeatures() const
|
||||
{
|
||||
//FIXME
|
||||
return m_deviceInfo.features;
|
||||
}
|
||||
|
||||
std::shared_ptr<AbstractBuffer> OpenGLDevice::InstantiateBuffer(BufferType type)
|
||||
{
|
||||
return std::make_shared<OpenGLBuffer>(*this, type);
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@ namespace Nz
|
|||
m_pipelineInfo(std::move(pipelineInfo)),
|
||||
m_isViewportFlipped(false)
|
||||
{
|
||||
ValidatePipelineInfo(device, m_pipelineInfo);
|
||||
|
||||
OpenGLRenderPipelineLayout& pipelineLayout = static_cast<OpenGLRenderPipelineLayout&>(*m_pipelineInfo.pipelineLayout);
|
||||
|
||||
if (!m_program.Create(device))
|
||||
|
|
|
|||
|
|
@ -47,9 +47,16 @@ namespace Nz
|
|||
return std::make_unique<OpenGLRenderWindow>(owner);
|
||||
}
|
||||
|
||||
std::shared_ptr<RenderDevice> OpenGLRenderer::InstanciateRenderDevice(std::size_t deviceIndex, const RenderDeviceFeatures& /*enabledFeatures*/)
|
||||
std::shared_ptr<RenderDevice> OpenGLRenderer::InstanciateRenderDevice(std::size_t deviceIndex, const RenderDeviceFeatures& enabledFeatures)
|
||||
{
|
||||
assert(deviceIndex == 0);
|
||||
|
||||
// For now, since we have to create a device to know its features, supported features are always reported as enabled
|
||||
// We still call ValidateFeatures in order to trigger warnings if requested features are not supported
|
||||
// TODO: Report disabled features as disabled (make OpenGLDeviceProxy?)
|
||||
RenderDeviceFeatures validatedFeatures = enabledFeatures;
|
||||
OpenGLDevice::ValidateFeatures(m_device->GetEnabledFeatures(), validatedFeatures);
|
||||
|
||||
return m_device;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,8 +9,10 @@
|
|||
|
||||
namespace Nz
|
||||
{
|
||||
OpenGLTextureSampler::OpenGLTextureSampler(OpenGLDevice& device, const TextureSamplerInfo& samplerInfo)
|
||||
OpenGLTextureSampler::OpenGLTextureSampler(OpenGLDevice& device, TextureSamplerInfo samplerInfo)
|
||||
{
|
||||
ValidateSamplerInfo(device, samplerInfo);
|
||||
|
||||
BuildSampler(device, m_samplerWithMipmaps, samplerInfo, true);
|
||||
BuildSampler(device, m_samplerWithoutMipmaps, samplerInfo, false);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,4 +31,25 @@ namespace Nz
|
|||
|
||||
return InstantiateShaderModule(shaderStages, lang, source.data(), source.size(), states);
|
||||
}
|
||||
|
||||
void RenderDevice::ValidateFeatures(const RenderDeviceFeatures& supportedFeatures, RenderDeviceFeatures& enabledFeatures)
|
||||
{
|
||||
if (enabledFeatures.anisotropicFiltering && !supportedFeatures.anisotropicFiltering)
|
||||
{
|
||||
NazaraWarning("anistropic filtering was enabled but device doesn't support it, disabling...");
|
||||
enabledFeatures.anisotropicFiltering = false;
|
||||
}
|
||||
|
||||
if (enabledFeatures.depthClamping && !supportedFeatures.depthClamping)
|
||||
{
|
||||
NazaraWarning("depth clamping was enabled but device doesn't support it, disabling...");
|
||||
enabledFeatures.depthClamping = false;
|
||||
}
|
||||
|
||||
if (enabledFeatures.nonSolidFaceFilling && !supportedFeatures.nonSolidFaceFilling)
|
||||
{
|
||||
NazaraWarning("non-solid face filling was enabled but device doesn't support it, disabling...");
|
||||
enabledFeatures.nonSolidFaceFilling = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,9 +3,26 @@
|
|||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Renderer/RenderPipeline.hpp>
|
||||
#include <Nazara/Renderer/RenderDevice.hpp>
|
||||
#include <Nazara/Renderer/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
RenderPipeline::~RenderPipeline() = default;
|
||||
|
||||
void RenderPipeline::ValidatePipelineInfo(const RenderDevice& device, RenderPipelineInfo& pipelineInfo)
|
||||
{
|
||||
const RenderDeviceFeatures& deviceFeatures = device.GetEnabledFeatures();
|
||||
if (pipelineInfo.faceFilling != FaceFilling::Fill && !deviceFeatures.nonSolidFaceFilling)
|
||||
{
|
||||
NazaraWarning("pipeline has face filling set to non-solid but non-solid face filling is not enabled on the device, disabling...");
|
||||
pipelineInfo.faceFilling = FaceFilling::Fill;
|
||||
}
|
||||
|
||||
if (pipelineInfo.depthClamp && !deviceFeatures.depthClamping)
|
||||
{
|
||||
NazaraWarning("pipeline has depth clamp enabled but depth clamping is not enabled on the device, disabling...");
|
||||
pipelineInfo.depthClamp = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,9 +3,20 @@
|
|||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Renderer/TextureSampler.hpp>
|
||||
#include <Nazara/Renderer/RenderDevice.hpp>
|
||||
#include <Nazara/Renderer/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
TextureSampler::~TextureSampler() = default;
|
||||
|
||||
void TextureSampler::ValidateSamplerInfo(const RenderDevice& device, TextureSamplerInfo& samplerInfo)
|
||||
{
|
||||
const RenderDeviceFeatures& deviceFeatures = device.GetEnabledFeatures();
|
||||
if (samplerInfo.anisotropyLevel > 1.f && !deviceFeatures.anisotropicFiltering)
|
||||
{
|
||||
NazaraWarning("texture sampler has anistropy level > 1.0 but anistropic filtering is not enabled on the device, disabling...");
|
||||
samplerInfo.anisotropyLevel = 0.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -598,7 +598,7 @@ namespace Nz
|
|||
&deviceFeatures
|
||||
};
|
||||
|
||||
std::shared_ptr<VulkanDevice> device = std::make_shared<VulkanDevice>(s_instance, BuildRenderDeviceInfo(deviceInfo));
|
||||
std::shared_ptr<VulkanDevice> device = std::make_shared<VulkanDevice>(s_instance, enabledFeatures, BuildRenderDeviceInfo(deviceInfo));
|
||||
if (!device->Create(deviceInfo, createInfo))
|
||||
{
|
||||
NazaraError("Failed to create Vulkan Device: " + TranslateVulkanError(device->GetLastErrorCode()));
|
||||
|
|
|
|||
|
|
@ -22,6 +22,11 @@ namespace Nz
|
|||
return m_renderDeviceInfo;
|
||||
}
|
||||
|
||||
const RenderDeviceFeatures& VulkanDevice::GetEnabledFeatures() const
|
||||
{
|
||||
return m_enabledFeatures;
|
||||
}
|
||||
|
||||
std::shared_ptr<AbstractBuffer> VulkanDevice::InstantiateBuffer(BufferType type)
|
||||
{
|
||||
return std::make_shared<VulkanBuffer>(*this, type);
|
||||
|
|
|
|||
|
|
@ -13,10 +13,12 @@
|
|||
|
||||
namespace Nz
|
||||
{
|
||||
VulkanRenderPipeline::VulkanRenderPipeline(Vk::Device& device, RenderPipelineInfo pipelineInfo) :
|
||||
VulkanRenderPipeline::VulkanRenderPipeline(VulkanDevice& device, RenderPipelineInfo pipelineInfo) :
|
||||
m_device(&device),
|
||||
m_pipelineInfo(std::move(pipelineInfo))
|
||||
{
|
||||
ValidatePipelineInfo(device, m_pipelineInfo);
|
||||
|
||||
m_pipelineCreateInfo = BuildCreateInfo(m_pipelineInfo);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,13 +3,16 @@
|
|||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/VulkanRenderer/VulkanTextureSampler.hpp>
|
||||
#include <Nazara/VulkanRenderer/VulkanDevice.hpp>
|
||||
#include <stdexcept>
|
||||
#include <Nazara/VulkanRenderer/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
VulkanTextureSampler::VulkanTextureSampler(Vk::Device& device, TextureSamplerInfo samplerInfo)
|
||||
VulkanTextureSampler::VulkanTextureSampler(VulkanDevice& device, TextureSamplerInfo samplerInfo)
|
||||
{
|
||||
ValidateSamplerInfo(device, samplerInfo);
|
||||
|
||||
VkSamplerCreateInfo createInfo = { VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO };
|
||||
createInfo.magFilter = ToVulkan(samplerInfo.magFilter);
|
||||
createInfo.minFilter = ToVulkan(samplerInfo.minFilter);
|
||||
|
|
|
|||
Loading…
Reference in New Issue