From 2a6677fd46b130a2bf772cbb09c893984bbc4967 Mon Sep 17 00:00:00 2001 From: Tim Felgentreff <timfelgentreff@gmail.com> Date: Mon, 21 Dec 2020 20:40:08 +0100 Subject: [PATCH] be more conservative and use pure SDL when shader 0 ("none") is selected --- src/include/shaders.h | 12 +++--------- src/video/sdl.cpp | 16 ++-------------- src/video/shaders.cpp | 28 +++++++++++++++------------- 3 files changed, 20 insertions(+), 36 deletions(-) diff --git a/src/include/shaders.h b/src/include/shaders.h index fc132623d..3d4e1bd7b 100644 --- a/src/include/shaders.h +++ b/src/include/shaders.h @@ -5,8 +5,7 @@ #ifndef __APPLE__ extern bool LoadShaderExtensions(); -extern void RenderWithShader(SDL_Renderer *renderer, SDL_Window* win, SDL_Texture* backBuffer); -extern const char* NextShader(); +extern bool RenderWithShader(SDL_Renderer *renderer, SDL_Window* win, SDL_Texture* backBuffer); #else #include "stratagus.h" @@ -14,13 +13,8 @@ inline bool LoadShaderExtensions() { return false; } -inline void RenderWithShader(SDL_Renderer*, SDL_Window*, SDL_Texture*) { - fprintf(stderr, "shaders not supported on macOS\n"); - ExitFatal(-1); -} - -inline const char* NextShader() { - return "shaders not supported on macOS"; +inline bool RenderWithShader(SDL_Renderer*, SDL_Window*, SDL_Texture*) { + return false; } #endif diff --git a/src/video/sdl.cpp b/src/video/sdl.cpp index 986c2686e..f130e845c 100644 --- a/src/video/sdl.cpp +++ b/src/video/sdl.cpp @@ -103,8 +103,6 @@ double FrameTicks; /// Frame length in ms const EventCallback *Callbacks; -static bool CanUseShaders = false; - bool IsSDLWindowVisible = true; uint32_t SDL_CUSTOM_KEY_UP; @@ -378,15 +376,7 @@ void InitVideoSdl() SDL_GetRendererInfo(TheRenderer, &rendererInfo); printf("[Renderer] %s\n", rendererInfo.name); if(!strncmp(rendererInfo.name, "opengl", 6)) { - CanUseShaders = LoadShaderExtensions(); - } - if (!CanUseShaders) { - puts("[Renderer] Cannot use shaders"); - SDL_SetHint(SDL_HINT_RENDER_DRIVER, "software"); - SDL_DestroyRenderer(TheRenderer); - TheRenderer = SDL_CreateRenderer(TheWindow, -1, SDL_RENDERER_SOFTWARE); - SDL_GetRendererInfo(TheRenderer, &rendererInfo); - printf("[Renderer] %s\n", rendererInfo.name); + LoadShaderExtensions(); } SDL_SetRenderDrawColor(TheRenderer, 0, 0, 0, 255); Video.ResizeScreen(Video.Width, Video.Height); @@ -747,9 +737,7 @@ void RealizeVideoMemory() if (NumRects) { //SDL_UpdateWindowSurfaceRects(TheWindow, Rects, NumRects); SDL_UpdateTexture(TheTexture, NULL, TheScreen->pixels, TheScreen->pitch); - if (CanUseShaders) { - RenderWithShader(TheRenderer, TheWindow, TheTexture); - } else { + if (!RenderWithShader(TheRenderer, TheWindow, TheTexture)) { SDL_RenderClear(TheRenderer); //for (int i = 0; i < NumRects; i++) // SDL_UpdateTexture(TheTexture, &Rects[i], TheScreen->pixels, TheScreen->pitch); diff --git a/src/video/shaders.cpp b/src/video/shaders.cpp index 689f56c4f..317925266 100644 --- a/src/video/shaders.cpp +++ b/src/video/shaders.cpp @@ -88,6 +88,9 @@ static const int MAX_SHADERS = 128; static GLuint shaderPrograms[MAX_SHADERS + 1] = { (GLuint) 0 }; static const char* shaderNames[MAX_SHADERS + 1] = { NULL }; static char shadersLoaded = -1; +#define canUseShaders (shadersLoaded == 1) +#define shadersAreInitialized (shadersLoaded != -1) +#define setCanUseShaders(x) (shadersLoaded = (x ? 1 : 0)) static int currentShaderIdx = 0; static std::regex invalidQuoteReplaceRegex("\"([a-zA-Z0-9 -\\.]+)\""); @@ -239,7 +242,11 @@ static int loadShaders() { return numShdr; } -void RenderWithShader(SDL_Renderer *renderer, SDL_Window* win, SDL_Texture* backBuffer) { +bool RenderWithShader(SDL_Renderer *renderer, SDL_Window* win, SDL_Texture* backBuffer) { + if (!canUseShaders || currentShaderIdx == 0) { + return false; + } + GLint oldProgramId; // Detach the texture SDL_SetRenderTarget(renderer, NULL); @@ -343,14 +350,8 @@ void RenderWithShader(SDL_Renderer *renderer, SDL_Window* win, SDL_Texture* back if (shaderProgram != 0) { glUseProgram(oldProgramId); } -} -const char* NextShader() { - if (shaderPrograms[++currentShaderIdx] == 0) { - currentShaderIdx = 0; - } - std::cout << "NextShader: " << shaderNames[currentShaderIdx] << std::endl; - return shaderNames[currentShaderIdx]; + return true; } static int CclGetShader(lua_State *l) { @@ -380,6 +381,7 @@ static int CclSetShader(lua_State *l) { break; } } + currentShaderIdx = 0; lua_pushboolean(l, 0); return 1; } @@ -395,8 +397,8 @@ static int CclGetShaderNames(lua_State *l) { } bool LoadShaderExtensions() { - if (shadersLoaded != -1) { - return shadersLoaded == 1; + if (shadersAreInitialized) { + return canUseShaders; } *(void **) (&lazyGlBegin) = SDL_GL_GetProcAddress("glBegin"); @@ -437,16 +439,16 @@ bool LoadShaderExtensions() { glLinkProgram && glValidateProgram && glGetProgramiv && glGetProgramInfoLog && glUseProgram && glGetUniformLocation && glUniform1i && glUniform1f && glUniform2f && glUniformMatrix4fv && glGetAttribLocation && glVertexAttrib4f) { - shadersLoaded = loadShaders() > 0 ? 1 : 0; + setCanUseShaders(loadShaders() > 0); } else { - shadersLoaded = 0; + setCanUseShaders(false); } lua_register(Lua, "GetShaderNames", CclGetShaderNames); lua_register(Lua, "GetShader", CclGetShader); lua_register(Lua, "SetShader", CclSetShader); - return shadersLoaded == 1; + return canUseShaders; } #endif