Changeset 778


Ignore:
Timestamp:
Jun 14, 2011, 1:54:37 AM (9 years ago)
Author:
sam
Message:

shader: check CRC before patching the shader and fix vertex shaders and
fragment shaders differently.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/shader.cpp

    r776 r778  
    4242    /* Shader patcher */
    4343    static int GetVersion();
    44     static void Patch(char *dst, char const *src);
     44    static void Patch(char *dst, char const *vert, char const *frag);
    4545
    4646    /* Global shader cache */
     
    8989#if !defined __CELLOS_LV2__
    9090    /* Compile vertex shader */
    91     ShaderData::Patch(buf, vert);
    92     data->vert_crc = Hash::Crc32(buf);
     91    data->vert_crc = Hash::Crc32(vert);
     92    ShaderData::Patch(buf, vert, NULL);
    9393    data->vert_id = glCreateShader(GL_VERTEX_SHADER);
    9494    glShaderSource(data->vert_id, 1, &shader, NULL);
     
    103103
    104104    /* Compile fragment shader */
    105     ShaderData::Patch(buf, frag);
    106     data->frag_crc = Hash::Crc32(buf);
     105    data->frag_crc = Hash::Crc32(frag);
     106    ShaderData::Patch(buf, NULL, frag);
    107107    data->frag_id = glCreateShader(GL_FRAGMENT_SHADER);
    108108    glShaderSource(data->frag_id, 1, &shader, NULL);
     
    217217 *  - replace "#version 130" with "#version 120"
    218218 */
    219 void ShaderData::Patch(char *dst, char const *src)
    220 {
    221     int version = GetVersion();
    222 
    223     strcpy(dst, src);
    224     if (version >= 130)
     219void ShaderData::Patch(char *dst, char const *vert, char const *frag)
     220{
     221    int ver_driver = GetVersion();
     222
     223    strcpy(dst, vert ? vert : frag);
     224    if (ver_driver >= 130)
    225225        return;
    226226
    227     if (version >= 110)
    228     {
    229         char *parser, *main;
     227    int ver_shader = 110;
     228    char *parser = strstr(dst, "#version");
     229    if (parser)
     230        ver_shader = atoi(parser + strlen("#version"));
     231
     232    if (ver_shader > 120 && ver_driver <= 120)
     233    {
    230234        char const *end = dst + strlen(dst) + 1;
    231235
     
    239243        parser = strstr(parser, "{");
    240244        if (!parser) return;
    241         main = parser + 1;
     245        char *main = parser + 1;
    242246
    243247        /* Perform main() replaces */
    244         static char const * const main_replaces[] =
    245         {
     248        char const * const main_replaces[] =
     249        {
     250#if 0
    246251            "in vec2 in_Vertex;", "vec2 in_Vertex = gl_Vertex.xy;",
    247252            "in vec3 in_Vertex;", "vec3 in_Vertex = gl_Vertex.xyz;",
     
    268273            "in vec2 in_MultiTexCoord7;",
    269274               "vec2 in_MultiTexCoord7 = gl_MultiTexCoord7.xy;",
     275#endif
    270276
    271277            NULL
     
    288294
    289295        /* Perform small replaces */
    290         static char const * const fast_replaces[] =
     296        char const * const fast_replaces[] =
    291297        {
    292298            "#version 130", "#version 120",
    293             "\nin vec2", "\n   vec2",
    294             "\nin vec3", "\n   vec3",
    295             "\nin vec4", "\n   vec4",
    296             "\nin mat4", "\n   mat4",
     299            "in vec2", vert ? "attribute vec2" : "varying vec2",
     300            "in vec3", vert ? "attribute vec3" : "varying vec3",
     301            "in vec4", vert ? "attribute vec4" : "varying vec4",
     302            "in mat4", vert ? "attribute mat4" : "varying mat4",
     303            "out vec2", "varying vec2",
     304            "out vec3", "varying vec3",
     305            "out vec4", "varying vec4",
     306            "out mat4", "varying mat4",
    297307            NULL
    298308        };
Note: See TracChangeset for help on using the changeset viewer.