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;
65 const Uint8 *Yplane,
int Ypitch,
66 const Uint8 *Uplane,
int Upitch,
67 const Uint8 *Vplane,
int Vpitch);
105 typedef struct GL_FBOList GL_FBOList;
119 SDL_bool GL_ARB_debug_output_supported;
121 char **error_messages;
123 GLvoid *next_error_userparam;
125 SDL_bool GL_ARB_texture_non_power_of_two_supported;
126 SDL_bool GL_ARB_texture_rectangle_supported;
133 SDL_bool GL_EXT_framebuffer_object_supported;
137 #define SDL_PROC(ret,func,params) ret (APIENTRY *func) params; 142 SDL_bool GL_ARB_multitexture_supported;
144 GLint num_texture_units;
146 PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
147 PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
148 PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
149 PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
150 PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
179 GL_TranslateError (
GLenum error)
181 #define GL_ERROR_TRANSLATE(e) case e: return #e; 194 #undef GL_ERROR_TRANSLATE 202 if (!data->debug_enabled)
206 if (data->GL_ARB_debug_output_supported) {
209 for (i = 0; i < data->errors; ++
i) {
215 data->error_messages =
NULL;
225 GL_CheckAllErrors (
const char *prefix,
SDL_Renderer *renderer,
const char *file,
int line,
const char *
function)
227 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
230 if (!data->debug_enabled)
234 if (data->GL_ARB_debug_output_supported) {
237 for (i = 0; i < data->errors; ++
i) {
238 SDL_SetError(
"%s: %s (%d): %s %s", prefix, file, line,
function, data->error_messages[i]);
241 GL_ClearErrors(renderer);
246 GLenum error = data->glGetError();
248 if (prefix ==
NULL || prefix[0] ==
'\0') {
251 SDL_SetError(
"%s: %s (%d): %s %s (0x%X)", prefix, file, line,
function, GL_TranslateError(error), error);
262 #define GL_CheckError(prefix, renderer) 264 #define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, SDL_FILE, SDL_LINE, SDL_FUNCTION) 268 GL_LoadFunctions(GL_RenderData * data)
270 #ifdef __SDL_NOGETPROCADDR__ 271 #define SDL_PROC(ret,func,params) data->func=func; 273 #define SDL_PROC(ret,func,params) \ 275 data->func = SDL_GL_GetProcAddress(#func); \ 276 if ( ! data->func ) { \ 277 return SDL_SetError("Couldn't load GL function %s: %s", #func, SDL_GetError()); \ 292 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
294 if (SDL_CurrentContext != data->context ||
299 SDL_CurrentContext = data->context;
301 GL_UpdateViewport(renderer);
304 GL_ClearErrors(renderer);
313 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
316 GL_UpdateViewport(renderer);
318 GL_ActivateRenderer(renderer);
322 data->current.color = 0xffffffff;
331 data->glLoadIdentity();
333 GL_CheckError(
"", renderer);
340 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
344 int errors = data->errors + 1;
345 char **error_messages =
SDL_realloc(data->error_messages, errors *
sizeof(*data->error_messages));
346 if (error_messages) {
347 data->errors = errors;
348 data->error_messages = error_messages;
349 data->error_messages[data->errors-1] =
SDL_strdup(message);
354 if (data->next_error_callback) {
355 data->next_error_callback(source, type,
id, severity, length, message, data->next_error_userparam);
368 GL_FBOList *
result = data->framebuffers;
370 while (result && ((result->w != w) || (result->h != h))) {
371 result = result->next;
379 data->glGenFramebuffersEXT(1, &result->FBO);
380 result->next = data->framebuffers;
381 data->framebuffers =
result;
394 int profile_mask = 0, major = 0, minor = 0;
421 data = (GL_RenderData *)
SDL_calloc(1,
sizeof(*data));
423 GL_DestroyRenderer(renderer);
451 renderer->
info = GL_RenderDriver.
info;
457 if (!data->context) {
458 GL_DestroyRenderer(renderer);
462 GL_DestroyRenderer(renderer);
466 if (GL_LoadFunctions(data) < 0) {
467 GL_DestroyRenderer(renderer);
493 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)
SDL_GL_GetProcAddress(
"glDebugMessageCallbackARB");
495 data->GL_ARB_debug_output_supported =
SDL_TRUE;
498 glDebugMessageCallbackARBFunc(GL_HandleDebugMessage, renderer);
505 data->GL_ARB_texture_non_power_of_two_supported =
SDL_TRUE;
508 data->GL_ARB_texture_rectangle_supported =
SDL_TRUE;
510 if (data->GL_ARB_texture_rectangle_supported) {
523 if (data->glActiveTextureARB) {
524 data->GL_ARB_multitexture_supported =
SDL_TRUE;
534 data->shaders ?
"ENABLED" :
"DISABLED");
537 if (data->shaders && data->num_texture_units >= 3) {
549 data->GL_EXT_framebuffer_object_supported =
SDL_TRUE;
550 data->glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)
552 data->glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)
554 data->glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
556 data->glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)
558 data->glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
562 data->framebuffers =
NULL;
565 GL_ResetState(renderer);
570 if (changed_window) {
587 SDL_CurrentContext =
NULL;
592 GL_GetOutputSize(
SDL_Renderer * renderer,
int *w,
int *h)
658 if (colorOperation != alphaOperation) {
665 power_of_2(
int input)
669 while (value < input) {
676 convert_format(GL_RenderData *renderdata,
Uint32 pixel_format,
679 switch (pixel_format) {
709 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
710 GL_TextureData *data;
711 GLint internalFormat;
713 int texture_w, texture_h;
716 GL_ActivateRenderer(renderer);
719 !renderdata->GL_EXT_framebuffer_object_supported) {
720 return SDL_SetError(
"Render targets not supported by OpenGL");
723 if (!convert_format(renderdata, texture->
format, &internalFormat,
725 return SDL_SetError(
"Texture format %s not supported by OpenGL",
729 data = (GL_TextureData *)
SDL_calloc(1,
sizeof(*data));
737 size = texture->
h * data->pitch;
741 size += 2 * ((texture->
h + 1) / 2) * ((data->pitch + 1) / 2);
746 size += 2 * ((texture->
h + 1) / 2) * ((data->pitch + 1) / 2);
756 data->fbo = GL_GetFBO(renderdata, texture->
w, texture->
h);
761 GL_CheckError(
"", renderer);
762 renderdata->glGenTextures(1, &data->texture);
763 if (GL_CheckError(
"glGenTextures()", renderer) < 0) {
772 if (renderdata->GL_ARB_texture_non_power_of_two_supported) {
774 texture_w = texture->
w;
775 texture_h = texture->
h;
778 }
else if (renderdata->GL_ARB_texture_rectangle_supported) {
780 texture_w = texture->
w;
781 texture_h = texture->
h;
782 data->texw = (
GLfloat) texture_w;
783 data->texh = (
GLfloat) texture_h;
786 texture_w = power_of_2(texture->
w);
787 texture_h = power_of_2(texture->
h);
788 data->texw = (
GLfloat) (texture->
w) / texture_w;
789 data->texh = (
GLfloat) texture->
h / texture_h;
793 data->formattype =
type;
795 renderdata->glEnable(data->type);
796 renderdata->glBindTexture(data->type, data->texture);
809 #ifndef GL_TEXTURE_STORAGE_HINT_APPLE 810 #define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC 812 #ifndef STORAGE_CACHED_APPLE 813 #define STORAGE_CACHED_APPLE 0x85BE 815 #ifndef STORAGE_SHARED_APPLE 816 #define STORAGE_SHARED_APPLE 0x85BF 827 && (texture->
w % 8) == 0) {
832 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,
833 texture_h, 0, format, type, data->pixels);
839 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,
840 texture_h, 0, format, type,
NULL);
842 renderdata->glDisable(data->type);
843 if (GL_CheckError(
"glTexImage2D()", renderer) < 0) {
851 renderdata->glGenTextures(1, &data->utexture);
852 renderdata->glGenTextures(1, &data->vtexture);
853 renderdata->glEnable(data->type);
855 renderdata->glBindTexture(data->type, data->utexture);
864 renderdata->glTexImage2D(data->type, 0, internalFormat, (texture_w+1)/2,
865 (texture_h+1)/2, 0, format, type,
NULL);
867 renderdata->glBindTexture(data->type, data->vtexture);
876 renderdata->glTexImage2D(data->type, 0, internalFormat, (texture_w+1)/2,
877 (texture_h+1)/2, 0, format, type,
NULL);
879 renderdata->glDisable(data->type);
886 renderdata->glGenTextures(1, &data->utexture);
887 renderdata->glEnable(data->type);
889 renderdata->glBindTexture(data->type, data->utexture);
900 renderdata->glDisable(data->type);
903 return GL_CheckError(
"", renderer);
910 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
911 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
916 GL_ActivateRenderer(renderer);
918 renderdata->glEnable(data->type);
919 renderdata->glBindTexture(data->type, data->texture);
922 renderdata->glTexSubImage2D(data->type, 0, rect->
x, rect->
y, rect->
w,
923 rect->
h, data->format, data->formattype,
929 pixels = (
const void*)((
const Uint8*)pixels + rect->
h * pitch);
931 renderdata->glBindTexture(data->type, data->vtexture);
933 renderdata->glBindTexture(data->type, data->utexture);
935 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
936 (rect->
w+1)/2, (rect->
h+1)/2,
937 data->format, data->formattype, pixels);
940 pixels = (
const void*)((
const Uint8*)pixels + ((rect->
h + 1) / 2) * ((pitch + 1) / 2));
942 renderdata->glBindTexture(data->type, data->utexture);
944 renderdata->glBindTexture(data->type, data->vtexture);
946 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
947 (rect->
w+1)/2, (rect->
h+1)/2,
948 data->format, data->formattype, pixels);
955 pixels = (
const void*)((
const Uint8*)pixels + rect->
h * pitch);
956 renderdata->glBindTexture(data->type, data->utexture);
957 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
958 (rect->
w + 1)/2, (rect->
h + 1)/2,
961 renderdata->glDisable(data->type);
963 return GL_CheckError(
"glTexSubImage2D()", renderer);
969 const Uint8 *Yplane,
int Ypitch,
970 const Uint8 *Uplane,
int Upitch,
971 const Uint8 *Vplane,
int Vpitch)
973 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
974 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
976 GL_ActivateRenderer(renderer);
978 renderdata->glEnable(data->type);
979 renderdata->glBindTexture(data->type, data->texture);
982 renderdata->glTexSubImage2D(data->type, 0, rect->
x, rect->
y, rect->
w,
983 rect->
h, data->format, data->formattype,
987 renderdata->glBindTexture(data->type, data->utexture);
988 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
989 (rect->
w + 1)/2, (rect->
h + 1)/2,
990 data->format, data->formattype, Uplane);
993 renderdata->glBindTexture(data->type, data->vtexture);
994 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
995 (rect->
w + 1)/2, (rect->
h + 1)/2,
996 data->format, data->formattype, Vplane);
997 renderdata->glDisable(data->type);
999 return GL_CheckError(
"glTexSubImage2D()", renderer);
1004 const SDL_Rect * rect,
void **pixels,
int *pitch)
1006 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
1008 data->locked_rect = *rect;
1010 (
void *) ((
Uint8 *) data->pixels + rect->
y * data->pitch +
1012 *pitch = data->pitch;
1019 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
1023 rect = &data->locked_rect;
1025 (
void *) ((
Uint8 *) data->pixels + rect->
y * data->pitch +
1027 GL_UpdateTexture(renderer, texture, rect, pixels, data->pitch);
1033 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1034 GL_TextureData *texturedata;
1037 GL_ActivateRenderer(renderer);
1039 if (!data->GL_EXT_framebuffer_object_supported) {
1040 return SDL_SetError(
"Render targets not supported by OpenGL");
1043 if (texture ==
NULL) {
1048 texturedata = (GL_TextureData *) texture->
driverdata;
1055 return SDL_SetError(
"glFramebufferTexture2DEXT() failed");
1063 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1065 if (SDL_CurrentContext != data->context) {
1082 data->glLoadIdentity();
1100 return GL_CheckError(
"", renderer);
1106 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1117 data->glScissor(renderer->
viewport.
x + rect->
x, h - renderer->
viewport.
y - rect->
y - rect->
h, rect->
w, rect->
h);
1128 if (data->shaders && shader != data->current.shader) {
1130 data->current.shader =
shader;
1137 Uint32 color = ((a << 24) | (r << 16) | (g << 8) | b);
1139 if (color != data->current.color) {
1140 data->glColor4f((
GLfloat) r * inv255f,
1144 data->current.color =
color;
1149 GL_SetBlendMode(GL_RenderData * data,
SDL_BlendMode blendMode)
1151 if (blendMode != data->current.blendMode) {
1169 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1171 GL_ActivateRenderer(renderer);
1173 GL_SetColor(data, renderer->
r,
1178 GL_SetBlendMode(data, renderer->
blendMode);
1186 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1188 GL_ActivateRenderer(renderer);
1190 data->glClearColor((
GLfloat) renderer->
r * inv255f,
1212 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1215 GL_SetDrawingState(renderer);
1219 data->glVertex2f(0.5
f + points[
i].
x, 0.5
f + points[
i].
y);
1230 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1233 GL_SetDrawingState(renderer);
1236 points[0].
x == points[count-1].
x && points[0].
y == points[count-1].
y) {
1241 data->glVertex2f(0.5
f + points[
i].
x, 0.5
f + points[
i].
y);
1245 #if defined(__MACOSX__) || defined(__WIN32__) 1252 data->glVertex2f(0.5
f + points[
i].
x, 0.5
f + points[
i].
y);
1264 #if defined(__MACOSX__) || defined(__WIN32__) 1266 data->glVertex2f(0.5
f + points[count-1].
x, 0.5
f + points[count-1].
y);
1271 x2 = points[count-1].
x;
1272 y2 = points[count-1].
y;
1275 data->glVertex2f(0.5
f + x1, 0.5
f + y1);
1276 }
else if (x2 > x1) {
1277 data->glVertex2f(0.5
f + x2, 0.5
f + y2);
1280 data->glVertex2f(0.5
f + x1, 0.5
f + y1);
1281 }
else if (y2 > y1) {
1282 data->glVertex2f(0.5
f + x2, 0.5
f + y2);
1287 return GL_CheckError(
"", renderer);
1293 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1296 GL_SetDrawingState(renderer);
1301 data->glRectf(rect->
x, rect->
y, rect->
x + rect->
w, rect->
y + rect->
h);
1303 return GL_CheckError(
"", renderer);
1309 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1310 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1312 data->glEnable(texturedata->type);
1313 if (texturedata->yuv) {
1315 data->glBindTexture(texturedata->type, texturedata->vtexture);
1318 data->glBindTexture(texturedata->type, texturedata->utexture);
1322 if (texturedata->nv12) {
1324 data->glBindTexture(texturedata->type, texturedata->utexture);
1328 data->glBindTexture(texturedata->type, texturedata->texture);
1331 GL_SetColor(data, texture->
r, texture->
g, texture->
b, texture->
a);
1333 GL_SetColor(data, 255, 255, 255, 255);
1336 GL_SetBlendMode(data, texture->
blendMode);
1338 if (texturedata->yuv || texturedata->nv12) {
1341 if (texturedata->yuv) {
1350 if (texturedata->yuv) {
1359 if (texturedata->yuv) {
1368 return SDL_SetError(
"Unsupported YUV conversion mode");
1380 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1381 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1382 GLfloat minx, miny, maxx, maxy;
1383 GLfloat minu, maxu, minv, maxv;
1385 GL_ActivateRenderer(renderer);
1387 if (GL_SetupCopy(renderer, texture) < 0) {
1393 maxx = dstrect->
x + dstrect->
w;
1394 maxy = dstrect->
y + dstrect->
h;
1396 minu = (
GLfloat) srcrect->
x / texture->
w;
1397 minu *= texturedata->texw;
1398 maxu = (
GLfloat) (srcrect->
x + srcrect->
w) / texture->
w;
1399 maxu *= texturedata->texw;
1400 minv = (
GLfloat) srcrect->
y / texture->
h;
1401 minv *= texturedata->texh;
1402 maxv = (
GLfloat) (srcrect->
y + srcrect->
h) / texture->
h;
1403 maxv *= texturedata->texh;
1406 data->glTexCoord2f(minu, minv);
1407 data->glVertex2f(minx, miny);
1408 data->glTexCoord2f(maxu, minv);
1409 data->glVertex2f(maxx, miny);
1410 data->glTexCoord2f(minu, maxv);
1411 data->glVertex2f(minx, maxy);
1412 data->glTexCoord2f(maxu, maxv);
1413 data->glVertex2f(maxx, maxy);
1416 data->glDisable(texturedata->type);
1418 return GL_CheckError(
"", renderer);
1426 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1427 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1428 GLfloat minx, miny, maxx, maxy;
1430 GLfloat minu, maxu, minv, maxv;
1432 GL_ActivateRenderer(renderer);
1434 if (GL_SetupCopy(renderer, texture) < 0) {
1438 centerx = center->
x;
1439 centery = center->
y;
1442 minx = dstrect->
w - centerx;
1447 maxx = dstrect->
w - centerx;
1451 miny = dstrect->
h - centery;
1456 maxy = dstrect->
h - centery;
1459 minu = (
GLfloat) srcrect->
x / texture->
w;
1460 minu *= texturedata->texw;
1461 maxu = (
GLfloat) (srcrect->
x + srcrect->
w) / texture->
w;
1462 maxu *= texturedata->texw;
1463 minv = (
GLfloat) srcrect->
y / texture->
h;
1464 minv *= texturedata->texh;
1465 maxv = (
GLfloat) (srcrect->
y + srcrect->
h) / texture->
h;
1466 maxv *= texturedata->texh;
1469 data->glPushMatrix();
1474 data->glTexCoord2f(minu, minv);
1475 data->glVertex2f(minx, miny);
1476 data->glTexCoord2f(maxu, minv);
1477 data->glVertex2f(maxx, miny);
1478 data->glTexCoord2f(minu, maxv);
1479 data->glVertex2f(minx, maxy);
1480 data->glTexCoord2f(maxu, maxv);
1481 data->glVertex2f(maxx, maxy);
1483 data->glPopMatrix();
1485 data->glDisable(texturedata->type);
1487 return GL_CheckError(
"", renderer);
1492 Uint32 pixel_format,
void * pixels,
int pitch)
1494 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1498 GLint internalFormat;
1501 int w, h, length, rows;
1504 GL_ActivateRenderer(renderer);
1506 if (!convert_format(data, temp_format, &internalFormat, &format, &type)) {
1507 return SDL_SetError(
"Texture format %s not supported by OpenGL",
1511 if (!rect->
w || !rect->
h) {
1527 data->glReadPixels(rect->
x, renderer->
target ? rect->
y : (h-rect->
y)-rect->
h,
1528 rect->
w, rect->
h, format, type, temp_pixels);
1530 if (GL_CheckError(
"glReadPixels()", renderer) < 0) {
1538 src = (
Uint8*)temp_pixels + (rect->
h-1)*temp_pitch;
1553 temp_format, temp_pixels, temp_pitch,
1554 pixel_format, pixels, pitch);
1563 GL_ActivateRenderer(renderer);
1571 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
1572 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
1574 GL_ActivateRenderer(renderer);
1579 if (data->texture) {
1580 renderdata->glDeleteTextures(1, &data->texture);
1583 renderdata->glDeleteTextures(1, &data->utexture);
1584 renderdata->glDeleteTextures(1, &data->vtexture);
1594 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1597 if (data->context !=
NULL) {
1599 GL_ActivateRenderer(renderer);
1602 GL_ClearErrors(renderer);
1603 if (data->GL_ARB_debug_output_supported) {
1604 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)
SDL_GL_GetProcAddress(
"glDebugMessageCallbackARB");
1608 glDebugMessageCallbackARBFunc(data->next_error_callback, data->next_error_userparam);
1610 if (data->shaders) {
1613 if (data->context) {
1614 while (data->framebuffers) {
1615 GL_FBOList *nextnode = data->framebuffers->next;
1617 data->glDeleteFramebuffersEXT(1, &data->framebuffers->FBO);
1618 GL_CheckError(
"", renderer);
1620 data->framebuffers = nextnode;
1632 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1633 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1634 GL_ActivateRenderer(renderer);
1636 data->glEnable(texturedata->type);
1637 if (texturedata->yuv) {
1639 data->glBindTexture(texturedata->type, texturedata->vtexture);
1642 data->glBindTexture(texturedata->type, texturedata->utexture);
1646 data->glBindTexture(texturedata->type, texturedata->texture);
1648 if(texw) *texw = (float)texturedata->texw;
1649 if(texh) *texh = (float)texturedata->texh;
1657 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1658 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1659 GL_ActivateRenderer(renderer);
1661 if (texturedata->yuv) {
1663 data->glDisable(texturedata->type);
1666 data->glDisable(texturedata->type);
1671 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_STORAGE_CACHED_APPLE
#define GL_UNPACK_CLIENT_STORAGE_APPLE
GLuint GLfloat GLfloat GLfloat x1
GL_ShaderContext * GL_CreateShaderContext(void)
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
#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
#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
GLfloat GLfloat GLfloat GLfloat h
GLfixed GLfixed GLfixed y2
Uint32 texture_formats[16]
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
#define SDL_HINT_RENDER_OPENGL_SHADERS
A variable controlling whether the OpenGL render driver uses shaders if they are available.
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
#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB
int(* RenderFillRects)(SDL_Renderer *renderer, const SDL_FRect *rects, int count)
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
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 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)
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
#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 SDL_GL_GetProcAddress
#define GL_COLOR_ATTACHMENT0_EXT
#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)
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)
#define GL_STORAGE_SHARED_APPLE
SDL_RendererFlip
Flip constants for SDL_RenderCopyEx.
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_assert(condition)
#define SDL_OutOfMemory()
#define SDL_GL_GetCurrentContext
SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor(SDL_BlendMode blendMode)
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
EGLSurface EGLNativeWindowType * window
#define SDL_GetRendererOutputSize
#define GL_FUNC_REVERSE_SUBTRACT
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)
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_stack_free(data)
#define SDL_GetYUVConversionModeForResolution
#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
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