Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dosbox-staging/dosbox-staging.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Novak <john@johnovak.net>2022-04-30 09:25:15 +0300
committerJohn Novak <john@johnovak.net>2022-05-01 15:32:15 +0300
commitb1d1e6eb585580cd899ffe6d881ca40e44bacee1 (patch)
treec6da4ef3009462854d187ec946d22074311fafec
parente2e13f50cd7821bc0caea814bfcc8240effe95c7 (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.h7
-rw-r--r--src/gui/render.cpp42
-rw-r--r--src/gui/sdlmain.cpp24
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