mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 06:08:30 +09:00
[Fix] (MG_Impl/GLImpl, MG_State/GLState): fix frag data location queries [skip ci]
This commit is contained in:
@@ -1200,6 +1200,19 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
std::to_string(program) + " is not the name of a program object."));
|
std::to_string(program) + " is not the name of a program object."));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (name == nullptr) {
|
||||||
|
MG_State::pGLContext->RecordError(
|
||||||
|
ErrorCode::InvalidValue,
|
||||||
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "name cannot be null."));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!programObject->GetLinkStatus()) {
|
||||||
|
MG_State::pGLContext->RecordError(
|
||||||
|
ErrorCode::InvalidOperation,
|
||||||
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
|
std::to_string(program) + " has not been linked successfully."));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return programObject->GetFragmentDataLocation(name);
|
return programObject->GetFragmentDataLocation(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -214,6 +214,7 @@ namespace MobileGL::MG_State::GLState {
|
|||||||
if (result) {
|
if (result) {
|
||||||
m_linkStatus = true;
|
m_linkStatus = true;
|
||||||
m_program = result.value();
|
m_program = result.value();
|
||||||
|
m_linkedFragDataLocation = m_explicitFragDataLocation;
|
||||||
MGLOG_D("ProgramObject %u: LinkProgram succeeded, TProgram ptr %p", m_externalIndex, m_program.get());
|
MGLOG_D("ProgramObject %u: LinkProgram succeeded, TProgram ptr %p", m_externalIndex, m_program.get());
|
||||||
} else {
|
} else {
|
||||||
m_infoLog = result.error().log;
|
m_infoLog = result.error().log;
|
||||||
@@ -592,12 +593,12 @@ namespace MobileGL::MG_State::GLState {
|
|||||||
Int ProgramObject::GetFragmentDataLocation(const char* name) {
|
Int ProgramObject::GetFragmentDataLocation(const char* name) {
|
||||||
if (!m_program || !name) return -1;
|
if (!m_program || !name) return -1;
|
||||||
|
|
||||||
const auto explicitLocation = m_explicitFragDataLocation.find(name);
|
const auto explicitLocation = m_linkedFragDataLocation.find(name);
|
||||||
const Int outputCount = m_program->getNumPipeOutputs();
|
const Int outputCount = m_program->getNumPipeOutputs();
|
||||||
for (Int index = 0; index < outputCount; ++index) {
|
for (Int index = 0; index < outputCount; ++index) {
|
||||||
const auto& output = m_program->getPipeOutput(index);
|
const auto& output = m_program->getPipeOutput(index);
|
||||||
if (output.name != name) continue;
|
if (output.name != name) continue;
|
||||||
if (explicitLocation != m_explicitFragDataLocation.end()) return static_cast<Int>(explicitLocation->second);
|
if (explicitLocation != m_linkedFragDataLocation.end()) return static_cast<Int>(explicitLocation->second);
|
||||||
return static_cast<Int>(output.layoutLocation());
|
return static_cast<Int>(output.layoutLocation());
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@@ -257,6 +257,7 @@ namespace MobileGL::MG_State::GLState {
|
|||||||
|
|
||||||
// FragData (Frag out)
|
// FragData (Frag out)
|
||||||
UnorderedMap<String, Uint> m_explicitFragDataLocation;
|
UnorderedMap<String, Uint> m_explicitFragDataLocation;
|
||||||
|
UnorderedMap<String, Uint> m_linkedFragDataLocation;
|
||||||
|
|
||||||
// Uniforms
|
// Uniforms
|
||||||
UnorderedMap<String, Uint> m_uniformLocations;
|
UnorderedMap<String, Uint> m_uniformLocations;
|
||||||
|
|||||||
@@ -142,6 +142,30 @@ void main() {
|
|||||||
EXPECT_EQ(source.find("#define"), String::npos);
|
EXPECT_EQ(source.find("#define"), String::npos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ProgramUtilTest, PreprocessLegacyFragmentShaderModernizesFragData) {
|
||||||
|
using namespace MG_Util::ShaderTranspiler;
|
||||||
|
|
||||||
|
String source = R"(#version 130
|
||||||
|
void main() {
|
||||||
|
gl_FragData[0] = vec4(1.0);
|
||||||
|
gl_FragData[1].a = 0.5;
|
||||||
|
})";
|
||||||
|
|
||||||
|
PreprocessShaderSource(ShaderStage::Fragment, source);
|
||||||
|
|
||||||
|
EXPECT_EQ(source.find("#version 460 core\n"), 0);
|
||||||
|
EXPECT_NE(source.find("layout(location = 0) out vec4 mg_FragData[8];\n"), String::npos);
|
||||||
|
EXPECT_NE(source.find("mg_FragData[0] = vec4(1.0);"), String::npos);
|
||||||
|
EXPECT_NE(source.find("mg_FragData[1].a = 0.5;"), String::npos);
|
||||||
|
EXPECT_EQ(source.find("gl_FragData"), String::npos);
|
||||||
|
|
||||||
|
ShaderAttrib attrib{.shaderType = GL_FRAGMENT_SHADER, .sourceStr = source};
|
||||||
|
auto res = ShaderCompiler::CompileShader(attrib);
|
||||||
|
if (!res) {
|
||||||
|
FAIL() << "errc: " << res.error().errc << "\nlog: " << res.error().log << "\nsource:\n" << source;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(ProgramUtilTest, PreprocessFragmentShaderInjectsDepthRangeShim) {
|
TEST_F(ProgramUtilTest, PreprocessFragmentShaderInjectsDepthRangeShim) {
|
||||||
using namespace MG_Util::ShaderTranspiler;
|
using namespace MG_Util::ShaderTranspiler;
|
||||||
|
|
||||||
|
|||||||
@@ -286,10 +286,15 @@ namespace {
|
|||||||
if (stage == MobileGL::ShaderStage::Fragment) {
|
if (stage == MobileGL::ShaderStage::Fragment) {
|
||||||
ReplaceIdentifier(source, "varying", "in");
|
ReplaceIdentifier(source, "varying", "in");
|
||||||
const bool usesFragColor = source.find("gl_FragColor") != MobileGL::String::npos;
|
const bool usesFragColor = source.find("gl_FragColor") != MobileGL::String::npos;
|
||||||
|
const bool usesFragData = source.find("gl_FragData") != MobileGL::String::npos;
|
||||||
if (usesFragColor) {
|
if (usesFragColor) {
|
||||||
ReplaceIdentifier(source, "gl_FragColor", "mg_FragColor");
|
ReplaceIdentifier(source, "gl_FragColor", "mg_FragColor");
|
||||||
source.insert(FindAfterVersionDirective(source), "out vec4 mg_FragColor;\n");
|
source.insert(FindAfterVersionDirective(source), "out vec4 mg_FragColor;\n");
|
||||||
}
|
}
|
||||||
|
if (usesFragData) {
|
||||||
|
ReplaceIdentifier(source, "gl_FragData", "mg_FragData");
|
||||||
|
source.insert(FindAfterVersionDirective(source), "layout(location = 0) out vec4 mg_FragData[8];\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user