diff options
author | Neil Roberts <neil@linux.intel.com> | 2011-11-25 21:57:05 +0000 |
---|---|---|
committer | Robert Bragg <robert@linux.intel.com> | 2011-12-06 19:02:06 +0000 |
commit | a0903e0cfb08e2ae75a1e2e038d511044ac4f4a1 (patch) | |
tree | c47529d3ae644c5f2b748c48d0fb492937404245 /cogl/cogl-pipeline-snippet.c | |
parent | cdc4bd6361cc1037a31da813f3bb8ee25cef7523 (diff) | |
download | cogl-a0903e0cfb08e2ae75a1e2e038d511044ac4f4a1.tar.gz |
snippet: Don't generate code for snippets that are replaced
The loop that generates code for a list of snippets now starts from
the first snippet that has a replace string. Any snippets before that
would be ignored so there's no point in generating code for them.
Reviewed-by: Robert Bragg <robert@linux.intel.com>
Diffstat (limited to 'cogl/cogl-pipeline-snippet.c')
-rw-r--r-- | cogl/cogl-pipeline-snippet.c | 90 |
1 files changed, 52 insertions, 38 deletions
diff --git a/cogl/cogl-pipeline-snippet.c b/cogl/cogl-pipeline-snippet.c index a5d1340b..33bf2234 100644 --- a/cogl/cogl-pipeline-snippet.c +++ b/cogl/cogl-pipeline-snippet.c @@ -40,17 +40,66 @@ void _cogl_pipeline_snippet_generate_code (const CoglPipelineSnippetData *data) { - CoglPipelineSnippet *snippet; + CoglPipelineSnippet *first_snippet, *snippet; int snippet_num = 0; int n_snippets = 0; + first_snippet = COGL_LIST_FIRST (data->snippets); + /* First count the number of snippets so we can easily tell when we're at the last one */ COGL_LIST_FOREACH (snippet, data->snippets, list_node) if (snippet->snippet->hook == data->hook) - n_snippets++; + { + /* Don't bother processing any previous snippets if we reach + one that has a replacement */ + if (snippet->snippet->replace) + { + n_snippets = 1; + first_snippet = snippet; + } + else + n_snippets++; + } - COGL_LIST_FOREACH (snippet, data->snippets, list_node) + /* If there weren't any snippets then generate a stub function with + the final name */ + if (n_snippets == 0) + { + if (data->return_type) + g_string_append_printf (data->source_buf, + "\n" + "%s\n" + "%s (%s)\n" + "{\n" + " return %s (%s);\n" + "}\n", + data->return_type, + data->final_name, + data->argument_declarations ? + data->argument_declarations : "", + data->chain_function, + data->arguments ? data->arguments : ""); + else + g_string_append_printf (data->source_buf, + "\n" + "void\n" + "%s (%s)\n" + "{\n" + " %s (%s);\n" + "}\n", + data->final_name, + data->argument_declarations ? + data->argument_declarations : "", + data->chain_function, + data->arguments ? data->arguments : ""); + + return; + } + + for (snippet = first_snippet, snippet_num = 0; + snippet_num < n_snippets; + snippet = COGL_LIST_NEXT (snippet, list_node), snippet_num++) if (snippet->snippet->hook == data->hook) { const char *source; @@ -130,42 +179,7 @@ _cogl_pipeline_snippet_generate_code (const CoglPipelineSnippetData *data) data->return_variable); g_string_append (data->source_buf, "}\n"); - - snippet_num++; } - - /* If there weren't any snippets then generate a stub function with - the final name */ - if (snippet_num == 0) - { - if (data->return_type) - g_string_append_printf (data->source_buf, - "\n" - "%s\n" - "%s (%s)\n" - "{\n" - " return %s (%s);\n" - "}\n", - data->return_type, - data->final_name, - data->argument_declarations ? - data->argument_declarations : "", - data->chain_function, - data->arguments ? data->arguments : ""); - else - g_string_append_printf (data->source_buf, - "\n" - "void\n" - "%s (%s)\n" - "{\n" - " %s (%s);\n" - "}\n", - data->final_name, - data->argument_declarations ? - data->argument_declarations : "", - data->chain_function, - data->arguments ? data->arguments : ""); - } } static void |