Pass material domain, variant to ShaderGenerator (#1402)

This commit is contained in:
Ben Doherty
2019-07-12 13:20:00 -07:00
committed by GitHub
parent 8f45f4ec35
commit 5cceda4155
3 changed files with 50 additions and 15 deletions

View File

@@ -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);

View File

@@ -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());

View File

@@ -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