Add shaderMode option and remove useUbershader option

This commit is contained in:
offtkp 2024-07-31 01:44:55 +03:00
parent 91ebff1b5f
commit 1b779cafa1
8 changed files with 68 additions and 19 deletions

View file

@ -13,17 +13,9 @@ struct EmulatorConfig {
static constexpr bool shaderJitDefault = false;
#endif
// For now, use specialized shaders by default on MacOS as M1 drivers are buggy when using the ubershader, and on Android since mobile GPUs are
// horrible. On other platforms we default to ubershader + shadergen fallback for lights
#if defined(__ANDROID__) || defined(__APPLE__)
static constexpr bool ubershaderDefault = false;
#else
static constexpr bool ubershaderDefault = true;
#endif
bool shaderJitEnabled = shaderJitDefault;
bool discordRpcEnabled = false;
bool useUbershaders = ubershaderDefault;
ShaderMode shaderMode = defaultShaderMode;
bool accurateShaderMul = false;
// Toggles whether to force shadergen when there's more than N lights active and we're using the ubershader, for better performance

View file

@ -21,6 +21,20 @@ enum class RendererType : s8 {
};
struct EmulatorConfig;
enum class ShaderMode {
Specialized = 1,
Ubershader = 2,
Hybrid = 3,
};
// For now, use specialized shaders by default on MacOS as M1 drivers are buggy when using the ubershader, and on Android since mobile GPUs are
// horrible. On other platforms we default to ubershader + shadergen fallback for lights
#if defined(__ANDROID__) || defined(__APPLE__)
static constexpr ShaderMode defaultShaderMode = ShaderMode::Specialized;
#else
static constexpr ShaderMode defaultShaderMode = ShaderMode::Ubershader;
#endif
class GPU;
struct SDL_Window;
@ -56,6 +70,8 @@ class Renderer {
static constexpr u32 vertexBufferSize = 0x10000;
static std::optional<RendererType> typeFromString(std::string inString);
static const char* typeToString(RendererType rendererType);
static std::optional<ShaderMode> shaderModeFromString(std::string inString);
static const char* shaderModeToString(ShaderMode shaderMode);
virtual void reset() = 0;
virtual void display() = 0; // Display the 3DS screen contents to the window
@ -77,7 +93,7 @@ class Renderer {
virtual std::string getUbershader() { return ""; }
virtual void setUbershader(const std::string& shader) {}
virtual void setUbershaderSetting(bool value) {}
virtual void setShaderMode(ShaderMode shaderMode) {}
// Functions for initializing the graphics context for the Qt frontend, where we don't have the convenience of SDL_Window
#ifdef PANDA3DS_FRONTEND_QT

View file

@ -30,7 +30,7 @@ class RendererGL final : public Renderer {
OpenGL::VertexArray vao;
OpenGL::VertexBuffer vbo;
bool enableUbershader = true;
ShaderMode shaderMode = defaultShaderMode;
// Data
struct {
@ -110,8 +110,8 @@ class RendererGL final : public Renderer {
virtual bool supportsShaderReload() override { return true; }
virtual std::string getUbershader() override;
virtual void setUbershader(const std::string& shader) override;
virtual void setUbershaderSetting(bool value) override { enableUbershader = value; }
virtual void setShaderMode(ShaderMode value) override { shaderMode = value; }
std::optional<ColourBuffer> getColourBuffer(u32 addr, PICA::ColorFmt format, u32 width, u32 height, bool createIfnotFound = true);