Go to the documentation of this file.
21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_RENDER_OGL_ES && !SDL_RENDER_DISABLED
27 #include "../SDL_sysrender.h"
33 #define RENDERER_CONTEXT_MAJOR 1
34 #define RENDERER_CONTEXT_MINOR 1
36 #if defined(SDL_VIDEO_DRIVER_PANDORA)
53 static const float inv255f = 1.0f / 255.0f;
94 typedef struct GLES_FBOList GLES_FBOList;
124 #define SDL_PROC(ret,func,params) ret (APIENTRY *func) params;
125 #define SDL_PROC_OES SDL_PROC
129 SDL_bool GL_OES_framebuffer_object_supported;
131 GLuint window_framebuffer;
133 SDL_bool GL_OES_blend_func_separate_supported;
134 SDL_bool GL_OES_blend_equation_separate_supported;
135 SDL_bool GL_OES_blend_subtract_supported;
158 error =
"GL_NO_ERROR";
161 error =
"GL_INVALID_ENUM";
164 error =
"GL_INVALID_VALUE";
167 error =
"GL_INVALID_OPERATION";
170 error =
"GL_STACK_OVERFLOW";
173 error =
"GL_STACK_UNDERFLOW";
176 error =
"GL_OUT_OF_MEMORY";
185 static int GLES_LoadFunctions(GLES_RenderData *
data)
187 #if SDL_VIDEO_DRIVER_UIKIT
188 #define __SDL_NOGETPROCADDR__
189 #elif SDL_VIDEO_DRIVER_ANDROID
190 #define __SDL_NOGETPROCADDR__
191 #elif SDL_VIDEO_DRIVER_PANDORA
192 #define __SDL_NOGETPROCADDR__
195 #ifdef __SDL_NOGETPROCADDR__
196 #define SDL_PROC(ret,func,params) data->func=func;
197 #define SDL_PROC_OES(ret,func,params) data->func=func;
199 #define SDL_PROC(ret,func,params) \
201 data->func = SDL_GL_GetProcAddress(#func); \
202 if ( ! data->func ) { \
203 return SDL_SetError("Couldn't load GLES function %s: %s", #func, SDL_GetError()); \
206 #define SDL_PROC_OES(ret,func,params) \
208 data->func = SDL_GL_GetProcAddress(#func); \
220 static GLES_FBOList *
244 if (SDL_CurrentContext !=
data->context) {
248 SDL_CurrentContext =
data->context;
261 if (SDL_CurrentContext ==
data->context) {
267 data->current.color = 0xffffffff;
275 data->glLoadIdentity();
286 GLES_RenderData *
data;
289 int profile_mask = 0, major = 0, minor = 0;
351 if (!
data->context) {
360 if (GLES_LoadFunctions(
data) < 0) {
387 data->glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &
value);
396 data->GL_OES_blend_equation_separate_supported =
SDL_TRUE;
408 if (changed_window) {
427 SDL_CurrentContext =
NULL;
475 return GL_FUNC_ADD_OES;
477 return GL_FUNC_SUBTRACT_OES;
479 return GL_FUNC_REVERSE_SUBTRACT_OES;
504 if ((srcColorFactor != srcAlphaFactor || dstColorFactor != dstAlphaFactor) && !
data->GL_OES_blend_func_separate_supported) {
507 if (colorOperation != alphaOperation && !
data->GL_OES_blend_equation_separate_supported) {
517 power_of_2(
int input)
531 GLES_TextureData *
data;
534 int texture_w, texture_h;
566 if (!renderdata->GL_OES_framebuffer_object_supported) {
568 return SDL_SetError(
"GL_OES_framebuffer_object not supported");
576 renderdata->glGetError();
578 renderdata->glGenTextures(1, &
data->texture);
579 result = renderdata->glGetError();
582 return GLES_SetError(
"glGenTextures()",
result);
587 texture_w = power_of_2(
texture->w);
588 texture_h = power_of_2(
texture->h);
595 renderdata->glBindTexture(
data->type,
data->texture);
605 result = renderdata->glGetError();
608 return GLES_SetError(
"glTexImage2D()",
result);
620 GLES_TextureData *
data = (GLES_TextureData *)
texture->driverdata;
636 if (pitch != srcPitch) {
651 renderdata->glGetError();
652 renderdata->glEnable(
data->type);
653 renderdata->glBindTexture(
data->type,
data->texture);
655 renderdata->glTexSubImage2D(
data->type,
664 renderdata->glDisable(
data->type);
677 GLES_TextureData *
data = (GLES_TextureData *)
texture->driverdata;
682 *pitch =
data->pitch;
689 GLES_TextureData *
data = (GLES_TextureData *)
texture->driverdata;
704 GLES_TextureData *texturedata =
NULL;
707 if (!
data->GL_OES_framebuffer_object_supported) {
708 return SDL_SetError(
"Can't enable render target support in this renderer");
712 data->glBindFramebufferOES(GL_FRAMEBUFFER_OES,
data->window_framebuffer);
716 texturedata = (GLES_TextureData *)
texture->driverdata;
717 data->glBindFramebufferOES(GL_FRAMEBUFFER_OES, texturedata->fbo->FBO);
719 data->glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, texturedata->type, texturedata->texture, 0);
721 status =
data->glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
722 if (status != GL_FRAMEBUFFER_COMPLETE_OES) {
723 return SDL_SetError(
"glFramebufferTexture2DOES() failed");
733 if (SDL_CurrentContext !=
data->context) {
750 data->glLoadIdentity();
776 if (SDL_CurrentContext !=
data->context) {
820 if (
data->GL_OES_blend_func_separate_supported) {
829 if (
data->GL_OES_blend_equation_separate_supported) {
832 }
else if (
data->GL_OES_blend_subtract_supported) {
907 for (idx = 0; idx <
count; ++idx) {
911 vertices[idx * 2] =
x;
912 vertices[(idx * 2) + 1] =
y;
933 for (idx = 0; idx <
count; ++idx) {
937 vertices[idx * 2] =
x;
938 vertices[(idx * 2) + 1] =
y;
994 GLES_TextureData *texturedata = (GLES_TextureData *)
texture->driverdata;
995 GLfloat minx, miny, maxx, maxy;
996 GLfloat minu, maxu, minv, maxv;
1004 data->glBindTexture(texturedata->type, texturedata->texture);
1009 GLES_SetColor(
data, 255, 255, 255, 255);
1018 maxx = dstrect->
x + dstrect->
w;
1019 maxy = dstrect->
y + dstrect->
h;
1022 minu *= texturedata->texw;
1024 maxu *= texturedata->texw;
1026 minv *= texturedata->texh;
1028 maxv *= texturedata->texh;
1039 texCoords[0] = minu;
1040 texCoords[1] = minv;
1041 texCoords[2] = maxu;
1042 texCoords[3] = minv;
1043 texCoords[4] = minu;
1044 texCoords[5] = maxv;
1045 texCoords[6] = maxu;
1046 texCoords[7] = maxv;
1064 GLES_TextureData *texturedata = (GLES_TextureData *)
texture->driverdata;
1065 GLfloat minx, miny, maxx, maxy;
1066 GLfloat minu, maxu, minv, maxv;
1076 data->glBindTexture(texturedata->type, texturedata->texture);
1081 GLES_SetColor(
data, 255, 255, 255, 255);
1088 centerx = center->
x;
1089 centery = center->
y;
1092 data->glPushMatrix();
1093 data->glTranslatef(dstrect->
x + centerx, dstrect->
y + centery, 0.0f);
1097 minx = dstrect->
w - centerx;
1101 maxx = dstrect->
w - centerx;
1105 miny = dstrect->
h - centery;
1109 maxy = dstrect->
h - centery;
1113 minu *= texturedata->texw;
1115 maxu *= texturedata->texw;
1117 minv *= texturedata->texh;
1119 maxv *= texturedata->texh;
1130 texCoords[0] = minu;
1131 texCoords[1] = minv;
1132 texCoords[2] = maxu;
1133 texCoords[3] = minv;
1134 texCoords[4] = minu;
1135 texCoords[5] = maxv;
1136 texCoords[6] = maxu;
1137 texCoords[7] = maxv;
1141 data->glPopMatrix();
1192 temp_format, temp_pixels, temp_pitch,
1193 pixel_format,
pixels, pitch);
1212 GLES_TextureData *
data = (GLES_TextureData *)
texture->driverdata;
1219 if (
data->texture) {
1220 renderdata->glDeleteTextures(1, &
data->texture);
1233 if (
data->context) {
1234 while (
data->framebuffers) {
1235 GLES_FBOList *nextnode =
data->framebuffers->next;
1236 data->glDeleteFramebuffersOES(1, &
data->framebuffers->FBO);
1238 data->framebuffers = nextnode;
1250 GLES_TextureData *texturedata = (GLES_TextureData *)
texture->driverdata;
1254 data->glBindTexture(texturedata->type, texturedata->texture);
1257 *texw = (float)texturedata->texw;
1260 *texh = (float)texturedata->texh;
1269 GLES_TextureData *texturedata = (GLES_TextureData *)
texture->driverdata;
1271 data->glDisable(texturedata->type);
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
GLfixed GLfixed GLint GLint GLfixed points
int(* GL_UnbindTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
@ SDL_BLENDFACTOR_DST_COLOR
static SDL_BlendMode blendMode
int SDL_RecreateWindow(SDL_Window *window, Uint32 flags)
int(* UpdateClipRect)(SDL_Renderer *renderer)
@ SDL_BLENDFACTOR_SRC_COLOR
@ SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR
GLboolean GLboolean GLboolean b
int(* SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture)
GLint GLint GLsizei width
#define GL_STACK_UNDERFLOW
#define GL_MAX_TEXTURE_SIZE
@ SDL_BLENDFACTOR_SRC_ALPHA
#define SDL_GL_CreateContext
GLuint GLuint GLsizei count
#define SDL_GetWindowFlags
#define GL_ONE_MINUS_DST_ALPHA
GLdouble GLdouble GLdouble r
SDL_BlendOperation
The blend operation used when combining source and destination pixel components.
int(* RenderFillRects)(SDL_Renderer *renderer, const SDL_FRect *rects, int count)
@ SDL_GL_CONTEXT_PROFILE_MASK
#define GL_COLOR_BUFFER_BIT
int(* UpdateViewport)(SDL_Renderer *renderer)
GLenum GLenum GLenum input
void(* WindowEvent)(SDL_Renderer *renderer, const SDL_WindowEvent *event)
SDL_BlendFactor
The normalized factor used to multiply pixel components.
#define GL_UNPACK_ALIGNMENT
SDL_RenderDriver GLES_RenderDriver
@ SDL_BLENDFACTOR_DST_ALPHA
GLboolean GLboolean GLboolean GLboolean a
GLfloat GLfloat GLfloat GLfloat h
GLuint GLsizei GLsizei * length
@ SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
@ SDL_BLENDOPERATION_SUBTRACT
#define GL_TEXTURE_WRAP_T
The type used to identify a window.
#define SDL_stack_alloc(type, count)
#define SDL_GL_GetDrawableSize
void * SDL_GLContext
An opaque handle to an OpenGL context.
#define GL_INVALID_OPERATION
#define GL_TEXTURE_MIN_FILTER
static screen_context_t context
GLint GLint GLint GLint GLint x
EGLSurface EGLNativeWindowType * window
#define SDL_GL_SetAttribute
#define GL_ONE_MINUS_SRC_COLOR
@ SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR
GLint GLint GLsizei GLsizei height
SDL_bool(* SupportsBlendMode)(SDL_Renderer *renderer, SDL_BlendMode blendMode)
@ SDL_RENDERER_PRESENTVSYNC
int(* RenderDrawLines)(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
@ SDL_GL_CONTEXT_PROFILE_ES
#define SDL_GL_GetSwapInterval
int(* RenderClear)(SDL_Renderer *renderer)
#define SDL_GL_SetSwapInterval
SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor(SDL_BlendMode blendMode)
#define GL_TEXTURE_MAG_FILTER
@ SDL_WINDOWEVENT_SIZE_CHANGED
int(* GL_BindTexture)(SDL_Renderer *renderer, SDL_Texture *texture, float *texw, float *texh)
#define GL_TEXTURE_COORD_ARRAY
int(* RenderDrawPoints)(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
@ SDL_WINDOWEVENT_MINIMIZED
#define GL_TEXTURE_WRAP_S
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
int(* GetOutputSize)(SDL_Renderer *renderer, int *w, int *h)
int(* RenderCopy)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
#define SDL_OutOfMemory()
int(* CreateTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
GLint GLint GLint GLint GLint GLint y
void(* DestroyRenderer)(SDL_Renderer *renderer)
int(* LockTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
#define SDL_GetRendererOutputSize
int(* RenderReadPixels)(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor(SDL_BlendMode blendMode)
SDL_BlendOperation SDL_GetBlendModeColorOperation(SDL_BlendMode blendMode)
int(* RenderCopyEx)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcquad, const SDL_FRect *dstrect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
@ SDL_BLENDOPERATION_REV_SUBTRACT
SDL_RendererFlip
Flip constants for SDL_RenderCopyEx.
static SDL_Renderer * renderer
#define GL_STACK_OVERFLOW
#define SDL_stack_free(data)
SDL_BlendFactor SDL_GetBlendModeDstColorFactor(SDL_BlendMode blendMode)
GLsizei const GLfloat * value
@ SDL_RENDERER_TARGETTEXTURE
@ SDL_GL_CONTEXT_MINOR_VERSION
#define SDL_BYTESPERPIXEL(X)
void(* RenderPresent)(SDL_Renderer *renderer)
A rectangle, with the origin at the upper left.
@ SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA
int(* UpdateTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
#define SDL_GL_MakeCurrent
@ SDL_TEXTUREACCESS_TARGET
#define GL_PACK_ALIGNMENT
Window state change event data (event.window.*)
#define SDL_GL_GetAttribute
#define SDL_ConvertPixels
GLenum GLenum GLsizei const GLuint GLboolean enabled
SDL_bool clipping_enabled
#define SDL_GL_SwapWindow
@ SDL_PIXELFORMAT_ABGR8888
@ SDL_RENDERER_ACCELERATED
#define GL_ONE_MINUS_SRC_ALPHA
const GLuint * framebuffers
@ SDL_TEXTUREACCESS_STREAMING
GLenum GLenum GLuint texture
#define GL_ONE_MINUS_DST_COLOR
EGLSurface EGLint * rects
SDL_BlendOperation SDL_GetBlendModeAlphaOperation(SDL_BlendMode blendMode)
GLuint GLuint GLsizei GLenum type
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
#define SDL_GL_DeleteContext
SDL_BlendFactor SDL_GetBlendModeSrcColorFactor(SDL_BlendMode blendMode)
#define GL_TRIANGLE_STRIP
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
void(* UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
@ SDL_GL_CONTEXT_MAJOR_VERSION
void(* DestroyTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
GLubyte GLubyte GLubyte GLubyte w
#define SDL_GL_ExtensionSupported