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;
54 typedef struct GL_FBOList GL_FBOList;
87 SDL_bool GL_ARB_debug_output_supported;
89 char **error_messages;
91 GLvoid *next_error_userparam;
95 SDL_bool GL_ARB_texture_non_power_of_two_supported;
96 SDL_bool GL_ARB_texture_rectangle_supported;
97 SDL_bool GL_EXT_framebuffer_object_supported;
101 #define SDL_PROC(ret,func,params) ret (APIENTRY *func) params; 106 SDL_bool GL_ARB_multitexture_supported;
108 GLint num_texture_units;
110 PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
111 PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
112 PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
113 PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
114 PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
119 GL_DrawStateCache drawstate;
143 GL_TranslateError (
GLenum error)
145 #define GL_ERROR_TRANSLATE(e) case e: return #e; 158 #undef GL_ERROR_TRANSLATE 166 if (!data->debug_enabled)
170 if (data->GL_ARB_debug_output_supported) {
173 for (i = 0; i < data->errors; ++
i) {
179 data->error_messages =
NULL;
181 }
else if (data->glGetError !=
NULL) {
189 GL_CheckAllErrors (
const char *prefix,
SDL_Renderer *renderer,
const char *file,
int line,
const char *
function)
191 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
194 if (!data->debug_enabled)
198 if (data->GL_ARB_debug_output_supported) {
201 for (i = 0; i < data->errors; ++
i) {
202 SDL_SetError(
"%s: %s (%d): %s %s", prefix, file, line,
function, data->error_messages[i]);
205 GL_ClearErrors(renderer);
210 GLenum error = data->glGetError();
212 if (prefix ==
NULL || prefix[0] ==
'\0') {
215 SDL_SetError(
"%s: %s (%d): %s %s (0x%X)", prefix, file, line,
function, GL_TranslateError(error), error);
226 #define GL_CheckError(prefix, renderer) 228 #define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, SDL_FILE, SDL_LINE, SDL_FUNCTION) 232 GL_LoadFunctions(GL_RenderData * data)
234 #ifdef __SDL_NOGETPROCADDR__ 235 #define SDL_PROC(ret,func,params) data->func=func; 238 #define SDL_PROC(ret,func,params) \ 240 data->func = SDL_GL_GetProcAddress(#func); \ 241 if ( ! data->func ) { \ 242 retval = SDL_SetError("Couldn't load GL function %s: %s", #func, SDL_GetError()); \ 255 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
263 GL_ClearErrors(renderer);
272 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
276 int errors = data->errors + 1;
277 char **error_messages =
SDL_realloc(data->error_messages, errors *
sizeof(*data->error_messages));
278 if (error_messages) {
279 data->errors = errors;
280 data->error_messages = error_messages;
281 data->error_messages[data->errors-1] =
SDL_strdup(message);
286 if (data->next_error_callback) {
287 data->next_error_callback(source, type,
id, severity, length, message, data->next_error_userparam);
300 GL_FBOList *
result = data->framebuffers;
302 while (result && ((result->w != w) || (result->h != h))) {
303 result = result->next;
311 data->glGenFramebuffersEXT(1, &result->FBO);
312 result->next = data->framebuffers;
313 data->framebuffers =
result;
320 GL_GetOutputSize(
SDL_Renderer * renderer,
int *w,
int *h)
386 if (colorOperation != alphaOperation) {
393 power_of_2(
int input)
397 while (value < input) {
404 convert_format(GL_RenderData *renderdata,
Uint32 pixel_format,
407 switch (pixel_format) {
444 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
445 const GLenum textype = renderdata->textype;
446 GL_TextureData *data;
447 GLint internalFormat;
449 int texture_w, texture_h;
452 GL_ActivateRenderer(renderer);
454 renderdata->drawstate.texture =
NULL;
457 !renderdata->GL_EXT_framebuffer_object_supported) {
458 return SDL_SetError(
"Render targets not supported by OpenGL");
461 if (!convert_format(renderdata, texture->
format, &internalFormat,
463 return SDL_SetError(
"Texture format %s not supported by OpenGL",
467 data = (GL_TextureData *)
SDL_calloc(1,
sizeof(*data));
475 size = texture->
h * data->pitch;
479 size += 2 * ((texture->
h + 1) / 2) * ((data->pitch + 1) / 2);
484 size += 2 * ((texture->
h + 1) / 2) * ((data->pitch + 1) / 2);
494 data->fbo = GL_GetFBO(renderdata, texture->
w, texture->
h);
499 GL_CheckError(
"", renderer);
500 renderdata->glGenTextures(1, &data->texture);
501 if (GL_CheckError(
"glGenTextures()", renderer) < 0) {
510 if (renderdata->GL_ARB_texture_non_power_of_two_supported) {
511 texture_w = texture->
w;
512 texture_h = texture->
h;
515 }
else if (renderdata->GL_ARB_texture_rectangle_supported) {
516 texture_w = texture->
w;
517 texture_h = texture->
h;
518 data->texw = (
GLfloat) texture_w;
519 data->texh = (
GLfloat) texture_h;
521 texture_w = power_of_2(texture->
w);
522 texture_h = power_of_2(texture->
h);
523 data->texw = (
GLfloat) (texture->
w) / texture_w;
524 data->texh = (
GLfloat) texture->
h / texture_h;
528 data->formattype =
type;
530 renderdata->glEnable(textype);
531 renderdata->glBindTexture(textype, data->texture);
544 #ifndef GL_TEXTURE_STORAGE_HINT_APPLE 545 #define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC 547 #ifndef STORAGE_CACHED_APPLE 548 #define STORAGE_CACHED_APPLE 0x85BE 550 #ifndef STORAGE_SHARED_APPLE 551 #define STORAGE_SHARED_APPLE 0x85BF 562 && (texture->
w % 8) == 0) {
567 renderdata->glTexImage2D(textype, 0, internalFormat, texture_w,
568 texture_h, 0, format, type, data->pixels);
574 renderdata->glTexImage2D(textype, 0, internalFormat, texture_w,
575 texture_h, 0, format, type,
NULL);
577 renderdata->glDisable(textype);
578 if (GL_CheckError(
"glTexImage2D()", renderer) < 0) {
586 renderdata->glGenTextures(1, &data->utexture);
587 renderdata->glGenTextures(1, &data->vtexture);
588 renderdata->glEnable(textype);
590 renderdata->glBindTexture(textype, data->utexture);
599 renderdata->glTexImage2D(textype, 0, internalFormat, (texture_w+1)/2,
600 (texture_h+1)/2, 0, format, type,
NULL);
602 renderdata->glBindTexture(textype, data->vtexture);
611 renderdata->glTexImage2D(textype, 0, internalFormat, (texture_w+1)/2,
612 (texture_h+1)/2, 0, format, type,
NULL);
614 renderdata->glDisable(textype);
621 renderdata->glGenTextures(1, &data->utexture);
622 renderdata->glEnable(textype);
624 renderdata->glBindTexture(textype, data->utexture);
635 renderdata->glDisable(textype);
638 return GL_CheckError(
"", renderer);
645 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
646 const GLenum textype = renderdata->textype;
647 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
652 GL_ActivateRenderer(renderer);
654 renderdata->drawstate.texture =
NULL;
656 renderdata->glEnable(textype);
657 renderdata->glBindTexture(textype, data->texture);
660 renderdata->glTexSubImage2D(textype, 0, rect->
x, rect->
y, rect->
w,
661 rect->
h, data->format, data->formattype,
667 pixels = (
const void*)((
const Uint8*)pixels + rect->
h * pitch);
669 renderdata->glBindTexture(textype, data->vtexture);
671 renderdata->glBindTexture(textype, data->utexture);
673 renderdata->glTexSubImage2D(textype, 0, rect->
x/2, rect->
y/2,
674 (rect->
w+1)/2, (rect->
h+1)/2,
675 data->format, data->formattype, pixels);
678 pixels = (
const void*)((
const Uint8*)pixels + ((rect->
h + 1) / 2) * ((pitch + 1) / 2));
680 renderdata->glBindTexture(textype, data->utexture);
682 renderdata->glBindTexture(textype, data->vtexture);
684 renderdata->glTexSubImage2D(textype, 0, rect->
x/2, rect->
y/2,
685 (rect->
w+1)/2, (rect->
h+1)/2,
686 data->format, data->formattype, pixels);
693 pixels = (
const void*)((
const Uint8*)pixels + rect->
h * pitch);
694 renderdata->glBindTexture(textype, data->utexture);
695 renderdata->glTexSubImage2D(textype, 0, rect->
x/2, rect->
y/2,
696 (rect->
w + 1)/2, (rect->
h + 1)/2,
699 renderdata->glDisable(textype);
701 return GL_CheckError(
"glTexSubImage2D()", renderer);
707 const Uint8 *Yplane,
int Ypitch,
708 const Uint8 *Uplane,
int Upitch,
709 const Uint8 *Vplane,
int Vpitch)
711 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
712 const GLenum textype = renderdata->textype;
713 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
715 GL_ActivateRenderer(renderer);
717 renderdata->drawstate.texture =
NULL;
719 renderdata->glEnable(textype);
720 renderdata->glBindTexture(textype, data->texture);
723 renderdata->glTexSubImage2D(textype, 0, rect->
x, rect->
y, rect->
w,
724 rect->
h, data->format, data->formattype,
728 renderdata->glBindTexture(textype, data->utexture);
729 renderdata->glTexSubImage2D(textype, 0, rect->
x/2, rect->
y/2,
730 (rect->
w + 1)/2, (rect->
h + 1)/2,
731 data->format, data->formattype, Uplane);
734 renderdata->glBindTexture(textype, data->vtexture);
735 renderdata->glTexSubImage2D(textype, 0, rect->
x/2, rect->
y/2,
736 (rect->
w + 1)/2, (rect->
h + 1)/2,
737 data->format, data->formattype, Vplane);
738 renderdata->glDisable(textype);
740 return GL_CheckError(
"glTexSubImage2D()", renderer);
745 const SDL_Rect * rect,
void **pixels,
int *pitch)
747 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
749 data->locked_rect = *rect;
751 (
void *) ((
Uint8 *) data->pixels + rect->
y * data->pitch +
753 *pitch = data->pitch;
760 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
764 rect = &data->locked_rect;
766 (
void *) ((
Uint8 *) data->pixels + rect->
y * data->pitch +
768 GL_UpdateTexture(renderer, texture, rect, pixels, data->pitch);
774 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
775 GL_TextureData *texturedata;
778 GL_ActivateRenderer(renderer);
780 if (!data->GL_EXT_framebuffer_object_supported) {
781 return SDL_SetError(
"Render targets not supported by OpenGL");
784 data->drawstate.viewport_dirty =
SDL_TRUE;
786 if (texture ==
NULL) {
791 texturedata = (GL_TextureData *) texture->
driverdata;
798 return SDL_SetError(
"glFramebufferTexture2DEXT() failed");
823 for (i = 0; i <
count; i++) {
824 *(verts++) = 0.5
f + points[i].
x;
825 *(verts++) = 0.5
f + points[i].
y;
842 for (i = 0; i <
count; i++) {
844 *(verts++) = rect->
x;
845 *(verts++) = rect->
y;
846 *(verts++) = rect->
x + rect->
w;
847 *(verts++) = rect->
y + rect->
h;
857 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
858 GLfloat minx, miny, maxx, maxy;
859 GLfloat minu, maxu, minv, maxv;
870 maxx = dstrect->
x + dstrect->
w;
871 maxy = dstrect->
y + dstrect->
h;
873 minu = (
GLfloat) srcrect->
x / texture->
w;
874 minu *= texturedata->texw;
875 maxu = (
GLfloat) (srcrect->
x + srcrect->
w) / texture->
w;
876 maxu *= texturedata->texw;
877 minv = (
GLfloat) srcrect->
y / texture->
h;
878 minv *= texturedata->texh;
879 maxv = (
GLfloat) (srcrect->
y + srcrect->
h) / texture->
h;
880 maxv *= texturedata->texh;
899 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
900 GLfloat minx, miny, maxx, maxy;
902 GLfloat minu, maxu, minv, maxv;
913 minx = dstrect->
w - centerx;
918 maxx = dstrect->
w - centerx;
922 miny = dstrect->
h - centery;
927 maxy = dstrect->
h - centery;
930 minu = (
GLfloat) srcrect->
x / texture->
w;
931 minu *= texturedata->texw;
932 maxu = (
GLfloat) (srcrect->
x + srcrect->
w) / texture->
w;
933 maxu *= texturedata->texw;
934 minv = (
GLfloat) srcrect->
y / texture->
h;
935 minv *= texturedata->texh;
936 maxv = (
GLfloat) (srcrect->
y + srcrect->
h) / texture->
h;
937 maxv *= texturedata->texh;
948 *(verts++) = (
GLfloat) dstrect->
x + centerx;
949 *(verts++) = (
GLfloat) dstrect->
y + centery;
959 if (data->drawstate.viewport_dirty) {
960 const SDL_bool istarget = data->drawstate.target !=
NULL;
963 data->glLoadIdentity();
964 data->glViewport(viewport->
x,
965 istarget ? viewport->
y : (data->drawstate.drawableh - viewport->
y - viewport->
h),
966 viewport->
w, viewport->
h);
967 if (viewport->
w && viewport->
h) {
974 data->drawstate.viewport_dirty =
SDL_FALSE;
977 if (data->drawstate.cliprect_enabled_dirty) {
978 if (!data->drawstate.cliprect_enabled) {
983 data->drawstate.cliprect_enabled_dirty =
SDL_FALSE;
986 if (data->drawstate.cliprect_enabled && data->drawstate.cliprect_dirty) {
987 const SDL_Rect *viewport = &data->drawstate.viewport;
988 const SDL_Rect *rect = &data->drawstate.cliprect;
989 data->glScissor(viewport->
x + rect->
x,
990 data->drawstate.target ? viewport->
y + rect->
y : data->drawstate.drawableh - viewport->
y - rect->
y - rect->
h,
992 data->drawstate.cliprect_dirty =
SDL_FALSE;
995 if (blend != data->drawstate.blend) {
1006 data->drawstate.blend = blend;
1009 if (data->shaders && (shader != data->drawstate.shader)) {
1011 data->drawstate.shader =
shader;
1014 if ((cmd->
data.
draw.texture !=
NULL) != data->drawstate.texturing) {
1016 data->glDisable(data->textype);
1019 data->glEnable(data->textype);
1020 data->drawstate.texturing =
SDL_TRUE;
1029 const GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1038 if (data->shaders) {
1039 if (texturedata->yuv || texturedata->nv12) {
1042 if (texturedata->yuv) {
1051 if (texturedata->yuv) {
1060 if (texturedata->yuv) {
1069 SDL_assert(!
"unsupported YUV conversion mode");
1077 if (texture != data->drawstate.texture) {
1078 const GLenum textype = data->textype;
1079 if (texturedata->yuv) {
1081 data->glBindTexture(textype, texturedata->vtexture);
1084 data->glBindTexture(textype, texturedata->utexture);
1086 if (texturedata->nv12) {
1088 data->glBindTexture(textype, texturedata->utexture);
1091 data->glBindTexture(textype, texturedata->texture);
1093 data->drawstate.texture =
texture;
1101 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1104 if (GL_ActivateRenderer(renderer) < 0) {
1108 data->drawstate.target = renderer->
target;
1109 if (!data->drawstate.target) {
1121 const Uint32 color = ((a << 24) | (r << 16) | (g << 8) | b);
1122 if (color != data->drawstate.color) {
1123 data->glColor4f((
GLfloat) r * inv255f,
1127 data->drawstate.color =
color;
1133 SDL_Rect *viewport = &data->drawstate.viewport;
1136 data->drawstate.viewport_dirty =
SDL_TRUE;
1143 if (data->drawstate.cliprect_enabled != cmd->
data.
cliprect.enabled) {
1144 data->drawstate.cliprect_enabled = cmd->
data.
cliprect.enabled;
1145 data->drawstate.cliprect_enabled_dirty =
SDL_TRUE;
1149 data->drawstate.cliprect_dirty =
SDL_TRUE;
1159 const Uint32 color = ((a << 24) | (r << 16) | (g << 8) | b);
1160 if (color != data->drawstate.clear_color) {
1165 data->glClearColor(fr, fg, fb, fa);
1166 data->drawstate.clear_color =
color;
1169 if (data->drawstate.cliprect_enabled) {
1171 data->drawstate.cliprect_enabled_dirty =
SDL_TRUE;
1180 const size_t count = cmd->
data.
draw.count;
1184 for (i = 0; i <
count; i++, verts += 2) {
1185 data->glVertex2f(verts[0], verts[1]);
1193 const size_t count = cmd->
data.
draw.count;
1195 if (count > 2 && (verts[0] == verts[(count-1)*2]) && (verts[1] == verts[(count*2)-1])) {
1198 for (i = 1; i <
count; ++
i, verts += 2) {
1199 data->glVertex2f(verts[0], verts[1]);
1203 #if defined(__MACOSX__) || defined(__WIN32__) 1209 for (i = 0; i <
count; ++
i, verts += 2) {
1210 data->glVertex2f(verts[0], verts[1]);
1223 #if defined(__MACOSX__) || defined(__WIN32__) 1225 data->glVertex2f(verts[(count-1)*2], verts[(count*2)-1]);
1230 x2 = verts[(count-1)*2];
1231 y2 = verts[(count*2)-1];
1234 data->glVertex2f(x1, y1);
1235 }
else if (x2 > x1) {
1236 data->glVertex2f(x2, y2);
1239 data->glVertex2f(x1, y1);
1240 }
else if (y2 > y1) {
1241 data->glVertex2f(x2, y2);
1250 const size_t count = cmd->
data.
draw.count;
1253 for (i = 0; i <
count; ++
i, verts += 4) {
1254 data->glRectf(verts[0], verts[1], verts[2], verts[3]);
1261 const GLfloat minx = verts[0];
1262 const GLfloat miny = verts[1];
1263 const GLfloat maxx = verts[2];
1264 const GLfloat maxy = verts[3];
1265 const GLfloat minu = verts[4];
1266 const GLfloat maxu = verts[5];
1267 const GLfloat minv = verts[6];
1268 const GLfloat maxv = verts[7];
1269 SetCopyState(data, cmd);
1271 data->glTexCoord2f(minu, minv);
1272 data->glVertex2f(minx, miny);
1273 data->glTexCoord2f(maxu, minv);
1274 data->glVertex2f(maxx, miny);
1275 data->glTexCoord2f(minu, maxv);
1276 data->glVertex2f(minx, maxy);
1277 data->glTexCoord2f(maxu, maxv);
1278 data->glVertex2f(maxx, maxy);
1285 const GLfloat minx = verts[0];
1286 const GLfloat miny = verts[1];
1287 const GLfloat maxx = verts[2];
1288 const GLfloat maxy = verts[3];
1289 const GLfloat minu = verts[4];
1290 const GLfloat maxu = verts[5];
1291 const GLfloat minv = verts[6];
1292 const GLfloat maxv = verts[7];
1293 const GLfloat translatex = verts[8];
1294 const GLfloat translatey = verts[9];
1296 SetCopyState(data, cmd);
1299 data->glPushMatrix();
1300 data->glTranslatef(translatex, translatey, 0.0
f);
1301 data->glRotated(angle, 0.0, 0.0, 1.0);
1303 data->glTexCoord2f(minu, minv);
1304 data->glVertex2f(minx, miny);
1305 data->glTexCoord2f(maxu, minv);
1306 data->glVertex2f(maxx, miny);
1307 data->glTexCoord2f(minu, maxv);
1308 data->glVertex2f(minx, maxy);
1309 data->glTexCoord2f(maxu, maxv);
1310 data->glVertex2f(maxx, maxy);
1312 data->glPopMatrix();
1323 return GL_CheckError(
"", renderer);
1328 Uint32 pixel_format,
void * pixels,
int pitch)
1330 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1334 GLint internalFormat;
1337 int w, h, length, rows;
1340 GL_ActivateRenderer(renderer);
1342 if (!convert_format(data, temp_format, &internalFormat, &format, &type)) {
1343 return SDL_SetError(
"Texture format %s not supported by OpenGL",
1347 if (!rect->
w || !rect->
h) {
1363 data->glReadPixels(rect->
x, renderer->
target ? rect->
y : (h-rect->
y)-rect->
h,
1364 rect->
w, rect->
h, format, type, temp_pixels);
1366 if (GL_CheckError(
"glReadPixels()", renderer) < 0) {
1375 src = (
Uint8*)temp_pixels + (rect->
h-1)*temp_pitch;
1390 temp_format, temp_pixels, temp_pitch,
1391 pixel_format, pixels, pitch);
1400 GL_ActivateRenderer(renderer);
1408 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
1409 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
1411 GL_ActivateRenderer(renderer);
1413 if (renderdata->drawstate.texture == texture) {
1414 renderdata->drawstate.texture =
NULL;
1416 if (renderdata->drawstate.target == texture) {
1417 renderdata->drawstate.target =
NULL;
1423 if (data->texture) {
1424 renderdata->glDeleteTextures(1, &data->texture);
1427 renderdata->glDeleteTextures(1, &data->utexture);
1428 renderdata->glDeleteTextures(1, &data->vtexture);
1438 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1441 if (data->context !=
NULL) {
1443 GL_ActivateRenderer(renderer);
1446 GL_ClearErrors(renderer);
1447 if (data->GL_ARB_debug_output_supported) {
1448 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)
SDL_GL_GetProcAddress(
"glDebugMessageCallbackARB");
1452 glDebugMessageCallbackARBFunc(data->next_error_callback, data->next_error_userparam);
1454 if (data->shaders) {
1457 if (data->context) {
1458 while (data->framebuffers) {
1459 GL_FBOList *nextnode = data->framebuffers->next;
1461 data->glDeleteFramebuffersEXT(1, &data->framebuffers->FBO);
1462 GL_CheckError(
"", renderer);
1464 data->framebuffers = nextnode;
1476 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1477 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1478 const GLenum textype = data->textype;
1480 GL_ActivateRenderer(renderer);
1482 data->glEnable(textype);
1483 if (texturedata->yuv) {
1485 data->glBindTexture(textype, texturedata->vtexture);
1488 data->glBindTexture(textype, texturedata->utexture);
1492 data->glBindTexture(textype, texturedata->texture);
1494 data->drawstate.texturing =
SDL_TRUE;
1495 data->drawstate.texture =
texture;
1497 if(texw) *texw = (float)texturedata->texw;
1498 if(texh) *texh = (float)texturedata->texh;
1506 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1507 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1508 const GLenum textype = data->textype;
1510 GL_ActivateRenderer(renderer);
1512 if (texturedata->yuv) {
1514 data->glDisable(textype);
1517 data->glDisable(textype);
1522 data->glDisable(textype);
1525 data->drawstate.texture =
NULL;
1535 GL_RenderData *
data;
1538 int profile_mask = 0, major = 0, minor = 0;
1565 data = (GL_RenderData *)
SDL_calloc(1,
sizeof(*data));
1600 if (!data->context) {
1612 if (GL_LoadFunctions(data) < 0) {
1641 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)
SDL_GL_GetProcAddress(
"glDebugMessageCallbackARB");
1643 data->GL_ARB_debug_output_supported =
SDL_TRUE;
1646 glDebugMessageCallbackARBFunc(GL_HandleDebugMessage, renderer);
1654 data->GL_ARB_texture_non_power_of_two_supported =
SDL_TRUE;
1657 data->GL_ARB_texture_rectangle_supported =
SDL_TRUE;
1660 if (data->GL_ARB_texture_rectangle_supported) {
1673 if (data->glActiveTextureARB) {
1674 data->GL_ARB_multitexture_supported =
SDL_TRUE;
1684 data->shaders ?
"ENABLED" :
"DISABLED");
1687 if (data->shaders && data->num_texture_units >= 3) {
1699 data->GL_EXT_framebuffer_object_supported =
SDL_TRUE;
1700 data->glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)
1702 data->glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)
1704 data->glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
1706 data->glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)
1708 data->glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
1712 data->framebuffers =
NULL;
1716 data->glLoadIdentity();
1720 data->glDisable(data->textype);
1721 data->glClearColor(1.0
f, 1.0
f, 1.0
f, 1.0
f);
1722 data->glColor4f(1.0
f, 1.0
f, 1.0
f, 1.0
f);
1728 data->drawstate.color = 0xFFFFFFFF;
1729 data->drawstate.clear_color = 0xFFFFFFFF;
1734 if (changed_window) {
SDL_BlendFactor SDL_GetBlendModeSrcColorFactor(SDL_BlendMode blendMode)
SDL_BlendFactor
The normalized factor used to multiply pixel components.
#define GL_STACK_UNDERFLOW
#define SDL_GL_ExtensionSupported
GLdouble GLdouble GLdouble r
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
GL_ShaderContext * GL_CreateShaderContext(void)
struct SDL_RenderCommand::@30::@31 viewport
void(APIENTRY * GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)
#define GL_INVALID_OPERATION
#define GL_UNSIGNED_INT_8_8_8_8_REV
static void SetDrawState(SDL_Surface *surface, SW_DrawStateCache *drawstate)
#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
struct SDL_RenderCommand::@30::@32 cliprect
#define GL_YCBCR_422_APPLE
GLuint GLsizei const GLchar * message
#define GL_DEBUG_CALLBACK_USER_PARAM_ARB
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
void * SDL_AllocateRenderVertices(SDL_Renderer *renderer, const size_t numbytes, const size_t alignment, size_t *offset)
struct SDL_RenderCommand::@30::@34 color
GLfloat GLfloat GLfloat GLfloat h
int(* QueueSetDrawColor)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
GLfixed GLfixed GLfixed y2
Uint32 texture_formats[16]
static screen_context_t context
SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor(SDL_BlendMode blendMode)
#define SDL_GetWindowFlags
#define SDL_HINT_RENDER_OPENGL_SHADERS
A variable controlling whether the OpenGL render driver uses shaders if they are available.
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)
SDL_BlendOperation SDL_GetBlendModeColorOperation(SDL_BlendMode blendMode)
SDL_RendererFlip
Flip constants for SDL_RenderCopyEx.
#define SDL_BYTESPERPIXEL(X)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define GL_TEXTURE_MAG_FILTER
#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB
GLsizei GLsizei GLuint * shaders
#define GL_TEXTURE_STORAGE_HINT_APPLE
SDL_RenderDriver GL_RenderDriver
#define GL_TRIANGLE_STRIP
struct GL_ShaderContext GL_ShaderContext
#define GL_MAX_TEXTURE_UNITS_ARB
#define GL_ONE_MINUS_SRC_ALPHA
SDL_BlendOperation
The blend operation used when combining source and destination pixel components.
#define GL_UNPACK_ROW_LENGTH
#define GL_ONE_MINUS_SRC_COLOR
#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 SDL_GetHintBoolean
#define GL_PACK_ALIGNMENT
void GL_DestroyShaderContext(GL_ShaderContext *ctx)
#define GL_MAX_TEXTURE_SIZE
static SDL_BlendMode blendMode
#define GL_TABLE_TOO_LARGE
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_small_alloc(type, count, pisstack)
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
int(* QueueCopy)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
#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
struct SDL_RenderCommand::@30::@33 draw
int SDL_RecreateWindow(SDL_Window *window, Uint32 flags)
#define GL_STACK_OVERFLOW
static SDL_Renderer * renderer
#define SDL_GL_SetSwapInterval
#define SDL_GL_GetProcAddress
#define GL_COLOR_ATTACHMENT0_EXT
int(* QueueSetViewport)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
#define GL_TEXTURE_WRAP_T
#define GL_LUMINANCE_ALPHA
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)
GLsizei GLsizei GLchar * source
#define GL_DEBUG_CALLBACK_FUNCTION_ARB
GLint GLint GLint GLint GLint GLint y
int(* SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture)
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
#define GL_COLOR_BUFFER_BIT
int(* QueueDrawLines)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
int(* GL_UnbindTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
#define GL_STORAGE_SHARED_APPLE
int(* RunCommandQueue)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
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
SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor(SDL_BlendMode blendMode)
GLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture)
#define SDL_GL_MakeCurrent
int(* QueueDrawPoints)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
EGLSurface EGLNativeWindowType * window
#define SDL_GetRendererOutputSize
#define GL_FUNC_REVERSE_SUBTRACT
SDL_RenderCommandType command
The type used to identify a window.
union SDL_RenderCommand::@30 data
#define GL_ONE_MINUS_DST_COLOR
SDL_BlendFactor SDL_GetBlendModeDstColorFactor(SDL_BlendMode blendMode)
#define SDL_small_free(ptr, isstack)
int(* QueueFillRects)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
Uint32 num_texture_formats
GLuint GLuint GLsizei GLenum type
#define SDL_GL_GetAttribute
#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
EGLSurface EGLint * rects
#define SDL_GetYUVConversionModeForResolution
#define GL_TEXTURE_WRAP_S
GLuint GLsizei GLsizei * length
#define GL_TEXTURE_MIN_FILTER
struct SDL_RenderCommand * next
GLboolean GLboolean GLboolean GLboolean a
#define GL_UNPACK_ALIGNMENT
#define GL_DEBUG_TYPE_ERROR_ARB
GLboolean GLboolean GLboolean b
#define SDL_GL_SwapWindow
void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader)
A rectangle, with the origin at the upper left (floating point).
The structure that defines a point (floating point)
A rectangle, with the origin at the upper left (integer).
#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB
#define GL_FRAMEBUFFER_EXT
#define SDL_GetPixelFormatName