23 #if SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED
28 #include "../SDL_sysrender.h"
32 #include <OpenGL/OpenGL.h>
45 static const float inv255f = 1.0f / 255.0f;
50 static int GL_GetOutputSize(
SDL_Renderer * renderer,
int *
w,
int *
h);
57 const Uint8 *Yplane,
int Ypitch,
58 const Uint8 *Uplane,
int Upitch,
59 const Uint8 *Vplane,
int Vpitch);
97 typedef struct GL_FBOList GL_FBOList;
111 SDL_bool GL_ARB_debug_output_supported;
113 char **error_messages;
115 GLvoid *next_error_userparam;
117 SDL_bool GL_ARB_texture_rectangle_supported;
124 SDL_bool GL_EXT_framebuffer_object_supported;
128 #define SDL_PROC(ret,func,params) ret (APIENTRY *func) params;
133 SDL_bool GL_ARB_multitexture_supported;
135 GLint num_texture_units;
171 #define GL_ERROR_TRANSLATE(e) case e: return #e;
184 #undef GL_ERROR_TRANSLATE
192 if (!data->debug_enabled)
196 if (data->GL_ARB_debug_output_supported) {
199 for (i = 0; i < data->errors; ++
i) {
205 data->error_messages =
NULL;
215 GL_CheckAllErrors (
const char *prefix,
SDL_Renderer *renderer,
const char *
file,
int line,
const char *
function)
217 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
220 if (!data->debug_enabled)
224 if (data->GL_ARB_debug_output_supported) {
227 for (i = 0; i < data->errors; ++
i) {
228 SDL_SetError(
"%s: %s (%d): %s %s", prefix, file, line,
function, data->error_messages[i]);
231 GL_ClearErrors(renderer);
236 GLenum error = data->glGetError();
238 if (prefix ==
NULL || prefix[0] ==
'\0') {
241 SDL_SetError(
"%s: %s (%d): %s %s (0x%X)", prefix, file, line,
function, GL_TranslateError(error), error);
252 #define GL_CheckError(prefix, renderer)
253 #elif defined(_MSC_VER)
254 #define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __FUNCTION__)
256 #define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __PRETTY_FUNCTION__)
260 GL_LoadFunctions(GL_RenderData * data)
262 #ifdef __SDL_NOGETPROCADDR__
263 #define SDL_PROC(ret,func,params) data->func=func;
265 #define SDL_PROC(ret,func,params) \
267 data->func = SDL_GL_GetProcAddress(#func); \
268 if ( ! data->func ) { \
269 return SDL_SetError("Couldn't load GL function %s: %s\n", #func, SDL_GetError()); \
284 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
286 if (SDL_CurrentContext != data->context) {
290 SDL_CurrentContext = data->context;
292 GL_UpdateViewport(renderer);
295 GL_ClearErrors(renderer);
304 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
306 if (SDL_CurrentContext == data->context) {
307 GL_UpdateViewport(renderer);
309 GL_ActivateRenderer(renderer);
313 data->current.color = 0;
314 data->current.blendMode = -1;
322 data->glLoadIdentity();
324 GL_CheckError(
"", renderer);
331 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
336 data->error_messages =
SDL_realloc(data->error_messages, data->errors *
sizeof(*data->error_messages));
337 if (data->error_messages) {
338 data->error_messages[data->errors-1] =
SDL_strdup(message);
343 if (data->next_error_callback) {
344 data->next_error_callback(source, type,
id, severity, length, message, data->next_error_userparam);
357 GL_FBOList *
result = data->framebuffers;
359 while (result && ((result->w != w) || (result->h != h))) {
360 result = result->next;
368 data->glGenFramebuffersEXT(1, &result->FBO);
369 result->next = data->framebuffers;
370 data->framebuffers =
result;
400 data = (GL_RenderData *)
SDL_calloc(1,
sizeof(*data));
402 GL_DestroyRenderer(renderer);
429 renderer->
info = GL_RenderDriver.
info;
432 renderer->
window = window;
435 if (!data->context) {
436 GL_DestroyRenderer(renderer);
440 GL_DestroyRenderer(renderer);
444 if (GL_LoadFunctions(data) < 0) {
445 GL_DestroyRenderer(renderer);
471 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)
SDL_GL_GetProcAddress(
"glDebugMessageCallbackARB");
473 data->GL_ARB_debug_output_supported =
SDL_TRUE;
476 glDebugMessageCallbackARBFunc(GL_HandleDebugMessage, renderer);
484 data->GL_ARB_texture_rectangle_supported =
SDL_TRUE;
497 if (data->glActiveTextureARB) {
498 data->GL_ARB_multitexture_supported =
SDL_TRUE;
505 if (!hint || *hint !=
'0') {
509 data->shaders ?
"ENABLED" :
"DISABLED");
512 if (data->shaders && data->num_texture_units >= 3) {
518 data->GL_EXT_framebuffer_object_supported =
SDL_TRUE;
519 data->glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)
521 data->glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)
523 data->glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
525 data->glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)
527 data->glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
531 data->framebuffers =
NULL;
534 GL_ResetState(renderer);
546 SDL_CurrentContext =
NULL;
551 GL_GetOutputSize(
SDL_Renderer * renderer,
int *w,
int *h)
559 power_of_2(
int input)
563 while (value < input) {
570 convert_format(GL_RenderData *renderdata,
Uint32 pixel_format,
573 switch (pixel_format) {
596 if (!hint || *hint ==
'0' ||
SDL_strcasecmp(hint,
"nearest") == 0) {
606 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
607 GL_TextureData *data;
608 GLint internalFormat;
610 int texture_w, texture_h;
613 GL_ActivateRenderer(renderer);
615 if (!convert_format(renderdata, texture->
format, &internalFormat,
617 return SDL_SetError(
"Texture format %s not supported by OpenGL",
621 data = (GL_TextureData *)
SDL_calloc(1,
sizeof(*data));
629 size = texture->
h * data->pitch;
633 size += (2 * (texture->
h * data->pitch) / 4);
645 data->fbo = GL_GetFBO(renderdata, texture->
w, texture->
h);
650 GL_CheckError(
"", renderer);
651 renderdata->glGenTextures(1, &data->texture);
652 if (GL_CheckError(
"glGenTexures()", renderer) < 0) {
656 if ((renderdata->GL_ARB_texture_rectangle_supported)
659 texture_w = texture->
w;
660 texture_h = texture->
h;
661 data->texw = (
GLfloat) texture_w;
662 data->texh = (
GLfloat) texture_h;
665 texture_w = power_of_2(texture->
w);
666 texture_h = power_of_2(texture->
h);
667 data->texw = (
GLfloat) (texture->
w) / texture_w;
668 data->texh = (
GLfloat) texture->
h / texture_h;
672 data->formattype =
type;
674 renderdata->glEnable(data->type);
675 renderdata->glBindTexture(data->type, data->texture);
688 #ifndef GL_TEXTURE_STORAGE_HINT_APPLE
689 #define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC
691 #ifndef STORAGE_CACHED_APPLE
692 #define STORAGE_CACHED_APPLE 0x85BE
694 #ifndef STORAGE_SHARED_APPLE
695 #define STORAGE_SHARED_APPLE 0x85BF
706 && (texture->
w % 8) == 0) {
711 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,
712 texture_h, 0, format, type, data->pixels);
718 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,
719 texture_h, 0, format, type,
NULL);
721 renderdata->glDisable(data->type);
722 if (GL_CheckError(
"glTexImage2D()", renderer) < 0) {
730 renderdata->glGenTextures(1, &data->utexture);
731 renderdata->glGenTextures(1, &data->vtexture);
732 renderdata->glEnable(data->type);
734 renderdata->glBindTexture(data->type, data->utexture);
743 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w/2,
744 texture_h/2, 0, format, type,
NULL);
746 renderdata->glBindTexture(data->type, data->vtexture);
755 renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w/2,
756 texture_h/2, 0, format, type,
NULL);
758 renderdata->glDisable(data->type);
761 return GL_CheckError(
"", renderer);
768 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
769 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
771 GL_ActivateRenderer(renderer);
773 renderdata->glEnable(data->type);
774 renderdata->glBindTexture(data->type, data->texture);
778 renderdata->glTexSubImage2D(data->type, 0, rect->
x, rect->
y, rect->
w,
779 rect->
h, data->format, data->formattype,
785 pixels = (
const void*)((
const Uint8*)pixels + rect->
h * pitch);
787 renderdata->glBindTexture(data->type, data->vtexture);
789 renderdata->glBindTexture(data->type, data->utexture);
791 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
792 rect->
w/2, rect->
h/2,
793 data->format, data->formattype, pixels);
796 pixels = (
const void*)((
const Uint8*)pixels + (rect->
h * pitch)/4);
798 renderdata->glBindTexture(data->type, data->utexture);
800 renderdata->glBindTexture(data->type, data->vtexture);
802 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
803 rect->
w/2, rect->
h/2,
804 data->format, data->formattype, pixels);
806 renderdata->glDisable(data->type);
807 return GL_CheckError(
"glTexSubImage2D()", renderer);
813 const Uint8 *Yplane,
int Ypitch,
814 const Uint8 *Uplane,
int Upitch,
815 const Uint8 *Vplane,
int Vpitch)
817 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
818 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
820 GL_ActivateRenderer(renderer);
822 renderdata->glEnable(data->type);
823 renderdata->glBindTexture(data->type, data->texture);
826 renderdata->glTexSubImage2D(data->type, 0, rect->
x, rect->
y, rect->
w,
827 rect->
h, data->format, data->formattype,
831 renderdata->glBindTexture(data->type, data->utexture);
832 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
833 rect->
w/2, rect->
h/2,
834 data->format, data->formattype, Uplane);
837 renderdata->glBindTexture(data->type, data->vtexture);
838 renderdata->glTexSubImage2D(data->type, 0, rect->
x/2, rect->
y/2,
839 rect->
w/2, rect->
h/2,
840 data->format, data->formattype, Vplane);
841 renderdata->glDisable(data->type);
842 return GL_CheckError(
"glTexSubImage2D()", renderer);
847 const SDL_Rect * rect,
void **pixels,
int *pitch)
849 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
851 data->locked_rect = *rect;
853 (
void *) ((
Uint8 *) data->pixels + rect->
y * data->pitch +
855 *pitch = data->pitch;
862 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
866 rect = &data->locked_rect;
868 (
void *) ((
Uint8 *) data->pixels + rect->
y * data->pitch +
870 GL_UpdateTexture(renderer, texture, rect, pixels, data->pitch);
876 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
877 GL_TextureData *texturedata;
880 GL_ActivateRenderer(renderer);
882 if (texture ==
NULL) {
887 texturedata = (GL_TextureData *) texture->
driverdata;
894 return SDL_SetError(
"glFramebufferTexture2DEXT() failed");
902 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
904 if (SDL_CurrentContext != data->context) {
913 data->glLoadIdentity();
929 return GL_CheckError(
"", renderer);
936 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
940 data->glScissor(rect->
x, renderer->
viewport.
h - rect->
y - rect->
h, rect->
w, rect->
h);
950 if (data->shaders && shader != data->current.shader) {
952 data->current.shader =
shader;
959 Uint32 color = ((a << 24) | (r << 16) | (g << 8) | b);
961 if (color != data->current.color) {
962 data->glColor4f((
GLfloat) r * inv255f,
966 data->current.color =
color;
971 GL_SetBlendMode(GL_RenderData * data,
int blendMode)
973 if (blendMode != data->current.blendMode) {
995 data->current.blendMode = blendMode;
1002 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1004 GL_ActivateRenderer(renderer);
1006 GL_SetColor(data, renderer->
r,
1011 GL_SetBlendMode(data, renderer->
blendMode);
1019 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1021 GL_ActivateRenderer(renderer);
1023 data->glClearColor((
GLfloat) renderer->
r * inv255f,
1037 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1040 GL_SetDrawingState(renderer);
1044 data->glVertex2f(0.5
f + points[
i].
x, 0.5
f + points[
i].
y);
1055 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1058 GL_SetDrawingState(renderer);
1061 points[0].
x == points[count-1].
x && points[0].
y == points[count-1].
y) {
1066 data->glVertex2f(0.5
f + points[
i].
x, 0.5
f + points[
i].
y);
1070 #if defined(__APPLE__) || defined(__WIN32__)
1077 data->glVertex2f(0.5
f + points[
i].
x, 0.5
f + points[
i].
y);
1089 #if defined(__APPLE__) || defined(__WIN32__)
1091 data->glVertex2f(0.5
f + points[count-1].
x, 0.5
f + points[count-1].
y);
1096 x2 = points[count-1].
x;
1097 y2 = points[count-1].
y;
1100 data->glVertex2f(0.5
f + x1, 0.5
f + y1);
1101 }
else if (x2 > x1) {
1102 data->glVertex2f(0.5
f + x2, 0.5
f + y2);
1103 }
else if (y1 > y2) {
1104 data->glVertex2f(0.5
f + x1, 0.5
f + y1);
1105 }
else if (y2 > y1) {
1106 data->glVertex2f(0.5
f + x2, 0.5
f + y2);
1111 return GL_CheckError(
"", renderer);
1117 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1120 GL_SetDrawingState(renderer);
1125 data->glRectf(rect->
x, rect->
y, rect->
x + rect->
w, rect->
y + rect->
h);
1127 return GL_CheckError(
"", renderer);
1134 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1135 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1136 GLfloat minx, miny, maxx, maxy;
1139 GL_ActivateRenderer(renderer);
1141 data->glEnable(texturedata->type);
1142 if (texturedata->yuv) {
1144 data->glBindTexture(texturedata->type, texturedata->vtexture);
1147 data->glBindTexture(texturedata->type, texturedata->utexture);
1151 data->glBindTexture(texturedata->type, texturedata->texture);
1154 GL_SetColor(data, texture->
r, texture->
g, texture->
b, texture->
a);
1156 GL_SetColor(data, 255, 255, 255, 255);
1159 GL_SetBlendMode(data, texture->
blendMode);
1161 if (texturedata->yuv) {
1169 maxx = dstrect->
x + dstrect->
w;
1170 maxy = dstrect->
y + dstrect->
h;
1172 minu = (
GLfloat) srcrect->
x / texture->
w;
1173 minu *= texturedata->texw;
1174 maxu = (
GLfloat) (srcrect->
x + srcrect->
w) / texture->
w;
1175 maxu *= texturedata->texw;
1176 minv = (
GLfloat) srcrect->
y / texture->
h;
1177 minv *= texturedata->texh;
1178 maxv = (
GLfloat) (srcrect->
y + srcrect->
h) / texture->
h;
1179 maxv *= texturedata->texh;
1182 data->glTexCoord2f(minu, minv);
1183 data->glVertex2f(minx, miny);
1184 data->glTexCoord2f(maxu, minv);
1185 data->glVertex2f(maxx, miny);
1186 data->glTexCoord2f(minu, maxv);
1187 data->glVertex2f(minx, maxy);
1188 data->glTexCoord2f(maxu, maxv);
1189 data->glVertex2f(maxx, maxy);
1192 data->glDisable(texturedata->type);
1194 return GL_CheckError(
"", renderer);
1202 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1203 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1204 GLfloat minx, miny, maxx, maxy;
1208 GL_ActivateRenderer(renderer);
1210 data->glEnable(texturedata->type);
1211 if (texturedata->yuv) {
1213 data->glBindTexture(texturedata->type, texturedata->vtexture);
1216 data->glBindTexture(texturedata->type, texturedata->utexture);
1220 data->glBindTexture(texturedata->type, texturedata->texture);
1223 GL_SetColor(data, texture->
r, texture->
g, texture->
b, texture->
a);
1225 GL_SetColor(data, 255, 255, 255, 255);
1228 GL_SetBlendMode(data, texture->
blendMode);
1230 if (texturedata->yuv) {
1236 centerx = center->
x;
1237 centery = center->
y;
1240 minx = dstrect->
w - centerx;
1245 maxx = dstrect->
w - centerx;
1249 miny = dstrect->
h - centery;
1254 maxy = dstrect->
h - centery;
1257 minu = (
GLfloat) srcrect->
x / texture->
w;
1258 minu *= texturedata->texw;
1259 maxu = (
GLfloat) (srcrect->
x + srcrect->
w) / texture->
w;
1260 maxu *= texturedata->texw;
1261 minv = (
GLfloat) srcrect->
y / texture->
h;
1262 minv *= texturedata->texh;
1263 maxv = (
GLfloat) (srcrect->
y + srcrect->
h) / texture->
h;
1264 maxv *= texturedata->texh;
1267 data->glPushMatrix();
1272 data->glTexCoord2f(minu, minv);
1273 data->glVertex2f(minx, miny);
1274 data->glTexCoord2f(maxu, minv);
1275 data->glVertex2f(maxx, miny);
1276 data->glTexCoord2f(minu, maxv);
1277 data->glVertex2f(minx, maxy);
1278 data->glTexCoord2f(maxu, maxv);
1279 data->glVertex2f(maxx, maxy);
1281 data->glPopMatrix();
1283 data->glDisable(texturedata->type);
1285 return GL_CheckError(
"", renderer);
1290 Uint32 pixel_format,
void * pixels,
int pitch)
1292 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1296 GLint internalFormat;
1299 int w, h, length, rows;
1302 GL_ActivateRenderer(renderer);
1310 convert_format(data, temp_format, &internalFormat, &format, &type);
1318 data->glReadPixels(rect->
x, (h-rect->
y)-rect->
h, rect->
w, rect->
h,
1319 format, type, temp_pixels);
1321 GL_CheckError(
"", renderer);
1325 src = (
Uint8*)temp_pixels + (rect->
h-1)*temp_pitch;
1339 temp_format, temp_pixels, temp_pitch,
1340 pixel_format, pixels, pitch);
1349 GL_ActivateRenderer(renderer);
1357 GL_RenderData *renderdata = (GL_RenderData *) renderer->
driverdata;
1358 GL_TextureData *data = (GL_TextureData *) texture->
driverdata;
1360 GL_ActivateRenderer(renderer);
1365 if (data->texture) {
1366 renderdata->glDeleteTextures(1, &data->texture);
1369 renderdata->glDeleteTextures(1, &data->utexture);
1370 renderdata->glDeleteTextures(1, &data->vtexture);
1380 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1383 GL_ClearErrors(renderer);
1384 if (data->GL_ARB_debug_output_supported) {
1385 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)
SDL_GL_GetProcAddress(
"glDebugMessageCallbackARB");
1389 glDebugMessageCallbackARBFunc(data->next_error_callback, data->next_error_userparam);
1391 if (data->shaders) {
1394 if (data->context) {
1395 while (data->framebuffers) {
1396 GL_FBOList *nextnode = data->framebuffers->next;
1398 data->glDeleteFramebuffersEXT(1, &data->framebuffers->FBO);
1399 GL_CheckError(
"", renderer);
1401 data->framebuffers = nextnode;
1413 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1414 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1415 GL_ActivateRenderer(renderer);
1417 data->glEnable(texturedata->type);
1418 if (texturedata->yuv) {
1420 data->glBindTexture(texturedata->type, texturedata->vtexture);
1423 data->glBindTexture(texturedata->type, texturedata->utexture);
1427 data->glBindTexture(texturedata->type, texturedata->texture);
1429 if(texw) *texw = (float)texturedata->texw;
1430 if(texh) *texh = (float)texturedata->texh;
1438 GL_RenderData *data = (GL_RenderData *) renderer->
driverdata;
1439 GL_TextureData *texturedata = (GL_TextureData *) texture->
driverdata;
1440 GL_ActivateRenderer(renderer);
1442 if (texturedata->yuv) {
1444 data->glDisable(texturedata->type);
1447 data->glDisable(texturedata->type);
1452 data->glDisable(texturedata->type);
#define GL_DEBUG_CALLBACK_FUNCTION_ARB
int(* UpdateClipRect)(SDL_Renderer *renderer)
#define GL_TEXTURE_STORAGE_HINT_APPLE
#define GL_TEXTURE_ENV_MODE
DECLSPEC void *SDLCALL SDL_GL_GetProcAddress(const char *proc)
Get the address of an OpenGL function.
GLfloat GLfloat GLfloat GLfloat h
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum GLenum type
GLsizei GLsizei GLuint * shaders
DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size)
void(* WindowEvent)(SDL_Renderer *renderer, const SDL_WindowEvent *event)
GLsizei GLenum GLuint GLuint GLsizei GLchar * message
#define GL_FRAMEBUFFER_COMPLETE_EXT
DECLSPEC int SDLCALL SDL_GL_GetSwapInterval(void)
Get the swap interval for the current OpenGL context.
DECLSPEC int SDLCALL SDL_ConvertPixels(int width, int height, Uint32 src_format, const void *src, int src_pitch, Uint32 dst_format, void *dst, int dst_pitch)
Copy a block of pixels of one format to another format.
int(* RenderClear)(SDL_Renderer *renderer)
#define SDL_stack_free(data)
#define GL_PACK_ROW_LENGTH
DECLSPEC SDL_GLContext SDLCALL SDL_GL_CreateContext(SDL_Window *window)
Create an OpenGL context for use with an OpenGL window, and make it current.
int(* RenderDrawPoints)(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
DECLSPEC const char *SDLCALL SDL_GetPixelFormatName(Uint32 format)
Get the human readable name of a pixel format.
int(* SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture)
int(* CreateTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
#define SDL_HINT_RENDER_SCALE_QUALITY
A variable controlling the scaling quality.
#define glCheckFramebufferStatusEXT
#define GL_TABLE_TOO_LARGE
DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size)
DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int *value)
Get the actual value for an attribute from the current context.
#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB
DECLSPEC void SDLCALL SDL_free(void *mem)
Uint32 texture_formats[16]
#define SDL_HINT_RENDER_OPENGL_SHADERS
A variable controlling whether the OpenGL render driver uses shaders if they are available.
#define GL_DEBUG_TYPE_ERROR_ARB
#define GL_INVALID_OPERATION
#define glBindFramebufferEXT
GLboolean GLboolean GLboolean GLboolean a
void * SDL_GLContext
An opaque handle to an OpenGL context.
#define SDL_BYTESPERPIXEL(X)
#define GL_STORAGE_CACHED_APPLE
void(* UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
#define GL_TEXTURE_MAG_FILTER
#define GL_STACK_OVERFLOW
DECLSPEC int SDLCALL SDL_GetRendererOutputSize(SDL_Renderer *renderer, int *w, int *h)
Get the output size of a rendering context.
struct GL_ShaderContext GL_ShaderContext
GLuint GLfloat GLfloat GLfloat GLfloat y1
#define GL_TRIANGLE_STRIP
GLfixed GLfixed GLfixed y2
SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r)
Returns true if the rectangle has no area.
#define glDeleteFramebuffersEXT
#define GL_DEBUG_CALLBACK_USER_PARAM_ARB
void GL_DestroyShaderContext(GL_ShaderContext *ctx)
uint32_t Uint32
An unsigned 32-bit integer type.
const GLuint * framebuffers
DECLSPEC int SDLCALL SDL_GL_MakeCurrent(SDL_Window *window, SDL_GLContext context)
Set up an OpenGL context for rendering into an OpenGL window.
int(* LockTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
#define GL_COLOR_BUFFER_BIT
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 GL_TEXTURE_MIN_FILTER
DECLSPEC int SDLCALL SDL_GL_SetSwapInterval(int interval)
Set the swap interval for the current OpenGL context.
int(* UpdateTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
DECLSPEC void SDLCALL SDL_LogDebug(int category, const char *fmt,...)
Log a message with SDL_LOG_PRIORITY_DEBUG.
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
int SDL_RecreateWindow(SDL_Window *window, Uint32 flags)
static int GetScaleQuality(void)
DECLSPEC char *SDLCALL SDL_strdup(const char *str)
DECLSPEC void SDLCALL SDL_GL_DeleteContext(SDL_GLContext context)
Delete an OpenGL context.
int(* RenderDrawLines)(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
#define GL_PACK_ALIGNMENT
GL_ShaderContext * GL_CreateShaderContext()
#define GL_UNPACK_ROW_LENGTH
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum format
DECLSPEC int SDLCALL SDL_SetError(const char *fmt,...)
DECLSPEC void *SDLCALL SDL_malloc(size_t size)
GLint GLint internalFormat
DECLSPEC Uint32 SDLCALL SDL_GetWindowFlags(SDL_Window *window)
Get the window flags.
DECLSPEC const char *SDLCALL SDL_GetHint(const char *name)
Get a hint.
void(APIENTRY * GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, GLvoid *userParam)
void(* DestroyTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
#define GL_UNSIGNED_INT_8_8_8_8_REV
int(* RenderCopy)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
GLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture)
static __inline ALuint minu(ALuint a, ALuint b)
#define GL_MAX_TEXTURE_UNITS_ARB
SDL_RendererFlip
Flip constants for SDL_RenderCopyEx.
#define glGenFramebuffersEXT
DECLSPEC void SDLCALL SDL_GL_GetDrawableSize(SDL_Window *window, int *w, int *h)
Get the size of a window's underlying drawable (for use with glViewport).
#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB
#define GL_FRAMEBUFFER_EXT
Window state change event data (event.window.*)
GLuint GLfloat GLfloat GLfloat x1
EGLSurface EGLint EGLint y
#define SDL_OutOfMemory()
#define GL_COLOR_ATTACHMENT0_EXT
GLenum GLenum GLuint texture
int(* GetOutputSize)(SDL_Renderer *renderer, int *w, int *h)
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
int(* GL_BindTexture)(SDL_Renderer *renderer, SDL_Texture *texture, float *texw, float *texh)
GLenum GLenum GLenum input
EGLSurface EGLint void ** value
#define GL_STORAGE_SHARED_APPLE
int(* RenderReadPixels)(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
DECLSPEC void *SDLCALL SDL_memcpy(void *dst, const void *src, size_t len)
GLenum GLsizei GLsizei GLsizei GLsizei GLbitfield flags
int(* GL_UnbindTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
#define GL_TEXTURE_WRAP_T
int(* RenderFillRects)(SDL_Renderer *renderer, const SDL_FRect *rects, int count)
uint8_t Uint8
An unsigned 8-bit integer type.
#define GL_TEXTURE_WRAP_S
#define GL_STACK_UNDERFLOW
DECLSPEC void SDLCALL SDL_LogError(int category, const char *fmt,...)
Log a message with SDL_LOG_PRIORITY_ERROR.
#define GL_ONE_MINUS_SRC_ALPHA
GLdouble GLdouble GLdouble r
GLdouble GLdouble GLdouble b
Uint32 num_texture_formats
GLint GLint GLint GLint GLint w
#define SDL_stack_alloc(type, count)
#define GL_UNPACK_ALIGNMENT
#define GL_UNPACK_CLIENT_STORAGE_APPLE
int(* UpdateViewport)(SDL_Renderer *renderer)
GLuint GLdouble GLdouble GLint GLint const GLdouble * points
DECLSPEC SDL_bool SDLCALL SDL_GL_ExtensionSupported(const char *extension)
Return true if an OpenGL extension is supported for the current context.
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 GL_TEXTURE_RECTANGLE_ARB
void(* RenderPresent)(SDL_Renderer *renderer)
void(* DestroyRenderer)(SDL_Renderer *renderer)
DECLSPEC void SDLCALL SDL_LogInfo(int category, const char *fmt,...)
Log a message with SDL_LOG_PRIORITY_INFO.
GLsizei GLsizei GLchar * source
DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2)
static __inline ALuint maxu(ALuint a, ALuint b)
void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader)
A rectangle, with the origin at the upper left.
#define GL_MAX_TEXTURE_SIZE
DECLSPEC void SDLCALL SDL_GL_SwapWindow(SDL_Window *window)
Swap the OpenGL buffers for a window, if double-buffering is supported.
#define glFramebufferTexture2DEXT