6 #include "SDL_platform.h" 12 #if __STDC_VERSION__ >= 199901L 18 #include "stb_image.h" 19 #include "stb_image_write.h" 22 #define M_PI 3.14159265358979323846 28 #define static_inline static 30 #define static_inline static inline 35 #define __func__ __FUNCTION__ 39 #if defined(_MSC_VER) && (_MSC_VER < 1900) 40 #define snprintf c99_snprintf 42 static_inline int c99_vsnprintf(
char* str,
size_t size,
const char* format, va_list ap)
47 count = _vsnprintf_s(str, size, _TRUNCATE, format, ap);
49 count = _vscprintf(format, ap);
54 static_inline int c99_snprintf(
char* str,
size_t size,
const char* format, ...)
60 count = c99_vsnprintf(str, size, format, ap);
71 #define GPU_BLIT_BUFFER_VERTICES_PER_SPRITE 4 72 #define GPU_BLIT_BUFFER_INIT_MAX_NUM_VERTICES (GPU_BLIT_BUFFER_VERTICES_PER_SPRITE*1000) 76 #define GPU_BLIT_BUFFER_ABSOLUTE_MAX_VERTICES 60000 78 #define GPU_INDEX_BUFFER_ABSOLUTE_MAX_VERTICES 4000000000u 82 #define GPU_BLIT_BUFFER_FLOATS_PER_VERTEX 8 85 #define GPU_BLIT_BUFFER_STRIDE (sizeof(float)*GPU_BLIT_BUFFER_FLOATS_PER_VERTEX) 86 #define GPU_BLIT_BUFFER_VERTEX_OFFSET 0 87 #define GPU_BLIT_BUFFER_TEX_COORD_OFFSET 2 88 #define GPU_BLIT_BUFFER_COLOR_OFFSET 4 95 #ifdef SDL_GPU_USE_SDL2 97 #define GET_ALPHA(sdl_color) ((sdl_color).a) 101 return SDL_GetWindowFromID(windowID);
106 return SDL_GetWindowID(window);
111 SDL_GetWindowSize(window, w, h);
116 SDL_GL_GetDrawableSize(window, w, h);
121 SDL_SetWindowSize(SDL_GetWindowFromID(target->
context->
windowID), w, h);
126 return (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN);
131 return (SDL_GetColorKey(surface, NULL) == 0);
136 #define SDL_Window SDL_Surface 137 #define GET_ALPHA(sdl_color) ((sdl_color).unused) 141 return (windowID == 1? SDL_GetVideoSurface() : NULL);
146 return (SDL_GetVideoSurface() == window? 1 : 0);
164 SDL_Surface* screen = SDL_GetVideoSurface();
165 Uint32 flags = screen->flags;
167 screen = SDL_SetVideoMode(w, h, 0, flags);
169 screen = SDL_SetVideoMode(w, h, 0, flags);
174 return (window->flags & SDL_FULLSCREEN);
179 return (surface->flags & SDL_SRCCOLORKEY);
189 if(target == NULL || target->
context == NULL)
198 if(target == NULL || target->
context == NULL)
207 #ifndef GL_VERTEX_SHADER 208 #ifndef SDL_GPU_DISABLE_SHADERS 209 #define SDL_GPU_DISABLE_SHADERS 215 #ifdef SDL_GPU_USE_OPENGL 223 static SDL_PixelFormat* AllocFormat(GLenum glFormat);
224 static void FreeFormat(SDL_PixelFormat* format);
227 static char shader_message[256];
231 static GPU_bool isExtensionSupported(
const char* extension_str)
233 #ifdef SDL_GPU_USE_OPENGL 234 return glewIsExtensionSupported(extension_str);
237 char* p = (
char*)glGetString(GL_EXTENSIONS);
239 unsigned long extNameLen;
244 extNameLen = strlen(extension_str);
249 unsigned long n = strcspn(p,
" ");
250 if((extNameLen == n) && (strncmp(extension_str, p, n) == 0))
265 #ifdef SDL_GPU_USE_OPENGL 266 #if SDL_GPU_GL_MAJOR_VERSION >= 2 270 if(isExtensionSupported(
"GL_ARB_texture_non_power_of_two"))
275 #elif defined(SDL_GPU_USE_GLES) 276 #if SDL_GPU_GLES_MAJOR_VERSION >= 3 280 if(isExtensionSupported(
"GL_OES_texture_npot") || isExtensionSupported(
"GL_IMG_texture_npot")
281 || isExtensionSupported(
"GL_APPLE_texture_2D_limited_npot") || isExtensionSupported(
"GL_ARB_texture_non_power_of_two"))
286 #if SDL_GPU_GLES_MAJOR_VERSION >= 2 294 #ifdef SDL_GPU_USE_OPENGL 295 #if SDL_GPU_GL_MAJOR_VERSION >= 3 299 if(isExtensionSupported(
"GL_EXT_framebuffer_object"))
304 #elif defined(SDL_GPU_USE_GLES) 305 #if SDL_GPU_GLES_MAJOR_VERSION >= 2 309 if(isExtensionSupported(
"GL_OES_framebuffer_object"))
317 #ifdef SDL_GPU_USE_OPENGL 321 #if SDL_GPU_GL_MAJOR_VERSION >= 2 325 if(isExtensionSupported(
"GL_EXT_blend_equation_separate"))
331 #elif defined(SDL_GPU_USE_GLES) 333 #if SDL_GPU_GLES_MAJOR_VERSION >= 2 339 if(isExtensionSupported(
"GL_OES_blend_subtract"))
344 if(isExtensionSupported(
"GL_OES_blend_func_separate"))
349 if(isExtensionSupported(
"GL_OES_blend_equation_separate"))
357 #ifdef SDL_GPU_USE_OPENGL 358 #if SDL_GPU_GL_MAJOR_VERSION >= 2 361 if(isExtensionSupported(
"GL_ARB_texture_mirrored_repeat"))
366 #elif defined(SDL_GPU_USE_GLES) 367 #if SDL_GPU_GLES_MAJOR_VERSION >= 2 370 if(isExtensionSupported(
"GL_OES_texture_mirrored_repeat"))
378 if(isExtensionSupported(
"GL_EXT_bgr"))
380 if(isExtensionSupported(
"GL_EXT_bgra"))
382 if(isExtensionSupported(
"GL_EXT_abgr"))
387 #ifdef SDL_GPU_USE_GLES 394 #ifndef SDL_GPU_DISABLE_SHADERS 395 if(isExtensionSupported(
"GL_ARB_fragment_shader"))
397 if(isExtensionSupported(
"GL_ARB_vertex_shader"))
399 if(isExtensionSupported(
"GL_ARB_geometry_shader4"))
402 #ifdef SDL_GPU_ASSUME_SHADERS 407 static void extBindFramebuffer(
GPU_Renderer* renderer, GLuint handle)
416 return ((x != 0) && !(x & (x - 1)));
435 renderer->
impl->FlushBlitBuffer(renderer);
437 glBindTexture( GL_TEXTURE_2D, handle );
445 renderer->
impl->FlushBlitBuffer(renderer);
447 glBindTexture( GL_TEXTURE_2D, handle );
462 renderer->
impl->FlushBlitBuffer(renderer);
464 extBindFramebuffer(renderer, handle);
485 renderer->
impl->FlushBlitBuffer(renderer);
487 extBindFramebuffer(renderer, handle);
495 renderer->
impl->FlushBlitBuffer(renderer);
503 renderer->
impl->FlushBlitBuffer(renderer);
519 renderer->
impl->FlushBlitBuffer(renderer);
526 unsigned int new_max_num_vertices;
529 if(minimum_vertices_needed <= cdata->blit_buffer_max_num_vertices)
535 new_max_num_vertices = ((
unsigned int)cdata->blit_buffer_max_num_vertices) * 2;
536 while(new_max_num_vertices <= minimum_vertices_needed)
537 new_max_num_vertices *= 2;
545 memcpy(new_buffer, cdata->blit_buffer, cdata->blit_buffer_num_vertices * GPU_BLIT_BUFFER_STRIDE);
546 SDL_free(cdata->blit_buffer);
547 cdata->blit_buffer = new_buffer;
548 cdata->blit_buffer_max_num_vertices = new_max_num_vertices;
550 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 552 #if !defined(SDL_GPU_NO_VAO) 553 glBindVertexArray(cdata->blit_VAO);
561 #if !defined(SDL_GPU_NO_VAO) 562 glBindVertexArray(0);
571 unsigned int new_max_num_vertices;
572 unsigned short* new_indices;
574 if(minimum_vertices_needed <= cdata->index_buffer_max_num_vertices)
580 new_max_num_vertices = cdata->index_buffer_max_num_vertices * 2;
581 while(new_max_num_vertices <= minimum_vertices_needed)
582 new_max_num_vertices *= 2;
589 new_indices = (
unsigned short*)SDL_malloc(new_max_num_vertices *
sizeof(
unsigned short));
590 memcpy(new_indices, cdata->index_buffer, cdata->index_buffer_num_vertices *
sizeof(
unsigned short));
591 SDL_free(cdata->index_buffer);
592 cdata->index_buffer = new_indices;
593 cdata->index_buffer_max_num_vertices = new_max_num_vertices;
595 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 597 #if !defined(SDL_GPU_NO_VAO) 598 glBindVertexArray(cdata->blit_VAO);
602 glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof(
unsigned short) * cdata->index_buffer_max_num_vertices, NULL, GL_DYNAMIC_DRAW);
604 #if !defined(SDL_GPU_NO_VAO) 605 glBindVertexArray(0);
619 renderer->
impl->FlushBlitBuffer(renderer);
621 #ifdef SDL_GPU_USE_SDL2 632 glEnable(GL_SCISSOR_TEST);
653 glDisable(GL_SCISSOR_TEST);
659 renderer->
impl->SetCamera(renderer, target, &target->
camera);
664 static void changeColor(
GPU_Renderer* renderer, SDL_Color color)
666 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 672 if(cdata->last_color.r != color.r
673 || cdata->last_color.g != color.g
674 || cdata->last_color.b != color.b
677 renderer->
impl->FlushBlitBuffer(renderer);
678 cdata->last_color = color;
679 glColor4f(color.r/255.01f, color.g/255.01f, color.b/255.01f,
GET_ALPHA(color)/255.01f);
687 if(cdata->last_use_blending == enable)
690 renderer->
impl->FlushBlitBuffer(renderer);
697 cdata->last_use_blending = enable;
704 renderer->
impl->FlushBlitBuffer(renderer);
706 cdata->last_blend_mode = mode;
741 if(cdata->last_blend_mode.source_color == mode.
source_color 742 && cdata->last_blend_mode.dest_color == mode.
dest_color 743 && cdata->last_blend_mode.source_alpha == mode.
source_alpha 744 && cdata->last_blend_mode.dest_alpha == mode.
dest_alpha 749 forceChangeBlendMode(renderer, mode);
754 static Uint32 get_proper_program_id(
GPU_Renderer* renderer, Uint32 program_object)
760 if(program_object == 0)
763 return program_object;
774 #ifndef SDL_GPU_SKIP_ENABLE_TEXTURE_2D 776 glEnable(GL_TEXTURE_2D);
778 glDisable(GL_TEXTURE_2D);
788 renderer->
impl->FlushBlitBuffer(renderer);
791 #ifndef SDL_GPU_SKIP_ENABLE_TEXTURE_2D 793 glEnable(GL_TEXTURE_2D);
795 glDisable(GL_TEXTURE_2D);
804 renderer->
impl->FlushBlitBuffer(renderer);
813 renderer->
impl->FlushBlitBuffer(renderer);
818 static void upload_texture(
const void* pixels,
GPU_Rect update_rect, Uint32 format,
int alignment,
int row_length,
unsigned int pitch)
820 glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
821 #if defined(SDL_GPU_USE_OPENGL) || SDL_GPU_GLES_MAJOR_VERSION > 2 822 glPixelStorei(GL_UNPACK_ROW_LENGTH, row_length);
824 glTexSubImage2D(GL_TEXTURE_2D, 0,
825 update_rect.
x, update_rect.
y, update_rect.
w, update_rect.
h,
826 format, GL_UNSIGNED_BYTE, pixels);
828 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
831 unsigned int h = update_rect.
h;
832 if(h > 0 && update_rect.
w > 0.0f)
836 for(i = 0; i < h; ++i)
838 glTexSubImage2D(GL_TEXTURE_2D, 0,
839 update_rect.
x, update_rect.
y + i, update_rect.
w, 1,
840 format, GL_UNSIGNED_BYTE, pixels);
845 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
848 static void upload_new_texture(
void* pixels,
GPU_Rect update_rect, Uint32 format,
int alignment,
int row_length,
int bytes_per_pixel)
850 glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
851 #if defined(SDL_GPU_USE_OPENGL) || SDL_GPU_GLES_MAJOR_VERSION > 2 852 glPixelStorei(GL_UNPACK_ROW_LENGTH, row_length);
854 glTexImage2D(GL_TEXTURE_2D, 0, format, update_rect.
w, update_rect.
h, 0,
855 format, GL_UNSIGNED_BYTE, pixels);
857 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
858 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
860 glTexImage2D(GL_TEXTURE_2D, 0, format, update_rect.
w, update_rect.
h, 0,
861 format, GL_UNSIGNED_BYTE, NULL);
864 upload_texture(pixels, update_rect, format, alignment, row_length, row_length*bytes_per_pixel);
868 #define MIX_COLOR_COMPONENT_NORMALIZED_RESULT(a, b) ((a)/255.0f * (b)/255.0f) 869 #define MIX_COLOR_COMPONENT(a, b) (((a)/255.0f * (b)/255.0f)*255) 891 enableTexturing(renderer);
894 renderer->
impl->FlushBlitBuffer(renderer);
899 changeColor(renderer, get_complete_mod_color(renderer, target, image));
908 static void prepareToRenderShapes(
GPU_Renderer* renderer,
unsigned int shape)
912 disableTexturing(renderer);
915 renderer->
impl->FlushBlitBuffer(renderer);
936 cdata->last_viewport = viewport;
942 if(target->
image != NULL)
943 y = target->
image->
h - viewport.
h - viewport.
y;
944 else if(target->
context != NULL)
948 glViewport(viewport.
x, y, viewport.
w, viewport.
h);
951 static void changeViewport(
GPU_Target* target)
955 if(cdata->last_viewport.x == target->
viewport.
x && cdata->last_viewport.y == target->
viewport.
y && cdata->last_viewport.w == target->
viewport.
w && cdata->last_viewport.h == target->
viewport.
h)
958 forceChangeViewport(target, target->
viewport);
961 static void applyTargetCamera(
GPU_Target* target)
965 cdata->last_camera = target->
camera;
966 cdata->last_camera_inverted = (target->
image != NULL);
980 applyTargetCamera(target);
984 static void get_camera_matrix(
float* result,
GPU_Camera camera)
988 GPU_bool invert = cdata->last_camera_inverted;
989 float offsetX, offsetY;
1000 offsetX = target->
w/2.0f;
1001 offsetY = target->
h/2.0f;
1014 #ifdef SDL_GPU_APPLY_TRANSFORMS_TO_GL_STACK 1015 static void applyTransforms(
void)
1021 float cam_matrix[16];
1022 get_camera_matrix(cam_matrix, cdata->last_camera);
1026 glMatrixMode(GL_PROJECTION);
1028 glMatrixMode(GL_MODELVIEW);
1039 #ifdef SDL_GPU_USE_OPENGL 1040 const char* vendor_string;
1053 if(GPU_flags & GPU_INIT_DISABLE_DOUBLE_BUFFER)
1054 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 0);
1056 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
1057 #ifdef SDL_GPU_USE_SDL2 1060 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 0);
1061 #ifdef SDL_GPU_USE_GLES 1062 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
1066 #if SDL_GPU_GL_MAJOR_VERSION == 3 1069 if(GPU_flags & GPU_INIT_REQUEST_COMPATIBILITY_PROFILE)
1070 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);
1073 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
1084 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, renderer_request.
major_version);
1085 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, renderer_request.
minor_version);
1088 if(!(GPU_flags & GPU_INIT_DISABLE_VSYNC))
1089 SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1);
1092 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
1094 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
1095 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
1096 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
1097 SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
1101 #ifdef SDL_GPU_USE_SDL2 1121 SDL_flags |= SDL_WINDOW_OPENGL;
1122 if(!(SDL_flags & SDL_WINDOW_HIDDEN))
1123 SDL_flags |= SDL_WINDOW_SHOWN;
1126 window = SDL_CreateWindow(
"",
1127 SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
1143 SDL_flags |= SDL_OPENGL;
1145 window = SDL_SetVideoMode(w, h, 0, SDL_flags);
1166 #ifdef SDL_GPU_USE_OPENGL 1167 vendor_string = (
const char*)glGetString(GL_VENDOR);
1168 if(strstr(vendor_string,
"Intel") != NULL)
1170 vendor_is_Intel = 1;
1171 apply_Intel_attrib_workaround = 1;
1184 static GPU_bool get_GL_version(
int* major,
int* minor)
1186 const char* version_string;
1187 #ifdef SDL_GPU_USE_OPENGL 1189 version_string = (
const char*)glGetString(GL_VERSION);
1190 if(version_string == NULL || sscanf(version_string,
"%d.%d", major, minor) <= 0)
1194 #if SDL_GPU_GL_MAJOR_VERSION != 3 1206 version_string = (
const char*)glGetString(GL_VERSION);
1208 if(version_string == NULL || sscanf(version_string,
"OpenGL ES %d.%d", major, minor) <= 0)
1211 if(version_string == NULL || sscanf(version_string,
"OpenGL ES-C%*c %d.%d", major, minor) <= 0)
1215 #if SDL_GPU_GLES_MAJOR_VERSION == 1 1229 static GPU_bool get_GLSL_version(
int* version)
1231 #ifndef SDL_GPU_DISABLE_SHADERS 1232 const char* version_string;
1234 #ifdef SDL_GPU_USE_OPENGL 1236 version_string = (
const char*)glGetString(GL_SHADING_LANGUAGE_VERSION);
1237 if(version_string == NULL || sscanf(version_string,
"%d.%d", &major, &minor) <= 0)
1244 *version = major*100 + minor;
1248 version_string = (
const char*)glGetString(GL_SHADING_LANGUAGE_VERSION);
1249 if(version_string == NULL || sscanf(version_string,
"OpenGL ES GLSL ES %d.%d", &major, &minor) <= 0)
1256 *version = major*100 + minor;
1270 static void update_stored_dimensions(
GPU_Target* target)
1295 int framebuffer_handle;
1296 SDL_Color white = { 255, 255, 255, 255 };
1297 #ifdef SDL_GPU_USE_OPENGL 1304 int blit_buffer_storage_size;
1305 int index_buffer_storage_size;
1315 target->
image = NULL;
1323 cdata->last_image = NULL;
1324 cdata->last_target = NULL;
1327 cdata->blit_buffer_num_vertices = 0;
1329 cdata->blit_buffer = (
float*)SDL_malloc(blit_buffer_storage_size);
1331 cdata->index_buffer_num_vertices = 0;
1333 cdata->index_buffer = (
unsigned short*)SDL_malloc(index_buffer_storage_size);
1348 SDL_free(cdata->blit_buffer);
1349 SDL_free(cdata->index_buffer);
1352 SDL_free(target->
data);
1361 #ifdef SDL_GPU_USE_SDL2 1369 SDL_free(cdata->blit_buffer);
1370 SDL_free(cdata->index_buffer);
1373 SDL_free(target->
data);
1390 update_stored_dimensions(target);
1419 cdata->last_color = white;
1421 cdata->last_use_texturing =
GPU_TRUE;
1422 cdata->last_shape = GL_TRIANGLES;
1427 cdata->last_viewport = target->
viewport;
1428 cdata->last_camera = target->
camera;
1429 cdata->last_camera_inverted =
GPU_FALSE;
1431 #ifdef SDL_GPU_USE_OPENGL 1432 glewExperimental = GL_TRUE;
1445 framebuffer_handle = 0;
1451 if(!get_API_versions(renderer))
1463 init_features(renderer);
1465 if(!IsFeatureEnabled(renderer, required_features))
1472 #ifdef SDL_GPU_USE_SDL2 1474 if(!(renderer->
GPU_init_flags & (GPU_INIT_DISABLE_VSYNC | GPU_INIT_ENABLE_VSYNC)))
1477 if(SDL_GL_SetSwapInterval(-1) < 0)
1478 SDL_GL_SetSwapInterval(1);
1481 SDL_GL_SetSwapInterval(1);
1483 SDL_GL_SetSwapInterval(0);
1497 #ifndef SDL_GPU_SKIP_ENABLE_TEXTURE_2D 1498 glEnable(GL_TEXTURE_2D);
1500 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1502 glDisable(GL_BLEND);
1503 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
1508 glClear( GL_COLOR_BUFFER_BIT );
1509 #if SDL_GPU_GL_TIER < 3 1510 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
1514 applyTargetCamera(target);
1516 renderer->
impl->SetLineThickness(renderer, 1.0f);
1519 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 1521 #if !defined(SDL_GPU_NO_VAO) 1522 glGenVertexArrays(1, &cdata->blit_VAO);
1523 glBindVertexArray(cdata->blit_VAO);
1531 #ifndef SDL_GPU_DISABLE_SHADERS 1542 #ifdef SDL_GPU_ENABLE_CORE_SHADERS 1572 p = renderer->
impl->CreateShaderProgram(renderer);
1573 renderer->
impl->AttachShader(renderer, p, v);
1574 renderer->
impl->AttachShader(renderer, p, f);
1575 renderer->
impl->LinkShaderProgram(renderer, p);
1609 p = renderer->
impl->CreateShaderProgram(renderer);
1610 renderer->
impl->AttachShader(renderer, p, v);
1611 renderer->
impl->AttachShader(renderer, p, f);
1612 renderer->
impl->LinkShaderProgram(renderer, p);
1632 snprintf(shader_message, 256,
"Shaders not supported by this hardware. Default shaders are disabled.\n");
1636 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 1648 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cdata->blit_IBO);
1649 glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof(
unsigned short) * cdata->blit_buffer_max_num_vertices, NULL, GL_DYNAMIC_DRAW);
1676 if(target->
image != NULL)
1689 if(target == NULL || target->
context == NULL)
1692 if(target->
image != NULL)
1696 #ifdef SDL_GPU_USE_SDL2 1701 #ifdef SDL_GPU_USE_SDL2 1702 SDL_GL_MakeCurrent(SDL_GetWindowFromID(windowID), target->
context->
context);
1708 renderer->
impl->FlushBlitBuffer(renderer);
1758 #ifdef SDL_GPU_USE_SDL2 1763 #ifndef SDL_GPU_USE_BUFFER_PIPELINE 1764 glColor4f(cdata->last_color.r/255.01f, cdata->last_color.g/255.01f, cdata->last_color.b/255.01f,
GET_ALPHA(cdata->last_color)/255.01f);
1766 #ifndef SDL_GPU_SKIP_ENABLE_TEXTURE_2D 1767 if(cdata->last_use_texturing)
1768 glEnable(GL_TEXTURE_2D);
1770 glDisable(GL_TEXTURE_2D);
1773 if(cdata->last_use_blending)
1776 glDisable(GL_BLEND);
1778 forceChangeBlendMode(renderer, cdata->last_blend_mode);
1780 forceChangeViewport(target, target->
viewport);
1782 if(cdata->last_image != NULL)
1783 glBindTexture(GL_TEXTURE_2D, ((
GPU_IMAGE_DATA*)(cdata->last_image)->data)->handle);
1785 if(cdata->last_target != NULL)
1786 extBindFramebuffer(renderer, ((
GPU_TARGET_DATA*)cdata->last_target->data)->handle);
1797 renderer->
impl->FlushBlitBuffer(renderer);
1809 #ifdef SDL_GPU_USE_SDL1 1822 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
1823 glClear( GL_COLOR_BUFFER_BIT );
1827 update_stored_dimensions(target);
1840 changeViewport(target);
1845 applyTargetCamera(target);
1859 renderer->
impl->FlushBlitBuffer(renderer);
1866 applyTargetCamera(target);
1878 renderer->
impl->FlushBlitBuffer(renderer);
1886 applyTargetCamera(target);
1901 #ifdef SDL_GPU_USE_SDL2 1903 Uint32 old_flags = SDL_GetWindowFlags(window);
1904 GPU_bool was_fullscreen = (old_flags & SDL_WINDOW_FULLSCREEN);
1905 GPU_bool is_fullscreen = was_fullscreen;
1909 if(enable_fullscreen)
1911 if(use_desktop_resolution)
1912 flags = SDL_WINDOW_FULLSCREEN_DESKTOP;
1914 flags = SDL_WINDOW_FULLSCREEN;
1917 if(SDL_SetWindowFullscreen(window, flags) >= 0)
1919 flags = SDL_GetWindowFlags(window);
1920 is_fullscreen = (flags & SDL_WINDOW_FULLSCREEN);
1925 if(!was_fullscreen && is_fullscreen)
1937 SDL_Surface* surf = SDL_GetVideoSurface();
1938 GPU_bool was_fullscreen = (surf->flags & SDL_FULLSCREEN);
1939 GPU_bool is_fullscreen = was_fullscreen;
1941 if(was_fullscreen ^ enable_fullscreen)
1943 SDL_WM_ToggleFullScreen(surf);
1944 is_fullscreen = (surf->flags & SDL_FULLSCREEN);
1949 if(is_fullscreen != was_fullscreen)
1965 changeViewport(target);
1972 applyTargetCamera(target);
1978 return is_fullscreen;
1998 old_camera = target->
camera;
2000 if(!equal_cameras(new_camera, old_camera))
2003 renderer->
impl->FlushBlitBuffer(renderer);
2005 target->
camera = new_camera;
2011 static GLuint CreateUninitializedTexture(
GPU_Renderer* renderer)
2015 glGenTextures(1, &handle);
2022 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2023 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2024 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2025 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2026 #if defined(SDL_GPU_USE_GLES) && (SDL_GPU_GLES_TIER == 1) 2027 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
2029 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
2037 GLuint handle, num_layers, bytes_per_pixel;
2041 SDL_Color white = { 255, 255, 255, 255 };
2046 gl_format = GL_LUMINANCE;
2048 bytes_per_pixel = 1;
2051 gl_format = GL_LUMINANCE_ALPHA;
2053 bytes_per_pixel = 2;
2058 bytes_per_pixel = 3;
2061 gl_format = GL_RGBA;
2063 bytes_per_pixel = 4;
2066 gl_format = GL_ALPHA;
2068 bytes_per_pixel = 1;
2070 #ifndef SDL_GPU_USE_GLES 2074 bytes_per_pixel = 2;
2078 gl_format = GL_LUMINANCE;
2080 bytes_per_pixel = 1;
2083 gl_format = GL_LUMINANCE;
2085 bytes_per_pixel = 1;
2092 if(bytes_per_pixel < 1 || bytes_per_pixel > 4)
2099 handle = CreateUninitializedTexture(renderer);
2122 result->
color = white;
2130 result->
data = data;
2132 data->handle = handle;
2134 data->format = gl_format;
2152 GLenum internal_format;
2153 static unsigned char* zero_buffer = NULL;
2154 static unsigned int zero_buffer_size = 0;
2162 result = CreateUninitializedImage(renderer, w, h, format);
2170 changeTexturing(renderer,
GPU_TRUE);
2171 bindTexture(renderer, result);
2187 SDL_free(zero_buffer);
2189 zero_buffer = (
unsigned char*)SDL_malloc(zero_buffer_size);
2190 memset(zero_buffer, 0, zero_buffer_size);
2208 #ifdef SDL_GPU_DISABLE_TEXTURE_GETS 2214 GLuint num_layers, bytes_per_pixel;
2216 GLint wrap_s, wrap_t;
2222 SDL_Color white = { 255, 255, 255, 255 };
2227 #ifdef SDL_GPU_USE_GLES 2237 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &gl_format);
2244 bytes_per_pixel = 1;
2246 case GL_LUMINANCE_ALPHA:
2249 bytes_per_pixel = 2;
2254 bytes_per_pixel = 3;
2259 bytes_per_pixel = 4;
2264 bytes_per_pixel = 1;
2266 #ifndef SDL_GPU_USE_GLES 2270 bytes_per_pixel = 2;
2278 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
2279 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
2282 glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &min_filter);
2292 case GL_LINEAR_MIPMAP_NEAREST:
2295 case GL_LINEAR_MIPMAP_LINEAR:
2305 glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &wrap_s);
2306 glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &wrap_t);
2311 case GL_CLAMP_TO_EDGE:
2328 case GL_CLAMP_TO_EDGE:
2347 data->handle = handle;
2348 data->owns_handle = take_ownership;
2349 data->format = gl_format;
2365 result->
color = white;
2373 result->
data = data;
2417 renderer->
impl->FlushBlitBuffer(renderer);
2419 if(bindFramebuffer(renderer, source))
2421 glReadPixels(0, 0, source->
base_w, source->
base_h, format, GL_UNSIGNED_BYTE, pixels);
2429 #ifdef SDL_GPU_USE_GLES 2438 #ifdef SDL_GPU_USE_GLES 2441 if(source->
target == NULL)
2449 result = readTargetPixels(renderer, source->
target, format, pixels);
2452 renderer->
impl->FreeTarget(renderer, source->
target);
2458 glGetTexImage(GL_TEXTURE_2D, 0, format, GL_UNSIGNED_BYTE, pixels);
2468 int bytes_per_pixel;
2469 unsigned char* data;
2471 unsigned char* copy;
2475 renderer->
impl->FlushBlitBuffer(renderer);
2477 bytes_per_pixel = 4;
2478 if(target->
image != NULL)
2480 data = (
unsigned char*)SDL_malloc(target->
base_w * target->
base_h * bytes_per_pixel);
2490 pitch = target->
base_w * bytes_per_pixel;
2491 copy = (
unsigned char*)SDL_malloc(pitch);
2493 for(y = 0; y < target->
base_h/2; y++)
2495 unsigned char* top = &data[target->
base_w * y * bytes_per_pixel];
2496 unsigned char* bottom = &data[target->
base_w * (target->
base_h - y - 1) * bytes_per_pixel];
2497 memcpy(copy, top, pitch);
2498 memcpy(top, bottom, pitch);
2499 memcpy(bottom, copy, pitch);
2508 unsigned char* data;
2511 renderer->
impl->FlushBlitBuffer(renderer);
2528 SDL_Surface* surface;
2530 if(image == NULL || filename == NULL ||
2543 SDL_FreeSurface(surface);
2549 unsigned char* data;
2550 SDL_Surface* result;
2551 SDL_PixelFormat* format;
2564 data = getRawTargetData(renderer, target);
2574 result = SDL_CreateRGBSurface(SDL_SWSURFACE, target->
base_w, target->
base_h, format->BitsPerPixel, format->Rmask, format->Gmask, format->Bmask, format->Amask);
2586 int source_pitch = target->
base_w*format->BytesPerPixel;
2587 for(i = 0; i < target->
base_h; ++i)
2589 memcpy((Uint8*)result->pixels + i*result->pitch, data + source_pitch*i, source_pitch);
2601 unsigned char* data;
2602 SDL_Surface* result;
2603 SDL_PixelFormat* format;
2611 if(image->
w < 1 || image->
h < 1)
2628 data = getRawImageData(renderer, image);
2638 result = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, format->BitsPerPixel, format->Rmask, format->Gmask, format->Bmask, format->Amask);
2650 int source_pitch = image->
texture_w*format->BytesPerPixel;
2651 for(i = 0; i < h; ++i)
2653 memcpy((Uint8*)result->pixels + i*result->pitch, data + source_pitch*i, result->pitch);
2679 #ifdef SDL_GPU_USE_GLES 2681 static int compareFormats(
GPU_Renderer* renderer, GLenum glFormat, SDL_Surface* surface, GLenum* surfaceFormatResult)
2683 SDL_PixelFormat* format = surface->format;
2688 if(format->BytesPerPixel != 3)
2691 if(format->Rmask == 0x0000FF && format->Gmask == 0x00FF00 && format->Bmask == 0xFF0000)
2693 if(surfaceFormatResult != NULL)
2694 *surfaceFormatResult = GL_RGB;
2698 if(format->Rmask == 0xFF0000 && format->Gmask == 0x00FF00 && format->Bmask == 0x0000FF)
2702 if(surfaceFormatResult != NULL)
2703 *surfaceFormatResult = GL_BGR;
2711 if(format->BytesPerPixel != 4)
2714 if (format->Rmask == 0x000000FF && format->Gmask == 0x0000FF00 && format->Bmask == 0x00FF0000)
2716 if(surfaceFormatResult != NULL)
2717 *surfaceFormatResult = GL_RGBA;
2721 if (format->Rmask == 0x00FF0000 && format->Gmask == 0x0000FF00 && format->Bmask == 0x000000FF)
2725 if(surfaceFormatResult != NULL)
2726 *surfaceFormatResult = GL_BGRA;
2732 if (format->Rmask == 0xFF000000 && format->Gmask == 0x00FF0000 && format->Bmask == 0x0000FF00)
2736 if(surfaceFormatResult != NULL)
2737 *surfaceFormatResult = GL_ABGR;
2750 static int compareFormats(
GPU_Renderer* renderer, GLenum glFormat, SDL_Surface* surface, GLenum* surfaceFormatResult)
2752 SDL_PixelFormat* format = surface->format;
2757 if(format->BytesPerPixel != 3)
2761 if(format->Rmask == 0x0000FF && format->Gmask == 0x00FF00 && format->Bmask == 0xFF0000)
2763 if(surfaceFormatResult != NULL)
2764 *surfaceFormatResult = GL_RGB;
2768 if(format->Rmask == 0xFF0000 && format->Gmask == 0x00FF00 && format->Bmask == 0x0000FF)
2773 if(surfaceFormatResult != NULL)
2774 *surfaceFormatResult = GL_BGR;
2784 if(format->BytesPerPixel != 4)
2788 if(format->Rmask == 0x000000FF && format->Gmask == 0x0000FF00 && format->Bmask == 0x00FF0000)
2790 if(surfaceFormatResult != NULL)
2791 *surfaceFormatResult = GL_RGBA;
2795 if(format->Rmask == 0xFF000000 && format->Gmask == 0x00FF0000 && format->Bmask == 0x0000FF00)
2800 if(surfaceFormatResult != NULL)
2801 *surfaceFormatResult = GL_ABGR;
2807 else if(format->Rmask == 0x00FF0000 && format->Gmask == 0x0000FF00 && format->Bmask == 0x000000FF)
2813 if(surfaceFormatResult != NULL)
2814 *surfaceFormatResult = GL_BGRA;
2829 static SDL_PixelFormat* AllocFormat(GLenum glFormat)
2833 Uint32 Rmask, Gmask, Bmask, Amask = 0, mask;
2834 SDL_PixelFormat* result;
2883 result = (SDL_PixelFormat*)SDL_malloc(
sizeof(SDL_PixelFormat));
2884 memset(result, 0,
sizeof(SDL_PixelFormat));
2886 result->BitsPerPixel = 8*channels;
2887 result->BytesPerPixel = channels;
2889 result->Rmask = Rmask;
2893 for (mask = Rmask; !(mask & 0x01); mask >>= 1)
2895 for (; (mask & 0x01); mask >>= 1)
2899 result->Gmask = Gmask;
2903 for (mask = Gmask; !(mask & 0x01); mask >>= 1)
2905 for (; (mask & 0x01); mask >>= 1)
2909 result->Bmask = Bmask;
2913 for (mask = Bmask; !(mask & 0x01); mask >>= 1)
2915 for (; (mask & 0x01); mask >>= 1)
2919 result->Amask = Amask;
2923 for (mask = Amask; !(mask & 0x01); mask >>= 1)
2925 for (; (mask & 0x01); mask >>= 1)
2932 static void FreeFormat(SDL_PixelFormat* format)
2939 static SDL_Surface* copySurfaceIfNeeded(
GPU_Renderer* renderer, GLenum glFormat, SDL_Surface* surface, GLenum* surfaceFormatResult)
2941 #ifdef SDL_GPU_USE_GLES 2942 SDL_Surface* original = surface;
2946 int format_compare = compareFormats(renderer, glFormat, surface, surfaceFormatResult);
2949 if(format_compare < 0)
2954 if(format_compare > 0)
2957 SDL_PixelFormat* dst_fmt = AllocFormat(glFormat);
2958 surface = SDL_ConvertSurface(surface, dst_fmt, 0);
2959 FreeFormat(dst_fmt);
2960 if(surfaceFormatResult != NULL && surface != NULL)
2961 *surfaceFormatResult = glFormat;
3003 SDL_Color color = image->
color;
3007 Uint16 w = 0, h = 0;
3018 renderer->
impl->Blit(renderer, image, NULL, target, image->
w / 2, image->
h / 2);
3040 GLenum internal_format;
3043 unsigned char* texture_data = getRawImageData(renderer, image);
3044 if(texture_data == NULL)
3053 SDL_free(texture_data);
3058 changeTexturing(renderer, 1);
3059 bindTexture(renderer, result);
3079 SDL_free(texture_data);
3097 result = gpu_copy_image_pixels_only(renderer, image);
3122 GLenum original_format;
3124 SDL_Surface* newSurface;
3130 if(image == NULL || surface == NULL)
3134 original_format = data->format;
3136 newSurface = copySurfaceIfNeeded(renderer, data->format, surface, &original_format);
3137 if(newSurface == NULL)
3143 if(image_rect != NULL)
3145 updateRect = *image_rect;
3146 if(updateRect.
x < 0)
3148 updateRect.
w += updateRect.
x;
3151 if(updateRect.
y < 0)
3153 updateRect.
h += updateRect.
y;
3156 if(updateRect.
x + updateRect.
w > image->
base_w)
3157 updateRect.
w += image->
base_w - (updateRect.
x + updateRect.
w);
3158 if(updateRect.
y + updateRect.
h > image->
base_h)
3159 updateRect.
h += image->
base_h - (updateRect.
y + updateRect.
h);
3161 if(updateRect.
w <= 0)
3163 if(updateRect.
h <= 0)
3172 if(updateRect.
w < 0.0f || updateRect.
h < 0.0f)
3179 if(surface_rect != NULL)
3181 sourceRect = *surface_rect;
3182 if(sourceRect.
x < 0)
3184 sourceRect.
w += sourceRect.
x;
3187 if(sourceRect.
y < 0)
3189 sourceRect.
h += sourceRect.
y;
3192 if(sourceRect.
x + sourceRect.
w > newSurface->w)
3193 sourceRect.
w += newSurface->w - (sourceRect.
x + sourceRect.
w);
3194 if(sourceRect.
y + sourceRect.
h > newSurface->h)
3195 sourceRect.
h += newSurface->h - (sourceRect.
y + sourceRect.
h);
3197 if(sourceRect.
w <= 0)
3199 if(sourceRect.
h <= 0)
3206 sourceRect.
w = newSurface->w;
3207 sourceRect.
h = newSurface->h;
3211 changeTexturing(renderer, 1);
3213 renderer->
impl->FlushBlitBuffer(renderer);
3214 bindTexture(renderer, image);
3216 while(newSurface->pitch % alignment)
3220 if(sourceRect.
w < updateRect.
w)
3221 updateRect.
w = sourceRect.
w;
3222 if(sourceRect.
h < updateRect.
h)
3223 updateRect.
h = sourceRect.
h;
3225 pixels = (Uint8*)newSurface->pixels;
3227 pixels += (
int)(newSurface->pitch * sourceRect.
y + (newSurface->format->BytesPerPixel)*sourceRect.
x);
3229 upload_texture(pixels, updateRect, original_format, alignment, (newSurface->pitch / newSurface->format->BytesPerPixel), newSurface->pitch);
3233 if(surface != newSurface)
3234 SDL_FreeSurface(newSurface);
3239 static void UpdateImageBytes(
GPU_Renderer* renderer,
GPU_Image* image,
const GPU_Rect* image_rect,
const unsigned char* bytes,
int bytes_per_row)
3242 GLenum original_format;
3247 if(image == NULL || bytes == NULL)
3251 original_format = data->format;
3253 if(image_rect != NULL)
3255 updateRect = *image_rect;
3256 if(updateRect.
x < 0)
3258 updateRect.
w += updateRect.
x;
3261 if(updateRect.
y < 0)
3263 updateRect.
h += updateRect.
y;
3266 if(updateRect.
x + updateRect.
w > image->
base_w)
3267 updateRect.
w += image->
base_w - (updateRect.
x + updateRect.
w);
3268 if(updateRect.
y + updateRect.
h > image->
base_h)
3269 updateRect.
h += image->
base_h - (updateRect.
y + updateRect.
h);
3271 if(updateRect.
w <= 0)
3273 if(updateRect.
h <= 0)
3282 if(updateRect.
w < 0.0f || updateRect.
h < 0.0f)
3290 changeTexturing(renderer, 1);
3292 renderer->
impl->FlushBlitBuffer(renderer);
3293 bindTexture(renderer, image);
3295 while(bytes_per_row % alignment)
3298 upload_texture(bytes, updateRect, original_format, alignment, (bytes_per_row / image->
bytes_per_pixel), bytes_per_row);
3308 SDL_Surface* newSurface;
3309 GLenum internal_format;
3327 internal_format = data->format;
3329 newSurface = copySurfaceIfNeeded(renderer, internal_format, surface, &internal_format);
3330 if(newSurface == NULL)
3342 if(tdata->handle != 0)
3348 if(data->owns_handle)
3349 glDeleteTextures( 1, &data->handle);
3353 if(surface_rect == NULL)
3357 sourceRect.
w = surface->w;
3358 sourceRect.
h = surface->h;
3361 sourceRect = *surface_rect;
3364 if(sourceRect.
x < 0)
3366 sourceRect.
w += sourceRect.
x;
3369 if(sourceRect.
y < 0)
3371 sourceRect.
h += sourceRect.
y;
3374 if(sourceRect.
x >= surface->w)
3375 sourceRect.
x = surface->w - 1;
3376 if(sourceRect.
y >= surface->h)
3377 sourceRect.
y = surface->h - 1;
3379 if(sourceRect.
x + sourceRect.
w > surface->w)
3380 sourceRect.
w = surface->w - sourceRect.
x;
3381 if(sourceRect.
y + sourceRect.
h > surface->h)
3382 sourceRect.
h = surface->h - sourceRect.
y;
3384 if(sourceRect.
w <= 0 || sourceRect.
h <= 0)
3391 data->handle = CreateUninitializedTexture(renderer);
3392 data->owns_handle = 1;
3393 if(data->handle == 0)
3426 while(newSurface->pitch % alignment)
3429 pixels = (Uint8*)newSurface->pixels;
3431 pixels += (
int)(newSurface->pitch * sourceRect.
y + (newSurface->format->BytesPerPixel)*sourceRect.
x);
3433 upload_new_texture(pixels,
GPU_MakeRect(0, 0, w, h), internal_format, alignment, (newSurface->pitch / newSurface->format->BytesPerPixel), newSurface->format->BytesPerPixel);
3437 if(surface != newSurface)
3438 SDL_FreeSurface(newSurface);
3452 if(tdata->handle == 0)
3491 if(x < 0 || x >= Surface->w)
3494 bpp = Surface->format->BytesPerPixel;
3495 bits = ((Uint8*)Surface->pixels) + y*Surface->pitch + x*bpp;
3500 return *((Uint8*)Surface->pixels + y * Surface->pitch + x);
3503 return *((Uint16*)Surface->pixels + y * Surface->pitch/2 + x);
3509 r = *((bits)+Surface->format->Rshift/8);
3510 g = *((bits)+Surface->format->Gshift/8);
3511 b = *((bits)+Surface->format->Bshift/8);
3512 return SDL_MapRGB(Surface->format, r, g, b);
3516 return *((Uint32*)Surface->pixels + y * Surface->pitch/4 + x);
3534 if(surface->w == 0 || surface->h == 0)
3541 if(surface->format->Amask == 0)
3551 image = renderer->
impl->
CreateImage(renderer, surface->w, surface->h, format);
3555 renderer->
impl->UpdateImage(renderer, image, NULL, surface, NULL);
3568 if(target->
image != NULL)
3570 result = gpu_copy_image_pixels_only(renderer, target->
image);
3576 SDL_FreeSurface(surface);
3597 if(image->
target != NULL)
3601 renderer->
impl->FreeTarget(renderer, target);
3608 if(data->refcount > 1)
3614 if(data->owns_handle)
3617 glDeleteTextures( 1, &data->handle);
3637 if(image->
target != NULL)
3663 result->
data = data;
3664 data->handle = handle;
3670 result->
image = image;
3671 result->
w = image->
w;
3672 result->
h = image->
h;
3715 SDL_free(cdata->blit_buffer);
3716 SDL_free(cdata->index_buffer);
3718 #ifdef SDL_GPU_USE_SDL2 3740 renderer->
impl->FlushBlitBuffer(renderer);
3752 if(data->refcount > 1)
3763 if(data->handle != 0)
3771 SDL_free(cdata->blit_buffer);
3772 SDL_free(cdata->index_buffer);
3774 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 3778 #if !defined(SDL_GPU_NO_VAO) 3779 glDeleteVertexArrays(1, &cdata->blit_VAO);
3783 #ifdef SDL_GPU_USE_SDL2 3804 #define SET_TEXTURED_VERTEX(x, y, s, t, r, g, b, a) \ 3805 blit_buffer[vert_index] = x; \ 3806 blit_buffer[vert_index+1] = y; \ 3807 blit_buffer[tex_index] = s; \ 3808 blit_buffer[tex_index+1] = t; \ 3809 blit_buffer[color_index] = r; \ 3810 blit_buffer[color_index+1] = g; \ 3811 blit_buffer[color_index+2] = b; \ 3812 blit_buffer[color_index+3] = a; \ 3813 index_buffer[cdata->index_buffer_num_vertices++] = cdata->blit_buffer_num_vertices++; \ 3814 vert_index += GPU_BLIT_BUFFER_FLOATS_PER_VERTEX; \ 3815 tex_index += GPU_BLIT_BUFFER_FLOATS_PER_VERTEX; \ 3816 color_index += GPU_BLIT_BUFFER_FLOATS_PER_VERTEX; 3818 #define SET_TEXTURED_VERTEX_UNINDEXED(x, y, s, t, r, g, b, a) \ 3819 blit_buffer[vert_index] = x; \ 3820 blit_buffer[vert_index+1] = y; \ 3821 blit_buffer[tex_index] = s; \ 3822 blit_buffer[tex_index+1] = t; \ 3823 blit_buffer[color_index] = r; \ 3824 blit_buffer[color_index+1] = g; \ 3825 blit_buffer[color_index+2] = b; \ 3826 blit_buffer[color_index+3] = a; \ 3827 vert_index += GPU_BLIT_BUFFER_FLOATS_PER_VERTEX; \ 3828 tex_index += GPU_BLIT_BUFFER_FLOATS_PER_VERTEX; \ 3829 color_index += GPU_BLIT_BUFFER_FLOATS_PER_VERTEX; 3831 #define SET_UNTEXTURED_VERTEX(x, y, r, g, b, a) \ 3832 blit_buffer[vert_index] = x; \ 3833 blit_buffer[vert_index+1] = y; \ 3834 blit_buffer[color_index] = r; \ 3835 blit_buffer[color_index+1] = g; \ 3836 blit_buffer[color_index+2] = b; \ 3837 blit_buffer[color_index+3] = a; \ 3838 index_buffer[cdata->index_buffer_num_vertices++] = cdata->blit_buffer_num_vertices++; \ 3839 vert_index += GPU_BLIT_BUFFER_FLOATS_PER_VERTEX; \ 3840 color_index += GPU_BLIT_BUFFER_FLOATS_PER_VERTEX; 3842 #define SET_UNTEXTURED_VERTEX_UNINDEXED(x, y, r, g, b, a) \ 3843 blit_buffer[vert_index] = x; \ 3844 blit_buffer[vert_index+1] = y; \ 3845 blit_buffer[color_index] = r; \ 3846 blit_buffer[color_index+1] = g; \ 3847 blit_buffer[color_index+2] = b; \ 3848 blit_buffer[color_index+3] = a; \ 3849 vert_index += GPU_BLIT_BUFFER_FLOATS_PER_VERTEX; \ 3850 color_index += GPU_BLIT_BUFFER_FLOATS_PER_VERTEX; 3852 #define SET_INDEXED_VERTEX(offset) \ 3853 index_buffer[cdata->index_buffer_num_vertices++] = blit_buffer_starting_index + (offset); 3855 #define SET_RELATIVE_INDEXED_VERTEX(offset) \ 3856 index_buffer[cdata->index_buffer_num_vertices++] = cdata->blit_buffer_num_vertices + (offset); 3860 #define BEGIN_UNTEXTURED_SEGMENTS(x1, y1, x2, y2, r, g, b, a) \ 3861 SET_UNTEXTURED_VERTEX(x1, y1, r, g, b, a); \ 3862 SET_UNTEXTURED_VERTEX(x2, y2, r, g, b, a); 3865 #define SET_UNTEXTURED_SEGMENTS(x1, y1, x2, y2, r, g, b, a) \ 3866 SET_UNTEXTURED_VERTEX(x1, y1, r, g, b, a); \ 3867 SET_RELATIVE_INDEXED_VERTEX(-2); \ 3868 SET_UNTEXTURED_VERTEX(x2, y2, r, g, b, a); \ 3869 SET_RELATIVE_INDEXED_VERTEX(-2); \ 3870 SET_RELATIVE_INDEXED_VERTEX(-2); \ 3871 SET_RELATIVE_INDEXED_VERTEX(-1); 3874 #define LOOP_UNTEXTURED_SEGMENTS() \ 3875 SET_INDEXED_VERTEX(0); \ 3876 SET_RELATIVE_INDEXED_VERTEX(-1); \ 3877 SET_INDEXED_VERTEX(1); \ 3878 SET_INDEXED_VERTEX(0); 3880 #define END_UNTEXTURED_SEGMENTS(x1, y1, x2, y2, r, g, b, a) \ 3881 SET_UNTEXTURED_VERTEX(x1, y1, r, g, b, a); \ 3882 SET_RELATIVE_INDEXED_VERTEX(-2); \ 3883 SET_UNTEXTURED_VERTEX(x2, y2, r, g, b, a); \ 3884 SET_RELATIVE_INDEXED_VERTEX(-2); 3890 Uint32 tex_w, tex_h;
3893 float x1, y1, x2, y2;
3894 float dx1, dy1, dx2, dy2;
3897 unsigned short* index_buffer;
3898 unsigned short blit_buffer_starting_index;
3920 makeContextCurrent(renderer, target);
3927 prepareToRenderToTarget(renderer, target);
3928 prepareToRenderImage(renderer, target, image);
3931 bindTexture(renderer, image);
3934 if(!bindFramebuffer(renderer, target))
3950 if(src_rect == NULL)
3955 x2 = ((float)image->
w)/tex_w;
3956 y2 = ((float)image->
h)/tex_h;
3963 x1 = src_rect->
x/(float)tex_w;
3964 y1 = src_rect->
y/(float)tex_h;
3965 x2 = (src_rect->
x + src_rect->
w)/(
float)tex_w;
3966 y2 = (src_rect->
y + src_rect->
h)/(
float)tex_h;
3974 x1 *= image->
base_w/(float)image->
w;
3975 y1 *= image->
base_h/(
float)image->
h;
3976 x2 *= image->
base_w/(float)image->
w;
3977 y2 *= image->
base_h/(
float)image->
h;
3983 dx2 = x + w * (1.0f - image->
anchor_x);
3984 dy2 = y + h * (1.0f - image->
anchor_y);
3989 fractional = w/2.0f - floorf(w/2.0f);
3992 fractional = h/2.0f - floorf(h/2.0f);
4006 if(cdata->blit_buffer_num_vertices + 4 >= cdata->blit_buffer_max_num_vertices)
4008 if(!growBlitBuffer(cdata, cdata->blit_buffer_num_vertices + 4))
4009 renderer->
impl->FlushBlitBuffer(renderer);
4011 if(cdata->index_buffer_num_vertices + 6 >= cdata->index_buffer_max_num_vertices)
4013 if(!growIndexBuffer(cdata, cdata->index_buffer_num_vertices + 6))
4014 renderer->
impl->FlushBlitBuffer(renderer);
4017 blit_buffer = cdata->blit_buffer;
4018 index_buffer = cdata->index_buffer;
4020 blit_buffer_starting_index = cdata->blit_buffer_num_vertices;
4034 r = image->
color.r/255.0f;
4035 g = image->
color.g/255.0f;
4036 b = image->
color.b/255.0f;
4073 w = (src_rect == NULL? image->
w : src_rect->
w);
4074 h = (src_rect == NULL? image->
h : src_rect->
h);
4075 renderer->
impl->BlitTransformX(renderer, image, src_rect, target, x, y, w*image->
anchor_x, h*image->
anchor_y, degrees, 1.0f, 1.0f);
4092 w = (src_rect == NULL? image->
w : src_rect->
w);
4093 h = (src_rect == NULL? image->
h : src_rect->
h);
4094 renderer->
impl->BlitTransformX(renderer, image, src_rect, target, x, y, w*image->
anchor_x, h*image->
anchor_y, 0.0f, scaleX, scaleY);
4111 w = (src_rect == NULL? image->
w : src_rect->
w);
4112 h = (src_rect == NULL? image->
h : src_rect->
h);
4113 renderer->
impl->BlitTransformX(renderer, image, src_rect, target, x, y, w*image->
anchor_x, h*image->
anchor_y, degrees, scaleX, scaleY);
4116 static void BlitTransformX(
GPU_Renderer* renderer,
GPU_Image* image,
GPU_Rect* src_rect,
GPU_Target* target,
float x,
float y,
float pivot_x,
float pivot_y,
float degrees,
float scaleX,
float scaleY)
4118 Uint32 tex_w, tex_h;
4119 float x1, y1, x2, y2;
4120 float dx1, dy1, dx2, dy2, dx3, dy3, dx4, dy4;
4124 unsigned short* index_buffer;
4125 unsigned short blit_buffer_starting_index;
4148 makeContextCurrent(renderer, target);
4150 prepareToRenderToTarget(renderer, target);
4151 prepareToRenderImage(renderer, target, image);
4154 bindTexture(renderer, image);
4157 if(!bindFramebuffer(renderer, target))
4179 if(src_rect == NULL)
4184 x2 = ((float)image->
w)/tex_w;
4185 y2 = ((float)image->
h)/tex_h;
4192 x1 = src_rect->
x/(float)tex_w;
4193 y1 = src_rect->
y/(float)tex_h;
4194 x2 = (src_rect->
x + src_rect->
w)/(
float)tex_w;
4195 y2 = (src_rect->
y + src_rect->
h)/(
float)tex_h;
4203 x1 *= image->
base_w/(float)image->
w;
4204 y1 *= image->
base_h/(
float)image->
h;
4205 x2 *= image->
base_w/(float)image->
w;
4206 y2 *= image->
base_h/(
float)image->
h;
4219 fractional = w/2.0f - floorf(w/2.0f);
4222 fractional = h/2.0f - floorf(h/2.0f);
4237 if(scaleX != 1.0f || scaleY != 1.0f)
4254 float cosA = cos(degrees*
M_PI/180);
4255 float sinA = sin(degrees*
M_PI/180);
4257 dx1 = dx1*cosA - dy1*sinA;
4258 dy1 = tempX*sinA + dy1*cosA;
4260 dx2 = dx2*cosA - dy2*sinA;
4261 dy2 = tempX*sinA + dy2*cosA;
4263 dx3 = dx3*cosA - dy3*sinA;
4264 dy3 = tempX*sinA + dy3*cosA;
4266 dx4 = dx4*cosA - dy4*sinA;
4267 dy4 = tempX*sinA + dy4*cosA;
4282 if(cdata->blit_buffer_num_vertices + 4 >= cdata->blit_buffer_max_num_vertices)
4284 if(!growBlitBuffer(cdata, cdata->blit_buffer_num_vertices + 4))
4285 renderer->
impl->FlushBlitBuffer(renderer);
4287 if(cdata->index_buffer_num_vertices + 6 >= cdata->index_buffer_max_num_vertices)
4289 if(!growIndexBuffer(cdata, cdata->index_buffer_num_vertices + 6))
4290 renderer->
impl->FlushBlitBuffer(renderer);
4293 blit_buffer = cdata->blit_buffer;
4294 index_buffer = cdata->index_buffer;
4296 blit_buffer_starting_index = cdata->blit_buffer_num_vertices;
4311 r = image->
color.r/255.0f;
4312 g = image->
color.g/255.0f;
4313 b = image->
color.b/255.0f;
4337 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 4342 if(type == GPU_TYPE_DOUBLE)
return sizeof(double);
4343 if(type == GPU_TYPE_FLOAT)
return sizeof(float);
4344 if(type == GPU_TYPE_INT)
return sizeof(int);
4345 if(type == GPU_TYPE_UNSIGNED_INT)
return sizeof(
unsigned int);
4346 if(type == GPU_TYPE_SHORT)
return sizeof(short);
4347 if(type == GPU_TYPE_UNSIGNED_SHORT)
return sizeof(
unsigned short);
4348 if(type == GPU_TYPE_BYTE)
return sizeof(char);
4349 if(type == GPU_TYPE_UNSIGNED_BYTE)
return sizeof(
unsigned char);
4356 for(i = 0; i < 16; i++)
4368 memcpy(storage_ptr, values_ptr, value_size_bytes);
4370 memcpy(storage_ptr, values_ptr, value_size_bytes);
4372 memcpy(storage_ptr, values_ptr, value_size_bytes);
4374 memcpy(storage_ptr, values_ptr, value_size_bytes);
4383 static void upload_attribute_data(
GPU_CONTEXT_DATA* cdata,
int num_vertices)
4386 for(i = 0; i < 16; i++)
4391 int num_values_used = num_vertices;
4419 for(i = 0; i < 16; i++)
4432 static int get_lowest_attribute_num_values(
GPU_CONTEXT_DATA* cdata,
int cap)
4436 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 4438 for(i = 0; i < 16; i++)
4454 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 4455 #ifdef SDL_GPU_USE_BUFFER_MAPPING 4458 unsigned short* data_i = (indices == NULL? NULL : (
unsigned short*)
glMapBuffer(GL_ELEMENT_ARRAY_BUFFER,
GL_WRITE_ONLY));
4461 memcpy(data, values, bytes);
4466 memcpy(data_i, indices, bytes_indices);
4469 #elif defined(SDL_GPU_USE_BUFFER_RESET) 4472 glBufferData(GL_ELEMENT_ARRAY_BUFFER, bytes_indices, indices, GL_DYNAMIC_DRAW);
4482 static void SetAttributefv(
GPU_Renderer* renderer,
int location,
int num_elements,
float* value);
4489 int stride, offset_texcoords, offset_colors;
4490 int size_vertices, size_texcoords, size_colors;
4492 GPU_bool using_texture = (image != NULL);
4493 GPU_bool use_vertices = (flags & (GPU_BATCH_XY | GPU_BATCH_XYZ));
4494 GPU_bool use_texcoords = (flags & GPU_BATCH_ST);
4495 GPU_bool use_colors = (flags & (GPU_BATCH_RGB | GPU_BATCH_RGBA | GPU_BATCH_RGB8 | GPU_BATCH_RGBA8));
4496 GPU_bool use_byte_colors = (flags & (GPU_BATCH_RGB8 | GPU_BATCH_RGBA8));
4497 GPU_bool use_z = (flags & GPU_BATCH_XYZ);
4498 GPU_bool use_a = (flags & (GPU_BATCH_RGBA | GPU_BATCH_RGBA8));
4500 if(num_vertices == 0)
4508 if((image != NULL && renderer != image->
renderer) || renderer != target->
renderer)
4514 makeContextCurrent(renderer, target);
4518 bindTexture(renderer, image);
4521 if(!bindFramebuffer(renderer, target))
4527 prepareToRenderToTarget(renderer, target);
4529 prepareToRenderImage(renderer, target, image);
4531 prepareToRenderShapes(renderer, GL_TRIANGLES);
4532 changeViewport(target);
4533 changeCamera(target);
4536 changeTexturing(renderer,
GPU_TRUE);
4538 setClipRect(renderer, target);
4540 #ifdef SDL_GPU_APPLY_TRANSFORMS_TO_GL_STACK 4541 if(!IsFeatureEnabled(renderer, GPU_FEATURE_VERTEX_SHADER))
4549 renderer->
impl->FlushBlitBuffer(renderer);
4551 if(cdata->index_buffer_num_vertices + num_indices >= cdata->index_buffer_max_num_vertices)
4553 growBlitBuffer(cdata, cdata->index_buffer_num_vertices + num_indices);
4555 if(cdata->blit_buffer_num_vertices + num_vertices >= cdata->blit_buffer_max_num_vertices)
4557 growBlitBuffer(cdata, cdata->blit_buffer_num_vertices + num_vertices);
4561 if(cdata->blit_buffer_num_vertices + num_vertices >= cdata->blit_buffer_max_num_vertices)
4563 if(!growBlitBuffer(cdata, cdata->blit_buffer_num_vertices + num_vertices))
4566 num_vertices = (cdata->blit_buffer_max_num_vertices - cdata->blit_buffer_num_vertices);
4569 if(cdata->index_buffer_num_vertices + num_indices >= cdata->index_buffer_max_num_vertices)
4571 if(!growIndexBuffer(cdata, cdata->index_buffer_num_vertices + num_indices))
4574 num_indices = (cdata->index_buffer_max_num_vertices - cdata->index_buffer_num_vertices);
4578 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 4579 refresh_attribute_data(cdata);
4583 num_indices = num_vertices;
4586 (void)offset_texcoords;
4587 (void)offset_colors;
4588 (void)size_vertices;
4589 (void)size_texcoords;
4593 offset_texcoords = offset_colors = 0;
4594 size_vertices = size_texcoords = size_colors = 0;
4604 stride += size_vertices;
4606 offset_texcoords = stride;
4607 offset_colors = stride;
4614 stride += size_texcoords;
4616 offset_colors = stride;
4628 if(use_colors && !use_byte_colors)
4630 stride += size_colors;
4634 stride *=
sizeof(float);
4635 offset_texcoords *=
sizeof(float);
4636 offset_colors *=
sizeof(float);
4639 if(use_colors && use_byte_colors)
4641 stride += size_colors;
4644 #ifdef SDL_GPU_USE_ARRAY_PIPELINE 4649 glEnableClientState(GL_VERTEX_ARRAY);
4651 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
4653 glEnableClientState(GL_COLOR_ARRAY);
4657 glVertexPointer(size_vertices, GL_FLOAT, stride, values);
4659 glTexCoordPointer(size_texcoords, GL_FLOAT, stride, values + offset_texcoords);
4663 glColorPointer(size_colors, GL_UNSIGNED_BYTE, stride, values + offset_colors);
4665 glColorPointer(size_colors, GL_FLOAT, stride, values + offset_colors);
4670 glDrawArrays(GL_TRIANGLES, 0, num_indices);
4672 glDrawElements(GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, indices);
4676 glDisableClientState(GL_COLOR_ARRAY);
4678 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
4680 glDisableClientState(GL_VERTEX_ARRAY);
4686 #ifdef SDL_GPU_USE_BUFFER_PIPELINE_FALLBACK 4687 if(!IsFeatureEnabled(renderer, GPU_FEATURE_VERTEX_SHADER))
4689 #ifdef SDL_GPU_USE_FIXED_FUNCTION_PIPELINE 4695 float* vertex_pointer = (
float*)(values);
4696 float* texcoord_pointer = (
float*)((
char*)values + offset_texcoords);
4698 glBegin(GL_TRIANGLES);
4699 for(i = 0; i < num_indices; i++)
4709 Uint8* color_pointer = (Uint8*)((
char*)values + offset_colors);
4710 glColor4ub(color_pointer[index], color_pointer[index+1], color_pointer[index+2], (use_a? color_pointer[index+3] : 255));
4714 float* color_pointer = (
float*)((
char*)values + offset_colors);
4715 glColor4f(color_pointer[index], color_pointer[index+1], color_pointer[index+2], (use_a? color_pointer[index+3] : 1.0f));
4719 glTexCoord2f( texcoord_pointer[index], texcoord_pointer[index+1] );
4721 glVertex3f( vertex_pointer[index], vertex_pointer[index+1], (use_z? vertex_pointer[index+2] : 0.0f) );
4727 #ifdef SDL_GPU_USE_BUFFER_PIPELINE_FALLBACK 4733 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 4744 #if !defined(SDL_GPU_NO_VAO) 4745 glBindVertexArray(cdata->blit_VAO);
4752 float cam_matrix[16];
4754 get_camera_matrix(cam_matrix, cdata->last_camera);
4765 cdata->blit_VBO_flop = !cdata->blit_VBO_flop;
4766 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cdata->blit_IBO);
4769 submit_buffer_data(stride * num_vertices, values,
sizeof(
unsigned short)*num_indices, indices);
4796 SDL_Color color = get_complete_mod_color(renderer, target, image);
4797 float default_color[4] = {color.r/255.0f, color.g/255.0f, color.b/255.0f, color.a/255.0f};
4802 upload_attribute_data(cdata, num_indices);
4805 glDrawArrays(GL_TRIANGLES, 0, num_indices);
4807 glDrawElements(GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, (
void*)0);
4817 disable_attribute_data(cdata);
4819 #if !defined(SDL_GPU_NO_VAO) 4820 glBindVertexArray(0);
4826 cdata->blit_buffer_num_vertices = 0;
4827 cdata->index_buffer_num_vertices = 0;
4829 unsetClipRect(renderer, target);
4834 #ifndef __IPHONEOS__ 4840 renderer->
impl->FlushBlitBuffer(renderer);
4841 bindTexture(renderer, image);
4845 glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &filter);
4846 if(filter == GL_LINEAR)
4847 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
4864 renderer->
impl->FlushBlitBuffer(renderer);
4882 makeContextCurrent(renderer, target);
4885 renderer->
impl->FlushBlitBuffer(renderer);
4897 SDL_Color result = {0,0,0,0};
4902 if(x < 0 || y < 0 || x >= target->
w || y >= target->
h)
4906 renderer->
impl->FlushBlitBuffer(renderer);
4907 if(bindFramebuffer(renderer, target))
4909 unsigned char pixels[4];
4910 glReadPixels(x, y, 1, 1, ((
GPU_TARGET_DATA*)target->
data)->format, GL_UNSIGNED_BYTE, pixels);
4912 result.r = pixels[0];
4913 result.g = pixels[1];
4914 result.b = pixels[2];
4923 GLenum minFilter, magFilter;
4939 minFilter = GL_NEAREST;
4940 magFilter = GL_NEAREST;
4944 minFilter = GL_LINEAR_MIPMAP_NEAREST;
4946 minFilter = GL_LINEAR;
4948 magFilter = GL_LINEAR;
4952 minFilter = GL_LINEAR_MIPMAP_LINEAR;
4954 minFilter = GL_LINEAR;
4956 magFilter = GL_LINEAR;
4964 bindTexture(renderer, image);
4968 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
4969 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
4974 GLenum wrap_x, wrap_y;
4990 wrap_x = GL_CLAMP_TO_EDGE;
5012 wrap_y = GL_CLAMP_TO_EDGE;
5032 bindTexture(renderer, image);
5037 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_x );
5038 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_y );
5052 makeContextCurrent(renderer, target);
5055 renderer->
impl->FlushBlitBuffer(renderer);
5056 if(bindFramebuffer(renderer, target))
5058 setClipRect(renderer, target);
5060 glClearColor(r/255.0f, g/255.0f, b/255.0f, a/255.0f);
5061 glClear(GL_COLOR_BUFFER_BIT);
5063 unsetClipRect(renderer, target);
5067 static void DoPartialFlush(
GPU_Renderer* renderer,
GPU_Target* dest,
GPU_Context* context,
unsigned short num_vertices,
float* blit_buffer,
unsigned int num_indices,
unsigned short* index_buffer)
5071 #ifdef SDL_GPU_USE_ARRAY_PIPELINE 5072 glEnableClientState(GL_VERTEX_ARRAY);
5073 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
5074 glEnableClientState(GL_COLOR_ARRAY);
5080 glDrawElements(cdata->last_shape, num_indices, GL_UNSIGNED_SHORT, index_buffer);
5082 glDisableClientState(GL_COLOR_ARRAY);
5083 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
5084 glDisableClientState(GL_VERTEX_ARRAY);
5090 #ifdef SDL_GPU_USE_BUFFER_PIPELINE_FALLBACK 5091 if(!IsFeatureEnabled(renderer, GPU_FEATURE_VERTEX_SHADER))
5093 #ifdef SDL_GPU_USE_FIXED_FUNCTION_PIPELINE 5101 glBegin(cdata->last_shape);
5102 for(i = 0; i < num_indices; i++)
5105 glColor4f( color_pointer[index], color_pointer[index+1], color_pointer[index+2], color_pointer[index+3] );
5106 glTexCoord2f( texcoord_pointer[index], texcoord_pointer[index+1] );
5107 glVertex3f( vertex_pointer[index], vertex_pointer[index+1], 0.0f );
5118 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 5121 #if !defined(SDL_GPU_NO_VAO) 5122 glBindVertexArray(cdata->blit_VAO);
5137 float cam_matrix[16];
5138 get_camera_matrix(cam_matrix, cdata->last_camera);
5152 cdata->blit_VBO_flop = !cdata->blit_VBO_flop;
5153 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cdata->blit_IBO);
5175 upload_attribute_data(cdata, num_vertices);
5177 glDrawElements(cdata->last_shape, num_indices, GL_UNSIGNED_SHORT, (
void*)0);
5187 disable_attribute_data(cdata);
5189 #if !defined(SDL_GPU_NO_VAO) 5190 glBindVertexArray(0);
5196 static void DoUntexturedFlush(
GPU_Renderer* renderer,
GPU_Context* context,
unsigned short num_vertices,
float* blit_buffer,
unsigned int num_indices,
unsigned short* index_buffer)
5201 #ifdef SDL_GPU_USE_ARRAY_PIPELINE 5202 glEnableClientState(GL_VERTEX_ARRAY);
5203 glEnableClientState(GL_COLOR_ARRAY);
5208 glDrawElements(cdata->last_shape, num_indices, GL_UNSIGNED_SHORT, index_buffer);
5210 glDisableClientState(GL_COLOR_ARRAY);
5211 glDisableClientState(GL_VERTEX_ARRAY);
5215 #ifdef SDL_GPU_USE_BUFFER_PIPELINE_FALLBACK 5216 if(!IsFeatureEnabled(renderer, GPU_FEATURE_VERTEX_SHADER))
5218 #ifdef SDL_GPU_USE_FIXED_FUNCTION_PIPELINE 5225 glBegin(cdata->last_shape);
5226 for(i = 0; i < num_indices; i++)
5229 glColor4f( color_pointer[index], color_pointer[index+1], color_pointer[index+2], color_pointer[index+3] );
5230 glVertex3f( vertex_pointer[index], vertex_pointer[index+1], 0.0f );
5238 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 5241 #if !defined(SDL_GPU_NO_VAO) 5242 glBindVertexArray(cdata->blit_VAO);
5249 float cam_matrix[16];
5251 get_camera_matrix(cam_matrix, cdata->last_camera);
5260 cdata->blit_VBO_flop = !cdata->blit_VBO_flop;
5261 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cdata->blit_IBO);
5278 upload_attribute_data(cdata, num_vertices);
5280 glDrawElements(cdata->last_shape, num_indices, GL_UNSIGNED_SHORT, (
void*)0);
5288 disable_attribute_data(cdata);
5290 #if !defined(SDL_GPU_NO_VAO) 5291 glBindVertexArray(0);
5297 #define MAX(a, b) ((a) > (b)? (a) : (b)) 5308 if(cdata->blit_buffer_num_vertices > 0 && cdata->last_target != NULL)
5314 unsigned short* index_buffer;
5316 changeViewport(dest);
5319 applyTexturing(renderer);
5321 #ifdef SDL_GPU_APPLY_TRANSFORMS_TO_GL_STACK 5322 if(!IsFeatureEnabled(renderer, GPU_FEATURE_VERTEX_SHADER))
5326 setClipRect(renderer, dest);
5328 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 5329 refresh_attribute_data(cdata);
5332 blit_buffer = cdata->blit_buffer;
5333 index_buffer = cdata->index_buffer;
5335 if(cdata->last_use_texturing)
5337 while(cdata->blit_buffer_num_vertices > 0)
5339 num_vertices =
MAX(cdata->blit_buffer_num_vertices, get_lowest_attribute_num_values(cdata, cdata->blit_buffer_num_vertices));
5340 num_indices = num_vertices * 3 / 2;
5342 DoPartialFlush(renderer, dest, context, num_vertices, blit_buffer, num_indices, index_buffer);
5344 cdata->blit_buffer_num_vertices -= num_vertices;
5347 index_buffer += num_indices;
5352 DoUntexturedFlush(renderer, context, cdata->blit_buffer_num_vertices, blit_buffer, cdata->index_buffer_num_vertices, index_buffer);
5355 cdata->blit_buffer_num_vertices = 0;
5356 cdata->index_buffer_num_vertices = 0;
5358 unsetClipRect(renderer, dest);
5364 renderer->
impl->FlushBlitBuffer(renderer);
5366 makeContextCurrent(renderer, target);
5368 #ifdef SDL_GPU_USE_SDL2 5371 SDL_GL_SwapBuffers();
5374 #ifdef SDL_GPU_USE_OPENGL 5376 apply_Intel_attrib_workaround =
GPU_TRUE;
5391 static Uint32 GetShaderSourceSize(
const char* filename);
5392 static Uint32 GetShaderSource(
const char* filename,
char* result);
5394 static void read_until_end_of_comment(SDL_RWops* rwops,
char multiline)
5397 while(SDL_RWread(rwops, &buffer, 1, 1) > 0)
5409 if(SDL_RWread(rwops, &buffer, 1, 1) <= 0 || buffer ==
'/')
5416 static Uint32 GetShaderSourceSize_RW(SDL_RWops* shader_source)
5423 if(shader_source == NULL)
5431 while((len = SDL_RWread(shader_source, &buffer, 1, 1)) > 0)
5434 if(buffer[0] ==
'#')
5438 unsigned long line_len;
5440 while((line_len = SDL_RWread(shader_source, buffer+line_size, 1, 1)) > 0)
5442 line_size += line_len;
5443 if(buffer[line_size - line_len] ==
'\n')
5446 buffer[line_size] =
'\0';
5449 token = strtok(buffer,
"# \t");
5451 if(token != NULL && strcmp(token,
"include") == 0)
5454 token = strtok(NULL,
"\"");
5458 size += GetShaderSourceSize(token) + 1;
5469 if(last_char ==
'/')
5471 if(buffer[0] ==
'/')
5473 read_until_end_of_comment(shader_source, 0);
5476 else if(buffer[0] ==
'*')
5478 read_until_end_of_comment(shader_source, 1);
5484 last_char = buffer[0];
5488 SDL_RWseek(shader_source, 0, SEEK_SET);
5493 static Uint32 GetShaderSource_RW(SDL_RWops* shader_source,
char* result)
5500 if(shader_source == NULL)
5511 while((len = SDL_RWread(shader_source, &buffer, 1, 1)) > 0)
5514 if(buffer[0] ==
'#')
5518 unsigned long line_len;
5519 char token_buffer[512];
5521 while((line_len = SDL_RWread(shader_source, buffer+line_size, 1, 1)) > 0)
5523 line_size += line_len;
5524 if(buffer[line_size - line_len] ==
'\n')
5529 memcpy(token_buffer, buffer, line_size+1);
5530 token_buffer[line_size] =
'\0';
5531 token = strtok(token_buffer,
"# \t");
5533 if(token != NULL && strcmp(token,
"include") == 0)
5536 token = strtok(NULL,
"\"");
5540 size += GetShaderSource(token, result + size);
5541 result[size] =
'\n';
5547 memcpy(result + size, buffer, line_size);
5554 memcpy(result + size, buffer, len);
5557 if(last_char ==
'/')
5559 if(buffer[0] ==
'/')
5561 read_until_end_of_comment(shader_source, 0);
5562 memcpy(result + size,
"\n", 1);
5565 else if(buffer[0] ==
'*')
5567 read_until_end_of_comment(shader_source, 1);
5568 memcpy(result + size,
"*/", 2);
5574 last_char = buffer[0];
5576 result[size] =
'\0';
5579 SDL_RWseek(shader_source, 0, SEEK_SET);
5583 static Uint32 GetShaderSource(
const char* filename,
char* result)
5588 if(filename == NULL)
5590 rwops = SDL_RWFromFile(filename,
"r");
5592 size = GetShaderSource_RW(rwops, result);
5598 static Uint32 GetShaderSourceSize(
const char* filename)
5603 if(filename == NULL)
5605 rwops = SDL_RWFromFile(filename,
"r");
5607 result = GetShaderSourceSize_RW(rwops);
5614 static Uint32 compile_shader_source(
GPU_ShaderEnum shader_type,
const char* shader_source)
5617 GLuint shader_object = 0;
5619 (void)shader_source;
5621 #ifndef SDL_GPU_DISABLE_SHADERS 5633 #ifdef GL_GEOMETRY_SHADER 5637 snprintf(shader_message, 256,
"Failed to create geometry shader object.\n");
5643 if(shader_object == 0)
5646 snprintf(shader_message, 256,
"Failed to create new shader object.\n");
5667 return shader_object;
5674 Uint32 size = GetShaderSourceSize_RW(shader_source);
5675 char* source_string = (
char*)SDL_malloc(size+1);
5676 int result = GetShaderSource_RW(shader_source, source_string);
5681 SDL_RWclose(shader_source);
5686 snprintf(shader_message, 256,
"Failed to read shader source.\n");
5687 SDL_free(source_string);
5691 result2 = compile_shader_source(shader_type, source_string);
5692 SDL_free(source_string);
5699 Uint32 size = (Uint32)strlen(shader_source);
5703 rwops = SDL_RWFromConstMem(shader_source, size);
5704 return renderer->
impl->CompileShader_RW(renderer, shader_type, rwops, 1);
5707 static Uint32 CreateShaderProgram(
GPU_Renderer* renderer)
5709 #ifndef SDL_GPU_DISABLE_SHADERS 5726 #ifndef SDL_GPU_DISABLE_SHADERS 5735 glBindAttribLocation(program_object, 0,
"gpu_Vertex");
5752 (void)program_object;
5758 static void FreeShader(
GPU_Renderer* renderer, Uint32 shader_object)
5761 (void)shader_object;
5762 #ifndef SDL_GPU_DISABLE_SHADERS 5768 static void FreeShaderProgram(
GPU_Renderer* renderer, Uint32 program_object)
5771 (void)program_object;
5772 #ifndef SDL_GPU_DISABLE_SHADERS 5778 static void AttachShader(
GPU_Renderer* renderer, Uint32 program_object, Uint32 shader_object)
5781 (void)program_object;
5782 (void)shader_object;
5783 #ifndef SDL_GPU_DISABLE_SHADERS 5789 static void DetachShader(
GPU_Renderer* renderer, Uint32 program_object, Uint32 shader_object)
5792 (void)program_object;
5793 (void)shader_object;
5794 #ifndef SDL_GPU_DISABLE_SHADERS 5796 glDetachShader(program_object, shader_object);
5804 #ifndef SDL_GPU_DISABLE_SHADERS 5807 if(program_object == 0)
5817 renderer->
impl->FlushBlitBuffer(renderer);
5847 static void DeactivateShaderProgram(
GPU_Renderer* renderer)
5849 renderer->
impl->ActivateShaderProgram(renderer, 0, NULL);
5852 static const char* GetShaderMessage(
GPU_Renderer* renderer)
5855 return shader_message;
5858 static int GetAttributeLocation(
GPU_Renderer* renderer, Uint32 program_object,
const char* attrib_name)
5860 #ifndef SDL_GPU_DISABLE_SHADERS 5863 program_object = get_proper_program_id(renderer, program_object);
5864 if(program_object == 0)
5869 (void)program_object;
5875 static int GetUniformLocation(
GPU_Renderer* renderer, Uint32 program_object,
const char* uniform_name)
5877 #ifndef SDL_GPU_DISABLE_SHADERS 5880 program_object = get_proper_program_id(renderer, program_object);
5881 if(program_object == 0)
5886 (void)program_object;
5892 static GPU_ShaderBlock LoadShaderBlock(
GPU_Renderer* renderer, Uint32 program_object,
const char* position_name,
const char* texcoord_name,
const char* color_name,
const char* modelViewMatrix_name)
5895 program_object = get_proper_program_id(renderer, program_object);
5905 if(position_name == NULL)
5908 b.
position_loc = renderer->
impl->GetAttributeLocation(renderer, program_object, position_name);
5910 if(texcoord_name == NULL)
5913 b.
texcoord_loc = renderer->
impl->GetAttributeLocation(renderer, program_object, texcoord_name);
5915 if(color_name == NULL)
5918 b.
color_loc = renderer->
impl->GetAttributeLocation(renderer, program_object, color_name);
5920 if(modelViewMatrix_name == NULL)
5931 #ifndef SDL_GPU_DISABLE_SHADERS 5937 renderer->
impl->FlushBlitBuffer(renderer);
5948 glBindTexture(GL_TEXTURE_2D, new_texture);
5962 static void GetUniformiv(
GPU_Renderer* renderer, Uint32 program_object,
int location,
int* values)
5965 (void)program_object;
5969 #ifndef SDL_GPU_DISABLE_SHADERS 5972 program_object = get_proper_program_id(renderer, program_object);
5973 if(program_object != 0)
5978 static void SetUniformi(
GPU_Renderer* renderer,
int location,
int value)
5984 #ifndef SDL_GPU_DISABLE_SHADERS 5987 renderer->
impl->FlushBlitBuffer(renderer);
5994 static void SetUniformiv(
GPU_Renderer* renderer,
int location,
int num_elements_per_value,
int num_values,
int* values)
5998 (void)num_elements_per_value;
6002 #ifndef SDL_GPU_DISABLE_SHADERS 6005 renderer->
impl->FlushBlitBuffer(renderer);
6008 switch(num_elements_per_value)
6027 static void GetUniformuiv(
GPU_Renderer* renderer, Uint32 program_object,
int location,
unsigned int* values)
6030 (void)program_object;
6034 #ifndef SDL_GPU_DISABLE_SHADERS 6037 program_object = get_proper_program_id(renderer, program_object);
6038 if(program_object != 0)
6039 #if defined(SDL_GPU_USE_GLES) && SDL_GPU_GLES_MAJOR_VERSION < 3 6042 glGetUniformuiv(program_object, location, values);
6047 static void SetUniformui(
GPU_Renderer* renderer,
int location,
unsigned int value)
6053 #ifndef SDL_GPU_DISABLE_SHADERS 6056 renderer->
impl->FlushBlitBuffer(renderer);
6059 #if defined(SDL_GPU_USE_GLES) && SDL_GPU_GLES_MAJOR_VERSION < 3 6062 glUniform1ui(location, value);
6067 static void SetUniformuiv(
GPU_Renderer* renderer,
int location,
int num_elements_per_value,
int num_values,
unsigned int* values)
6071 (void)num_elements_per_value;
6075 #ifndef SDL_GPU_DISABLE_SHADERS 6078 renderer->
impl->FlushBlitBuffer(renderer);
6081 #if defined(SDL_GPU_USE_GLES) && SDL_GPU_GLES_MAJOR_VERSION < 3 6082 switch(num_elements_per_value)
6098 switch(num_elements_per_value)
6101 glUniform1uiv(location, num_values, values);
6104 glUniform2uiv(location, num_values, values);
6107 glUniform3uiv(location, num_values, values);
6110 glUniform4uiv(location, num_values, values);
6118 static void GetUniformfv(
GPU_Renderer* renderer, Uint32 program_object,
int location,
float* values)
6121 (void)program_object;
6125 #ifndef SDL_GPU_DISABLE_SHADERS 6128 program_object = get_proper_program_id(renderer, program_object);
6129 if(program_object != 0)
6130 glGetUniformfv(program_object, location, values);
6134 static void SetUniformf(
GPU_Renderer* renderer,
int location,
float value)
6140 #ifndef SDL_GPU_DISABLE_SHADERS 6143 renderer->
impl->FlushBlitBuffer(renderer);
6150 static void SetUniformfv(
GPU_Renderer* renderer,
int location,
int num_elements_per_value,
int num_values,
float* values)
6154 (void)num_elements_per_value;
6158 #ifndef SDL_GPU_DISABLE_SHADERS 6161 renderer->
impl->FlushBlitBuffer(renderer);
6164 switch(num_elements_per_value)
6182 static void SetUniformMatrixfv(
GPU_Renderer* renderer,
int location,
int num_matrices,
int num_rows,
int num_columns,
GPU_bool transpose,
float* values)
6192 #ifndef SDL_GPU_DISABLE_SHADERS 6195 renderer->
impl->FlushBlitBuffer(renderer);
6198 if(num_rows < 2 || num_rows > 4 || num_columns < 2 || num_columns > 4)
6203 #if defined(SDL_GPU_USE_GLES) 6205 #define glUniformMatrix2x3fv glUniformMatrix2fv 6206 #define glUniformMatrix2x4fv glUniformMatrix2fv 6207 #define glUniformMatrix3x2fv glUniformMatrix2fv 6208 #define glUniformMatrix3x4fv glUniformMatrix2fv 6209 #define glUniformMatrix4x2fv glUniformMatrix2fv 6210 #define glUniformMatrix4x3fv glUniformMatrix2fv 6211 if(num_rows != num_columns)
6221 if(num_columns == 2)
6222 glUniformMatrix2fv(location, num_matrices, transpose, values);
6223 else if(num_columns == 3)
6224 glUniformMatrix2x3fv(location, num_matrices, transpose, values);
6225 else if(num_columns == 4)
6226 glUniformMatrix2x4fv(location, num_matrices, transpose, values);
6229 if(num_columns == 2)
6230 glUniformMatrix3x2fv(location, num_matrices, transpose, values);
6231 else if(num_columns == 3)
6232 glUniformMatrix3fv(location, num_matrices, transpose, values);
6233 else if(num_columns == 4)
6234 glUniformMatrix3x4fv(location, num_matrices, transpose, values);
6237 if(num_columns == 2)
6238 glUniformMatrix4x2fv(location, num_matrices, transpose, values);
6239 else if(num_columns == 3)
6240 glUniformMatrix4x3fv(location, num_matrices, transpose, values);
6241 else if(num_columns == 4)
6249 static void SetAttributef(
GPU_Renderer* renderer,
int location,
float value)
6255 #ifndef SDL_GPU_DISABLE_SHADERS 6258 renderer->
impl->FlushBlitBuffer(renderer);
6262 #ifdef SDL_GPU_USE_OPENGL 6263 if(apply_Intel_attrib_workaround && location == 0)
6265 apply_Intel_attrib_workaround =
GPU_FALSE;
6266 glBegin(GL_TRIANGLES);
6276 static void SetAttributei(
GPU_Renderer* renderer,
int location,
int value)
6282 #ifndef SDL_GPU_DISABLE_SHADERS 6285 renderer->
impl->FlushBlitBuffer(renderer);
6289 #ifdef SDL_GPU_USE_OPENGL 6290 if(apply_Intel_attrib_workaround && location == 0)
6292 apply_Intel_attrib_workaround =
GPU_FALSE;
6293 glBegin(GL_TRIANGLES);
6303 static void SetAttributeui(
GPU_Renderer* renderer,
int location,
unsigned int value)
6309 #ifndef SDL_GPU_DISABLE_SHADERS 6312 renderer->
impl->FlushBlitBuffer(renderer);
6316 #ifdef SDL_GPU_USE_OPENGL 6317 if(apply_Intel_attrib_workaround && location == 0)
6319 apply_Intel_attrib_workaround =
GPU_FALSE;
6320 glBegin(GL_TRIANGLES);
6331 static void SetAttributefv(
GPU_Renderer* renderer,
int location,
int num_elements,
float* value)
6338 #ifndef SDL_GPU_DISABLE_SHADERS 6341 renderer->
impl->FlushBlitBuffer(renderer);
6345 #ifdef SDL_GPU_USE_OPENGL 6346 if(apply_Intel_attrib_workaround && location == 0)
6348 apply_Intel_attrib_workaround =
GPU_FALSE;
6349 glBegin(GL_TRIANGLES);
6354 switch(num_elements)
6373 static void SetAttributeiv(
GPU_Renderer* renderer,
int location,
int num_elements,
int* value)
6379 #ifndef SDL_GPU_DISABLE_SHADERS 6382 renderer->
impl->FlushBlitBuffer(renderer);
6386 #ifdef SDL_GPU_USE_OPENGL 6387 if(apply_Intel_attrib_workaround && location == 0)
6389 apply_Intel_attrib_workaround =
GPU_FALSE;
6390 glBegin(GL_TRIANGLES);
6395 switch(num_elements)
6414 static void SetAttributeuiv(
GPU_Renderer* renderer,
int location,
int num_elements,
unsigned int* value)
6421 #ifndef SDL_GPU_DISABLE_SHADERS 6424 renderer->
impl->FlushBlitBuffer(renderer);
6428 #ifdef SDL_GPU_USE_OPENGL 6429 if(apply_Intel_attrib_workaround && location == 0)
6431 apply_Intel_attrib_workaround =
GPU_FALSE;
6432 glBegin(GL_TRIANGLES);
6437 switch(num_elements)
6458 #ifndef SDL_GPU_DISABLE_SHADERS 6467 a = &cdata->shader_attributes[source.
location];
6514 #define SET_COMMON_FUNCTIONS(impl) \ 6515 impl->Init = &Init; \ 6516 impl->CreateTargetFromWindow = &CreateTargetFromWindow; \ 6517 impl->CreateAliasTarget = &CreateAliasTarget; \ 6518 impl->MakeCurrent = &MakeCurrent; \ 6519 impl->SetAsCurrent = &SetAsCurrent; \ 6520 impl->ResetRendererState = &ResetRendererState; \ 6521 impl->SetWindowResolution = &SetWindowResolution; \ 6522 impl->SetVirtualResolution = &SetVirtualResolution; \ 6523 impl->UnsetVirtualResolution = &UnsetVirtualResolution; \ 6524 impl->Quit = &Quit; \ 6526 impl->SetFullscreen = &SetFullscreen; \ 6527 impl->SetCamera = &SetCamera; \ 6529 impl->CreateImage = &CreateImage; \ 6530 impl->CreateImageUsingTexture = &CreateImageUsingTexture; \ 6531 impl->CreateAliasImage = &CreateAliasImage; \ 6532 impl->SaveImage = &SaveImage; \ 6533 impl->CopyImage = &CopyImage; \ 6534 impl->UpdateImage = &UpdateImage; \ 6535 impl->UpdateImageBytes = &UpdateImageBytes; \ 6536 impl->ReplaceImage = &ReplaceImage; \ 6537 impl->CopyImageFromSurface = &CopyImageFromSurface; \ 6538 impl->CopyImageFromTarget = &CopyImageFromTarget; \ 6539 impl->CopySurfaceFromTarget = &CopySurfaceFromTarget; \ 6540 impl->CopySurfaceFromImage = &CopySurfaceFromImage; \ 6541 impl->FreeImage = &FreeImage; \ 6543 impl->LoadTarget = &LoadTarget; \ 6544 impl->FreeTarget = &FreeTarget; \ 6546 impl->Blit = &Blit; \ 6547 impl->BlitRotate = &BlitRotate; \ 6548 impl->BlitScale = &BlitScale; \ 6549 impl->BlitTransform = &BlitTransform; \ 6550 impl->BlitTransformX = &BlitTransformX; \ 6551 impl->TriangleBatchX = &TriangleBatchX; \ 6553 impl->GenerateMipmaps = &GenerateMipmaps; \ 6555 impl->SetClip = &SetClip; \ 6556 impl->UnsetClip = &UnsetClip; \ 6558 impl->GetPixel = &GetPixel; \ 6559 impl->SetImageFilter = &SetImageFilter; \ 6560 impl->SetWrapMode = &SetWrapMode; \ 6562 impl->ClearRGBA = &ClearRGBA; \ 6563 impl->FlushBlitBuffer = &FlushBlitBuffer; \ 6564 impl->Flip = &Flip; \ 6566 impl->CompileShader_RW = &CompileShader_RW; \ 6567 impl->CompileShader = &CompileShader; \ 6568 impl->CreateShaderProgram = &CreateShaderProgram; \ 6569 impl->LinkShaderProgram = &LinkShaderProgram; \ 6570 impl->FreeShader = &FreeShader; \ 6571 impl->FreeShaderProgram = &FreeShaderProgram; \ 6572 impl->AttachShader = &AttachShader; \ 6573 impl->DetachShader = &DetachShader; \ 6574 impl->ActivateShaderProgram = &ActivateShaderProgram; \ 6575 impl->DeactivateShaderProgram = &DeactivateShaderProgram; \ 6576 impl->GetShaderMessage = &GetShaderMessage; \ 6577 impl->GetAttributeLocation = &GetAttributeLocation; \ 6578 impl->GetUniformLocation = &GetUniformLocation; \ 6579 impl->LoadShaderBlock = &LoadShaderBlock; \ 6580 impl->SetShaderImage = &SetShaderImage; \ 6581 impl->GetUniformiv = &GetUniformiv; \ 6582 impl->SetUniformi = &SetUniformi; \ 6583 impl->SetUniformiv = &SetUniformiv; \ 6584 impl->GetUniformuiv = &GetUniformuiv; \ 6585 impl->SetUniformui = &SetUniformui; \ 6586 impl->SetUniformuiv = &SetUniformuiv; \ 6587 impl->GetUniformfv = &GetUniformfv; \ 6588 impl->SetUniformf = &SetUniformf; \ 6589 impl->SetUniformfv = &SetUniformfv; \ 6590 impl->SetUniformMatrixfv = &SetUniformMatrixfv; \ 6591 impl->SetAttributef = &SetAttributef; \ 6592 impl->SetAttributei = &SetAttributei; \ 6593 impl->SetAttributeui = &SetAttributeui; \ 6594 impl->SetAttributefv = &SetAttributefv; \ 6595 impl->SetAttributeiv = &SetAttributeiv; \ 6596 impl->SetAttributeuiv = &SetAttributeuiv; \ 6597 impl->SetAttributeSource = &SetAttributeSource; \ 6601 impl->SetLineThickness = &SetLineThickness; \ 6602 impl->GetLineThickness = &GetLineThickness; \ 6603 impl->Pixel = &Pixel; \ 6604 impl->Line = &Line; \ 6606 impl->ArcFilled = &ArcFilled; \ 6607 impl->Circle = &Circle; \ 6608 impl->CircleFilled = &CircleFilled; \ 6609 impl->Ellipse = &Ellipse; \ 6610 impl->EllipseFilled = &EllipseFilled; \ 6611 impl->Sector = &Sector; \ 6612 impl->SectorFilled = &SectorFilled; \ 6614 impl->TriFilled = &TriFilled; \ 6615 impl->Rectangle = &Rectangle; \ 6616 impl->RectangleFilled = &RectangleFilled; \ 6617 impl->RectangleRound = &RectangleRound; \ 6618 impl->RectangleRoundFilled = &RectangleRoundFilled; \ 6619 impl->Polygon = &Polygon; \ 6620 impl->PolygonFilled = &PolygonFilled; GPU_Image *SDLCALL * CopyImageFromSurface(GPU_Renderer *renderer, SDL_Surface *surface)
#define glVertexAttribI1i
struct GPU_Renderer * renderer
GPU_Target * context_target
#define glGetProgramInfoLog
#define glVertexAttribI3ui
DECLSPEC Uint32 SDLCALL GPU_GetInitWindow(void)
GPU_Target *SDLCALL * CreateTargetFromWindow(GPU_Renderer *renderer, Uint32 windowID, GPU_Target *target)
GPU_BlendFuncEnum dest_alpha
DECLSPEC void SDLCALL GPU_MatrixOrtho(float *result, float left, float right, float bottom, float top, float near, float far)
DECLSPEC void SDLCALL GPU_MakeCurrent(GPU_Target *target, Uint32 windowID)
static_inline void flushAndClearBlitBufferIfCurrentFramebuffer(GPU_Renderer *renderer, GPU_Target *target)
#define SDL_GPU_GLSL_VERSION
GPU_BlendEqEnum color_equation
static_inline void flushAndClearBlitBufferIfCurrentTexture(GPU_Renderer *renderer, GPU_Image *image)
DECLSPEC GPU_bool SDLCALL GPU_SaveSurface(SDL_Surface *surface, const char *filename, GPU_FileFormatEnum format)
#define GPU_BLIT_BUFFER_COLOR_OFFSET
DECLSPEC float *SDLCALL GPU_GetProjection(void)
GPU_RendererID requested_id
DECLSPEC const char *SDLCALL GPU_GetShaderMessage(void)
static_inline Uint32 get_window_id(SDL_Surface *window)
GPU_Image *SDLCALL * CreateImage(GPU_Renderer *renderer, Uint16 w, Uint16 h, GPU_FormatEnum format)
static_inline Uint32 getPixel(SDL_Surface *Surface, int x, int y)
DECLSPEC void SDLCALL GPU_SetColor(GPU_Image *image, SDL_Color color)
static_inline GPU_bool get_fullscreen_state(SDL_Window *window)
DECLSPEC GPU_InitFlagEnum SDLCALL GPU_GetPreInitFlags(void)
Uint32 current_shader_program
float matrix[GPU_MATRIX_STACK_MAX][16]
DECLSPEC void SDLCALL GPU_SetImageFilter(GPU_Image *image, GPU_FilterEnum filter)
int per_vertex_storage_size
GPU_ShaderBlock default_untextured_shader_block
#define glDeleteFramebuffers
#define GPU_DEFAULT_TEXTURED_VERTEX_SHADER_SOURCE
#define GL_MIRRORED_REPEAT
struct GPU_Renderer * renderer
#define glVertexAttribI2i
DECLSPEC float *SDLCALL GPU_GetModelView(void)
#define GPU_FEATURE_BASIC_SHADERS
int modelViewProjection_loc
GPU_MatrixStack modelview_matrix
#define SDL_GPU_GLES_MAJOR_VERSION
GPU_BlendMode shapes_blend_mode
DECLSPEC void SDLCALL GPU_SetShaderBlock(GPU_ShaderBlock block)
GPU_bool shapes_use_blending
DECLSPEC GPU_Target *SDLCALL GPU_GetContextTarget(void)
#define glGetAttribLocation
#define GL_FRAGMENT_SHADER
#define glGetShaderInfoLog
GPU_BlendFuncEnum source_color
DECLSPEC void SDLCALL GPU_SetBlending(GPU_Image *image, GPU_bool enable)
GPU_WindowFlagEnum SDL_init_flags
DECLSPEC void SDLCALL GPU_MatrixRotate(float *result, float degrees, float x, float y, float z)
DECLSPEC GPU_FeatureEnum SDLCALL GPU_GetRequiredFeatures(void)
GPU_bool using_virtual_resolution
int gpu_strcasecmp(const char *s1, const char *s2)
GPU_Target * current_context_target
#define GPU_BLIT_BUFFER_INIT_MAX_NUM_VERTICES
static_inline void flushAndBindTexture(GPU_Renderer *renderer, GLuint handle)
#define glFramebufferTexture2D
#define glUniformMatrix4fv
#define glVertexAttribI2ui
#define glVertexAttribI3i
#define GPU_BLIT_BUFFER_STRIDE
#define glGenFramebuffers
#define glEnableVertexAttribArray
#define SET_INDEXED_VERTEX(offset)
DECLSPEC void SDLCALL GPU_AddWindowMapping(GPU_Target *target)
DECLSPEC void SDLCALL GPU_MultiplyAndAssign(float *result, float *B)
DECLSPEC void SDLCALL GPU_UnsetImageVirtualResolution(GPU_Image *image)
#define glVertexAttribPointer
static_inline void get_target_window_dimensions(GPU_Target *target, int *w, int *h)
DECLSPEC void SDLCALL GPU_UnsetClip(GPU_Target *target)
DECLSPEC void SDLCALL GPU_FreeImage(GPU_Image *image)
static_inline void get_target_drawable_dimensions(GPU_Target *target, int *w, int *h)
#define GPU_DEFAULT_UNTEXTURED_VERTEX_SHADER_SOURCE
DECLSPEC void SDLCALL GPU_GenerateMipmaps(GPU_Image *image)
DECLSPEC void SDLCALL GPU_GetModelViewProjection(float *result)
GPU_AttributeFormat format
#define glVertexAttribI1ui
GPU_MatrixStack projection_matrix
#define glDisableVertexAttribArray
SDL_Surface *SDLCALL * CopySurfaceFromImage(GPU_Renderer *renderer, GPU_Image *image)
#define SDL_GPU_GLSL_VERSION_CORE
#define GL_FRAMEBUFFER_COMPLETE
#define GET_ALPHA(sdl_color)
GPU_Target *SDLCALL * LoadTarget(GPU_Renderer *renderer, GPU_Image *image)
#define SDL_GPU_DISABLE_SHADERS
#define GPU_DEFAULT_TEXTURED_VERTEX_SHADER_SOURCE_CORE
Uint32 GPU_WindowFlagEnum
GPU_ShaderBlock current_shader_block
#define GPU_DEFAULT_TEXTURED_FRAGMENT_SHADER_SOURCE
#define SET_TEXTURED_VERTEX_UNINDEXED(x, y, s, t, r, g, b, a)
DECLSPEC void SDLCALL GPU_MatrixTranslate(float *result, float x, float y, float z)
static_inline void submit_buffer_data(int bytes, float *values, int bytes_indices, unsigned short *indices)
GPU_FilterEnum filter_mode
void * per_vertex_storage
DECLSPEC GPU_bool SDLCALL GPU_GetCoordinateMode(void)
GPU_InitFlagEnum GPU_init_flags
static_inline void get_drawable_dimensions(SDL_Window *window, int *w, int *h)
#define MIX_COLOR_COMPONENT(a, b)
Uint32 default_untextured_shader_program
DECLSPEC GPU_Target *SDLCALL GPU_LoadTarget(GPU_Image *image)
#define GPU_BLIT_BUFFER_ABSOLUTE_MAX_VERTICES
#define GL_COLOR_ATTACHMENT0
float default_image_anchor_y
static_inline void get_window_dimensions(SDL_Window *window, int *w, int *h)
static_inline unsigned int getNearestPowerOf2(unsigned int n)
#define glVertexAttribI4ui
static_inline GPU_bool isCurrentTarget(GPU_Renderer *renderer, GPU_Target *target)
DECLSPEC void SDLCALL GPU_RemoveWindowMappingByTarget(GPU_Target *target)
int per_vertex_storage_stride_bytes
GPU_bool using_virtual_resolution
DECLSPEC void SDLCALL GPU_UnsetColor(GPU_Image *image)
#define GPU_BLIT_BUFFER_TEX_COORD_OFFSET
GPU_Target * context_target
SDL_Surface *SDLCALL * CopySurfaceFromTarget(GPU_Renderer *renderer, GPU_Target *target)
#define GPU_BLIT_BUFFER_FLOATS_PER_VERTEX
#define glBlendFuncSeparate
static_inline void flushAndBindFramebuffer(GPU_Renderer *renderer, GLuint handle)
GPU_BlendEqEnum alpha_equation
#define glGetUniformLocation
DECLSPEC void SDLCALL GPU_MatrixCopy(float *result, const float *A)
static_inline void resize_window(GPU_Target *target, int w, int h)
#define GPU_DEFAULT_UNTEXTURED_FRAGMENT_SHADER_SOURCE_CORE
#define GPU_DEFAULT_UNTEXTURED_FRAGMENT_SHADER_SOURCE
#define glBindFramebuffer
#define glCheckFramebufferStatus
struct GPU_RendererImpl * impl
#define GPU_BLIT_BUFFER_VERTICES_PER_SPRITE
#define glVertexAttribI4i
GPU_BlendFuncEnum source_alpha
#define MIX_COLOR_COMPONENT_NORMALIZED_RESULT(a, b)
DECLSPEC void SDLCALL GPU_MatrixIdentity(float *result)
static_inline void flushBlitBufferIfCurrentTexture(GPU_Renderer *renderer, GPU_Image *image)
DECLSPEC void SDLCALL GPU_SetInitWindow(Uint32 windowID)
GPU_BlendFuncEnum dest_color
DECLSPEC GPU_Rect SDLCALL GPU_MakeRect(float x, float y, float w, float h)
float default_image_anchor_x
#define GPU_DEFAULT_TEXTURED_FRAGMENT_SHADER_SOURCE_CORE
DECLSPEC GPU_BlendMode SDLCALL GPU_GetBlendModeFromPreset(GPU_BlendPresetEnum preset)
DECLSPEC void SDLCALL GPU_SetWrapMode(GPU_Image *image, GPU_WrapEnum wrap_mode_x, GPU_WrapEnum wrap_mode_y)
DECLSPEC void SDLCALL GPU_PushErrorCode(const char *function, GPU_ErrorEnum error, const char *details,...)
DECLSPEC void SDLCALL GPU_SetSnapMode(GPU_Image *image, GPU_SnapEnum mode)
#define SDL_GPU_GL_MAJOR_VERSION
DECLSPEC void SDLCALL GPU_MatrixScale(float *result, float sx, float sy, float sz)
DECLSPEC GPU_Camera SDLCALL GPU_GetDefaultCamera(void)
#define glBlendEquationSeparate
#define GL_COMPILE_STATUS
GPU_FeatureEnum enabled_features
static_inline GPU_bool has_colorkey(SDL_Surface *surface)
DECLSPEC void SDLCALL GPU_Multiply4x4(float *result, float *A, float *B)
#define GPU_BLIT_BUFFER_VERTEX_OFFSET
DECLSPEC void SDLCALL GPU_RemoveWindowMapping(Uint32 windowID)
#define GL_FRAMEBUFFER_BINDING
GPU_ShaderBlock default_textured_shader_block
DECLSPEC GPU_ShaderBlock SDLCALL GPU_LoadShaderBlock(Uint32 program_object, const char *position_name, const char *texcoord_name, const char *color_name, const char *modelViewMatrix_name)
static_inline SDL_Window * get_window(Uint32 windowID)
Uint32 default_textured_shader_program
DECLSPEC void SDLCALL GPU_SetImageVirtualResolution(GPU_Image *image, Uint16 w, Uint16 h)
static_inline GPU_bool isPowerOfTwo(unsigned int x)
int per_vertex_storage_offset_bytes
#define GPU_DEFAULT_UNTEXTURED_VERTEX_SHADER_SOURCE_CORE
#define GPU_INDEX_BUFFER_ABSOLUTE_MAX_VERTICES