summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRyan C. Gordon <icculus@icculus.org>2008-12-07 07:06:34 +0000
committerRyan C. Gordon <icculus@icculus.org>2008-12-07 07:06:34 +0000
commitd47e969767eec2cc93389f58d690ed876974fe90 (patch)
tree25c770b408c0ed923093772c6701c375d8bc5120 /src
parent90c895f436fc0bcad1d3685a6e7ea3f3ae6b2e09 (diff)
Don't hardcode RECT for fragment program texture targets.
Now we can generate what a given system needs when compiling the shader.
Diffstat (limited to 'src')
-rw-r--r--src/video/SDL_renderer_gl.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/src/video/SDL_renderer_gl.c b/src/video/SDL_renderer_gl.c
index 05891f465b..9cf890af20 100644
--- a/src/video/SDL_renderer_gl.c
+++ b/src/video/SDL_renderer_gl.c
@@ -478,19 +478,42 @@ power_of_2(int input)
#define DEBUG_PROGRAM_COMPILE 1
static GLuint
-compile_shader(GL_RenderData *data, GLenum shader_type, const char *source)
+compile_shader(GL_RenderData *data, GLenum shader_type, const char *_code)
{
+ const int have_texture_rects = data->GL_ARB_texture_rectangle_supported;
+ const char *replacement = have_texture_rects ? "RECT" : "2D";
+ const size_t replacementlen = strlen(replacement);
+ const char *token = "%TEXTURETARGET%";
+ const size_t tokenlen = strlen(token);
+ char *code = NULL;
+ char *ptr = NULL;
+ GLuint program = 0;
+
+ /*
+ * The TEX instruction needs a different target depending on what we use.
+ * To handle this, we use "%TEXTURETARGET%" and replace the string before
+ * compiling the shader.
+ */
+ code = SDL_strdup(_code);
+ if (code == NULL)
+ return 0;
+
+ for (ptr = SDL_strstr(code, token); ptr; ptr = SDL_strstr(ptr+1, token)) {
+ memcpy(ptr, replacement, replacementlen);
+ memmove(ptr+replacementlen, ptr+tokenlen, strlen(ptr+tokenlen)+1);
+ }
+
#if DEBUG_PROGRAM_COMPILE
- printf("compiling shader:\n%s\n\n", source);
+ printf("compiling shader:\n%s\n\n", code);
#endif
- GLuint program = 0;
-
data->glGetError(); /* flush any existing error state. */
data->glGenProgramsARB(1, &program);
data->glBindProgramARB(shader_type, program);
data->glProgramStringARB(shader_type, GL_PROGRAM_FORMAT_ASCII_ARB,
- SDL_strlen(source), source);
+ SDL_strlen(code), code);
+
+ SDL_free(code);
if (data->glGetError() == GL_INVALID_OPERATION)
{
@@ -534,8 +557,7 @@ static const char *fragment_program_UYVY_source_code =
"MUL work, fragment.texcoord, { 0.5, 1.0, 1.0, 1.0 };\n"
// Sample the YUV texture. Cb, Y1, Cr, Y2, are stored x,y,z,w
- // !!! FIXME: "RECT" needs to be "2D" if we're not using texture_rectangle extension. :/
- "TEX uyvy, work, texture[0], RECT;\n"
+ "TEX uyvy, work, texture[0], %TEXTURETARGET%;\n"
// Do subtractions (128/255, 16/255, 128/255, 16/255)
"SUB uyvy, uyvy, { 0.501960784313726, 0.06274509803922, 0.501960784313726, 0.06274509803922 };\n"