compiles again

This commit is contained in:
Dynamitos
2023-11-05 10:36:01 +01:00
parent 4746c0f838
commit 77eb92838c
112 changed files with 1717 additions and 1540 deletions
+20 -20
View File
@@ -9,23 +9,23 @@ Material::Material()
{
}
Material::Material(Gfx::PGraphics graphics,
Array<OShaderParameter> parameter,
Material::Material(Gfx::PGraphics graphics,
Gfx::ODescriptorLayout layout,
uint32 uniformDataSize,
uint32 uniformBinding,
std::string materialName,
Array<OShaderExpression> expressions,
Map<std::string, OShaderExpression> expressions,
Array<std::string> parameter,
MaterialNode brdf)
: graphics(graphics)
, parameters(std::move(parameter))
, uniformDataSize(uniformDataSize)
, uniformBinding(uniformBinding)
, instanceId(0)
, layout(std::move(layout))
, materialName(materialName)
, codeExpressions(std::move(expressions))
, brdf(brdf)
, instanceId(0)
, parameters(std::move(parameter))
, brdf(std::move(brdf))
{
}
@@ -33,14 +33,19 @@ Material::~Material()
{
}
PMaterialInstance Seele::Material::instantiate()
OMaterialInstance Material::instantiate()
{
return new MaterialInstance(instanceId++, graphics, this, layout, parameters, uniformBinding, uniformDataSize);
return new MaterialInstance(
instanceId++,
graphics,
codeExpressions,
parameters,
uniformBinding,
uniformDataSize);
}
void Material::save(ArchiveBuffer& buffer) const
{
Serialization::save(buffer, brdfName);
Serialization::save(buffer, uniformDataSize);
Serialization::save(buffer, uniformBinding);
Serialization::save(buffer, instanceId);
@@ -59,13 +64,11 @@ void Material::save(ArchiveBuffer& buffer) const
Serialization::save(buffer, binding.descriptorType);
Serialization::save(buffer, binding.shaderStages);
}
Serialization::save(buffer, instances);
}
void Material::load(ArchiveBuffer& buffer)
{
graphics = buffer.getGraphics();
Serialization::load(buffer, brdfName);
Serialization::load(buffer, uniformDataSize);
Serialization::load(buffer, uniformBinding);
Serialization::load(buffer, instanceId);
@@ -98,11 +101,6 @@ void Material::load(ArchiveBuffer& buffer)
layout->addDescriptorBinding(binding, descriptorType, descriptorCount, bindingFlags, shaderStages);
}
layout->create();
Serialization::load(buffer, instances);
for (auto& instance : instances)
{
instance->setBaseMaterial(this);
}
}
void Material::compile()
@@ -114,21 +112,23 @@ void Material::compile()
codeStream << "struct " << materialName << " : IMaterial {\n";
for(const auto& parameter : parameters)
{
parameter->generateDeclaration(codeStream);
PShaderParameter handle = PShaderExpression(codeExpressions[parameter]);
handle->generateDeclaration(codeStream);
}
codeStream << "\ttypedef " << brdf.profile << " BRDF;\n";
codeStream << "\t" << brdf.profile << " prepare(MaterialFragmentParameter input) {\n";
codeStream << "\t\t" << brdf.profile << " result;\n";
Map<int32, std::string> varState;
for(const auto& expr : codeExpressions)
Map<std::string, std::string> varState;
for(const auto& [_, expr] :codeExpressions)
{
codeStream << expr->evaluate(varState);
}
for(const auto& [name, exp] : brdf.variables)
{
codeStream << "\t\tresult." << name << " = " << varState[exp->key] << ";";
codeStream << "\t\tresult." << name << " = " << varState[exp] << ";";
}
codeStream << "\t\treturn result;\n";
codeStream << "\t}\n";
codeStream << "};\n";
graphics->getShaderCompiler()->registerMaterial(this);
}
+6 -9
View File
@@ -9,18 +9,17 @@ class Material
{
public:
Material();
Material(Gfx::PGraphics graphics,
Array<OShaderParameter> parameter,
Material(Gfx::PGraphics graphics,
Gfx::ODescriptorLayout layout,
uint32 uniformDataSize,
uint32 uniformBinding,
std::string materialName,
Array<OShaderExpression> expressions,
Map<std::string, OShaderExpression> expressions,
Array<std::string> parameter,
MaterialNode brdf);
~Material();
const Gfx::PDescriptorLayout getDescriptorLayout() const { return layout; }
PMaterialInstance instantiate();
PMaterialInstance getInstance(uint64 instance) { return instances[instance]; }
OMaterialInstance instantiate();
const std::string& getName() const { return materialName; }
void save(ArchiveBuffer& buffer) const;
@@ -30,15 +29,13 @@ public:
private:
Gfx::PGraphics graphics;
std::string brdfName;
uint32 uniformDataSize;
uint32 uniformBinding;
uint64 instanceId;
Gfx::ODescriptorLayout layout;
std::string materialName;
Array<OShaderExpression> codeExpressions;
Array<OShaderParameter> parameters;
Array<OMaterialInstance> instances;
Map<std::string, OShaderExpression> codeExpressions;
Array<std::string> parameters;
MaterialNode brdf;
};
DEFINE_REF(Material)
+35 -18
View File
@@ -8,17 +8,34 @@ MaterialInstance::MaterialInstance()
{
}
MaterialInstance::MaterialInstance(uint64 id, Gfx::PGraphics graphics, PMaterial baseMaterial, Gfx::PDescriptorLayout layout, Array<OShaderParameter> params, uint32 uniformBinding, uint32 uniformSize)
: id(id), graphics(graphics), baseMaterial(baseMaterial), layout(layout), parameters(params), uniformBinding(uniformBinding)
MaterialInstance::MaterialInstance(uint64 id,
Gfx::PGraphics graphics,
Map<std::string, OShaderExpression>& expressions,
Array<std::string> params,
uint32 uniformBinding,
uint32 uniformSize)
: id(id)
, graphics(graphics)
, uniformBinding(uniformBinding)
{
uniformBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{
.sourceData = {
.size = uniformSize,
},
.bDynamic = true,
.dynamic = true,
}
);
uniformData.resize(uniformSize);
ArchiveBuffer buffer(graphics);
parameters.reserve(params.size());
for (int i = 0; i < params.size(); ++i)
{
Serialization::save(buffer, params[i]);
buffer.rewind();
OShaderParameter param;
Serialization::load(buffer, param);
parameters.add(std::move(param));
}
}
MaterialInstance::~MaterialInstance()
@@ -28,6 +45,8 @@ MaterialInstance::~MaterialInstance()
void MaterialInstance::updateDescriptor()
{
Gfx::PDescriptorLayout layout = baseMaterial->getMaterial()->getDescriptorLayout();
layout->reset();
descriptor = layout->allocateDescriptorSet();
for (auto& param : parameters)
{
@@ -36,16 +55,27 @@ void MaterialInstance::updateDescriptor()
descriptor->writeChanges();
}
Gfx::PDescriptorSet Seele::MaterialInstance::getDescriptorSet() const
Gfx::PDescriptorSet MaterialInstance::getDescriptorSet() const
{
return descriptor;
}
void MaterialInstance::setBaseMaterial(PMaterialAsset asset)
{
uniformBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{
.sourceData = {
.size = uniformData.size(),
},
.dynamic = true,
}
);
baseMaterial = asset;
}
void MaterialInstance::save(ArchiveBuffer& buffer) const
{
Serialization::save(buffer, uniformData);
Serialization::save(buffer, uniformBinding);
Serialization::save(buffer, uniformBuffer);
Serialization::save(buffer, parameters);
Serialization::save(buffer, id);
}
@@ -55,19 +85,6 @@ void MaterialInstance::load(ArchiveBuffer& buffer)
graphics = buffer.getGraphics();
Serialization::load(buffer, uniformData);
Serialization::load(buffer, uniformBinding);
Serialization::load(buffer, uniformBuffer);
Serialization::load(buffer, parameters);
Serialization::load(buffer, id);
}
void MaterialInstance::setBaseMaterial(PMaterial material)
{
layout = material->getDescriptorLayout();
baseMaterial = material;
descriptor = layout->allocateDescriptorSet();
for (auto& param : parameters)
{
param->updateDescriptorSet(descriptor, uniformData.data());
}
descriptor->writeChanges();
}
+11 -5
View File
@@ -1,6 +1,7 @@
#pragma once
#include "Material.h"
#include "Graphics/Buffer.h"
#include "Asset/MaterialAsset.h"
namespace Seele
{
@@ -8,16 +9,22 @@ class MaterialInstance
{
public:
MaterialInstance();
MaterialInstance(uint64 id, Gfx::PGraphics graphics, PMaterial baseMaterial, Gfx::PDescriptorLayout descriptor, Array<OShaderParameter> params, uint32 uniformBinding, uint32 uniformSize);
MaterialInstance(uint64 id,
Gfx::PGraphics graphics,
Map<std::string, OShaderExpression>& expressions,
Array<std::string> params,
uint32 uniformBinding,
uint32 uniformSize);
~MaterialInstance();
void updateDescriptor();
Gfx::PDescriptorSet getDescriptorSet() const;
PMaterial getBaseMaterial() const { return baseMaterial; }
PMaterial getBaseMaterial() const { return baseMaterial->getMaterial(); }
uint64 getId() const { return id; }
void setBaseMaterial(PMaterialAsset asset);
void save(ArchiveBuffer& buffer) const;
void load(ArchiveBuffer& buffer);
void setBaseMaterial(PMaterial material);
private:
Gfx::PGraphics graphics;
@@ -25,9 +32,8 @@ private:
uint32 uniformBinding;
Gfx::OUniformBuffer uniformBuffer;
Array<OShaderParameter> parameters;
Gfx::PDescriptorLayout layout;
Gfx::PDescriptorSet descriptor;
PMaterial baseMaterial;
PMaterialAsset baseMaterial;
uint64 id;
};
DEFINE_REF(MaterialInstance)
+27 -17
View File
@@ -31,6 +31,15 @@ void ExpressionOutput::load(ArchiveBuffer& buffer)
Serialization::load(buffer, type);
}
ShaderExpression::ShaderExpression()
{
}
ShaderExpression::ShaderExpression(std::string key)
: key(key)
{
}
void ShaderExpression::save(ArchiveBuffer& buffer) const
{
Serialization::save(buffer, inputs);
@@ -46,7 +55,7 @@ void ShaderExpression::load(ArchiveBuffer& buffer)
}
ShaderParameter::ShaderParameter(std::string name, uint32 byteOffset, uint32 binding)
: name(name)
: ShaderExpression(name)
, byteOffset(byteOffset)
, binding(binding)
{
@@ -56,16 +65,16 @@ ShaderParameter::~ShaderParameter()
{
}
std::string ShaderParameter::evaluate(Map<int32, std::string>& varState) const
std::string ShaderParameter::evaluate(Map<std::string, std::string>& varState) const
{
varState[key] = name;
varState[key] = key;
return "";
}
void ShaderParameter::save(ArchiveBuffer& buffer) const
{
ShaderExpression::save(buffer);
Serialization::save(buffer, name);
Serialization::save(buffer, key);
Serialization::save(buffer, byteOffset);
Serialization::save(buffer, binding);
}
@@ -73,7 +82,7 @@ void ShaderParameter::save(ArchiveBuffer& buffer) const
void ShaderParameter::load(ArchiveBuffer& buffer)
{
ShaderExpression::load(buffer);
Serialization::load(buffer, name);
Serialization::load(buffer, key);
Serialization::load(buffer, byteOffset);
Serialization::load(buffer, binding);
}
@@ -109,7 +118,7 @@ void FloatParameter::updateDescriptorSet(Gfx::PDescriptorSet, uint8* dst)
void FloatParameter::generateDeclaration(std::ofstream& stream) const
{
stream << "\tlayout(offset = " << byteOffset << ") float " << name << ";\n";
stream << "\tlayout(offset = " << byteOffset << ") float " << key << ";\n";
}
VectorParameter::VectorParameter(std::string name, uint32 byteOffset, uint32 binding)
@@ -131,7 +140,7 @@ void VectorParameter::updateDescriptorSet(Gfx::PDescriptorSet, uint8* dst)
void VectorParameter::generateDeclaration(std::ofstream& stream) const
{
stream << "\tlayout(offset = " << byteOffset << ") float3 " << name << ";\n";
stream << "\tlayout(offset = " << byteOffset << ") float3 " << key << ";\n";
}
void VectorParameter::save(ArchiveBuffer& buffer) const
@@ -164,7 +173,7 @@ void TextureParameter::updateDescriptorSet(Gfx::PDescriptorSet descriptorSet, ui
void TextureParameter::generateDeclaration(std::ofstream& stream) const
{
stream << "\tTexture2D " << name << ";\n";
stream << "\tTexture2D " << key << ";\n";
}
void TextureParameter::save(ArchiveBuffer& buffer) const
@@ -200,7 +209,7 @@ void SamplerParameter::updateDescriptorSet(Gfx::PDescriptorSet descriptorSet, ui
void SamplerParameter::generateDeclaration(std::ofstream& stream) const
{
stream << "\tSamplerState " << name << ";\n";
stream << "\tSamplerState " << key << ";\n";
}
void SamplerParameter::save(ArchiveBuffer& buffer) const
@@ -233,7 +242,7 @@ void CombinedTextureParameter::updateDescriptorSet(Gfx::PDescriptorSet descripto
void CombinedTextureParameter::generateDeclaration(std::ofstream& stream) const
{
stream << "\tTexture2D " << name << ";\n";
stream << "\tTexture2D " << key << ";\n";
}
void CombinedTextureParameter::save(ArchiveBuffer& buffer) const
@@ -267,9 +276,9 @@ ConstantExpression::~ConstantExpression()
}
std::string ConstantExpression::evaluate(Map<int32, std::string>& varState) const
std::string ConstantExpression::evaluate(Map<std::string, std::string>& varState) const
{
std::string varName = std::format("const_exp_{}", std::abs(key));
std::string varName = std::format("const_exp_{}", key);
varState[key] = varName;
return std::format("let {} = {};\n", varName, expr);
}
@@ -296,7 +305,7 @@ AddExpression::~AddExpression()
}
std::string AddExpression::evaluate(Map<int32, std::string>& varState) const
std::string AddExpression::evaluate(Map<std::string, std::string>& varState) const
{
std::string varName = std::format("exp_{}", key);
varState[key] = varName;
@@ -313,7 +322,7 @@ void AddExpression::load(ArchiveBuffer& buffer)
ShaderExpression::load(buffer);
}
std::string SubExpression::evaluate(Map<int32, std::string>& varState) const
std::string SubExpression::evaluate(Map<std::string, std::string>& varState) const
{
std::string varName = std::format("exp_{}", key);
varState[key] = varName;
@@ -330,7 +339,7 @@ void SubExpression::load(ArchiveBuffer& buffer)
ShaderExpression::load(buffer);
}
std::string MulExpression::evaluate(Map<int32, std::string>& varState) const
std::string MulExpression::evaluate(Map<std::string, std::string>& varState) const
{
std::string varName = std::format("exp_{}", key);
varState[key] = varName;
@@ -347,7 +356,7 @@ void MulExpression::load(ArchiveBuffer& buffer)
ShaderExpression::load(buffer);
}
std::string SwizzleExpression::evaluate(Map<int32, std::string>& varState) const
std::string SwizzleExpression::evaluate(Map<std::string, std::string>& varState) const
{
std::string varName = std::format("exp_{}", key);
std::string swizzle = "";
@@ -370,6 +379,7 @@ std::string SwizzleExpression::evaluate(Map<int32, std::string>& varState) const
break;
case 3:
swizzle += "w";
break;
default:
throw std::logic_error("invalid component");
}
@@ -390,7 +400,7 @@ void SwizzleExpression::load(ArchiveBuffer& buffer)
Serialization::load(buffer, comp);
}
std::string SampleExpression::evaluate(Map<int32, std::string>& varState) const
std::string SampleExpression::evaluate(Map<std::string, std::string>& varState) const
{
std::string varName = std::format("exp_{}", key);
varState[key] = varName;
+13 -12
View File
@@ -18,7 +18,7 @@ enum class ExpressionType
};
struct ExpressionInput
{
int source;
std::string source;
ExpressionType type = ExpressionType::UNKNOWN;
void save(ArchiveBuffer& buffer) const;
void load(ArchiveBuffer& buffer);
@@ -35,9 +35,11 @@ struct ShaderExpression
{
Map<std::string, ExpressionInput> inputs;
ExpressionOutput output;
int32 key;
std::string key;
ShaderExpression();
ShaderExpression(std::string key);
virtual uint64 getIdentifier() const = 0;
virtual std::string evaluate(Map<int32, std::string>& varState) const = 0;
virtual std::string evaluate(Map<std::string, std::string>& varState) const = 0;
virtual void save(ArchiveBuffer& buffer) const;
virtual void load(ArchiveBuffer& buffer);
};
@@ -46,7 +48,6 @@ DEFINE_REF(ShaderExpression)
DECLARE_NAME_REF(Gfx, DescriptorSet)
struct ShaderParameter : public ShaderExpression
{
std::string name;
uint32 byteOffset;
uint32 binding;
ShaderParameter() {}
@@ -56,7 +57,7 @@ struct ShaderParameter : public ShaderExpression
virtual void updateDescriptorSet(Gfx::PDescriptorSet descriptorSet, uint8* dst) = 0;
virtual void generateDeclaration(std::ofstream& stream) const = 0;
virtual uint64 getIdentifier() const = 0;
virtual std::string evaluate(Map<int32, std::string>& varState) const override;
virtual std::string evaluate(Map<std::string, std::string>& varState) const override;
virtual void save(ArchiveBuffer& buffer) const;
virtual void load(ArchiveBuffer& buffer);
};
@@ -143,7 +144,7 @@ struct ConstantExpression : public ShaderExpression
ConstantExpression(std::string expr, ExpressionType type);
virtual ~ConstantExpression();
virtual uint64 getIdentifier() const { return IDENTIFIER; }
virtual std::string evaluate(Map<int32, std::string>& varState) const override;
virtual std::string evaluate(Map<std::string, std::string>& varState) const override;
virtual void save(ArchiveBuffer& buffer) const override;
virtual void load(ArchiveBuffer& buffer) override;
};
@@ -154,7 +155,7 @@ struct AddExpression : public ShaderExpression
AddExpression();
virtual ~AddExpression();
virtual uint64 getIdentifier() const { return IDENTIFIER; }
virtual std::string evaluate(Map<int32, std::string>& varState) const override;
virtual std::string evaluate(Map<std::string, std::string>& varState) const override;
virtual void save(ArchiveBuffer& buffer) const override;
virtual void load(ArchiveBuffer& buffer) override;
};
@@ -165,7 +166,7 @@ struct SubExpression : public ShaderExpression
SubExpression() {}
virtual ~SubExpression() {}
virtual uint64 getIdentifier() const { return IDENTIFIER; }
virtual std::string evaluate(Map<int32, std::string>& varState) const override;
virtual std::string evaluate(Map<std::string, std::string>& varState) const override;
virtual void save(ArchiveBuffer& buffer) const override;
virtual void load(ArchiveBuffer& buffer) override;
};
@@ -176,7 +177,7 @@ struct MulExpression : public ShaderExpression
MulExpression() {}
virtual ~MulExpression() {}
virtual uint64 getIdentifier() const { return IDENTIFIER; }
virtual std::string evaluate(Map<int32, std::string>& varState) const override;
virtual std::string evaluate(Map<std::string, std::string>& varState) const override;
virtual void save(ArchiveBuffer& buffer) const override;
virtual void load(ArchiveBuffer& buffer) override;
};
@@ -188,7 +189,7 @@ struct SwizzleExpression : public ShaderExpression
SwizzleExpression() {}
virtual ~SwizzleExpression() {}
virtual uint64 getIdentifier() const { return IDENTIFIER; }
virtual std::string evaluate(Map<int32, std::string>& varState) const override;
virtual std::string evaluate(Map<std::string, std::string>& varState) const override;
virtual void save(ArchiveBuffer& buffer) const override;
virtual void load(ArchiveBuffer& buffer) override;
};
@@ -199,7 +200,7 @@ struct SampleExpression : public ShaderExpression
SampleExpression() {}
virtual ~SampleExpression() {}
virtual uint64 getIdentifier() const { return IDENTIFIER; }
virtual std::string evaluate(Map<int32, std::string>& varState) const override;
virtual std::string evaluate(Map<std::string, std::string>& varState) const override;
virtual void save(ArchiveBuffer& buffer) const override;
virtual void load(ArchiveBuffer& buffer) override;
};
@@ -208,7 +209,7 @@ DEFINE_REF(SampleExpression)
struct MaterialNode
{
std::string profile;
Map<std::string, OShaderExpression> variables;
Map<std::string, std::string> variables;
MaterialNode() {}
~MaterialNode() {}
void save(ArchiveBuffer& buffer) const;