Support MIN/MAX blend on OpenGL + ES
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
diff --git a/src/render/opengl/SDL_render_gl.c b/src/render/opengl/SDL_render_gl.c
index 26386b1..e96d136 100644
--- a/src/render/opengl/SDL_render_gl.c
+++ b/src/render/opengl/SDL_render_gl.c
@@ -375,6 +375,10 @@ static GLenum GetBlendEquation(SDL_BlendOperation operation)
return GL_FUNC_SUBTRACT;
case SDL_BLENDOPERATION_REV_SUBTRACT:
return GL_FUNC_REVERSE_SUBTRACT;
+ case SDL_BLENDOPERATION_MINIMUM:
+ return GL_MIN;
+ case SDL_BLENDOPERATION_MAXIMUM:
+ return GL_MAX;
default:
return GL_INVALID_ENUM;
}
diff --git a/src/render/opengles/SDL_render_gles.c b/src/render/opengles/SDL_render_gles.c
index b4b789a..0b6f1ed 100644
--- a/src/render/opengles/SDL_render_gles.c
+++ b/src/render/opengles/SDL_render_gles.c
@@ -97,6 +97,7 @@ typedef struct
SDL_bool GL_OES_blend_func_separate_supported;
SDL_bool GL_OES_blend_equation_separate_supported;
SDL_bool GL_OES_blend_subtract_supported;
+ SDL_bool GL_EXT_blend_minmax_supported;
GLES_DrawStateCache drawstate;
} GLES_RenderData;
@@ -263,6 +264,10 @@ static GLenum GetBlendEquation(SDL_BlendOperation operation)
return GL_FUNC_SUBTRACT_OES;
case SDL_BLENDOPERATION_REV_SUBTRACT:
return GL_FUNC_REVERSE_SUBTRACT_OES;
+ case SDL_BLENDOPERATION_MINIMUM:
+ return GL_MIN_EXT;
+ case SDL_BLENDOPERATION_MAXIMUM:
+ return GL_MAX_EXT;
default:
return GL_INVALID_ENUM;
}
@@ -295,6 +300,12 @@ static SDL_bool GLES_SupportsBlendMode(SDL_Renderer *renderer, SDL_BlendMode ble
if (colorOperation != SDL_BLENDOPERATION_ADD && !data->GL_OES_blend_subtract_supported) {
return SDL_FALSE;
}
+ if (colorOperation == SDL_BLENDOPERATION_MINIMUM && !data->GL_EXT_blend_minmax_supported) {
+ return SDL_FALSE;
+ }
+ if (colorOperation == SDL_BLENDOPERATION_MAXIMUM && !data->GL_EXT_blend_minmax_supported) {
+ return SDL_FALSE;
+ }
return SDL_TRUE;
}
@@ -1161,6 +1172,9 @@ static SDL_Renderer *GLES_CreateRenderer(SDL_Window *window, Uint32 flags)
if (SDL_GL_ExtensionSupported("GL_OES_blend_subtract")) {
data->GL_OES_blend_subtract_supported = SDL_TRUE;
}
+ if (SDL_GL_ExtensionSupported("GL_EXT_blend_minmax")) {
+ data->GL_EXT_blend_minmax_supported = SDL_TRUE;
+ }
/* Set up parameters for rendering */
data->glDisable(GL_DEPTH_TEST);