Skip to content

Commit 7a49ce7

Browse files
committed
Handle partial OpenGL shader availability
The pixelart shaders are not supported on OpenGL 2.1 (GLSL 130 isn't available) Fixes the OpenGL renderer on macOS
1 parent 57cd131 commit 7a49ce7

File tree

3 files changed

+69
-17
lines changed

3 files changed

+69
-17
lines changed

src/render/opengl/SDL_render_gl.c

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ typedef struct
9191

9292
bool debug_enabled;
9393
bool GL_ARB_debug_output_supported;
94+
bool pixelart_supported;
9495
int errors;
9596
char **error_messages;
9697
GLDEBUGPROCARB next_error_callback;
@@ -455,7 +456,13 @@ static bool SetTextureScaleMode(GL_RenderData *data, GLenum textype, SDL_PixelFo
455456
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
456457
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
457458
break;
458-
case SDL_SCALEMODE_PIXELART: // Uses linear sampling
459+
case SDL_SCALEMODE_PIXELART: // Uses linear sampling if supported
460+
if (!data->pixelart_supported) {
461+
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
462+
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
463+
break;
464+
}
465+
SDL_FALLTHROUGH;
459466
case SDL_SCALEMODE_LINEAR:
460467
if (format == SDL_PIXELFORMAT_INDEX8) {
461468
// We'll do linear sampling in the shader
@@ -1210,19 +1217,22 @@ static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
12101217
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_LINEAR) {
12111218
shader = SHADER_PALETTE_LINEAR;
12121219
shader_params = texturedata->texel_size;
1213-
} else if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
1220+
} else if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART &&
1221+
data->pixelart_supported) {
12141222
shader = SHADER_PALETTE_PIXELART;
12151223
shader_params = texturedata->texel_size;
12161224
}
12171225
break;
12181226
case SHADER_RGB:
1219-
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
1227+
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART &&
1228+
data->pixelart_supported) {
12201229
shader = SHADER_RGB_PIXELART;
12211230
shader_params = texturedata->texel_size;
12221231
}
12231232
break;
12241233
case SHADER_RGBA:
1225-
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
1234+
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART &&
1235+
data->pixelart_supported) {
12261236
shader = SHADER_RGBA_PIXELART;
12271237
shader_params = texturedata->texel_size;
12281238
}
@@ -1928,27 +1938,50 @@ static bool GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pr
19281938
data->shaders = GL_CreateShaderContext();
19291939
SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "OpenGL shaders: %s",
19301940
data->shaders ? "ENABLED" : "DISABLED");
1931-
if (data->shaders) {
1941+
if (GL_SupportsShader(data->shaders, SHADER_RGB)) {
19321942
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX32);
19331943
if (bgra_supported) {
19341944
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX32);
19351945
}
1946+
} else {
1947+
SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "OpenGL RGB shaders not supported");
1948+
}
1949+
// We support PIXELART mode using a shader
1950+
if (GL_SupportsShader(data->shaders, SHADER_RGB_PIXELART) &&
1951+
GL_SupportsShader(data->shaders, SHADER_RGBA_PIXELART)) {
1952+
data->pixelart_supported = true;
1953+
} else {
1954+
SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "OpenGL PIXELART shaders not supported");
19361955
}
19371956
// We support INDEX8 textures using 2 textures and a shader
1938-
if (data->shaders && data->num_texture_units >= 2) {
1957+
if (GL_SupportsShader(data->shaders, SHADER_PALETTE_NEAREST) &&
1958+
GL_SupportsShader(data->shaders, SHADER_PALETTE_LINEAR) &&
1959+
(!data->pixelart_supported || GL_SupportsShader(data->shaders, SHADER_PALETTE_PIXELART)) &&
1960+
data->num_texture_units >= 2) {
19391961
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_INDEX8);
1962+
} else {
1963+
SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "OpenGL palette shaders not supported");
19401964
}
19411965
#ifdef SDL_HAVE_YUV
19421966
// We support YV12 textures using 3 textures and a shader
1943-
if (data->shaders && data->num_texture_units >= 3) {
1967+
if (GL_SupportsShader(data->shaders, SHADER_YUV) &&
1968+
data->num_texture_units >= 3) {
19441969
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
19451970
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
1971+
} else {
1972+
SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "OpenGL YUV not supported");
19461973
}
19471974

