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 *
223 GLES_FBOList *result = data->framebuffers;
224 while ((result) && ((result->w != w) || (result->h != h)) ) {
225 result = result->next;
227 if (result ==
NULL) {
231 data->glGenFramebuffersOES(1, &result->FBO);
232 result->next = data->framebuffers;
233 data->framebuffers =
result;
242 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
244 if (SDL_CurrentContext != data->context) {
248 SDL_CurrentContext = data->context;
250 GLES_UpdateViewport(renderer);
259 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
261 if (SDL_CurrentContext == data->context) {
262 GLES_UpdateViewport(renderer);
264 GLES_ActivateRenderer(renderer);
267 data->current.color = 0xffffffff;
275 data->glLoadIdentity();
286 GLES_RenderData *
data;
289 int profile_mask = 0, major = 0, minor = 0;
316 data = (GLES_RenderData *)
SDL_calloc(1,
sizeof(*data));
318 GLES_DestroyRenderer(renderer);
345 renderer->
info = GLES_RenderDriver.
info;
351 if (!data->context) {
352 GLES_DestroyRenderer(renderer);
356 GLES_DestroyRenderer(renderer);
360 if (GLES_LoadFunctions(data) < 0) {
361 GLES_DestroyRenderer(renderer);
383 data->GL_OES_framebuffer_object_supported =
SDL_TRUE;
387 data->glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &value);
388 data->window_framebuffer = (
GLuint)value;
390 data->framebuffers =
NULL;
393 data->GL_OES_blend_func_separate_supported =
SDL_TRUE;
396 data->GL_OES_blend_equation_separate_supported =
SDL_TRUE;
399 data->GL_OES_blend_subtract_supported =
SDL_TRUE;
403 GLES_ResetState(renderer);
408 if (changed_window) {
421 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
427 SDL_CurrentContext =
NULL;
437 GLES_GetOutputSize(
SDL_Renderer * renderer,
int *w,
int *h)
475 return GL_FUNC_ADD_OES;
477 return GL_FUNC_SUBTRACT_OES;
479 return GL_FUNC_REVERSE_SUBTRACT_OES;
488 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
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)
521 while (value < input) {
530 GLES_RenderData *renderdata = (GLES_RenderData *) renderer->
driverdata;
531 GLES_TextureData *data;
534 int texture_w, texture_h;
538 GLES_ActivateRenderer(renderer);
540 switch (texture->
format) {
550 data = (GLES_TextureData *)
SDL_calloc(1,
sizeof(*data));
557 data->pixels =
SDL_calloc(1, texture->
h * data->pitch);
566 if (!renderdata->GL_OES_framebuffer_object_supported) {
568 return SDL_SetError(
"GL_OES_framebuffer_object not supported");
570 data->fbo = GLES_GetFBO(renderer->
driverdata, texture->
w, texture->
h);
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);
589 data->texw = (
GLfloat) texture->
w / texture_w;
590 data->texh = (
GLfloat) texture->
h / texture_h;
593 data->formattype =
type;
595 renderdata->glBindTexture(data->type, data->texture);
601 renderdata->glTexImage2D(data->type, 0,
internalFormat, texture_w,
605 result = renderdata->glGetError();
608 return GLES_SetError(
"glTexImage2D()", result);
619 GLES_RenderData *renderdata = (GLES_RenderData *) renderer->
driverdata;
620 GLES_TextureData *data = (GLES_TextureData *) texture->
driverdata;
626 GLES_ActivateRenderer(renderer);
629 if (rect->
w <= 0 || rect->
h <= 0) {
635 src = (
Uint8 *)pixels;
636 if (pitch != srcPitch) {
642 for (y = 0; y < rect->
h; ++
y) {
645 pixels = (
Uint8 *)pixels + pitch;
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);
675 const SDL_Rect * rect,
void **pixels,
int *pitch)
677 GLES_TextureData *data = (GLES_TextureData *) texture->
driverdata;
680 (
void *) ((
Uint8 *) data->pixels + rect->
y * data->pitch +
682 *pitch = data->pitch;
689 GLES_TextureData *data = (GLES_TextureData *) texture->
driverdata;
697 GLES_UpdateTexture(renderer, texture, &rect, data->pixels, data->pitch);
703 GLES_RenderData *data = (GLES_RenderData *) renderer->
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");
711 if (texture ==
NULL) {
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");
731 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
733 if (SDL_CurrentContext != data->context) {
750 data->glLoadIdentity();
774 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
776 if (SDL_CurrentContext != data->context) {
790 data->glScissor(renderer->
viewport.
x + rect->
x, h - renderer->
viewport.
y - rect->
y - rect->
h, rect->
w, rect->
h);
801 Uint32 color = ((a << 24) | (r << 16) | (g << 8) | b);
803 if (color != data->current.color) {
804 data->glColor4f((
GLfloat) r * inv255f,
808 data->current.color =
color;
813 GLES_SetBlendMode(GLES_RenderData * data,
SDL_BlendMode blendMode)
815 if (blendMode != data->current.blendMode) {
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) {
843 if (enabled != data->current.tex_coords) {
849 data->current.tex_coords =
enabled;
856 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
858 GLES_ActivateRenderer(renderer);
860 GLES_SetColor(data, (
GLfloat) renderer->
r,
865 GLES_SetBlendMode(data, renderer->
blendMode);
873 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
875 GLES_ActivateRenderer(renderer);
877 data->glClearColor((
GLfloat) renderer->
r * inv255f,
899 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
903 GLES_SetDrawingState(renderer);
911 vertices[
idx * 2] =
x;
912 vertices[(
idx * 2) + 1] = y;
915 data->glVertexPointer(2,
GL_FLOAT, 0, vertices);
925 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
929 GLES_SetDrawingState(renderer);
937 vertices[
idx * 2] =
x;
938 vertices[(
idx * 2) + 1] = y;
941 data->glVertexPointer(2,
GL_FLOAT, 0, vertices);
943 points[0].
x == points[count-1].
x && points[0].y == points[count-1].y) {
950 data->glDrawArrays(
GL_POINTS, count-1, 1);
961 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
964 GLES_SetDrawingState(renderer);
982 data->glVertexPointer(2,
GL_FLOAT, 0, vertices);
993 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
994 GLES_TextureData *texturedata = (GLES_TextureData *) texture->
driverdata;
995 GLfloat minx, miny, maxx, maxy;
996 GLfloat minu, maxu, minv, maxv;
1000 GLES_ActivateRenderer(renderer);
1004 data->glBindTexture(texturedata->type, texturedata->texture);
1007 GLES_SetColor(data, texture->
r, texture->
g, texture->
b, texture->
a);
1009 GLES_SetColor(data, 255, 255, 255, 255);
1012 GLES_SetBlendMode(data, texture->
blendMode);
1018 maxx = dstrect->
x + dstrect->
w;
1019 maxy = dstrect->
y + dstrect->
h;
1021 minu = (
GLfloat) srcrect->
x / texture->
w;
1022 minu *= texturedata->texw;
1023 maxu = (
GLfloat) (srcrect->
x + srcrect->
w) / texture->
w;
1024 maxu *= texturedata->texw;
1025 minv = (
GLfloat) srcrect->
y / texture->
h;
1026 minv *= texturedata->texh;
1027 maxv = (
GLfloat) (srcrect->
y + srcrect->
h) / texture->
h;
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;
1048 data->glVertexPointer(2,
GL_FLOAT, 0, vertices);
1049 data->glTexCoordPointer(2,
GL_FLOAT, 0, texCoords);
1063 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
1064 GLES_TextureData *texturedata = (GLES_TextureData *) texture->
driverdata;
1065 GLfloat minx, miny, maxx, maxy;
1066 GLfloat minu, maxu, minv, maxv;
1072 GLES_ActivateRenderer(renderer);
1076 data->glBindTexture(texturedata->type, texturedata->texture);
1079 GLES_SetColor(data, texture->
r, texture->
g, texture->
b, texture->
a);
1081 GLES_SetColor(data, 255, 255, 255, 255);
1084 GLES_SetBlendMode(data, texture->
blendMode);
1088 centerx = center->
x;
1089 centery = center->
y;
1092 data->glPushMatrix();
1093 data->glTranslatef(dstrect->
x + centerx, dstrect->
y + centery, 0.0f);
1094 data->glRotatef((
GLfloat)angle, 0.0
f, 0.0
f, 1.0
f);
1097 minx = dstrect->
w - centerx;
1101 maxx = dstrect->
w - centerx;
1105 miny = dstrect->
h - centery;
1109 maxy = dstrect->
h - centery;
1112 minu = (
GLfloat) srcrect->
x / texture->
w;
1113 minu *= texturedata->texw;
1114 maxu = (
GLfloat) (srcrect->
x + srcrect->
w) / texture->
w;
1115 maxu *= texturedata->texw;
1116 minv = (
GLfloat) srcrect->
y / texture->
h;
1117 minv *= texturedata->texh;
1118 maxv = (
GLfloat) (srcrect->
y + srcrect->
h) / texture->
h;
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;
1138 data->glVertexPointer(2,
GL_FLOAT, 0, vertices);
1139 data->glTexCoordPointer(2,
GL_FLOAT, 0, texCoords);
1141 data->glPopMatrix();
1149 Uint32 pixel_format,
void * pixels,
int pitch)
1151 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
1159 GLES_ActivateRenderer(renderer);
1171 data->glReadPixels(rect->
x, renderer->
target ? rect->
y : (h-rect->
y)-rect->
h,
1177 src = (
Uint8*)temp_pixels + (rect->
h-1)*temp_pitch;
1192 temp_format, temp_pixels, temp_pitch,
1193 pixel_format, pixels, pitch);
1202 GLES_ActivateRenderer(renderer);
1210 GLES_RenderData *renderdata = (GLES_RenderData *) renderer->
driverdata;
1212 GLES_TextureData *data = (GLES_TextureData *) texture->
driverdata;
1214 GLES_ActivateRenderer(renderer);
1219 if (data->texture) {
1220 renderdata->glDeleteTextures(1, &data->texture);
1230 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
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;
1249 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
1250 GLES_TextureData *texturedata = (GLES_TextureData *) texture->
driverdata;
1251 GLES_ActivateRenderer(renderer);
1254 data->glBindTexture(texturedata->type, texturedata->texture);
1257 *texw = (float)texturedata->texw;
1260 *texh = (float)texturedata->texh;
1268 GLES_RenderData *data = (GLES_RenderData *) renderer->
driverdata;
1269 GLES_TextureData *texturedata = (GLES_TextureData *) texture->
driverdata;
1270 GLES_ActivateRenderer(renderer);
1271 data->glDisable(texturedata->type);
SDL_BlendFactor SDL_GetBlendModeSrcColorFactor(SDL_BlendMode blendMode)
SDL_BlendFactor
The normalized factor used to multiply pixel components.
int(* RenderDrawLines)(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
#define GL_STACK_UNDERFLOW
#define SDL_GL_ExtensionSupported
GLdouble GLdouble GLdouble r
int(* RenderDrawPoints)(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
int(* LockTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
#define GL_INVALID_OPERATION
#define SDL_GL_CreateContext
int(* RenderReadPixels)(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
const GLuint * framebuffers
GLint GLint GLint GLint GLint x
SDL_RenderDriver GLES_RenderDriver
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
SDL_bool(* SupportsBlendMode)(SDL_Renderer *renderer, SDL_BlendMode blendMode)
GLuint GLuint GLsizei count
GLfloat GLfloat GLfloat GLfloat h
static screen_context_t context
SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor(SDL_BlendMode blendMode)
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 local skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
#define SDL_GetWindowFlags
SDL_BlendOperation SDL_GetBlendModeColorOperation(SDL_BlendMode blendMode)
#define SDL_BYTESPERPIXEL(X)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define GL_TEXTURE_MAG_FILTER
int(* RenderFillRects)(SDL_Renderer *renderer, const SDL_FRect *rects, int count)
#define GL_TRIANGLE_STRIP
#define GL_ONE_MINUS_SRC_ALPHA
SDL_BlendOperation
The blend operation used when combining source and destination pixel components.
#define GL_ONE_MINUS_SRC_COLOR
int(* RenderClear)(SDL_Renderer *renderer)
void(* DestroyRenderer)(SDL_Renderer *renderer)
GLint GLint GLsizei width
GLfixed GLfixed GLint GLint GLfixed points
int(* GetOutputSize)(SDL_Renderer *renderer, int *w, int *h)
#define GL_PACK_ALIGNMENT
#define GL_MAX_TEXTURE_SIZE
static SDL_BlendMode blendMode
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
int(* UpdateTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
#define SDL_GL_SetAttribute
#define SDL_GL_GetDrawableSize
#define GL_ONE_MINUS_DST_ALPHA
GLenum GLenum GLuint texture
SDL_BlendOperation SDL_GetBlendModeAlphaOperation(SDL_BlendMode blendMode)
void * SDL_GLContext
An opaque handle to an OpenGL context.
#define SDL_GL_GetSwapInterval
GLenum GLenum GLenum input
int SDL_RecreateWindow(SDL_Window *window, Uint32 flags)
#define GL_STACK_OVERFLOW
static SDL_Renderer * renderer
#define SDL_stack_alloc(type, count)
#define SDL_GL_SetSwapInterval
#define GL_TEXTURE_WRAP_T
int(* GL_BindTexture)(SDL_Renderer *renderer, SDL_Texture *texture, float *texw, float *texh)
GLubyte GLubyte GLubyte GLubyte w
GLsizei const GLfloat * value
void(* UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
GLint GLint GLint GLint GLint GLint y
int(* SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture)
int(* UpdateViewport)(SDL_Renderer *renderer)
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
#define GL_COLOR_BUFFER_BIT
int(* GL_UnbindTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
SDL_RendererFlip
Flip constants for SDL_RenderCopyEx.
GLenum GLenum GLsizei const GLuint GLboolean enabled
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)
int(* RenderCopy)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
Window state change event data (event.window.*)
#define SDL_OutOfMemory()
SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor(SDL_BlendMode blendMode)
GLint GLint GLsizei GLsizei height
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)
#define SDL_GL_MakeCurrent
EGLSurface EGLNativeWindowType * window
#define SDL_GetRendererOutputSize
The type used to identify a window.
#define GL_ONE_MINUS_DST_COLOR
SDL_BlendFactor SDL_GetBlendModeDstColorFactor(SDL_BlendMode blendMode)
void(* WindowEvent)(SDL_Renderer *renderer, const SDL_WindowEvent *event)
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 idx
GLuint GLuint GLsizei GLenum type
#define GL_TEXTURE_COORD_ARRAY
#define SDL_GL_GetAttribute
#define SDL_ConvertPixels
void(* DestroyTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
int(* CreateTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
void(* RenderPresent)(SDL_Renderer *renderer)
#define SDL_GL_DeleteContext
EGLSurface EGLint * rects
#define SDL_stack_free(data)
#define GL_TEXTURE_WRAP_S
GLuint GLsizei GLsizei * length
#define GL_TEXTURE_MIN_FILTER
GLboolean GLboolean GLboolean GLboolean a
#define GL_UNPACK_ALIGNMENT
int(* UpdateClipRect)(SDL_Renderer *renderer)
GLboolean GLboolean GLboolean b
#define SDL_GL_SwapWindow
SDL_bool clipping_enabled
A rectangle, with the origin at the upper left.