Don't hardcode RECT for fragment program texture targets.
authorRyan C. Gordon <icculus@icculus.org>
Sun, 07 Dec 2008 07:06:34 +0000
changeset 2847 7d020441fa81
parent 2846 3d7833d5a4be
child 2848 8a3aa505ecba
Don't hardcode RECT for fragment program texture targets. Now we can generate what a given system needs when compiling the shader.
src/video/SDL_renderer_gl.c
--- a/src/video/SDL_renderer_gl.c	Sun Dec 07 04:38:32 2008 +0000
+++ b/src/video/SDL_renderer_gl.c	Sun Dec 07 07:06:34 2008 +0000
@@ -478,19 +478,42 @@
 #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 @@
     "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"