diff options
author | John Novak <john@johnovak.net> | 2022-04-30 09:25:15 +0300 |
---|---|---|
committer | John Novak <john@johnovak.net> | 2022-05-01 15:32:15 +0300 |
commit | b1d1e6eb585580cd899ffe6d881ca40e44bacee1 (patch) | |
tree | c6da4ef3009462854d187ec946d22074311fafec | |
parent | e2e13f50cd7821bc0caea814bfcc8240effe95c7 (diff) |
Gamma-correct all built-in shadersjnovak/gamma-correct-builtin-shaders
- Except for the CRT shaders that do their own gamma handling
-rw-r--r-- | include/render.h | 7 | ||||
-rw-r--r-- | src/gui/render.cpp | 42 | ||||
-rw-r--r-- | src/gui/sdlmain.cpp | 24 |
3 files changed, 48 insertions, 25 deletions
diff --git a/include/render.h b/include/render.h index f0676f76b..8ec1b9ac1 100644 --- a/include/render.h +++ b/include/render.h @@ -27,6 +27,9 @@ #include "../src/gui/render_scalers.h" +#include <string> +#include <vector> + #define RENDER_SKIP_CACHE 16 //Enable this for scalers to support 0 input for empty lines //#define RENDER_NULL_INPUT @@ -108,4 +111,8 @@ bool RENDER_StartUpdate(void); void RENDER_EndUpdate(bool abort); void RENDER_SetPal(uint8_t entry,uint8_t red,uint8_t green,uint8_t blue); +#if C_OPENGL +extern const std::vector<std::string> builtin_shader_names; +#endif + #endif diff --git a/src/gui/render.cpp b/src/gui/render.cpp index 6ce0e2a59..1b03c4915 100644 --- a/src/gui/render.cpp +++ b/src/gui/render.cpp @@ -624,25 +624,33 @@ static void ChangeScaler(bool pressed) { } */ #if C_OPENGL +const std::unordered_map<std::string, const char *> builtin_shaders = { + {"advinterp2x", advinterp2x_glsl}, + {"advinterp3x", advinterp3x_glsl}, + {"advmame2x", advmame2x_glsl}, + {"advmame3x", advmame3x_glsl}, + {"crt-easymode-flat", crt_easymode_tweaked_glsl}, + {"crt-fakelottes-flat", crt_fakelottes_tweaked_glsl}, + {"default", sharp_glsl}, + {"rgb2x", rgb2x_glsl}, + {"rgb3x", rgb3x_glsl}, + {"scan2x", scan2x_glsl}, + {"scan3x", scan3x_glsl}, + {"sharp", sharp_glsl}, + {"tv2x", tv2x_glsl}, + {"tv3x", tv3x_glsl}, +}; + +const std::vector<std::string> builtin_shader_names = []{ + std::vector<std::string> v; + for (auto &it : builtin_shaders) { + v.push_back(it.first); + } + return v; +}(); + static bool RENDER_GetShader(std::string &shader_path, char *old_src) { - const std::unordered_map<std::string, const char *> builtin_shaders = { - {"advinterp2x", advinterp2x_glsl}, - {"advinterp3x", advinterp3x_glsl}, - {"advmame2x", advmame2x_glsl}, - {"advmame3x", advmame3x_glsl}, - {"crt-easymode-flat", crt_easymode_tweaked_glsl}, - {"crt-fakelottes-flat", crt_fakelottes_tweaked_glsl}, - {"default", sharp_glsl}, - {"rgb2x", rgb2x_glsl}, - {"rgb3x", rgb3x_glsl}, - {"scan2x", scan2x_glsl}, - {"scan3x", scan3x_glsl}, - {"sharp", sharp_glsl}, - {"tv2x", tv2x_glsl}, - {"tv3x", tv3x_glsl}, - }; - char* src; std::stringstream buf; std::ifstream fshader(shader_path.c_str(), std::ios_base::binary); diff --git a/src/gui/sdlmain.cpp b/src/gui/sdlmain.cpp index 875528c79..b0d11add3 100644 --- a/src/gui/sdlmain.cpp +++ b/src/gui/sdlmain.cpp @@ -21,6 +21,7 @@ #include "dosbox.h" +#include <algorithm> #include <array> #include <cassert> #include <cerrno> @@ -31,6 +32,7 @@ #include <stdarg.h> #include <sys/types.h> #include <tuple> +#include <vector> #include <math.h> #ifdef WIN32 #include <signal.h> @@ -58,6 +60,7 @@ #include "render.h" #include "setup.h" #include "string_utils.h" +#include "render.h" #include "support.h" #include "sdlmain.h" #include "timer.h" @@ -1388,14 +1391,14 @@ static bool LoadGLShaders(const char *src, GLuint *vertex, GLuint *fragment) { return ""; } -[[maybe_unused]] static bool is_sharp_shader() +#if C_OPENGL +static bool is_builtin_non_crt_shader() { - constexpr std::array<std::string_view, 2> sharp_shader_names{{ - "sharp", - "default", - }}; - return contains(sharp_shader_names, get_glshader_value()); + auto it = std::find(builtin_shader_names.begin(), + builtin_shader_names.end(), get_glshader_value()); + return it != builtin_shader_names.end() && !starts_with("crt-", *it); } +#endif // C_OPENGL [[maybe_unused]] static bool is_shader_flexible() { @@ -1871,9 +1874,14 @@ dosurface: SDL_GL_GetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, &is_framebuffer_srgb_capable); - sdl.opengl.framebuffer_is_srgb_encoded = is_sharp_shader() && is_framebuffer_srgb_capable > 0; + auto shader_name = get_glshader_value(); + auto use_srgb_framebuffer = is_builtin_non_crt_shader() || + shader_name.empty() || + shader_name == "none"; + + sdl.opengl.framebuffer_is_srgb_encoded = use_srgb_framebuffer && is_framebuffer_srgb_capable > 0; - if (is_sharp_shader() && !sdl.opengl.framebuffer_is_srgb_encoded) + if (use_srgb_framebuffer && !sdl.opengl.framebuffer_is_srgb_encoded) LOG_WARNING("OPENGL: sRGB framebuffer not supported"); // Using GL_SRGB8_ALPHA8 because GL_SRGB8 doesn't work properly with Mesa drivers on certain integrated Intel GPUs |