Skip to content

Commit

Permalink
Capture Irrlicht's shader error message and include it in our error m…
Browse files Browse the repository at this point in the history
…essage
  • Loading branch information
grorp committed Jan 15, 2024
1 parent 48e8fb1 commit 64df516
Showing 1 changed file with 32 additions and 6 deletions.
38 changes: 32 additions & 6 deletions src/client/shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,23 @@ class MainShaderConstantSetterFactory : public IShaderConstantSetterFactory
};


class ShaderEventReceiver : public IEventReceiver
{
public:
std::string output;

virtual bool OnEvent(const SEvent &event) {
if (event.EventType == EET_LOG_TEXT_EVENT &&
event.LogEvent.Level == ELL_ERROR) {
// Log messages from Irrlicht are *usually* not newline-terminated.
output.append(event.LogEvent.Text).append("\n");
return true;
}

return false;
}
};

/*
ShaderSource
*/
Expand Down Expand Up @@ -777,21 +794,30 @@ ShaderInfo ShaderSource::generateShader(const std::string &name,

irr_ptr<ShaderCallback> cb{new ShaderCallback(m_setter_factories)};
infostream<<"Compiling high level shaders for "<<name<<std::endl;

IrrlichtDevice *device = RenderingEngine::get_raw_device();
IEventReceiver *old_recv = device->getEventReceiver();
ShaderEventReceiver recv;
device->setEventReceiver(&recv);

s32 shadermat = gpu->addHighLevelShaderMaterial(
vertex_shader.c_str(), nullptr, video::EVST_VS_1_1,
fragment_shader.c_str(), nullptr, video::EPST_PS_1_1,
geometry_shader_ptr, nullptr, video::EGST_GS_4_0, scene::EPT_TRIANGLES, scene::EPT_TRIANGLES, 0,
cb.get(), shaderinfo.base_material, 1);

device->setEventReceiver(old_recv);

if (shadermat == -1) {
errorstream<<"generate_shader(): "
"failed to generate \""<<name<<"\", "
"addHighLevelShaderMaterial failed."
<<std::endl;
dumpShaderProgram(warningstream, "Vertex", vertex_shader);
dumpShaderProgram(warningstream, "Fragment", fragment_shader);
dumpShaderProgram(warningstream, "Geometry", geometry_shader);
throw ShaderException("Failed to compile the \"" + name + "\" shader. "
"Check debug.txt for details.");

throw ShaderException("Failed to compile the \"" + name + "\" shader.\n" +
recv.output + "Check debug.txt for details.");
} else if (!recv.output.empty()) {
// Don't suppress any error messages.
errorstream << recv.output;
}

// Apply the newly created material type
Expand Down

0 comments on commit 64df516

Please sign in to comment.