Changeset 776


Ignore:
Timestamp:
Jun 13, 2011, 9:35:49 PM (8 years ago)
Author:
sam
Message:

shader: support most standard parameters in the shader patcher.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/shader.cpp

    r775 r776  
    8383  : data(new ShaderData())
    8484{
    85     char buf[4096];
     85    char buf[4096], errbuf[4096];
    8686    char const *shader = buf;
    8787    GLsizei len;
    8888
    8989#if !defined __CELLOS_LV2__
    90 
    91     /* Compile vertex shader and fragment shader */
     90    /* Compile vertex shader */
    9291    ShaderData::Patch(buf, vert);
    9392    data->vert_crc = Hash::Crc32(buf);
     
    9695    glCompileShader(data->vert_id);
    9796
    98     glGetShaderInfoLog(data->vert_id, sizeof(buf), &len, buf);
     97    glGetShaderInfoLog(data->vert_id, sizeof(errbuf), &len, errbuf);
    9998    if (len > 0)
    100         Log::Error("failed to compile vertex shader: %s", buf);
    101 
     99    {
     100        Log::Error("failed to compile vertex shader: %s", errbuf);
     101        Log::Error("shader source:\n%s\n", buf);
     102    }
     103
     104    /* Compile fragment shader */
    102105    ShaderData::Patch(buf, frag);
    103106    data->frag_crc = Hash::Crc32(buf);
     
    106109    glCompileShader(data->frag_id);
    107110
    108     glGetShaderInfoLog(data->frag_id, sizeof(buf), &len, buf);
     111    glGetShaderInfoLog(data->frag_id, sizeof(errbuf), &len, errbuf);
    109112    if (len > 0)
    110         Log::Error("failed to compile fragment shader: %s", buf);
    111 
     113    {
     114        Log::Error("failed to compile fragment shader: %s", errbuf);
     115        Log::Error("shader source:\n%s\n", buf);
     116    }
     117
     118    /* Create program */
    112119    data->prog_id = glCreateProgram();
    113120    glAttachShader(data->prog_id, data->vert_id);
     
    214221    int version = GetVersion();
    215222
     223    strcpy(dst, src);
    216224    if (version >= 130)
    217     {
    218         strcpy(dst, src);
    219225        return;
    220     }
    221 
    222     if (version == 120)
    223     {
    224         static char const * const replaces[] =
    225         {
    226             "#version 130", "#version 120",
    227             "\nin vec2", "\nvec2",
    228             "\nin vec3", "\nvec3",
    229             "\nin vec4", "\nvec4",
    230             "\nin mat4", "\nmat4",
     226
     227    if (version >= 110)
     228    {
     229        char *parser, *main;
     230        char const *end = dst + strlen(dst) + 1;
     231
     232        /* Find main() */
     233        parser = strstr(dst, "main");
     234        if (!parser) return;
     235        parser = strstr(parser, "(");
     236        if (!parser) return;
     237        parser = strstr(parser, ")");
     238        if (!parser) return;
     239        parser = strstr(parser, "{");
     240        if (!parser) return;
     241        main = parser + 1;
     242
     243        /* Perform main() replaces */
     244        static char const * const main_replaces[] =
     245        {
     246            "in vec2 in_Vertex;", "vec2 in_Vertex = gl_Vertex.xy;",
     247            "in vec3 in_Vertex;", "vec3 in_Vertex = gl_Vertex.xyz;",
     248            "in vec4 in_Vertex;", "vec4 in_Vertex = gl_Vertex.xyzw;",
     249
     250            "in vec2 in_Color;", "vec2 in_Color = gl_Color.xy;",
     251            "in vec3 in_Color;", "vec3 in_Color = gl_Color.xyz;",
     252            "in vec4 in_Color;", "vec4 in_Color = gl_Color.xyzw;",
     253
     254            "in vec2 in_MultiTexCoord0;",
     255               "vec2 in_MultiTexCoord0 = gl_MultiTexCoord0.xy;",
     256            "in vec2 in_MultiTexCoord1;",
     257               "vec2 in_MultiTexCoord1 = gl_MultiTexCoord1.xy;",
     258            "in vec2 in_MultiTexCoord2;",
     259               "vec2 in_MultiTexCoord2 = gl_MultiTexCoord2.xy;",
     260            "in vec2 in_MultiTexCoord3;",
     261               "vec2 in_MultiTexCoord3 = gl_MultiTexCoord3.xy;",
     262            "in vec2 in_MultiTexCoord4;",
     263               "vec2 in_MultiTexCoord4 = gl_MultiTexCoord4.xy;",
     264            "in vec2 in_MultiTexCoord5;",
     265               "vec2 in_MultiTexCoord5 = gl_MultiTexCoord5.xy;",
     266            "in vec2 in_MultiTexCoord6;",
     267               "vec2 in_MultiTexCoord6 = gl_MultiTexCoord6.xy;",
     268            "in vec2 in_MultiTexCoord7;",
     269               "vec2 in_MultiTexCoord7 = gl_MultiTexCoord7.xy;",
     270
    231271            NULL
    232272        };
    233273
    234         while (*src)
    235         {
    236             for (char const * const *rep = replaces; rep[0]; rep += 2)
     274        for (char const * const *rep = main_replaces; rep[0]; rep += 2)
     275        {
     276            char *match = strstr(dst, rep[0]);
     277            if (match && match < main)
    237278            {
    238279                size_t l0 = strlen(rep[0]);
    239                 if (!strncmp(src, rep[0], l0))
    240                 {
    241                     src += l0;
    242                     dst += sprintf(dst, "%s", rep[1]);
    243                     goto next;
    244                 }
     280                size_t l1 = strlen(rep[1]);
     281                memmove(main + l1, main, end - main);
     282                memcpy(main, rep[1], l1);
     283                memset(match, ' ', l0);
     284                main += l1;
     285                end += l1;
    245286            }
    246 
    247             *dst++ = *src++;
    248 
    249             next: continue;
    250287        }
    251         *dst = '\0';
     288
     289        /* Perform small replaces */
     290        static char const * const fast_replaces[] =
     291        {
     292            "#version 130", "#version 120",
     293            "\nin vec2", "\n   vec2",
     294            "\nin vec3", "\n   vec3",
     295            "\nin vec4", "\n   vec4",
     296            "\nin mat4", "\n   mat4",
     297            NULL
     298        };
     299
     300        for (char const * const *rep = fast_replaces; rep[0]; rep += 2)
     301        {
     302            char *match;
     303            while ((match = strstr(dst, rep[0])))
     304            {
     305                size_t l0 = strlen(rep[0]);
     306                size_t l1 = strlen(rep[1]);
     307
     308                if (l1 > l0)
     309                    memmove(match + l1, match + l0, (end - match) - l0);
     310                memcpy(match, rep[1], l1);
     311                if (l1 < l0)
     312                    memset(match + l0, ' ', l1 - l0);
     313                end += l1 - l0;
     314            }
     315        }
    252316    }
    253317}
Note: See TracChangeset for help on using the changeset viewer.