21 #include "../../SDL_internal.h" 23 #if SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED 29 #include "../SDL_sysrender.h" 33 #include <OpenGL/OpenGL.h> 40 #define RENDERER_CONTEXT_MAJOR 2 41 #define RENDERER_CONTEXT_MINOR 1 52 static const float inv255f = 1.0f / 255.0f;
64 const Uint8 *Yplane,
int Ypitch,
65 const Uint8 *Uplane,
int Upitch,
66 const Uint8 *Vplane,
int Vpitch);
104 typedef struct GL_FBOList GL_FBOList;
118 SDL_bool GL_ARB_debug_output_supported;
120 char **error_messages;
122 GLvoid *next_error_userparam;
124 SDL_bool GL_ARB_texture_non_power_of_two_supported;
125 SDL_bool GL_ARB_texture_rectangle_supported;
132 SDL_bool GL_EXT_framebuffer_object_supported;
136 #define SDL_PROC(ret,func,params) ret (APIENTRY *func) params; 141 SDL_bool GL_ARB_multitexture_supported;
143 GLint num_texture_units;
145 PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
146 PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
147 PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
148 PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
149 PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
178 GL_TranslateError (
GLenum error)
180 #define GL_ERROR_TRANSLATE(e) case e: return #e; 193 #undef GL_ERROR_TRANSLATE 201 if (!data->debug_enabled)
205 if (data->GL_ARB_debug_output_supported) {
208 for (i = 0; i < data->errors; ++
i) {
214 data->error_messages =
NULL;
224 GL_CheckAllErrors (
const char *prefix,
SDL_Renderer *renderer,
const char *file,
int line,
const char *
function)
226 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
229 if (!data->debug_enabled)
233 if (data->GL_ARB_debug_output_supported) {
236 for (i = 0; i < data->errors; ++
i) {
237 SDL_SetError(
"%s: %s (%d): %s %s", prefix, file, line,
function, data->error_messages[i]);
240 GL_ClearErrors(renderer);
245 GLenum error = data->glGetError();
247 if (prefix ==
NULL || prefix[0] ==
'\0') {
250 SDL_SetError(
"%s: %s (%d): %s %s (0x%X)", prefix, file, line,
function, GL_TranslateError(error), error);
261 #define GL_CheckError(prefix, renderer) 262 #elif defined(_MSC_VER) 263 #define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __FUNCTION__) 265 #define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __PRETTY_FUNCTION__) 269 GL_LoadFunctions(GL_RenderData * data)
271 #ifdef __SDL_NOGETPROCADDR__ 272 #define SDL_PROC(ret,func,params) data->func=func; 274 #define SDL_PROC(ret,func,params) \ 276 data->func = SDL_GL_GetProcAddress(#func); \ 277 if ( ! data->func ) { \ 278 return SDL_SetError("Couldn't load GL function %s: %s\n", #func, SDL_GetError()); \ 293 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
295 if (SDL_CurrentContext != data->context ||
300 SDL_CurrentContext = data->context;
302 GL_UpdateViewport(renderer);
305 GL_ClearErrors(renderer);
314 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
317 GL_UpdateViewport(renderer);
319 GL_ActivateRenderer(renderer);
323 data->current.color = 0;
324 data->current.blendMode = -1;
332 data->glLoadIdentity();
334 GL_CheckError(
"", renderer);
341 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
345 int errors = data->errors + 1;
346 char **error_messages =
SDL_realloc(data->error_messages, errors *
sizeof(*data->error_messages));
347 if (error_messages) {
348 data->errors = errors;
349 data->error_messages = error_messages;
350 data->error_messages[data->errors-1] =
SDL_strdup(message);
355 if (data->next_error_callback) {
356 data->next_error_callback(source, type,
id, severity, length, message, data->next_error_userparam);
369 GL_FBOList *
result = data->framebuffers;
371 while (result && ((result->w != w) || (result->h != h))) {
372 result = result->next;
380 data->glGenFramebuffersEXT(1, &result->FBO);
381 result->next = data->framebuffers;
382 data->framebuffers =
result;
396 int profile_mask = 0, major = 0, minor = 0;
423 data = (GL_RenderData *)
SDL_calloc(1,
sizeof(*data));
425 GL_DestroyRenderer(renderer);
452 renderer->
info = GL_RenderDriver.
info;
458 if (!data->context) {
459 GL_DestroyRenderer(renderer);
463 GL_DestroyRenderer(renderer);
467 if (GL_LoadFunctions(data) < 0) {
468 GL_DestroyRenderer(renderer);
494 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)
SDL_GL_GetProcAddress(
"glDebugMessageCallbackARB");
496 data->GL_ARB_debug_output_supported =
SDL_TRUE;
499 glDebugMessageCallbackARBFunc(GL_HandleDebugMessage, renderer);
506 data->GL_ARB_texture_non_power_of_two_supported =
SDL_TRUE;
509 data->GL_ARB_texture_rectangle_supported =
SDL_TRUE;
511 if (data->GL_ARB_texture_rectangle_supported) {
524 if (data->glActiveTextureARB) {
525 data->GL_ARB_multitexture_supported =
SDL_TRUE;
532 if (!hint || *hint !=
'0') {
536 data->shaders ?
"ENABLED" :
"DISABLED");
539 if (data->shaders && data->num_texture_units >= 3) {
551 data->GL_EXT_framebuffer_object_supported =
SDL_TRUE;
552 data->glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)
554 data->glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)
556 data->glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
558 data->glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)
560 data->glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
564 data->framebuffers =
NULL;
567 GL_ResetState(renderer);
572 if (changed_window) {
589 SDL_CurrentContext =
NULL;
594 GL_GetOutputSize(
SDL_Renderer * renderer,
int *w,
int *h)
602 power_of_2(
int input)
606 while (value < input) {
616 switch (pixel_format) {
648 if (!hint || *hint ==
'0' ||
SDL_strcasecmp(hint,
"nearest") == 0) {
658 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
659 GL_TextureData *data;
660 GLint internalFormat;
662 int texture_w, texture_h;
665 GL_ActivateRenderer(renderer);
667 if (!convert_format(renderdata, texture->
format, &internalFormat,
669 return SDL_SetError(
"Texture format %s not supported by OpenGL",
673 data = (GL_TextureData *)
SDL_calloc(1,
sizeof(*data));
681 size = texture->
h * data->pitch;
685 size += (2 * (texture->
h * data->pitch) / 4);
690 size += ((texture->
h * data->pitch) / 2);
700 data->fbo = GL_GetFBO(renderdata, texture->
w, texture->
h);
705 GL_CheckError(
"", renderer);
706 renderdata->glGenTextures(1, &data->texture);
707 if (GL_CheckError(
"glGenTextures()", renderer) < 0) {
716 if (renderdata->GL_ARB_texture_non_power_of_two_supported) {
718 texture_w = texture->
w;
719 texture_h = texture->
h;
722 }
else if (renderdata->GL_ARB_texture_rectangle_supported) {
724 texture_w = texture->
w;
725 texture_h = texture->
h;
726 data->texw = (
GLfloat) texture_w;
727 data->texh = (
GLfloat) texture_h;
730 texture_w = power_of_2(texture->
w);
731 texture_h = power_of_2(texture->
h);
732 data->texw = (
GLfloat) (texture->
w) / texture_w;
733 data->texh = (
GLfloat) texture->
h / texture_h;
737 data->formattype =
type;
739 renderdata->glEnable(data->type);
740 renderdata->glBindTexture(data->type, data->texture);
753 #ifndef GL_TEXTURE_STORAGE_HINT_APPLE 754 #define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC 756 #ifndef STORAGE_CACHED_APPLE 757 #define STORAGE_CACHED_APPLE 0x85BE 759 #ifndef STORAGE_SHARED_APPLE 760 #define STORAGE_SHARED_APPLE 0x85BF 771 && (texture->
w % 8) == 0) {
776 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,
777 texture_h, 0, format, type, data->pixels);
783 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,
784 texture_h, 0, format, type,
NULL);
786 renderdata->glDisable(data->type);
787 if (GL_CheckError(
"glTexImage2D()", renderer) < 0) {
795 renderdata->glGenTextures(1, &data->utexture);
796 renderdata->glGenTextures(1, &data->vtexture);
797 renderdata->glEnable(data->type);
799 renderdata->glBindTexture(data->type, data->utexture);
808 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w/2,
809 texture_h/2, 0, format, type,
NULL);
811 renderdata->glBindTexture(data->type, data->vtexture);
820 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w/2,
821 texture_h/2, 0, format, type,
NULL);
823 renderdata->glDisable(data->type);
830 renderdata->glGenTextures(1, &data->utexture);
831 renderdata->glEnable(data->type);
833 renderdata->glBindTexture(data->type, data->utexture);
844 renderdata->glDisable(data->type);
847 return GL_CheckError(
"", renderer);
854 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
855 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
860 GL_ActivateRenderer(renderer);
862 renderdata->glEnable(data->type);
863 renderdata->glBindTexture(data->type, data->texture);
866 renderdata->glTexSubImage2D(data->type, 0, rect->
x, rect->
y, rect->
w,
867 rect->
h, data->format, data->formattype,
873 pixels = (
const void*)((
const Uint8*)pixels + rect->
h * pitch);
875 renderdata->glBindTexture(data->type, data->vtexture);
877 renderdata->glBindTexture(data->type, data->utexture);
879 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
880 rect->
w/2, rect->
h/2,
881 data->format, data->formattype, pixels);
884 pixels = (
const void*)((
const Uint8*)pixels + (rect->
h * pitch)/4);
886 renderdata->glBindTexture(data->type, data->utexture);
888 renderdata->glBindTexture(data->type, data->vtexture);
890 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
891 rect->
w/2, rect->
h/2,
892 data->format, data->formattype, pixels);
899 pixels = (
const void*)((
const Uint8*)pixels + rect->
h * pitch);
900 renderdata->glBindTexture(data->type, data->utexture);
901 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
902 rect->
w/2, rect->
h/2,
905 renderdata->glDisable(data->type);
907 return GL_CheckError(
"glTexSubImage2D()", renderer);
913 const Uint8 *Yplane,
int Ypitch,
914 const Uint8 *Uplane,
int Upitch,
915 const Uint8 *Vplane,
int Vpitch)
917 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
918 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
920 GL_ActivateRenderer(renderer);
922 renderdata->glEnable(data->type);
923 renderdata->glBindTexture(data->type, data->texture);
926 renderdata->glTexSubImage2D(data->type, 0, rect->
x, rect->
y, rect->
w,
927 rect->
h, data->format, data->formattype,
931 renderdata->glBindTexture(data->type, data->utexture);
932 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
933 rect->
w/2, rect->
h/2,
934 data->format, data->formattype, Uplane);
937 renderdata->glBindTexture(data->type, data->vtexture);
938 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
939 rect->
w/2, rect->
h/2,
940 data->format, data->formattype, Vplane);
941 renderdata->glDisable(data->type);
943 return GL_CheckError(
"glTexSubImage2D()", renderer);
948 const SDL_Rect * rect,
void **pixels,
int *pitch)
950 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
952 data->locked_rect = *rect;
954 (
void *) ((
Uint8 *) data->pixels + rect->
y * data->pitch +
956 *pitch = data->pitch;
963 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
967 rect = &data->locked_rect;
969 (
void *) ((
Uint8 *) data->pixels + rect->
y * data->pitch +
971 GL_UpdateTexture(renderer, texture, rect, pixels, data->pitch);
977 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
978 GL_TextureData *texturedata;
981 GL_ActivateRenderer(renderer);
983 if (texture ==
NULL) {
988 texturedata = (GL_TextureData *) texture->
driverdata;
995 return SDL_SetError(
"glFramebufferTexture2DEXT() failed");
1003 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1005 if (SDL_CurrentContext != data->context) {
1022 data->glLoadIdentity();
1038 return GL_CheckError(
"", renderer);
1044 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1055 data->glScissor(renderer->
viewport.
x + rect->
x, h - renderer->
viewport.
y - rect->
y - rect->
h, rect->
w, rect->
h);
1066 if (data->shaders && shader != data->current.shader) {
1068 data->current.shader =
shader;
1075 Uint32 color = ((a << 24) | (r << 16) | (g << 8) | b);
1077 if (color != data->current.color) {
1078 data->glColor4f((
GLfloat) r * inv255f,
1082 data->current.color =
color;
1087 GL_SetBlendMode(GL_RenderData * data,
int blendMode)
1089 if (blendMode != data->current.blendMode) {
1090 switch (blendMode) {
1118 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1120 GL_ActivateRenderer(renderer);
1122 GL_SetColor(data, renderer->
r,
1127 GL_SetBlendMode(data, renderer->
blendMode);
1135 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1137 GL_ActivateRenderer(renderer);
1139 data->glClearColor((
GLfloat) renderer->
r * inv255f,
1153 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1156 GL_SetDrawingState(renderer);
1160 data->glVertex2f(0.5
f + points[
i].
x, 0.5
f + points[
i].
y);
1171 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1174 GL_SetDrawingState(renderer);
1177 points[0].
x == points[count-1].
x && points[0].
y == points[count-1].
y) {
1182 data->glVertex2f(0.5
f + points[
i].
x, 0.5
f + points[
i].
y);
1186 #if defined(__MACOSX__) || defined(__WIN32__) 1193 data->glVertex2f(0.5
f + points[
i].
x, 0.5
f + points[
i].
y);
1205 #if defined(__MACOSX__) || defined(__WIN32__) 1207 data->glVertex2f(0.5
f + points[count-1].
x, 0.5
f + points[count-1].
y);
1212 x2 = points[count-1].
x;
1213 y2 = points[count-1].
y;
1216 data->glVertex2f(0.5
f + x1, 0.5
f + y1);
1217 }
else if (x2 > x1) {
1218 data->glVertex2f(0.5
f + x2, 0.5
f + y2);
1221 data->glVertex2f(0.5
f + x1, 0.5
f + y1);
1222 }
else if (y2 > y1) {
1223 data->glVertex2f(0.5
f + x2, 0.5
f + y2);
1228 return GL_CheckError(
"", renderer);
1234 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1237 GL_SetDrawingState(renderer);
1242 data->glRectf(rect->
x, rect->
y, rect->
x + rect->
w, rect->
y + rect->
h);
1244 return GL_CheckError(
"", renderer);
1250 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1251 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1253 data->glEnable(texturedata->type);
1254 if (texturedata->yuv) {
1256 data->glBindTexture(texturedata->type, texturedata->vtexture);
1259 data->glBindTexture(texturedata->type, texturedata->utexture);
1263 if (texturedata->nv12) {
1265 data->glBindTexture(texturedata->type, texturedata->utexture);
1269 data->glBindTexture(texturedata->type, texturedata->texture);
1272 GL_SetColor(data, texture->
r, texture->
g, texture->
b, texture->
a);
1274 GL_SetColor(data, 255, 255, 255, 255);
1277 GL_SetBlendMode(data, texture->
blendMode);
1279 if (texturedata->yuv) {
1281 }
else if (texturedata->nv12) {
1297 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1298 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1299 GLfloat minx, miny, maxx, maxy;
1300 GLfloat minu, maxu, minv, maxv;
1302 GL_ActivateRenderer(renderer);
1304 if (GL_SetupCopy(renderer, texture) < 0) {
1310 maxx = dstrect->
x + dstrect->
w;
1311 maxy = dstrect->
y + dstrect->
h;
1313 minu = (
GLfloat) srcrect->
x / texture->
w;
1314 minu *= texturedata->texw;
1315 maxu = (
GLfloat) (srcrect->
x + srcrect->
w) / texture->
w;
1316 maxu *= texturedata->texw;
1317 minv = (
GLfloat) srcrect->
y / texture->
h;
1318 minv *= texturedata->texh;
1319 maxv = (
GLfloat) (srcrect->
y + srcrect->
h) / texture->
h;
1320 maxv *= texturedata->texh;
1323 data->glTexCoord2f(minu, minv);
1324 data->glVertex2f(minx, miny);
1325 data->glTexCoord2f(maxu, minv);
1326 data->glVertex2f(maxx, miny);
1327 data->glTexCoord2f(minu, maxv);
1328 data->glVertex2f(minx, maxy);
1329 data->glTexCoord2f(maxu, maxv);
1330 data->glVertex2f(maxx, maxy);
1333 data->glDisable(texturedata->type);
1335 return GL_CheckError(
"", renderer);
1343 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1344 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1345 GLfloat minx, miny, maxx, maxy;
1347 GLfloat minu, maxu, minv, maxv;
1349 GL_ActivateRenderer(renderer);
1351 if (GL_SetupCopy(renderer, texture) < 0) {
1355 centerx = center->
x;
1356 centery = center->
y;
1359 minx = dstrect->
w - centerx;
1364 maxx = dstrect->
w - centerx;
1368 miny = dstrect->
h - centery;
1373 maxy = dstrect->
h - centery;
1376 minu = (
GLfloat) srcrect->
x / texture->
w;
1377 minu *= texturedata->texw;
1378 maxu = (
GLfloat) (srcrect->
x + srcrect->
w) / texture->
w;
1379 maxu *= texturedata->texw;
1380 minv = (
GLfloat) srcrect->
y / texture->
h;
1381 minv *= texturedata->texh;
1382 maxv = (
GLfloat) (srcrect->
y + srcrect->
h) / texture->
h;
1383 maxv *= texturedata->texh;
1386 data->glPushMatrix();
1391 data->glTexCoord2f(minu, minv);
1392 data->glVertex2f(minx, miny);
1393 data->glTexCoord2f(maxu, minv);
1394 data->glVertex2f(maxx, miny);
1395 data->glTexCoord2f(minu, maxv);
1396 data->glVertex2f(minx, maxy);
1397 data->glTexCoord2f(maxu, maxv);
1398 data->glVertex2f(maxx, maxy);
1400 data->glPopMatrix();
1402 data->glDisable(texturedata->type);
1404 return GL_CheckError(
"", renderer);
1409 Uint32 pixel_format,
void * pixels,
int pitch)
1411 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1415 GLint internalFormat;
1418 int w, h, length, rows;
1421 GL_ActivateRenderer(renderer);
1429 convert_format(data, temp_format, &internalFormat, &format, &type);
1437 data->glReadPixels(rect->
x, (h-rect->
y)-rect->
h, rect->
w, rect->
h,
1438 format, type, temp_pixels);
1440 if (GL_CheckError(
"glReadPixels()", renderer) < 0) {
1447 src = (
Uint8*)temp_pixels + (rect->
h-1)*temp_pitch;
1461 temp_format, temp_pixels, temp_pitch,
1462 pixel_format, pixels, pitch);
1471 GL_ActivateRenderer(renderer);
1479 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
1480 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
1482 GL_ActivateRenderer(renderer);
1487 if (data->texture) {
1488 renderdata->glDeleteTextures(1, &data->texture);
1491 renderdata->glDeleteTextures(1, &data->utexture);
1492 renderdata->glDeleteTextures(1, &data->vtexture);
1502 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1505 GL_ClearErrors(renderer);
1506 if (data->GL_ARB_debug_output_supported) {
1507 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)
SDL_GL_GetProcAddress(
"glDebugMessageCallbackARB");
1511 glDebugMessageCallbackARBFunc(data->next_error_callback, data->next_error_userparam);
1513 if (data->shaders) {
1516 if (data->context) {
1517 while (data->framebuffers) {
1518 GL_FBOList *nextnode = data->framebuffers->next;
1520 data->glDeleteFramebuffersEXT(1, &data->framebuffers->FBO);
1521 GL_CheckError(
"", renderer);
1523 data->framebuffers = nextnode;
1535 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1536 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1537 GL_ActivateRenderer(renderer);
1539 data->glEnable(texturedata->type);
1540 if (texturedata->yuv) {
1542 data->glBindTexture(texturedata->type, texturedata->vtexture);
1545 data->glBindTexture(texturedata->type, texturedata->utexture);
1549 data->glBindTexture(texturedata->type, texturedata->texture);
1551 if(texw) *texw = (float)texturedata->texw;
1552 if(texh) *texh = (float)texturedata->texh;
1560 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1561 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1562 GL_ActivateRenderer(renderer);
1564 if (texturedata->yuv) {
1566 data->glDisable(texturedata->type);
1569 data->glDisable(texturedata->type);
1574 data->glDisable(texturedata->type);
int(* RenderDrawLines)(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
#define GL_STACK_UNDERFLOW
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
#define SDL_GL_ExtensionSupported
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_STORAGE_CACHED_APPLE
#define GL_UNPACK_CLIENT_STORAGE_APPLE
GLuint GLfloat GLfloat GLfloat x1
void(APIENTRY * GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)
#define GL_INVALID_OPERATION
GLdouble GLdouble GLdouble r
#define GL_UNSIGNED_INT_8_8_8_8_REV
uint32_t Uint32
An unsigned 32-bit integer type.
#define SDL_GL_CreateContext
int(* RenderReadPixels)(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
const GLuint * framebuffers
#define GL_YCBCR_422_APPLE
GLuint GLsizei const GLchar * message
#define GL_DEBUG_CALLBACK_USER_PARAM_ARB
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei count
#define SDL_HINT_RENDER_SCALE_QUALITY
A variable controlling the scaling quality.
GLenum GLenum GLuint texture
GLfixed GLfixed GLfixed y2
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Uint32 texture_formats[16]
#define SDL_GetWindowFlags
#define SDL_HINT_RENDER_OPENGL_SHADERS
A variable controlling whether the OpenGL render driver uses shaders if they are available.
#define SDL_BYTESPERPIXEL(X)
#define GL_TEXTURE_MAG_FILTER
#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB
int(* RenderFillRects)(SDL_Renderer *renderer, const SDL_FRect *rects, int count)
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
GLsizei GLsizei GLuint * shaders
#define GL_TEXTURE_STORAGE_HINT_APPLE
#define GL_TRIANGLE_STRIP
struct GL_ShaderContext GL_ShaderContext
#define GL_MAX_TEXTURE_UNITS_ARB
#define GL_ONE_MINUS_SRC_ALPHA
#define GL_UNPACK_ROW_LENGTH
int(* RenderClear)(SDL_Renderer *renderer)
#define GL_FRAMEBUFFER_COMPLETE_EXT
void(* DestroyRenderer)(SDL_Renderer *renderer)
GLfixed GLfixed GLint GLint GLfixed points
int(* GetOutputSize)(SDL_Renderer *renderer, int *w, int *h)
#define GL_PACK_ROW_LENGTH
#define GL_TEXTURE_RECTANGLE_ARB
#define GL_PACK_ALIGNMENT
void GL_DestroyShaderContext(GL_ShaderContext *ctx)
#define GL_MAX_TEXTURE_SIZE
static SDL_BlendMode blendMode
#define GL_TABLE_TOO_LARGE
int(* UpdateTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const 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)
#define SDL_GL_SetAttribute
#define SDL_GL_GetDrawableSize
GLuint GLuint GLsizei GLenum type
void * SDL_calloc(size_t nmemb, size_t size)
void * SDL_GLContext
An opaque handle to an OpenGL context.
#define SDL_GL_GetSwapInterval
GLenum GLenum GLenum input
GLint GLint GLint GLint GLint GLint y
int SDL_RecreateWindow(SDL_Window *window, Uint32 flags)
GLsizei const GLfloat * value
#define GL_STACK_OVERFLOW
static int GetScaleQuality(void)
uint8_t Uint8
An unsigned 8-bit integer type.
#define SDL_stack_alloc(type, count)
#define SDL_GL_SetSwapInterval
#define SDL_GL_GetProcAddress
#define GL_COLOR_ATTACHMENT0_EXT
#define GL_TEXTURE_WRAP_T
GL_ShaderContext * GL_CreateShaderContext()
#define GL_LUMINANCE_ALPHA
int(* GL_BindTexture)(SDL_Renderer *renderer, SDL_Texture *texture, float *texw, float *texh)
void(* UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
GLsizei GLsizei GLchar * source
#define GL_DEBUG_CALLBACK_FUNCTION_ARB
int(* SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture)
int(* UpdateViewport)(SDL_Renderer *renderer)
#define GL_COLOR_BUFFER_BIT
int(* GL_UnbindTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
#define GL_STORAGE_SHARED_APPLE
SDL_RendererFlip
Flip constants for SDL_RenderCopyEx.
int(* RenderCopy)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
Window state change event data (event.window.*)
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_assert(condition)
#define SDL_OutOfMemory()
#define SDL_GL_GetCurrentContext
GLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture)
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
#define SDL_GetRendererOutputSize
The type used to identify a window.
SDL_Rect rects[MAX_RECTS]
#define GL_TEXTURE_ENV_MODE
void(* WindowEvent)(SDL_Renderer *renderer, const SDL_WindowEvent *event)
Uint32 num_texture_formats
#define SDL_GL_GetAttribute
GLubyte GLubyte GLubyte GLubyte w
#define SDL_ConvertPixels
void(* DestroyTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
#define GL_UNSIGNED_SHORT_8_8_APPLE
int(* CreateTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
void(* RenderPresent)(SDL_Renderer *renderer)
#define SDL_GL_DeleteContext
#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)
#define GL_DEBUG_TYPE_ERROR_ARB
GLboolean GLboolean GLboolean b
#define SDL_GL_SwapWindow
GLfloat GLfloat GLfloat GLfloat h
void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader)
SDL_bool clipping_enabled
A rectangle, with the origin at the upper left.
#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB
#define GL_FRAMEBUFFER_EXT
#define SDL_GetPixelFormatName