mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 14:18:31 +09:00
[Fix] (MG_Util/Program): fix sampler extraction
This commit is contained in:
@@ -117,6 +117,7 @@ TEST_F(ProgramTest, ExtractPlainUniform) {
|
|||||||
root->traverse(&traverser);
|
root->traverse(&traverser);
|
||||||
|
|
||||||
ASSERT_EQ(uniforms.size(), 2);
|
ASSERT_EQ(uniforms.size(), 2);
|
||||||
|
ASSERT_EQ(samplers.size(), 0);
|
||||||
|
|
||||||
auto ProjMat_uniform_it = std::find_if(uniforms.begin(), uniforms.end(), [] (TUniform<TUniformType::Uniform>& uniform) {
|
auto ProjMat_uniform_it = std::find_if(uniforms.begin(), uniforms.end(), [] (TUniform<TUniformType::Uniform>& uniform) {
|
||||||
return uniform.name == "ProjMat";
|
return uniform.name == "ProjMat";
|
||||||
@@ -134,3 +135,59 @@ TEST_F(ProgramTest, ExtractPlainUniform) {
|
|||||||
FAIL() << "errc: " << res.error().errc << "\nlog: " << res.error().log;
|
FAIL() << "errc: " << res.error().errc << "\nlog: " << res.error().log;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* fs_uniform = R"(#version 150
|
||||||
|
|
||||||
|
uniform sampler2D DiffuseSampler;
|
||||||
|
|
||||||
|
uniform vec4 ColorModulator;
|
||||||
|
|
||||||
|
in vec2 texCoord;
|
||||||
|
in vec4 vertexColor;
|
||||||
|
|
||||||
|
out vec4 fragColor;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec4 color = texture(DiffuseSampler, texCoord) * vertexColor;
|
||||||
|
|
||||||
|
// blit final output of compositor into displayed back buffer
|
||||||
|
fragColor = color * ColorModulator;
|
||||||
|
})";
|
||||||
|
|
||||||
|
TEST_F(ProgramTest, ExtractSampler) {
|
||||||
|
using namespace MG_Util::ShaderTranspiler;
|
||||||
|
ShaderAttrib attrib {
|
||||||
|
.shaderType = GL_FRAGMENT_SHADER,
|
||||||
|
.sourceStr = fs_uniform
|
||||||
|
};
|
||||||
|
|
||||||
|
Vector<TUniform<TUniformType::Uniform>> uniforms;
|
||||||
|
Vector<TUniform<TUniformType::Sampler>> samplers;
|
||||||
|
|
||||||
|
auto res = ShaderCompiler::CompileShader(attrib);
|
||||||
|
if (res) {
|
||||||
|
UniformTraverser traverser(uniforms, samplers);
|
||||||
|
auto root = res->TShader->getIntermediate()->getTreeRoot();
|
||||||
|
root->traverse(&traverser);
|
||||||
|
|
||||||
|
ASSERT_EQ(uniforms.size(), 1);
|
||||||
|
ASSERT_EQ(samplers.size(), 1);
|
||||||
|
|
||||||
|
auto ColorModulator_uniform_it = std::find_if(uniforms.begin(), uniforms.end(), [] (TUniform<TUniformType::Uniform>& uniform) {
|
||||||
|
return uniform.name == "ColorModulator";
|
||||||
|
});
|
||||||
|
ASSERT_TRUE(ColorModulator_uniform_it != uniforms.end());
|
||||||
|
ASSERT_EQ(ColorModulator_uniform_it->storageQualifier, glslang::EvqUniform);
|
||||||
|
|
||||||
|
auto DiffuseSampler_uniform_it = std::find_if(samplers.begin(), samplers.end(), [] (TUniform<TUniformType::Sampler>& uniform) {
|
||||||
|
return uniform.name == "DiffuseSampler";
|
||||||
|
});
|
||||||
|
ASSERT_TRUE(DiffuseSampler_uniform_it != samplers.end());
|
||||||
|
auto& sampler = DiffuseSampler_uniform_it->sampler;
|
||||||
|
ASSERT_EQ(sampler.type, glslang::EbtFloat);
|
||||||
|
ASSERT_EQ(sampler.dim, glslang::Esd2D);
|
||||||
|
} else {
|
||||||
|
ASSERT_NE(res.error().errc, 0);
|
||||||
|
FAIL() << "errc: " << res.error().errc << "\nlog: " << res.error().log;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,7 +16,11 @@ namespace ShaderTranspiler {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
const auto &type = symbol->getType();
|
const auto &type = symbol->getType();
|
||||||
if (symbol->getQualifier().isUniform()) {
|
if (type.getBasicType() == glslang::EbtSampler) {
|
||||||
|
auto &uniform = samplers.emplace_back();
|
||||||
|
uniform.name = symbol->getName();
|
||||||
|
uniform.sampler = type.getSampler();
|
||||||
|
} else if (symbol->getQualifier().isUniform()) {
|
||||||
auto& name = symbol->getName();
|
auto& name = symbol->getName();
|
||||||
auto qualifier = symbol->getQualifier();
|
auto qualifier = symbol->getQualifier();
|
||||||
|
|
||||||
@@ -26,11 +30,26 @@ namespace ShaderTranspiler {
|
|||||||
uniform.layoutLocation = qualifier.layoutLocation;
|
uniform.layoutLocation = qualifier.layoutLocation;
|
||||||
uniform.layoutBinding = qualifier.layoutBinding;
|
uniform.layoutBinding = qualifier.layoutBinding;
|
||||||
uniform.layoutPacking = qualifier.layoutPacking;
|
uniform.layoutPacking = qualifier.layoutPacking;
|
||||||
} else if (type.getBasicType() == glslang::EbtSampler) {
|
|
||||||
auto &uniform = samplers.emplace_back();
|
|
||||||
uniform.name = symbol->getName();
|
|
||||||
uniform.sampler = type.getSampler();
|
|
||||||
}
|
}
|
||||||
|
// if (symbol->getQualifier().isUniformOrBuffer()) {
|
||||||
|
// auto name = symbol->getName();
|
||||||
|
// auto qualifier = symbol->getQualifier();
|
||||||
|
//
|
||||||
|
// fprintf(stderr, "%s: %s\n", name.c_str(),
|
||||||
|
// glslang::GetStorageQualifierString(qualifier.storage));
|
||||||
|
//
|
||||||
|
// if (qualifier.hasLocation()) {
|
||||||
|
// fprintf(stderr, " loc: %d\n", qualifier.layoutLocation);
|
||||||
|
// }
|
||||||
|
// if (qualifier.hasBinding()) {
|
||||||
|
// fprintf(stderr, " binding: %d\n", qualifier.layoutBinding);
|
||||||
|
// }
|
||||||
|
// if (qualifier.hasPacking()) {
|
||||||
|
// fprintf(stderr, " packing: %s\n",
|
||||||
|
// glslang::TQualifier::getLayoutPackingString(
|
||||||
|
// qualifier.layoutPacking));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user