@@ -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
0 commit comments