diff --git a/src/Engine/Graphics/Resources.h b/src/Engine/Graphics/Resources.h index 050aedd..53d5a32 100644 --- a/src/Engine/Graphics/Resources.h +++ b/src/Engine/Graphics/Resources.h @@ -2,6 +2,7 @@ #include "Containers/Array.h" #include "Enums.h" #include "Math/Math.h" +#include "Initializer.h" namespace Seele { DECLARE_REF(Material) @@ -14,7 +15,9 @@ DECLARE_REF(GraphicsPipeline) DECLARE_REF(ComputePipeline) class Sampler { public: + Sampler(SamplerCreateInfo createInfo): samplerInfo(createInfo) {} virtual ~Sampler() {} + SamplerCreateInfo samplerInfo; }; DEFINE_REF(Sampler) diff --git a/src/Engine/Graphics/Vulkan/Graphics.cpp b/src/Engine/Graphics/Vulkan/Graphics.cpp index 542cb0e..f127628 100644 --- a/src/Engine/Graphics/Vulkan/Graphics.cpp +++ b/src/Engine/Graphics/Vulkan/Graphics.cpp @@ -285,27 +285,7 @@ Gfx::PComputePipeline Graphics::createComputePipeline(Gfx::ComputePipelineCreate } Gfx::OSampler Graphics::createSampler(const SamplerCreateInfo& createInfo) { - VkSamplerCreateInfo vkInfo = { - .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, - .pNext = nullptr, - .flags = createInfo.flags, - .magFilter = cast(createInfo.magFilter), - .minFilter = cast(createInfo.minFilter), - .mipmapMode = cast(createInfo.mipmapMode), - .addressModeU = cast(createInfo.addressModeU), - .addressModeV = cast(createInfo.addressModeV), - .addressModeW = cast(createInfo.addressModeW), - .mipLodBias = createInfo.mipLodBias, - .anisotropyEnable = createInfo.anisotropyEnable, - .maxAnisotropy = createInfo.maxAnisotropy, - .compareEnable = createInfo.compareEnable, - .compareOp = cast(createInfo.compareOp), - .minLod = createInfo.minLod, - .maxLod = createInfo.maxLod, - .borderColor = cast(createInfo.borderColor), - .unnormalizedCoordinates = createInfo.unnormalizedCoordinates, - }; - return new Sampler(this, vkInfo); + return new Sampler(this, createInfo); } Gfx::ODescriptorLayout Graphics::createDescriptorLayout(const std::string& name) { return new DescriptorLayout(this, name); } diff --git a/src/Engine/Graphics/Vulkan/Resources.cpp b/src/Engine/Graphics/Vulkan/Resources.cpp index 1b5e75e..b01a771 100644 --- a/src/Engine/Graphics/Vulkan/Resources.cpp +++ b/src/Engine/Graphics/Vulkan/Resources.cpp @@ -110,13 +110,33 @@ void DestructionManager::notifyCommandComplete() { } } -SamplerHandle::SamplerHandle(PGraphics graphics, VkSamplerCreateInfo createInfo) : CommandBoundResource(graphics, "Sampler") { - vkCreateSampler(graphics->getDevice(), &createInfo, nullptr, &sampler); +SamplerHandle::SamplerHandle(PGraphics graphics, SamplerCreateInfo createInfo) : CommandBoundResource(graphics, "Sampler") { + VkSamplerCreateInfo vkInfo = { + .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, + .pNext = nullptr, + .flags = createInfo.flags, + .magFilter = cast(createInfo.magFilter), + .minFilter = cast(createInfo.minFilter), + .mipmapMode = cast(createInfo.mipmapMode), + .addressModeU = cast(createInfo.addressModeU), + .addressModeV = cast(createInfo.addressModeV), + .addressModeW = cast(createInfo.addressModeW), + .mipLodBias = createInfo.mipLodBias, + .anisotropyEnable = createInfo.anisotropyEnable, + .maxAnisotropy = createInfo.maxAnisotropy, + .compareEnable = createInfo.compareEnable, + .compareOp = cast(createInfo.compareOp), + .minLod = createInfo.minLod, + .maxLod = createInfo.maxLod, + .borderColor = cast(createInfo.borderColor), + .unnormalizedCoordinates = createInfo.unnormalizedCoordinates, + }; + vkCreateSampler(graphics->getDevice(), &vkInfo, nullptr, &sampler); } SamplerHandle::~SamplerHandle() { vkDestroySampler(graphics->getDevice(), sampler, nullptr); } -Sampler::Sampler(PGraphics graphics, VkSamplerCreateInfo createInfo) - : graphics(graphics), handle(new SamplerHandle(graphics, createInfo)) {} +Sampler::Sampler(PGraphics graphics, SamplerCreateInfo createInfo) + : Gfx::Sampler(createInfo), graphics(graphics), handle(new SamplerHandle(graphics, createInfo)) {} Sampler::~Sampler() { graphics->getDestructionManager()->queueResourceForDestruction(std::move(handle)); } diff --git a/src/Engine/Graphics/Vulkan/Resources.h b/src/Engine/Graphics/Vulkan/Resources.h index 8290ecc..5d609ad 100644 --- a/src/Engine/Graphics/Vulkan/Resources.h +++ b/src/Engine/Graphics/Vulkan/Resources.h @@ -106,7 +106,7 @@ DEFINE_REF(DestructionManager) class SamplerHandle : public CommandBoundResource { public: - SamplerHandle(PGraphics graphics, VkSamplerCreateInfo createInfo); + SamplerHandle(PGraphics graphics, SamplerCreateInfo createInfo); virtual ~SamplerHandle(); VkSampler sampler; }; @@ -114,7 +114,7 @@ DEFINE_REF(SamplerHandle) class Sampler : public Gfx::Sampler { public: - Sampler(PGraphics graphics, VkSamplerCreateInfo createInfo); + Sampler(PGraphics graphics, SamplerCreateInfo createInfo); virtual ~Sampler(); PSamplerHandle getHandle() const { return handle; } VkSampler getSampler() const { return handle->sampler; } diff --git a/src/Engine/Material/ShaderExpression.cpp b/src/Engine/Material/ShaderExpression.cpp index d2fec09..2798153 100644 --- a/src/Engine/Material/ShaderExpression.cpp +++ b/src/Engine/Material/ShaderExpression.cpp @@ -69,12 +69,9 @@ FloatParameter::FloatParameter(std::string name, float data, uint32 index) : Sha FloatParameter::~FloatParameter() {} -void FloatParameter::updateDescriptorSet(uint32, uint32, uint32 floatOffset) { - Material::updateFloatData(floatOffset + index, 1, &data); -} +void FloatParameter::updateDescriptorSet(uint32, uint32, uint32 floatOffset) { Material::updateFloatData(floatOffset + index, 1, &data); } -std::string FloatParameter::evaluate(Map& varState) const -{ +std::string FloatParameter::evaluate(Map& varState) const { std::string varName = fmt::format("exp_{}", key); varState[key] = varName; return fmt::format("let {} = getMaterialFloatParameter({});\n", varName, index); @@ -90,8 +87,7 @@ void FloatParameter::load(ArchiveBuffer& buffer) { Serialization::load(buffer, data); } -VectorParameter::VectorParameter(std::string name, Vector data, uint32 index) - : ShaderParameter(name, index), data(data) { +VectorParameter::VectorParameter(std::string name, Vector data, uint32 index) : ShaderParameter(name, index), data(data) { output.name = name; output.type = ExpressionType::FLOAT3; } @@ -99,7 +95,7 @@ VectorParameter::VectorParameter(std::string name, Vector data, uint32 index) VectorParameter::~VectorParameter() {} void VectorParameter::updateDescriptorSet(uint32, uint32, uint32 floatOffset) { - Material::updateFloatData(floatOffset + index, 3, (float*) & data); + Material::updateFloatData(floatOffset + index, 3, (float*)&data); } std::string VectorParameter::evaluate(Map& varState) const { @@ -158,9 +154,7 @@ SamplerParameter::SamplerParameter(std::string name, Gfx::OSampler sampler, uint SamplerParameter::~SamplerParameter() {} -void SamplerParameter::updateDescriptorSet(uint32, uint32 samplerOffset, uint32) { - Material::updateSampler(samplerOffset + index, data); -} +void SamplerParameter::updateDescriptorSet(uint32, uint32 samplerOffset, uint32) { Material::updateSampler(samplerOffset + index, data); } std::string SamplerParameter::evaluate(Map& varState) const { std::string varName = fmt::format("exp_{}", key); @@ -168,11 +162,48 @@ std::string SamplerParameter::evaluate(Map& varState) return fmt::format("let {} = getMaterialSamplerParameter({});\n", varName, index); } -void SamplerParameter::save(ArchiveBuffer& buffer) const { ShaderParameter::save(buffer); } +void SamplerParameter::save(ArchiveBuffer& buffer) const { + ShaderParameter::save(buffer); + Serialization::save(buffer, data->samplerInfo.flags); + Serialization::save(buffer, data->samplerInfo.magFilter); + Serialization::save(buffer, data->samplerInfo.minFilter); + Serialization::save(buffer, data->samplerInfo.mipmapMode); + Serialization::save(buffer, data->samplerInfo.addressModeU); + Serialization::save(buffer, data->samplerInfo.addressModeV); + Serialization::save(buffer, data->samplerInfo.addressModeW); + Serialization::save(buffer, data->samplerInfo.mipLodBias); + Serialization::save(buffer, data->samplerInfo.anisotropyEnable); + Serialization::save(buffer, data->samplerInfo.maxAnisotropy); + Serialization::save(buffer, data->samplerInfo.compareEnable); + Serialization::save(buffer, data->samplerInfo.compareOp); + Serialization::save(buffer, data->samplerInfo.minLod); + Serialization::save(buffer, data->samplerInfo.maxLod); + Serialization::save(buffer, data->samplerInfo.borderColor); + Serialization::save(buffer, data->samplerInfo.unnormalizedCoordinates); + Serialization::save(buffer, data->samplerInfo.name); +} void SamplerParameter::load(ArchiveBuffer& buffer) { ShaderParameter::load(buffer); - data = buffer.getGraphics()->createSampler(SamplerCreateInfo{}); + SamplerCreateInfo samplerInfo; + Serialization::load(buffer, samplerInfo.flags); + Serialization::load(buffer, samplerInfo.magFilter); + Serialization::load(buffer, samplerInfo.minFilter); + Serialization::load(buffer, samplerInfo.mipmapMode); + Serialization::load(buffer, samplerInfo.addressModeU); + Serialization::load(buffer, samplerInfo.addressModeV); + Serialization::load(buffer, samplerInfo.addressModeW); + Serialization::load(buffer, samplerInfo.mipLodBias); + Serialization::load(buffer, samplerInfo.anisotropyEnable); + Serialization::load(buffer, samplerInfo.maxAnisotropy); + Serialization::load(buffer, samplerInfo.compareEnable); + Serialization::load(buffer, samplerInfo.compareOp); + Serialization::load(buffer, samplerInfo.minLod); + Serialization::load(buffer, samplerInfo.maxLod); + Serialization::load(buffer, samplerInfo.borderColor); + Serialization::load(buffer, samplerInfo.unnormalizedCoordinates); + Serialization::load(buffer, samplerInfo.name); + data = buffer.getGraphics()->createSampler(samplerInfo); } CombinedTextureParameter::CombinedTextureParameter(std::string name, PTextureAsset data, Gfx::OSampler sampler, uint32 index) @@ -183,7 +214,7 @@ CombinedTextureParameter::CombinedTextureParameter(std::string name, PTextureAss CombinedTextureParameter::~CombinedTextureParameter() {} -void CombinedTextureParameter::updateDescriptorSet(uint32 , uint32 , uint32 ) { assert(false); } +void CombinedTextureParameter::updateDescriptorSet(uint32, uint32, uint32) { assert(false); } std::string CombinedTextureParameter::evaluate(Map&) const { return ""; }