Go to the documentation of this file.
21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_RENDER_OGL_ES && !SDL_RENDER_DISABLED
28 #include "../SDL_sysrender.h"
34 #define RENDERER_CONTEXT_MAJOR 1
35 #define RENDERER_CONTEXT_MINOR 1
37 #if defined(SDL_VIDEO_DRIVER_PANDORA)
54 static const float inv255f = 1.0f / 255.0f;
56 typedef struct GLES_FBOList GLES_FBOList;
81 } GLES_DrawStateCache;
87 #define SDL_PROC(ret,func,params) ret (APIENTRY *func) params;
88 #define SDL_PROC_OES SDL_PROC
92 SDL_bool GL_OES_framebuffer_object_supported;
96 SDL_bool GL_OES_blend_func_separate_supported;
97 SDL_bool GL_OES_blend_equation_separate_supported;
98 SDL_bool GL_OES_blend_subtract_supported;
100 GLES_DrawStateCache drawstate;
123 error =
"GL_NO_ERROR";
126 error =
"GL_INVALID_ENUM";
129 error =
"GL_INVALID_VALUE";
132 error =
"GL_INVALID_OPERATION";
135 error =
"GL_STACK_OVERFLOW";
138 error =
"GL_STACK_UNDERFLOW";
141 error =
"GL_OUT_OF_MEMORY";
150 static int GLES_LoadFunctions(GLES_RenderData *
data)
152 #if SDL_VIDEO_DRIVER_UIKIT
153 #define __SDL_NOGETPROCADDR__
154 #elif SDL_VIDEO_DRIVER_ANDROID
155 #define __SDL_NOGETPROCADDR__
156 #elif SDL_VIDEO_DRIVER_PANDORA
157 #define __SDL_NOGETPROCADDR__
160 #ifdef __SDL_NOGETPROCADDR__
161 #define SDL_PROC(ret,func,params) data->func=func;
162 #define SDL_PROC_OES(ret,func,params) data->func=func;
164 #define SDL_PROC(ret,func,params) \
166 data->func = SDL_GL_GetProcAddress(#func); \
167 if ( ! data->func ) { \
168 return SDL_SetError("Couldn't load GLES function %s: %s", #func, SDL_GetError()); \
171 #define SDL_PROC_OES(ret,func,params) \
173 data->func = SDL_GL_GetProcAddress(#func); \
183 static GLES_FBOList *
266 return GL_FUNC_ADD_OES;
268 return GL_FUNC_SUBTRACT_OES;
270 return GL_FUNC_REVERSE_SUBTRACT_OES;
295 if ((srcColorFactor != srcAlphaFactor || dstColorFactor != dstAlphaFactor) && !
data->GL_OES_blend_func_separate_supported) {
298 if (colorOperation != alphaOperation && !
data->GL_OES_blend_equation_separate_supported) {
308 power_of_2(
int input)
322 GLES_TextureData *
data;
325 int texture_w, texture_h;
357 if (!renderdata->GL_OES_framebuffer_object_supported) {
359 return SDL_SetError(
"GL_OES_framebuffer_object not supported");
367 renderdata->glGetError();
369 renderdata->glGenTextures(1, &
data->texture);
370 result = renderdata->glGetError();
373 return GLES_SetError(
"glGenTextures()",
result);
378 texture_w = power_of_2(
texture->w);
379 texture_h = power_of_2(
texture->h);
386 renderdata->glBindTexture(
data->type,
data->texture);
395 renderdata->drawstate.texture =
texture;
396 renderdata->drawstate.texturing =
SDL_FALSE;
398 result = renderdata->glGetError();
401 return GLES_SetError(
"glTexImage2D()",
result);
413 GLES_TextureData *
data = (GLES_TextureData *)
texture->driverdata;
429 if (pitch != srcPitch) {
444 renderdata->glGetError();
445 renderdata->glEnable(
data->type);
446 renderdata->glBindTexture(
data->type,
data->texture);
448 renderdata->glTexSubImage2D(
data->type,
457 renderdata->glDisable(
data->type);
460 renderdata->drawstate.texture =
texture;
461 renderdata->drawstate.texturing =
SDL_FALSE;
473 GLES_TextureData *
data = (GLES_TextureData *)
texture->driverdata;
478 *pitch =
data->pitch;
485 GLES_TextureData *
data = (GLES_TextureData *)
texture->driverdata;
500 GLES_TextureData *
data = (GLES_TextureData *)
texture->driverdata;
503 renderdata->glBindTexture(
data->type,
data->texture);
512 GLES_TextureData *texturedata =
NULL;
515 if (!
data->GL_OES_framebuffer_object_supported) {
516 return SDL_SetError(
"Can't enable render target support in this renderer");
522 data->glBindFramebufferOES(GL_FRAMEBUFFER_OES,
data->window_framebuffer);
526 texturedata = (GLES_TextureData *)
texture->driverdata;
527 data->glBindFramebufferOES(GL_FRAMEBUFFER_OES, texturedata->fbo->FBO);
529 data->glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, texturedata->type, texturedata->texture, 0);
531 status =
data->glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
532 if (status != GL_FRAMEBUFFER_COMPLETE_OES) {
533 return SDL_SetError(
"glFramebufferTexture2DOES() failed");
599 GLES_TextureData *texturedata = (GLES_TextureData *)
texture->driverdata;
600 GLfloat minx, miny, maxx, maxy;
601 GLfloat minu, maxu, minv, maxv;
612 maxx = dstrect->
x + dstrect->
w;
613 maxy = dstrect->
y + dstrect->
h;
616 minu *= texturedata->texw;
618 maxu *= texturedata->texw;
620 minv *= texturedata->texh;
622 maxv *= texturedata->texh;
650 GLES_TextureData *texturedata = (GLES_TextureData *)
texture->driverdata;
651 GLfloat minx, miny, maxx, maxy;
653 GLfloat minu, maxu, minv, maxv;
664 minx = dstrect->
w - centerx;
669 maxx = dstrect->
w - centerx;
673 miny = dstrect->
h - centery;
678 maxy = dstrect->
h - centery;
682 minu *= texturedata->texw;
684 maxu *= texturedata->texw;
686 minv *= texturedata->texh;
688 maxv *= texturedata->texh;
710 *(verts++) = (
GLfloat) dstrect->
x + centerx;
711 *(verts++) = (
GLfloat) dstrect->
y + centery;
732 data->glColor4f(fr, fg, fb, fa);
736 if (
data->drawstate.viewport_dirty) {
740 data->glLoadIdentity();
754 if (
data->drawstate.cliprect_enabled_dirty) {
755 if (
data->drawstate.cliprect_enabled) {
763 if (
data->drawstate.cliprect_enabled &&
data->drawstate.cliprect_dirty) {
773 if (blend !=
data->drawstate.blend) {
778 if (
data->GL_OES_blend_func_separate_supported) {
787 if (
data->GL_OES_blend_equation_separate_supported) {
790 }
else if (
data->GL_OES_blend_subtract_supported) {
794 data->drawstate.blend = blend;
817 GLES_TextureData *texturedata = (GLES_TextureData *)
texture->driverdata;
873 if (
color !=
data->drawstate.clear_color) {
878 data->glClearColor(fr, fg, fb, fa);
882 if (
data->drawstate.cliprect_enabled ||
data->drawstate.cliprect_enabled_dirty) {
884 data->drawstate.cliprect_enabled_dirty =
data->drawstate.cliprect_enabled;
906 if (
count > 2 && (verts[0] == verts[(
count-1)*2]) && (verts[1] == verts[(
count*2)-1])) {
931 SetCopyState(
data, cmd);
940 const GLfloat translatex = verts[16];
941 const GLfloat translatey = verts[17];
943 SetCopyState(
data, cmd);
948 data->glPushMatrix();
949 data->glTranslatef(translatex, translatey, 0.0
f);
1012 temp_format, temp_pixels, temp_pitch,
1013 pixel_format,
pixels, pitch);
1032 GLES_TextureData *
data = (GLES_TextureData *)
texture->driverdata;
1036 if (renderdata->drawstate.texture ==
texture) {
1037 renderdata->drawstate.texture =
NULL;
1039 if (renderdata->drawstate.target ==
texture) {
1040 renderdata->drawstate.target =
NULL;
1046 if (
data->texture) {
1047 renderdata->glDeleteTextures(1, &
data->texture);
1060 if (
data->context) {
1061 while (
data->framebuffers) {
1062 GLES_FBOList *nextnode =
data->framebuffers->next;
1063 data->glDeleteFramebuffersOES(1, &
data->framebuffers->FBO);
1065 data->framebuffers = nextnode;
1077 GLES_TextureData *texturedata = (GLES_TextureData *)
texture->driverdata;
1081 data->glBindTexture(texturedata->type, texturedata->texture);
1087 *texw = (float)texturedata->texw;
1090 *texh = (float)texturedata->texh;
1099 GLES_TextureData *texturedata = (GLES_TextureData *)
texture->driverdata;
1101 data->glDisable(texturedata->type);
1113 GLES_RenderData *
data;
1116 int profile_mask = 0, major = 0, minor = 0;
1179 if (!
data->context) {
1188 if (GLES_LoadFunctions(
data) < 0) {
1215 data->glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &
value);
1224 data->GL_OES_blend_equation_separate_supported =
SDL_TRUE;
1235 data->glLoadIdentity();
1240 data->glClearColor(1.0
f, 1.0
f, 1.0
f, 1.0
f);
1243 data->drawstate.color = 0xFFFFFFFF;
1244 data->drawstate.clear_color = 0xFFFFFFFF;
1249 if (changed_window) {
1260 GLES_CreateRenderer,
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
GLfixed GLfixed GLint GLint GLfixed points
int(* GL_UnbindTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
@ SDL_BLENDOPERATION_SUBTRACT
#define SDL_small_free(ptr, isstack)
static SDL_BlendMode blendMode
int SDL_RecreateWindow(SDL_Window *window, Uint32 flags)
@ SDL_BLENDFACTOR_SRC_ALPHA
@ SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA
@ SDL_BLENDOPERATION_REV_SUBTRACT
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro pixld1_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl else error unsupported endif endm macro pixld2_s mem_operand if mov asr add asl add asl mov asr sub UNIT_X add asl mov asr add asl add asl mov asr add UNIT_X add asl else pixld1_s mem_operand pixld1_s mem_operand endif endm macro pixld0_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl endif endm macro pixld_s_internal mem_operand if mem_operand pixld2_s mem_operand pixdeinterleave basereg elseif mem_operand elseif mem_operand elseif mem_operand elseif mem_operand pixld0_s mem_operand else pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else error unsupported mem_operand if bpp mem_operand endif endm macro vuzp8 reg2 vuzp d d ®2 endm macro vzip8 reg2 vzip d d ®2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld if[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro fetch_mask_pixblock pixld mask_basereg pixblock_size MASK endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
int(* QueueCopyEx)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcquad, const SDL_FRect *dstrect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
void * SDL_AllocateRenderVertices(SDL_Renderer *renderer, const size_t numbytes, const size_t alignment, size_t *offset)
@ SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR
int(* RunCommandQueue)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
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
#define SDL_GL_CreateContext
GLuint GLuint GLsizei count
#define SDL_GetWindowFlags
struct SDL_RenderCommand * next
SDL_BlendOperation
The blend operation used when combining source and destination pixel components.
#define GL_ONE_MINUS_DST_ALPHA
GLdouble GLdouble GLdouble r
#define GL_COLOR_BUFFER_BIT
void(* WindowEvent)(SDL_Renderer *renderer, const SDL_WindowEvent *event)
GLenum GLenum GLenum input
#define GL_UNPACK_ALIGNMENT
SDL_RenderDriver GLES_RenderDriver
GLboolean GLboolean GLboolean GLboolean a
@ SDL_GL_CONTEXT_MINOR_VERSION
GLfloat GLfloat GLfloat GLfloat h
SDL_RendererFlip
Flip constants for SDL_RenderCopyEx.
#define SDL_small_alloc(type, count, pisstack)
GLuint GLsizei GLsizei * length
@ SDL_RENDERCMD_SETCLIPRECT
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define GL_TEXTURE_WRAP_T
The type used to identify a window.
#define SDL_GL_GetDrawableSize
#define GL_INVALID_OPERATION
@ SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR
#define GL_TEXTURE_MIN_FILTER
static screen_context_t context
int(* QueueSetDrawColor)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
The structure that defines a point (floating point)
struct SDL_RenderCommand::@23::@27 color
GLint GLint GLint GLint GLint x
EGLSurface EGLNativeWindowType * window
void(* SetTextureScaleMode)(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
#define SDL_GL_SetAttribute
#define GL_ONE_MINUS_SRC_COLOR
GLint GLint GLsizei GLsizei height
SDL_bool(* SupportsBlendMode)(SDL_Renderer *renderer, SDL_BlendMode blendMode)
@ SDL_RENDERCMD_SETVIEWPORT
int(* QueueDrawLines)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
@ SDL_RENDERER_PRESENTVSYNC
@ SDL_RENDERCMD_DRAW_POINTS
@ SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA
@ SDL_GL_CONTEXT_PROFILE_ES
#define SDL_GL_GetSwapInterval
SDL_BlendFactor
The normalized factor used to multiply pixel components.
static void SetDrawState(SDL_Surface *surface, SW_DrawStateCache *drawstate)
#define SDL_GL_SetSwapInterval
SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor(SDL_BlendMode blendMode)
#define GL_TEXTURE_MAG_FILTER
int(* GL_BindTexture)(SDL_Renderer *renderer, SDL_Texture *texture, float *texw, float *texh)
SDL_RenderCommandType command
int(* QueueSetViewport)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
#define GL_TEXTURE_COORD_ARRAY
#define SDL_GL_GetCurrentContext
@ SDL_WINDOWEVENT_MINIMIZED
#define GL_TEXTURE_WRAP_S
@ SDL_RENDERCMD_DRAW_LINES
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
int(* GetOutputSize)(SDL_Renderer *renderer, int *w, int *h)
@ SDL_BLENDFACTOR_DST_COLOR
#define SDL_OutOfMemory()
@ SDL_GL_CONTEXT_MAJOR_VERSION
@ SDL_GL_CONTEXT_PROFILE_MASK
int(* CreateTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
union SDL_RenderCommand::@23 data
GLint GLint GLint GLint GLint GLint y
@ SDL_RENDERCMD_FILL_RECTS
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)
void * SDL_GLContext
An opaque handle to an OpenGL context.
static SDL_Renderer * renderer
#define GL_STACK_OVERFLOW
SDL_BlendFactor SDL_GetBlendModeDstColorFactor(SDL_BlendMode blendMode)
struct SDL_RenderCommand::@23::@25 cliprect
GLsizei const GLfloat * value
@ SDL_RENDERER_TARGETTEXTURE
void(* RenderPresent)(SDL_Renderer *renderer)
#define SDL_BYTESPERPIXEL(X)
A rectangle, with the origin at the upper left (integer).
@ SDL_BLENDFACTOR_SRC_COLOR
int(* QueueFillRects)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
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
A rectangle, with the origin at the upper left (floating point).
#define SDL_ConvertPixels
@ SDL_BLENDFACTOR_DST_ALPHA
SDL_ScaleMode
The scaling mode for a texture.
int(* QueueDrawPoints)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
#define SDL_GL_SwapWindow
@ SDL_RENDERER_ACCELERATED
#define GL_ONE_MINUS_SRC_ALPHA
const GLuint * framebuffers
@ SDL_RENDERCMD_SETDRAWCOLOR
int(* QueueCopy)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
@ SDL_TEXTUREACCESS_STREAMING
GLenum GLenum GLuint texture
#define GL_ONE_MINUS_DST_COLOR
struct SDL_RenderCommand::@23::@24 viewport
EGLSurface EGLint * rects
@ SDL_PIXELFORMAT_ABGR8888
SDL_BlendOperation SDL_GetBlendModeAlphaOperation(SDL_BlendMode blendMode)
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
GLuint GLuint GLsizei GLenum type
#define SDL_GL_DeleteContext
struct SDL_RenderCommand::@23::@26 draw
SDL_BlendFactor SDL_GetBlendModeSrcColorFactor(SDL_BlendMode blendMode)
#define GL_TRIANGLE_STRIP
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)
void(* UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
void(* DestroyTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
GLubyte GLubyte GLubyte GLubyte w
#define SDL_GL_ExtensionSupported