Pass material domain, variant to ShaderGenerator (#1402)
This commit is contained in:
@@ -493,8 +493,8 @@ bool MaterialBuilder::generateShaders(const std::vector<Variant>& variants, Chun
|
||||
std::vector<uint32_t> spirv;
|
||||
std::string msl;
|
||||
|
||||
ShaderGenerator sg(mProperties, mVariables,
|
||||
mMaterialCode, mMaterialLineOffset, mMaterialVertexCode, mMaterialVertexLineOffset);
|
||||
ShaderGenerator sg(mProperties, mVariables, mMaterialCode, mMaterialLineOffset,
|
||||
mMaterialVertexCode, mMaterialVertexLineOffset, mMaterialDomain);
|
||||
|
||||
bool emptyVertexCode = mMaterialVertexCode.empty();
|
||||
bool customDepth = sg.hasCustomDepthShader() ||
|
||||
@@ -657,8 +657,8 @@ Package MaterialBuilder::build() noexcept {
|
||||
const std::string MaterialBuilder::peek(filament::backend::ShaderType type,
|
||||
const CodeGenParams& params, const PropertyList& properties) noexcept {
|
||||
|
||||
ShaderGenerator sg(properties, mVariables,
|
||||
mMaterialCode, mMaterialLineOffset, mMaterialVertexCode, mMaterialVertexLineOffset);
|
||||
ShaderGenerator sg(properties, mVariables, mMaterialCode, mMaterialLineOffset,
|
||||
mMaterialVertexCode, mMaterialVertexLineOffset, mMaterialDomain);
|
||||
|
||||
MaterialInfo info;
|
||||
prepareToBuild(info);
|
||||
|
||||
@@ -69,6 +69,18 @@ static void generateVertexDomain(const CodeGenerator& cg, utils::io::sstream& vs
|
||||
}
|
||||
}
|
||||
|
||||
static void generatePostProcessMaterialVariantDefines(const CodeGenerator& cg,
|
||||
utils::io::sstream& shader, PostProcessVariant variant) noexcept {
|
||||
switch (variant) {
|
||||
case PostProcessVariant::OPAQUE:
|
||||
cg.generateDefine(shader, "POST_PROCESS_OPAQUE", 1u);
|
||||
break;
|
||||
case PostProcessVariant::TRANSLUCENT:
|
||||
cg.generateDefine(shader, "POST_PROCESS_OPAQUE", 0u);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static size_t countLines(const char* s) noexcept {
|
||||
size_t lines = 0;
|
||||
size_t i = 0;
|
||||
@@ -106,8 +118,8 @@ ShaderGenerator::ShaderGenerator(
|
||||
MaterialBuilder::PropertyList const& properties,
|
||||
MaterialBuilder::VariableList const& variables,
|
||||
utils::CString const& materialCode, size_t lineOffset,
|
||||
utils::CString const& materialVertexCode, size_t vertexLineOffset) noexcept {
|
||||
|
||||
utils::CString const& materialVertexCode, size_t vertexLineOffset,
|
||||
MaterialBuilder::MaterialDomain materialDomain) noexcept {
|
||||
std::copy(std::begin(properties), std::end(properties), std::begin(mProperties));
|
||||
std::copy(std::begin(variables), std::end(variables), std::begin(mVariables));
|
||||
|
||||
@@ -115,10 +127,16 @@ ShaderGenerator::ShaderGenerator(
|
||||
mMaterialVertexCode = materialVertexCode;
|
||||
mMaterialLineOffset = lineOffset;
|
||||
mMaterialVertexLineOffset = vertexLineOffset;
|
||||
mMaterialDomain = materialDomain;
|
||||
|
||||
if (mMaterialCode.empty()) {
|
||||
mMaterialCode =
|
||||
utils::CString("void material(inout MaterialInputs m) {\n prepareMaterial(m);\n}\n");
|
||||
if (mMaterialDomain == MaterialBuilder::MaterialDomain::SURFACE) {
|
||||
mMaterialCode =
|
||||
utils::CString("void material(inout MaterialInputs m) {\n prepareMaterial(m);\n}\n");
|
||||
} else if (mMaterialDomain == MaterialBuilder::MaterialDomain::POST_PROCESS) {
|
||||
mMaterialCode =
|
||||
utils::CString("void postProcess(inout PostProcessInputs p) {\n}\n");
|
||||
}
|
||||
}
|
||||
if (mMaterialVertexCode.empty()) {
|
||||
mMaterialVertexCode =
|
||||
@@ -130,6 +148,11 @@ const std::string ShaderGenerator::createVertexProgram(filament::backend::Shader
|
||||
MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage,
|
||||
MaterialInfo const& material, uint8_t variantKey, filament::Interpolation interpolation,
|
||||
filament::VertexDomain vertexDomain) const noexcept {
|
||||
if (mMaterialDomain == MaterialBuilder::MaterialDomain::POST_PROCESS) {
|
||||
return ShaderPostProcessGenerator::createPostProcessVertexProgram(shaderModel, targetApi,
|
||||
targetLanguage, material, variantKey, material.samplerBindings, mMaterialVertexCode);
|
||||
}
|
||||
|
||||
utils::io::sstream vs;
|
||||
|
||||
const CodeGenerator cg(shaderModel, targetApi, targetLanguage);
|
||||
@@ -228,6 +251,10 @@ const std::string ShaderGenerator::createFragmentProgram(filament::backend::Shad
|
||||
MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage,
|
||||
MaterialInfo const& material, uint8_t variantKey,
|
||||
filament::Interpolation interpolation) const noexcept {
|
||||
if (mMaterialDomain == MaterialBuilder::MaterialDomain::POST_PROCESS) {
|
||||
return ShaderPostProcessGenerator::createPostProcessFragmentProgram(shaderModel,
|
||||
targetApi, targetLanguage, material, variantKey, material.samplerBindings, mMaterialCode);
|
||||
}
|
||||
|
||||
const CodeGenerator cg(shaderModel, targetApi, targetLanguage);
|
||||
const bool lit = material.isLit;
|
||||
@@ -455,12 +482,13 @@ void ShaderPostProcessGenerator::generatePostProcessStageDefines(utils::io::sstr
|
||||
const std::string ShaderPostProcessGenerator::createPostProcessVertexProgram(
|
||||
filament::backend::ShaderModel sm, MaterialBuilder::TargetApi targetApi,
|
||||
MaterialBuilder::TargetLanguage targetLanguage, MaterialInfo const& material,
|
||||
const filament::SamplerBindingMap& samplerBindingMap,
|
||||
uint8_t variant, const filament::SamplerBindingMap& samplerBindingMap,
|
||||
utils::CString const& postProcessCode) noexcept {
|
||||
const CodeGenerator cg(sm, targetApi, targetLanguage);
|
||||
utils::io::sstream vs;
|
||||
cg.generateProlog(vs, ShaderType::VERTEX, false);
|
||||
cg.generateDefine(vs, "LOCATION_POSITION", uint32_t(VertexAttribute::POSITION));
|
||||
generatePostProcessMaterialVariantDefines(cg, vs, PostProcessVariant(variant));
|
||||
|
||||
cg.generateUniforms(vs, ShaderType::VERTEX,
|
||||
BindingPoints::PER_VIEW, UibGenerator::getPerViewUib());
|
||||
@@ -483,11 +511,12 @@ const std::string ShaderPostProcessGenerator::createPostProcessVertexProgram(
|
||||
const std::string ShaderPostProcessGenerator::createPostProcessFragmentProgram(
|
||||
filament::backend::ShaderModel sm, MaterialBuilder::TargetApi targetApi,
|
||||
MaterialBuilder::TargetLanguage targetLanguage, MaterialInfo const& material,
|
||||
const filament::SamplerBindingMap& samplerBindingMap,
|
||||
uint8_t variant, const filament::SamplerBindingMap& samplerBindingMap,
|
||||
utils::CString const& postProcessCode) noexcept {
|
||||
const CodeGenerator cg(sm, targetApi, targetLanguage);
|
||||
utils::io::sstream fs;
|
||||
cg.generateProlog(fs, ShaderType::FRAGMENT, false);
|
||||
generatePostProcessMaterialVariantDefines(cg, fs, PostProcessVariant(variant));
|
||||
|
||||
cg.generateUniforms(fs, ShaderType::FRAGMENT,
|
||||
BindingPoints::PER_VIEW, UibGenerator::getPerViewUib());
|
||||
|
||||
@@ -40,7 +40,8 @@ public:
|
||||
utils::CString const& materialCode,
|
||||
size_t lineOffset,
|
||||
utils::CString const& materialVertexCode,
|
||||
size_t vertexLineOffset) noexcept;
|
||||
size_t vertexLineOffset,
|
||||
MaterialBuilder::MaterialDomain materialDomain) noexcept;
|
||||
|
||||
const std::string createVertexProgram(filament::backend::ShaderModel sm,
|
||||
MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage,
|
||||
@@ -67,6 +68,7 @@ public:
|
||||
private:
|
||||
MaterialBuilder::PropertyList mProperties;
|
||||
MaterialBuilder::VariableList mVariables;
|
||||
MaterialBuilder::MaterialDomain mMaterialDomain;
|
||||
utils::CString mMaterialCode;
|
||||
utils::CString mMaterialVertexCode;
|
||||
size_t mMaterialLineOffset;
|
||||
@@ -84,11 +86,15 @@ struct ShaderPostProcessGenerator {
|
||||
filament::PostProcessStage variant) noexcept;
|
||||
|
||||
static const std::string createPostProcessVertexProgram(filament::backend::ShaderModel sm,
|
||||
MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, MaterialInfo const& material,
|
||||
const filament::SamplerBindingMap& samplerBindingMap, utils::CString const& postProcessCode) noexcept;
|
||||
MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage,
|
||||
MaterialInfo const& material, uint8_t variant,
|
||||
const filament::SamplerBindingMap& samplerBindingMap,
|
||||
utils::CString const& postProcessCode) noexcept;
|
||||
static const std::string createPostProcessFragmentProgram(filament::backend::ShaderModel sm,
|
||||
MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, MaterialInfo const& material,
|
||||
const filament::SamplerBindingMap& samplerBindingMap, utils::CString const& postProcessCode) noexcept;
|
||||
MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage,
|
||||
MaterialInfo const& material, uint8_t variant,
|
||||
const filament::SamplerBindingMap& samplerBindingMap,
|
||||
utils::CString const& postProcessCode) noexcept;
|
||||
};
|
||||
|
||||
} // namespace filament
|
||||
|
||||
Reference in New Issue
Block a user