21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED
27 #include "../SDL_sysrender.h"
31 #include <OpenGL/OpenGL.h>
38 #define RENDERER_CONTEXT_MAJOR 2
39 #define RENDERER_CONTEXT_MINOR 1
50 static const float inv255f = 1.0f / 255.0f;
52 typedef struct GL_FBOList GL_FBOList;
85 SDL_bool GL_ARB_debug_output_supported;
87 char **error_messages;
89 GLvoid *next_error_userparam;
93 SDL_bool GL_ARB_texture_non_power_of_two_supported;
94 SDL_bool GL_ARB_texture_rectangle_supported;
95 SDL_bool GL_EXT_framebuffer_object_supported;
99 #define SDL_PROC(ret,func,params) ret (APIENTRY *func) params;
104 SDL_bool GL_ARB_multitexture_supported;
106 GLint num_texture_units;
108 PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
109 PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
110 PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
111 PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
112 PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
117 GL_DrawStateCache drawstate;
141 GL_TranslateError (
GLenum error)
143 #define GL_ERROR_TRANSLATE(e) case e: return #e;
156 #undef GL_ERROR_TRANSLATE
168 if (
data->GL_ARB_debug_output_supported) {
171 for (
i = 0;
i <
data->errors; ++
i) {
179 }
else if (
data->glGetError !=
NULL) {
187 GL_CheckAllErrors (
const char *prefix,
SDL_Renderer *
renderer,
const char *file,
int line,
const char *
function)
196 if (
data->GL_ARB_debug_output_supported) {
199 for (
i = 0;
i <
data->errors; ++
i) {
200 SDL_SetError(
"%s: %s (%d): %s %s", prefix, file, line,
function,
data->error_messages[
i]);
210 if (prefix ==
NULL || prefix[0] ==
'\0') {
213 SDL_SetError(
"%s: %s (%d): %s %s (0x%X)", prefix, file, line,
function, GL_TranslateError(error), error);
224 #define GL_CheckError(prefix, renderer)
226 #define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, SDL_FILE, SDL_LINE, SDL_FUNCTION)
230 GL_LoadFunctions(GL_RenderData *
data)
232 #ifdef __SDL_NOGETPROCADDR__
233 #define SDL_PROC(ret,func,params) data->func=func;
236 #define SDL_PROC(ret,func,params) \
238 data->func = SDL_GL_GetProcAddress(#func); \
239 if ( ! data->func ) { \
240 retval = SDL_SetError("Couldn't load GL function %s: %s", #func, SDL_GetError()); \
274 int errors =
data->errors + 1;
275 char **error_messages =
SDL_realloc(
data->error_messages, errors *
sizeof(*
data->error_messages));
276 if (error_messages) {
277 data->errors = errors;
278 data->error_messages = error_messages;
284 if (
data->next_error_callback) {
384 if (colorOperation != alphaOperation) {
391 power_of_2(
int input)
443 const GLenum textype = renderdata->textype;
444 GL_TextureData *
data;
447 int texture_w, texture_h;
452 renderdata->drawstate.texture =
NULL;
455 !renderdata->GL_EXT_framebuffer_object_supported) {
456 return SDL_SetError(
"Render targets not supported by OpenGL");
461 return SDL_SetError(
"Texture format %s not supported by OpenGL",
498 renderdata->glGenTextures(1, &
data->texture);
499 if (GL_CheckError(
"glGenTextures()",
renderer) < 0) {
508 if (renderdata->GL_ARB_texture_non_power_of_two_supported) {
513 }
else if (renderdata->GL_ARB_texture_rectangle_supported) {
519 texture_w = power_of_2(
texture->w);
520 texture_h = power_of_2(
texture->h);
528 renderdata->glEnable(textype);
529 renderdata->glBindTexture(textype,
data->texture);
542 #ifndef GL_TEXTURE_STORAGE_HINT_APPLE
543 #define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC
545 #ifndef STORAGE_CACHED_APPLE
546 #define STORAGE_CACHED_APPLE 0x85BE
548 #ifndef STORAGE_SHARED_APPLE
549 #define STORAGE_SHARED_APPLE 0x85BF
575 renderdata->glDisable(textype);
576 if (GL_CheckError(
"glTexImage2D()",
renderer) < 0) {
584 renderdata->glGenTextures(1, &
data->utexture);
585 renderdata->glGenTextures(1, &
data->vtexture);
587 renderdata->glBindTexture(textype,
data->utexture);
596 renderdata->glTexImage2D(textype, 0,
internalFormat, (texture_w+1)/2,
599 renderdata->glBindTexture(textype,
data->vtexture);
608 renderdata->glTexImage2D(textype, 0,
internalFormat, (texture_w+1)/2,
616 renderdata->glGenTextures(1, &
data->utexture);
617 renderdata->glBindTexture(textype,
data->utexture);
638 const GLenum textype = renderdata->textype;
639 GL_TextureData *
data = (GL_TextureData *)
texture->driverdata;
646 renderdata->drawstate.texture =
NULL;
648 renderdata->glBindTexture(textype,
data->texture);
660 renderdata->glBindTexture(textype,
data->vtexture);
662 renderdata->glBindTexture(textype,
data->utexture);
664 renderdata->glTexSubImage2D(textype, 0,
rect->
x/2,
rect->
y/2,
671 renderdata->glBindTexture(textype,
data->utexture);
673 renderdata->glBindTexture(textype,
data->vtexture);
675 renderdata->glTexSubImage2D(textype, 0,
rect->
x/2,
rect->
y/2,
685 renderdata->glBindTexture(textype,
data->utexture);
686 renderdata->glTexSubImage2D(textype, 0,
rect->
x/2,
rect->
y/2,
691 return GL_CheckError(
"glTexSubImage2D()",
renderer);
697 const Uint8 *Yplane,
int Ypitch,
698 const Uint8 *Uplane,
int Upitch,
699 const Uint8 *Vplane,
int Vpitch)
702 const GLenum textype = renderdata->textype;
703 GL_TextureData *
data = (GL_TextureData *)
texture->driverdata;
707 renderdata->drawstate.texture =
NULL;
709 renderdata->glBindTexture(textype,
data->texture);
717 renderdata->glBindTexture(textype,
data->utexture);
718 renderdata->glTexSubImage2D(textype, 0,
rect->
x/2,
rect->
y/2,
720 data->format,
data->formattype, Uplane);
723 renderdata->glBindTexture(textype,
data->vtexture);
724 renderdata->glTexSubImage2D(textype, 0,
rect->
x/2,
rect->
y/2,
726 data->format,
data->formattype, Vplane);
728 return GL_CheckError(
"glTexSubImage2D()",
renderer);
735 GL_TextureData *
data = (GL_TextureData *)
texture->driverdata;
741 *pitch =
data->pitch;
748 GL_TextureData *
data = (GL_TextureData *)
texture->driverdata;
763 const GLenum textype = renderdata->textype;
764 GL_TextureData *
data = (GL_TextureData *)
texture->driverdata;
767 renderdata->glBindTexture(textype,
data->texture);
773 renderdata->glBindTexture(textype,
data->utexture);
777 renderdata->glBindTexture(textype,
data->vtexture);
784 renderdata->glBindTexture(textype,
data->utexture);
794 GL_TextureData *texturedata;
799 if (!
data->GL_EXT_framebuffer_object_supported) {
800 return SDL_SetError(
"Render targets not supported by OpenGL");
810 texturedata = (GL_TextureData *)
texture->driverdata;
817 return SDL_SetError(
"glFramebufferTexture2DEXT() failed");
871 const GLfloat xstart = verts[0];
872 const GLfloat ystart = verts[1];
876 if (ystart == yend) {
877 verts[2] += (xend > xstart) ? 1.0f : -1.0f;
878 }
else if (xstart == xend) {
879 verts[3] += (yend > ystart) ? 1.0f : -1.0f;
881 const GLfloat deltax = xend - xstart;
882 const GLfloat deltay = yend - ystart;
905 *(verts++) =
rect->
x;
906 *(verts++) =
rect->
y;
918 GL_TextureData *texturedata = (GL_TextureData *)
texture->driverdata;
919 GLfloat minx, miny, maxx, maxy;
920 GLfloat minu, maxu, minv, maxv;
931 maxx = dstrect->
x + dstrect->
w;
932 maxy = dstrect->
y + dstrect->
h;
935 minu *= texturedata->texw;
937 maxu *= texturedata->texw;
939 minv *= texturedata->texh;
941 maxv *= texturedata->texh;
960 GL_TextureData *texturedata = (GL_TextureData *)
texture->driverdata;
961 GLfloat minx, miny, maxx, maxy;
963 GLfloat minu, maxu, minv, maxv;
974 minx = dstrect->
w - centerx;
979 maxx = dstrect->
w - centerx;
983 miny = dstrect->
h - centery;
988 maxy = dstrect->
h - centery;
992 minu *= texturedata->texw;
994 maxu *= texturedata->texw;
996 minv *= texturedata->texh;
998 maxv *= texturedata->texh;
1009 *(verts++) = (
GLfloat) dstrect->
x + centerx;
1010 *(verts++) = (
GLfloat) dstrect->
y + centery;
1020 if (
data->drawstate.viewport_dirty) {
1024 data->glLoadIdentity();
1038 if (
data->drawstate.cliprect_enabled_dirty) {
1039 if (!
data->drawstate.cliprect_enabled) {
1047 if (
data->drawstate.cliprect_enabled &&
data->drawstate.cliprect_dirty) {
1056 if (blend !=
data->drawstate.blend) {
1067 data->drawstate.blend = blend;
1090 const GL_TextureData *texturedata = (GL_TextureData *)
texture->driverdata;
1099 if (
data->shaders) {
1100 if (texturedata->yuv || texturedata->nv12) {
1103 if (texturedata->yuv) {
1112 if (texturedata->yuv) {
1121 if (texturedata->yuv) {
1130 SDL_assert(!
"unsupported YUV conversion mode");
1140 if (texturedata->yuv) {
1142 data->glBindTexture(textype, texturedata->vtexture);
1145 data->glBindTexture(textype, texturedata->utexture);
1147 if (texturedata->nv12) {
1149 data->glBindTexture(textype, texturedata->utexture);
1152 data->glBindTexture(textype, texturedata->texture);
1170 if (!
data->drawstate.target) {
1221 if (
color !=
data->drawstate.clear_color) {
1226 data->glClearColor(fr, fg, fb, fa);
1230 if (
data->drawstate.cliprect_enabled ||
data->drawstate.cliprect_enabled_dirty) {
1232 data->drawstate.cliprect_enabled_dirty =
data->drawstate.cliprect_enabled;
1245 for (
i = 0;
i <
count;
i++, verts += 2) {
1246 data->glVertex2f(verts[0], verts[1]);
1258 for (
i = 0;
i <
count; ++
i, verts += 2) {
1259 data->glVertex2f(verts[0], verts[1]);
1269 for (
i = 0;
i <
count; ++
i, verts += 4) {
1270 data->glRectf(verts[0], verts[1], verts[2], verts[3]);
1277 const GLfloat minx = verts[0];
1278 const GLfloat miny = verts[1];
1279 const GLfloat maxx = verts[2];
1280 const GLfloat maxy = verts[3];
1281 const GLfloat minu = verts[4];
1282 const GLfloat maxu = verts[5];
1283 const GLfloat minv = verts[6];
1284 const GLfloat maxv = verts[7];
1285 SetCopyState(
data, cmd);
1287 data->glTexCoord2f(minu, minv);
1288 data->glVertex2f(minx, miny);
1289 data->glTexCoord2f(maxu, minv);
1290 data->glVertex2f(maxx, miny);
1291 data->glTexCoord2f(minu, maxv);
1292 data->glVertex2f(minx, maxy);
1293 data->glTexCoord2f(maxu, maxv);
1294 data->glVertex2f(maxx, maxy);
1301 const GLfloat minx = verts[0];
1302 const GLfloat miny = verts[1];
1303 const GLfloat maxx = verts[2];
1304 const GLfloat maxy = verts[3];
1305 const GLfloat minu = verts[4];
1306 const GLfloat maxu = verts[5];
1307 const GLfloat minv = verts[6];
1308 const GLfloat maxv = verts[7];
1309 const GLfloat translatex = verts[8];
1310 const GLfloat translatey = verts[9];
1312 SetCopyState(
data, cmd);
1315 data->glPushMatrix();
1316 data->glTranslatef(translatex, translatey, 0.0f);
1319 data->glTexCoord2f(minu, minv);
1320 data->glVertex2f(minx, miny);
1321 data->glTexCoord2f(maxu, minv);
1322 data->glVertex2f(maxx, miny);
1323 data->glTexCoord2f(minu, maxv);
1324 data->glVertex2f(minx, maxy);
1325 data->glTexCoord2f(maxu, maxv);
1326 data->glVertex2f(maxx, maxy);
1328 data->glPopMatrix();
1339 return GL_CheckError(
"",
renderer);
1359 return SDL_SetError(
"Texture format %s not supported by OpenGL",
1382 if (GL_CheckError(
"glReadPixels()",
renderer) < 0) {
1406 temp_format, temp_pixels, temp_pitch,
1425 GL_TextureData *
data = (GL_TextureData *)
texture->driverdata;
1429 if (renderdata->drawstate.texture ==
texture) {
1430 renderdata->drawstate.texture =
NULL;
1432 if (renderdata->drawstate.target ==
texture) {
1433 renderdata->drawstate.target =
NULL;
1439 if (
data->texture) {
1440 renderdata->glDeleteTextures(1, &
data->texture);
1443 renderdata->glDeleteTextures(1, &
data->utexture);
1444 renderdata->glDeleteTextures(1, &
data->vtexture);
1463 if (
data->GL_ARB_debug_output_supported) {
1464 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)
SDL_GL_GetProcAddress(
"glDebugMessageCallbackARB");
1468 glDebugMessageCallbackARBFunc(
data->next_error_callback,
data->next_error_userparam);
1470 if (
data->shaders) {
1473 if (
data->context) {
1474 while (
data->framebuffers) {
1475 GL_FBOList *nextnode =
data->framebuffers->next;
1477 data->glDeleteFramebuffersEXT(1, &
data->framebuffers->FBO);
1480 data->framebuffers = nextnode;
1493 GL_TextureData *texturedata = (GL_TextureData *)
texture->driverdata;
1498 data->glEnable(textype);
1499 if (texturedata->yuv) {
1501 data->glBindTexture(textype, texturedata->vtexture);
1504 data->glBindTexture(textype, texturedata->utexture);
1508 data->glBindTexture(textype, texturedata->texture);
1513 if(texw) *texw = (float)texturedata->texw;
1514 if(texh) *texh = (float)texturedata->texh;
1523 GL_TextureData *texturedata = (GL_TextureData *)
texture->driverdata;
1528 if (texturedata->yuv) {
1530 data->glDisable(textype);
1533 data->glDisable(textype);
1538 data->glDisable(textype);
1551 GL_RenderData *
data;
1554 int profile_mask = 0, major = 0, minor = 0;
1617 if (!
data->context) {
1629 if (GL_LoadFunctions(
data) < 0) {
1658 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)
SDL_GL_GetProcAddress(
"glDebugMessageCallbackARB");
1663 glDebugMessageCallbackARBFunc(GL_HandleDebugMessage,
renderer);
1671 data->GL_ARB_texture_non_power_of_two_supported =
SDL_TRUE;
1677 if (
data->GL_ARB_texture_rectangle_supported) {
1690 if (
data->glActiveTextureARB) {
1701 data->shaders ?
"ENABLED" :
"DISABLED");
1704 if (
data->shaders &&
data->num_texture_units >= 3) {
1717 data->glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)
1719 data->glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)
1721 data->glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
1723 data->glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)
1725 data->glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
1733 data->glLoadIdentity();
1738 data->glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
1739 data->glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
1745 data->drawstate.color = 0xFFFFFFFF;
1746 data->drawstate.clear_color = 0xFFFFFFFF;
1751 if (changed_window) {
#define SDL_assert(condition)
SDL_BlendOperation
The blend operation used when combining source and destination pixel components.
@ SDL_BLENDOPERATION_REV_SUBTRACT
@ SDL_BLENDOPERATION_SUBTRACT
SDL_BlendFactor
The normalized factor used to multiply pixel components.
@ SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR
@ SDL_BLENDFACTOR_SRC_COLOR
@ SDL_BLENDFACTOR_SRC_ALPHA
@ SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR
@ SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA
@ SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA
@ SDL_BLENDFACTOR_DST_ALPHA
@ SDL_BLENDFACTOR_DST_COLOR
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
#define SDL_GL_SwapWindow
#define SDL_GetWindowFlags
#define SDL_GetYUVConversionModeForResolution
#define SDL_GetPixelFormatName
#define SDL_GL_GetAttribute
#define SDL_GL_SetSwapInterval
#define SDL_GL_MakeCurrent
#define SDL_GetRendererOutputSize
#define SDL_GL_SetAttribute
#define SDL_GL_GetSwapInterval
#define SDL_GL_DeleteContext
#define SDL_GetHintBoolean
#define SDL_GL_GetProcAddress
#define SDL_GL_CreateContext
#define SDL_GL_ExtensionSupported
#define SDL_GL_GetDrawableSize
#define SDL_ConvertPixels
#define SDL_GL_GetCurrentContext
#define SDL_OutOfMemory()
#define SDL_HINT_RENDER_OPENGL_SHADERS
A variable controlling whether the OpenGL render driver uses shaders if they are available.
#define SDL_small_alloc(type, count, pisstack)
#define SDL_small_free(ptr, isstack)
int uint32_t uint32_t uint32_t pixel_format
@ SDL_LOG_CATEGORY_RENDER
#define GL_MAX_TEXTURE_SIZE
GLint GLint GLint GLint GLint GLint y
#define GL_TEXTURE_MIN_FILTER
#define GL_TEXTURE_WRAP_S
GLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture)
#define GL_MAX_TEXTURE_UNITS_ARB
#define GL_LUMINANCE_ALPHA
#define GL_ONE_MINUS_DST_ALPHA
#define GL_PACK_ROW_LENGTH
#define GL_PACK_ALIGNMENT
#define GL_ONE_MINUS_DST_COLOR
#define GL_INVALID_OPERATION
GLuint GLuint GLsizei count
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
#define GL_STACK_OVERFLOW
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define GL_FUNC_REVERSE_SUBTRACT
#define GL_UNPACK_ALIGNMENT
#define GL_COLOR_BUFFER_BIT
#define GL_ONE_MINUS_SRC_ALPHA
GLdouble GLdouble GLdouble r
GLint GLint GLint GLint GLint x
#define GL_TEXTURE_WRAP_T
#define GL_TEXTURE_MAG_FILTER
#define GL_TABLE_TOO_LARGE
#define GL_TRIANGLE_STRIP
GLuint GLuint GLsizei GLenum type
#define GL_UNSIGNED_INT_8_8_8_8_REV
#define GL_STACK_UNDERFLOW
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
#define GL_ONE_MINUS_SRC_COLOR
#define GL_UNPACK_ROW_LENGTH
GLboolean GLboolean GLboolean b
GLfixed GLfixed GLint GLint GLfixed points
#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB
#define GL_UNSIGNED_SHORT_8_8_APPLE
#define GL_FRAMEBUFFER_COMPLETE_EXT
#define GL_COLOR_ATTACHMENT0_EXT
#define GL_DEBUG_CALLBACK_USER_PARAM_ARB
GLsizei GLsizei GLchar * source
GLboolean GLboolean GLboolean GLboolean a
GLuint GLsizei const GLchar * message
void(APIENTRY * GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)
const GLuint * framebuffers
#define GL_STORAGE_CACHED_APPLE
GLsizei GLsizei GLuint * shaders
#define GL_DEBUG_CALLBACK_FUNCTION_ARB
#define GL_DEBUG_TYPE_ERROR_ARB
GLenum GLenum GLuint texture
GLuint GLsizei GLsizei * length
#define GL_UNPACK_CLIENT_STORAGE_APPLE
#define GL_TEXTURE_RECTANGLE_ARB
GLsizei const GLfloat * value
GLenum GLenum GLenum input
#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB
#define GL_STORAGE_SHARED_APPLE
#define GL_FRAMEBUFFER_EXT
#define GL_TEXTURE_STORAGE_HINT_APPLE
GLfloat GLfloat GLfloat GLfloat h
GLubyte GLubyte GLubyte GLubyte w
#define GL_YCBCR_422_APPLE
#define SDL_BYTESPERPIXEL(X)
@ SDL_PIXELFORMAT_ABGR8888
@ SDL_PIXELFORMAT_ARGB8888
SDL_BlendFactor SDL_GetBlendModeDstColorFactor(SDL_BlendMode blendMode)
SDL_BlendFactor SDL_GetBlendModeSrcColorFactor(SDL_BlendMode blendMode)
void * SDL_AllocateRenderVertices(SDL_Renderer *renderer, const size_t numbytes, const size_t alignment, size_t *offset)
SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor(SDL_BlendMode blendMode)
SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor(SDL_BlendMode blendMode)
SDL_BlendOperation SDL_GetBlendModeAlphaOperation(SDL_BlendMode blendMode)
SDL_BlendOperation SDL_GetBlendModeColorOperation(SDL_BlendMode blendMode)
@ SDL_RENDERER_ACCELERATED
@ SDL_RENDERER_PRESENTVSYNC
@ SDL_RENDERER_TARGETTEXTURE
SDL_RendererFlip
Flip constants for SDL_RenderCopyEx.
@ SDL_TEXTUREACCESS_STREAMING
@ SDL_TEXTUREACCESS_TARGET
SDL_ScaleMode
The scaling mode for a texture.
static void SetDrawState(SDL_Surface *surface, SW_DrawStateCache *drawstate)
GL_ShaderContext * GL_CreateShaderContext(void)
void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader)
void GL_DestroyShaderContext(GL_ShaderContext *ctx)
struct GL_ShaderContext GL_ShaderContext
@ SDL_YUV_CONVERSION_BT601
@ SDL_YUV_CONVERSION_JPEG
@ SDL_YUV_CONVERSION_BT709
SDL_RenderDriver GL_RenderDriver
@ SDL_RENDERCMD_SETCLIPRECT
@ SDL_RENDERCMD_DRAW_LINES
@ SDL_RENDERCMD_SETVIEWPORT
@ SDL_RENDERCMD_DRAW_POINTS
@ SDL_RENDERCMD_FILL_RECTS
@ SDL_RENDERCMD_SETDRAWCOLOR
int SDL_RecreateWindow(SDL_Window *window, Uint32 flags)
@ SDL_GL_CONTEXT_MAJOR_VERSION
@ SDL_GL_CONTEXT_MINOR_VERSION
@ SDL_GL_CONTEXT_PROFILE_MASK
@ SDL_GL_CONTEXT_DEBUG_FLAG
void * SDL_GLContext
An opaque handle to an OpenGL context.
@ SDL_GL_CONTEXT_PROFILE_ES
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)
EGLSurface EGLNativeWindowType * window
EGLSurface EGLint * rects
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
The structure that defines a point (floating point)
A rectangle, with the origin at the upper left (floating point).
A rectangle, with the origin at the upper left (integer).
struct SDL_RenderCommand::@38::@42 color
struct SDL_RenderCommand * next
struct SDL_RenderCommand::@38::@39 viewport
struct SDL_RenderCommand::@38::@41 draw
SDL_RenderCommandType command
union SDL_RenderCommand::@38 data
struct SDL_RenderCommand::@38::@40 cliprect
int(* QueueCopy)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
int(* LockTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
int(* UpdateTextureYUV)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const Uint8 *Yplane, int Ypitch, const Uint8 *Uplane, int Upitch, const Uint8 *Vplane, int Vpitch)
int(* QueueDrawLines)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
void(* SetTextureScaleMode)(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
void(* UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
int(* UpdateTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
int(* SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture)
void(* DestroyRenderer)(SDL_Renderer *renderer)
void(* DestroyTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
int(* GL_BindTexture)(SDL_Renderer *renderer, SDL_Texture *texture, float *texw, float *texh)
int(* GetOutputSize)(SDL_Renderer *renderer, int *w, int *h)
SDL_bool(* SupportsBlendMode)(SDL_Renderer *renderer, SDL_BlendMode blendMode)
void(* RenderPresent)(SDL_Renderer *renderer)
int(* RenderReadPixels)(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
int(* QueueDrawPoints)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
int(* QueueFillRects)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
int(* RunCommandQueue)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
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)
int(* CreateTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
int(* QueueSetViewport)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
int(* GL_UnbindTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
int(* QueueSetDrawColor)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
Uint32 texture_formats[16]
Uint32 num_texture_formats
The type used to identify a window.
static SDL_Renderer * renderer
static SDL_BlendMode blendMode
static screen_context_t context