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;
395 int profile_mask = 0, major = 0, minor = 0;
422 data = (GL_RenderData *)
SDL_calloc(1,
sizeof(*data));
424 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)
599 power_of_2(
int input)
603 while (value < input) {
613 switch (pixel_format) {
645 if (!hint || *hint ==
'0' ||
SDL_strcasecmp(hint,
"nearest") == 0) {
655 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
656 GL_TextureData *data;
657 GLint internalFormat;
659 int texture_w, texture_h;
662 GL_ActivateRenderer(renderer);
665 !renderdata->GL_EXT_framebuffer_object_supported) {
666 return SDL_SetError(
"Render targets not supported by OpenGL");
669 if (!convert_format(renderdata, texture->
format, &internalFormat,
671 return SDL_SetError(
"Texture format %s not supported by OpenGL",
675 data = (GL_TextureData *)
SDL_calloc(1,
sizeof(*data));
683 size = texture->
h * data->pitch;
687 size += (2 * (texture->
h * data->pitch) / 4);
692 size += ((texture->
h * data->pitch) / 2);
702 data->fbo = GL_GetFBO(renderdata, texture->
w, texture->
h);
707 GL_CheckError(
"", renderer);
708 renderdata->glGenTextures(1, &data->texture);
709 if (GL_CheckError(
"glGenTextures()", renderer) < 0) {
718 if (renderdata->GL_ARB_texture_non_power_of_two_supported) {
720 texture_w = texture->
w;
721 texture_h = texture->
h;
724 }
else if (renderdata->GL_ARB_texture_rectangle_supported) {
726 texture_w = texture->
w;
727 texture_h = texture->
h;
728 data->texw = (
GLfloat) texture_w;
729 data->texh = (
GLfloat) texture_h;
732 texture_w = power_of_2(texture->
w);
733 texture_h = power_of_2(texture->
h);
734 data->texw = (
GLfloat) (texture->
w) / texture_w;
735 data->texh = (
GLfloat) texture->
h / texture_h;
739 data->formattype =
type;
741 renderdata->glEnable(data->type);
742 renderdata->glBindTexture(data->type, data->texture);
755 #ifndef GL_TEXTURE_STORAGE_HINT_APPLE 756 #define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC 758 #ifndef STORAGE_CACHED_APPLE 759 #define STORAGE_CACHED_APPLE 0x85BE 761 #ifndef STORAGE_SHARED_APPLE 762 #define STORAGE_SHARED_APPLE 0x85BF 773 && (texture->
w % 8) == 0) {
778 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,
779 texture_h, 0, format, type, data->pixels);
785 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,
786 texture_h, 0, format, type,
NULL);
788 renderdata->glDisable(data->type);
789 if (GL_CheckError(
"glTexImage2D()", renderer) < 0) {
797 renderdata->glGenTextures(1, &data->utexture);
798 renderdata->glGenTextures(1, &data->vtexture);
799 renderdata->glEnable(data->type);
801 renderdata->glBindTexture(data->type, data->utexture);
810 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w/2,
811 texture_h/2, 0, format, type,
NULL);
813 renderdata->glBindTexture(data->type, data->vtexture);
822 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w/2,
823 texture_h/2, 0, format, type,
NULL);
825 renderdata->glDisable(data->type);
832 renderdata->glGenTextures(1, &data->utexture);
833 renderdata->glEnable(data->type);
835 renderdata->glBindTexture(data->type, data->utexture);
846 renderdata->glDisable(data->type);
849 return GL_CheckError(
"", renderer);
856 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
857 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
862 GL_ActivateRenderer(renderer);
864 renderdata->glEnable(data->type);
865 renderdata->glBindTexture(data->type, data->texture);
868 renderdata->glTexSubImage2D(data->type, 0, rect->
x, rect->
y, rect->
w,
869 rect->
h, data->format, data->formattype,
875 pixels = (
const void*)((
const Uint8*)pixels + rect->
h * pitch);
877 renderdata->glBindTexture(data->type, data->vtexture);
879 renderdata->glBindTexture(data->type, data->utexture);
881 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
882 rect->
w/2, rect->
h/2,
883 data->format, data->formattype, pixels);
886 pixels = (
const void*)((
const Uint8*)pixels + (rect->
h * pitch)/4);
888 renderdata->glBindTexture(data->type, data->utexture);
890 renderdata->glBindTexture(data->type, data->vtexture);
892 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
893 rect->
w/2, rect->
h/2,
894 data->format, data->formattype, pixels);
901 pixels = (
const void*)((
const Uint8*)pixels + rect->
h * pitch);
902 renderdata->glBindTexture(data->type, data->utexture);
903 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
904 rect->
w/2, rect->
h/2,
907 renderdata->glDisable(data->type);
909 return GL_CheckError(
"glTexSubImage2D()", renderer);
915 const Uint8 *Yplane,
int Ypitch,
916 const Uint8 *Uplane,
int Upitch,
917 const Uint8 *Vplane,
int Vpitch)
919 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
920 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
922 GL_ActivateRenderer(renderer);
924 renderdata->glEnable(data->type);
925 renderdata->glBindTexture(data->type, data->texture);
928 renderdata->glTexSubImage2D(data->type, 0, rect->
x, rect->
y, rect->
w,
929 rect->
h, data->format, data->formattype,
933 renderdata->glBindTexture(data->type, data->utexture);
934 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
935 rect->
w/2, rect->
h/2,
936 data->format, data->formattype, Uplane);
939 renderdata->glBindTexture(data->type, data->vtexture);
940 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
941 rect->
w/2, rect->
h/2,
942 data->format, data->formattype, Vplane);
943 renderdata->glDisable(data->type);
945 return GL_CheckError(
"glTexSubImage2D()", renderer);
950 const SDL_Rect * rect,
void **pixels,
int *pitch)
952 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
954 data->locked_rect = *rect;
956 (
void *) ((
Uint8 *) data->pixels + rect->
y * data->pitch +
958 *pitch = data->pitch;
965 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
969 rect = &data->locked_rect;
971 (
void *) ((
Uint8 *) data->pixels + rect->
y * data->pitch +
973 GL_UpdateTexture(renderer, texture, rect, pixels, data->pitch);
979 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
980 GL_TextureData *texturedata;
983 GL_ActivateRenderer(renderer);
985 if (!data->GL_EXT_framebuffer_object_supported) {
986 return SDL_SetError(
"Render targets not supported by OpenGL");
989 if (texture ==
NULL) {
994 texturedata = (GL_TextureData *) texture->
driverdata;
1001 return SDL_SetError(
"glFramebufferTexture2DEXT() failed");
1009 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1011 if (SDL_CurrentContext != data->context) {
1028 data->glLoadIdentity();
1044 return GL_CheckError(
"", renderer);
1050 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1061 data->glScissor(renderer->
viewport.
x + rect->
x, h - renderer->
viewport.
y - rect->
y - rect->
h, rect->
w, rect->
h);
1072 if (data->shaders && shader != data->current.shader) {
1074 data->current.shader =
shader;
1081 Uint32 color = ((a << 24) | (r << 16) | (g << 8) | b);
1083 if (color != data->current.color) {
1084 data->glColor4f((
GLfloat) r * inv255f,
1088 data->current.color =
color;
1093 GL_SetBlendMode(GL_RenderData * data,
int blendMode)
1095 if (blendMode != data->current.blendMode) {
1096 switch (blendMode) {
1120 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1122 GL_ActivateRenderer(renderer);
1124 GL_SetColor(data, renderer->
r,
1129 GL_SetBlendMode(data, renderer->
blendMode);
1137 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1139 GL_ActivateRenderer(renderer);
1141 data->glClearColor((
GLfloat) renderer->
r * inv255f,
1163 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1166 GL_SetDrawingState(renderer);
1170 data->glVertex2f(0.5
f + points[
i].
x, 0.5
f + points[
i].
y);
1181 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1184 GL_SetDrawingState(renderer);
1187 points[0].
x == points[count-1].
x && points[0].
y == points[count-1].
y) {
1192 data->glVertex2f(0.5
f + points[
i].
x, 0.5
f + points[
i].
y);
1196 #if defined(__MACOSX__) || defined(__WIN32__) 1203 data->glVertex2f(0.5
f + points[
i].
x, 0.5
f + points[
i].
y);
1215 #if defined(__MACOSX__) || defined(__WIN32__) 1217 data->glVertex2f(0.5
f + points[count-1].
x, 0.5
f + points[count-1].
y);
1222 x2 = points[count-1].
x;
1223 y2 = points[count-1].
y;
1226 data->glVertex2f(0.5
f + x1, 0.5
f + y1);
1227 }
else if (x2 > x1) {
1228 data->glVertex2f(0.5
f + x2, 0.5
f + y2);
1231 data->glVertex2f(0.5
f + x1, 0.5
f + y1);
1232 }
else if (y2 > y1) {
1233 data->glVertex2f(0.5
f + x2, 0.5
f + y2);
1238 return GL_CheckError(
"", renderer);
1244 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1247 GL_SetDrawingState(renderer);
1252 data->glRectf(rect->
x, rect->
y, rect->
x + rect->
w, rect->
y + rect->
h);
1254 return GL_CheckError(
"", renderer);
1260 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1261 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1263 data->glEnable(texturedata->type);
1264 if (texturedata->yuv) {
1266 data->glBindTexture(texturedata->type, texturedata->vtexture);
1269 data->glBindTexture(texturedata->type, texturedata->utexture);
1273 if (texturedata->nv12) {
1275 data->glBindTexture(texturedata->type, texturedata->utexture);
1279 data->glBindTexture(texturedata->type, texturedata->texture);
1282 GL_SetColor(data, texture->
r, texture->
g, texture->
b, texture->
a);
1284 GL_SetColor(data, 255, 255, 255, 255);
1287 GL_SetBlendMode(data, texture->
blendMode);
1289 if (texturedata->yuv) {
1291 }
else if (texturedata->nv12) {
1307 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1308 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1309 GLfloat minx, miny, maxx, maxy;
1310 GLfloat minu, maxu, minv, maxv;
1312 GL_ActivateRenderer(renderer);
1314 if (GL_SetupCopy(renderer, texture) < 0) {
1320 maxx = dstrect->
x + dstrect->
w;
1321 maxy = dstrect->
y + dstrect->
h;
1323 minu = (
GLfloat) srcrect->
x / texture->
w;
1324 minu *= texturedata->texw;
1325 maxu = (
GLfloat) (srcrect->
x + srcrect->
w) / texture->
w;
1326 maxu *= texturedata->texw;
1327 minv = (
GLfloat) srcrect->
y / texture->
h;
1328 minv *= texturedata->texh;
1329 maxv = (
GLfloat) (srcrect->
y + srcrect->
h) / texture->
h;
1330 maxv *= texturedata->texh;
1333 data->glTexCoord2f(minu, minv);
1334 data->glVertex2f(minx, miny);
1335 data->glTexCoord2f(maxu, minv);
1336 data->glVertex2f(maxx, miny);
1337 data->glTexCoord2f(minu, maxv);
1338 data->glVertex2f(minx, maxy);
1339 data->glTexCoord2f(maxu, maxv);
1340 data->glVertex2f(maxx, maxy);
1343 data->glDisable(texturedata->type);
1345 return GL_CheckError(
"", renderer);
1353 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1354 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1355 GLfloat minx, miny, maxx, maxy;
1357 GLfloat minu, maxu, minv, maxv;
1359 GL_ActivateRenderer(renderer);
1361 if (GL_SetupCopy(renderer, texture) < 0) {
1365 centerx = center->
x;
1366 centery = center->
y;
1369 minx = dstrect->
w - centerx;
1374 maxx = dstrect->
w - centerx;
1378 miny = dstrect->
h - centery;
1383 maxy = dstrect->
h - centery;
1386 minu = (
GLfloat) srcrect->
x / texture->
w;
1387 minu *= texturedata->texw;
1388 maxu = (
GLfloat) (srcrect->
x + srcrect->
w) / texture->
w;
1389 maxu *= texturedata->texw;
1390 minv = (
GLfloat) srcrect->
y / texture->
h;
1391 minv *= texturedata->texh;
1392 maxv = (
GLfloat) (srcrect->
y + srcrect->
h) / texture->
h;
1393 maxv *= texturedata->texh;
1396 data->glPushMatrix();
1401 data->glTexCoord2f(minu, minv);
1402 data->glVertex2f(minx, miny);
1403 data->glTexCoord2f(maxu, minv);
1404 data->glVertex2f(maxx, miny);
1405 data->glTexCoord2f(minu, maxv);
1406 data->glVertex2f(minx, maxy);
1407 data->glTexCoord2f(maxu, maxv);
1408 data->glVertex2f(maxx, maxy);
1410 data->glPopMatrix();
1412 data->glDisable(texturedata->type);
1414 return GL_CheckError(
"", renderer);
1419 Uint32 pixel_format,
void * pixels,
int pitch)
1421 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1425 GLint internalFormat;
1428 int w, h, length, rows;
1431 GL_ActivateRenderer(renderer);
1439 if (!convert_format(data, temp_format, &internalFormat, &format, &type)) {
1441 return SDL_SetError(
"Texture format %s not supported by OpenGL",
1451 data->glReadPixels(rect->
x, renderer->
target ? rect->
y : (h-rect->
y)-rect->
h,
1452 rect->
w, rect->
h, format, type, temp_pixels);
1454 if (GL_CheckError(
"glReadPixels()", renderer) < 0) {
1462 src = (
Uint8*)temp_pixels + (rect->
h-1)*temp_pitch;
1477 temp_format, temp_pixels, temp_pitch,
1478 pixel_format, pixels, pitch);
1487 GL_ActivateRenderer(renderer);
1495 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
1496 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
1498 GL_ActivateRenderer(renderer);
1503 if (data->texture) {
1504 renderdata->glDeleteTextures(1, &data->texture);
1507 renderdata->glDeleteTextures(1, &data->utexture);
1508 renderdata->glDeleteTextures(1, &data->vtexture);
1518 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1521 GL_ClearErrors(renderer);
1522 if (data->GL_ARB_debug_output_supported) {
1523 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)
SDL_GL_GetProcAddress(
"glDebugMessageCallbackARB");
1527 glDebugMessageCallbackARBFunc(data->next_error_callback, data->next_error_userparam);
1529 if (data->shaders) {
1532 if (data->context) {
1533 while (data->framebuffers) {
1534 GL_FBOList *nextnode = data->framebuffers->next;
1536 data->glDeleteFramebuffersEXT(1, &data->framebuffers->FBO);
1537 GL_CheckError(
"", renderer);
1539 data->framebuffers = nextnode;
1551 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1552 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1553 GL_ActivateRenderer(renderer);
1555 data->glEnable(texturedata->type);
1556 if (texturedata->yuv) {
1558 data->glBindTexture(texturedata->type, texturedata->vtexture);
1561 data->glBindTexture(texturedata->type, texturedata->utexture);
1565 data->glBindTexture(texturedata->type, texturedata->texture);
1567 if(texw) *texw = (float)texturedata->texw;
1568 if(texh) *texh = (float)texturedata->texh;
1576 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1577 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1578 GL_ActivateRenderer(renderer);
1580 if (texturedata->yuv) {
1582 data->glDisable(texturedata->type);
1585 data->glDisable(texturedata->type);
1590 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
#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.
static SDL_Window * window
GLenum GLenum GLuint texture
GLfixed GLfixed GLfixed y2
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Uint32 texture_formats[16]
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.
#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
uint32_t Uint32
An unsigned 32-bit integer type.
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 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
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)
static SDL_Renderer * renderer
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.
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
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]
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