19481975
// We support NV12 textures using 2 textures and a shader
1949-
if (data->shaders && data->num_texture_units >= 2) {
1976+
if (GL_SupportsShader(data->shaders, SHADER_NV12_RA) &&
1977+
GL_SupportsShader(data->shaders, SHADER_NV12_RG) &&
1978+
GL_SupportsShader(data->shaders, SHADER_NV21_RA) &&
1979+
GL_SupportsShader(data->shaders, SHADER_NV21_RG) &&
1980+
data->num_texture_units >= 2) {
19501981
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
19511982
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
1983+
} else {
1984+
SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "OpenGL NV12/NV21 not supported");
19521985
}
19531986
#endif
19541987
#ifdef SDL_PLATFORM_MACOS

src/render/opengl/SDL_shaders_gl.c

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -520,10 +520,15 @@ static bool CompileShader(GL_ShaderContext *ctx, GLhandleARB shader, const char
520520
info = SDL_small_alloc(char, length + 1, &isstack);
521521
if (info) {
522522
ctx->glGetInfoLogARB(shader, length, NULL, info);
523-
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Failed to compile shader:");
524-
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "%s", defines);
525-
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "%s", source);
526-
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "%s", info);
523+
SDL_LogDebug(SDL_LOG_CATEGORY_RENDER, "Failed to compile shader:");
524+
if (version) {
525+
SDL_LogDebug(SDL_LOG_CATEGORY_RENDER, "%s", version);
526+
}
527+
if (defines) {
528+
SDL_LogDebug(SDL_LOG_CATEGORY_RENDER, "%s", defines);
529+
}
530+
SDL_LogDebug(SDL_LOG_CATEGORY_RENDER, "%s", source);
531+
SDL_LogDebug(SDL_LOG_CATEGORY_RENDER, "%s", info);
527532
SDL_small_free(info, isstack);
528533
}
529534
return false;
@@ -598,9 +603,18 @@ static bool CompileShaderProgram(GL_ShaderContext *ctx, int index, GL_ShaderData
598603

599604
static void DestroyShaderProgram(GL_ShaderContext *ctx, GL_ShaderData *data)
600605
{
601-
ctx->glDeleteObjectARB(data->vert_shader);
602-
ctx->glDeleteObjectARB(data->frag_shader);
603-
ctx->glDeleteObjectARB(data->program);
606+
if (data->vert_shader) {
607+
ctx->glDeleteObjectARB(data->vert_shader);
608+
data->vert_shader = 0;
609+
}
610+
if (data->frag_shader) {
611+
ctx->glDeleteObjectARB(data->frag_shader);
612+
data->frag_shader = 0;
613+
}
614+
if (data->program) {
615+
ctx->glDeleteObjectARB(data->program);
616+
data->program = 0;
617+
}
604618
}
605619

606620
GL_ShaderContext *GL_CreateShaderContext(void)
@@ -669,15 +683,19 @@ GL_ShaderContext *GL_CreateShaderContext(void)
669683
// Compile all the shaders
670684
for (i = 0; i < NUM_SHADERS; ++i) {
671685
if (!CompileShaderProgram(ctx, i, &ctx->shaders[i])) {
672-
GL_DestroyShaderContext(ctx);
673-
return NULL;
686+
DestroyShaderProgram(ctx, &ctx->shaders[i]);
674687
}
675688
}
676689

677690
// We're done!
678691
return ctx;
679692
}
680693

694+
bool GL_SupportsShader(GL_ShaderContext *ctx, GL_Shader shader)
695+
{
696+
return ctx && ctx->shaders[shader].program;
697+
}
698+
681699
void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader, const float *shader_params)
682700
{
683701
GLint location;

src/render/opengl/SDL_shaders_gl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ typedef enum
5151
typedef struct GL_ShaderContext GL_ShaderContext;
5252

5353
extern GL_ShaderContext *GL_CreateShaderContext(void);
54+
extern bool GL_SupportsShader(GL_ShaderContext *ctx, GL_Shader shader);
5455
extern void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader, const float *shader_params);
5556
extern void GL_DestroyShaderContext(GL_ShaderContext *ctx);
5657

0 commit comments

Comments
 (0)