Skip to content

Commit

Permalink
Return to the main menu if a shader compilation fails (#14256)
Browse files Browse the repository at this point in the history
Before this change, if the shaders are broken, only an error message is shown and the player enters the world nonetheless, where he/she sees broken graphics.
  • Loading branch information
HybridDog committed Jan 19, 2024
1 parent 432988a commit f08e4bb
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 3 deletions.
4 changes: 4 additions & 0 deletions src/client/clientlauncher.cpp
Expand Up @@ -278,6 +278,10 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args)
error_message = gettext("Connection error (timed out?)");
errorstream << error_message << std::endl;
}
catch (ShaderException &e) {
error_message = e.what();
errorstream << error_message << std::endl;
}

#ifdef NDEBUG
catch (std::exception &e) {
Expand Down
9 changes: 6 additions & 3 deletions src/client/shader.cpp
Expand Up @@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <IShaderConstantSetCallBack.h>
#include "client/renderingengine.h"
#include "EShaderTypes.h"
#include "gettext.h"
#include "log.h"
#include "gamedef.h"
#include "client/tile.h"
Expand Down Expand Up @@ -588,8 +589,8 @@ ShaderInfo ShaderSource::generateShader(const std::string &name,

video::IVideoDriver *driver = RenderingEngine::get_video_driver();
if (!driver->queryFeature(video::EVDF_ARB_GLSL)) {
errorstream << "Shaders are enabled but GLSL is not supported by the driver\n";
return shaderinfo;
throw ShaderException(gettext("Shaders are enabled but GLSL is not "
"supported by the driver."));
}
video::IGPUProgrammingServices *gpu = driver->getGPUProgrammingServices();

Expand Down Expand Up @@ -792,7 +793,9 @@ ShaderInfo ShaderSource::generateShader(const std::string &name,
dumpShaderProgram(warningstream, "Vertex", vertex_shader);
dumpShaderProgram(warningstream, "Fragment", fragment_shader);
dumpShaderProgram(warningstream, "Geometry", geometry_shader);
return shaderinfo;
throw ShaderException(
fmtgettext("Failed to compile the \"%s\" shader.", name.c_str()) +
strgettext("\nCheck debug.txt for details."));
}

// Apply the newly created material type
Expand Down
5 changes: 5 additions & 0 deletions src/exceptions.h
Expand Up @@ -92,6 +92,11 @@ class PrngException : public BaseException {
PrngException(const std::string &s): BaseException(s) {}
};

class ShaderException : public BaseException {
public:
ShaderException(const std::string &s): BaseException(s) {}
};

class ModError : public BaseException {
public:
ModError(const std::string &s): BaseException(s) {}
Expand Down

0 comments on commit f08e4bb

Please sign in to comment.