diff options
author | Ryan C. Gordon <icculus@icculus.org> | 2008-12-07 07:06:34 +0000 |
---|---|---|
committer | Ryan C. Gordon <icculus@icculus.org> | 2008-12-07 07:06:34 +0000 |
commit | d47e969767eec2cc93389f58d690ed876974fe90 (patch) | |
tree | 25c770b408c0ed923093772c6701c375d8bc5120 /src | |
parent | 90c895f436fc0bcad1d3685a6e7ea3f3ae6b2e09 (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.c | 36 |
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" |