# HG changeset patch # User Sam Lantinga # Date 1186902148 0 # Node ID 9b7d29d2432b15caa7f82c4f30e7d7b53957fa10 # Parent 22342048bcb82996ced7a6a900c16fd92558dae5 Optimized OpenGL renderer for Mac OS X. The SDL 1.2 API version of testsprite went from 120 FPS to 320 FPS. :) diff -r 22342048bcb8 -r 9b7d29d2432b src/video/SDL_renderer_gl.c --- a/src/video/SDL_renderer_gl.c Sun Aug 12 05:48:51 2007 +0000 +++ b/src/video/SDL_renderer_gl.c Sun Aug 12 07:02:28 2007 +0000 @@ -32,6 +32,10 @@ /* OpenGL renderer implementation */ +/* Details on optimizing the texture path on Mac OS X: + http://developer.apple.com/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_texturedata/chapter_10_section_2.html +*/ + static const float inv255f = 1.0f / 255.0f; static SDL_Renderer *GL_CreateRenderer(SDL_Window * window, Uint32 flags); @@ -461,9 +465,15 @@ type = GL_UNSIGNED_BYTE; break; case SDL_PIXELFORMAT_ARGB8888: +#ifdef __MACOSX__ + internalFormat = GL_RGBA; + format = GL_BGRA; + type = GL_UNSIGNED_INT_8_8_8_8_REV; +#else internalFormat = GL_RGBA8; format = GL_BGRA; type = GL_UNSIGNED_BYTE; +#endif break; case SDL_PIXELFORMAT_ABGR8888: internalFormat = GL_RGBA8; @@ -526,8 +536,42 @@ data->format = format; data->formattype = type; renderdata->glBindTexture(data->type, data->texture); - renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w, - texture_h, 0, format, type, NULL); + renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER, + GL_NEAREST); + renderdata->glTexParameteri(data->type, GL_TEXTURE_MAG_FILTER, + GL_NEAREST); + renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_S, + GL_CLAMP_TO_EDGE); + renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_T, + GL_CLAMP_TO_EDGE); +#ifdef __MACOSX__ +#ifndef GL_TEXTURE_STORAGE_HINT_APPLE +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#endif +#ifndef STORAGE_CACHED_APPLE +#define STORAGE_CACHED_APPLE 0x85BE +#endif +#ifndef STORAGE_SHARED_APPLE +#define STORAGE_SHARED_APPLE 0x85BF +#endif + if (texture->access == SDL_TEXTUREACCESS_STREAMING) { + renderdata->glTexParameteri(data->type, GL_TEXTURE_STORAGE_HINT_APPLE, + GL_STORAGE_SHARED_APPLE); + } else { + renderdata->glTexParameteri(data->type, GL_TEXTURE_STORAGE_HINT_APPLE, + GL_STORAGE_CACHED_APPLE); + } + if (data->pixels && internalFormat == GL_RGBA && format == GL_BGRA + && type == GL_UNSIGNED_INT_8_8_8_8_REV && data->pixels) { + renderdata->glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE); + renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w, + texture_h, 0, format, type, data->pixels); + } else +#endif + { + renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w, + texture_h, 0, format, type, NULL); + } result = renderdata->glGetError(); if (result != GL_NO_ERROR) { GL_SetError("glTexImage2D()", result);