[Cogl] [PATCH 2/2] Add the layer's sampler and uniform declarations at the start

Robert Bragg robert at sixbynine.org
Tue Feb 26 12:38:01 PST 2013


This looks good to land to me:

Reviewed-by: Robert Bragg <robert at linux.intel.com>

thanks,
- Robert

On Tue, Feb 26, 2013 at 7:56 PM, Neil Roberts <neil at linux.intel.com> wrote:
> Previously the sampler uniform declarations such as cogl_sampler0 were
> generated by walking the list of layers in the shader state. This had
> two problems. Firstly it would only generate the declarations for
> layers that have been referenced. If a layer has a combine mode of
> replace then the samplers from previous layers couldn't be used by
> custom snippets. Secondly it meant that the samplers couldn't be
> referenced by functions in the declarations sections because the
> samplers are declared too late.
>
> This patch fixes it to generate the layer declarations in the backend
> start function using all of the layers on the pipeline instead. In
> addition it adds the sampler declarations to the vertex shader as they
> were previously missing.
> ---
>  cogl/driver/gl/cogl-pipeline-fragend-glsl.c | 104 +++++++++++-----------------
>  cogl/driver/gl/cogl-pipeline-vertend-glsl.c |  48 ++++++++++---
>  cogl/driver/gl/cogl-util-gl-private.h       |   8 ++-
>  cogl/driver/gl/cogl-util-gl.c               |  40 ++++++++++-
>  4 files changed, 125 insertions(+), 75 deletions(-)
>
> diff --git a/cogl/driver/gl/cogl-pipeline-fragend-glsl.c b/cogl/driver/gl/cogl-pipeline-fragend-glsl.c
> index 85bc8d3..f432a0c 100644
> --- a/cogl/driver/gl/cogl-pipeline-fragend-glsl.c
> +++ b/cogl/driver/gl/cogl-pipeline-fragend-glsl.c
> @@ -204,6 +204,42 @@ has_replace_hook (CoglPipelineLayer *layer,
>    return FALSE;
>  }
>
> +static CoglBool
> +add_layer_declaration_cb (CoglPipelineLayer *layer,
> +                          void *user_data)
> +{
> +  CoglPipelineShaderState *shader_state = user_data;
> +  CoglTextureType texture_type =
> +    _cogl_pipeline_layer_get_texture_type (layer);
> +  const char *target_string;
> +
> +  _cogl_gl_util_get_texture_target_string (texture_type, &target_string, NULL);
> +
> +  g_string_append_printf (shader_state->header,
> +                          "varying vec4 _cogl_tex_coord%i;\n"
> +                          "#define cogl_tex_coord%i_in _cogl_tex_coord%i\n"
> +                          "uniform sampler%s cogl_sampler%i;\n",
> +                          layer->index,
> +                          layer->index,
> +                          layer->index,
> +                          target_string,
> +                          layer->index);
> +
> +  return TRUE;
> +}
> +
> +static void
> +add_layer_declarations (CoglPipeline *pipeline,
> +                        CoglPipelineShaderState *shader_state)
> +{
> +  /* We always emit sampler uniforms in case there will be custom
> +   * layer snippets that want to sample arbitrary layers. */
> +
> +  _cogl_pipeline_foreach_layer_internal (pipeline,
> +                                         add_layer_declaration_cb,
> +                                         shader_state);
> +}
> +
>  static void
>  add_global_declarations (CoglPipeline *pipeline,
>                           CoglPipelineShaderState *shader_state)
> @@ -311,6 +347,7 @@ _cogl_pipeline_fragend_glsl_start (CoglPipeline *pipeline,
>    shader_state->source = ctx->codegen_source_buffer;
>    COGL_LIST_INIT (&shader_state->layers);
>
> +  add_layer_declarations (pipeline, shader_state);
>    add_global_declarations (pipeline, shader_state);
>
>    g_string_append (shader_state->source,
> @@ -337,44 +374,6 @@ add_constant_lookup (CoglPipelineShaderState *shader_state,
>  }
>
>  static void
> -get_texture_target_string (CoglTextureType texture_type,
> -                           const char **target_string_out,
> -                           const char **swizzle_out)
> -{
> -  const char *target_string, *tex_coord_swizzle;
> -
> -  switch (texture_type)
> -    {
> -#if 0 /* TODO */
> -    case COGL_TEXTURE_TYPE_1D:
> -      target_string = "1D";
> -      tex_coord_swizzle = "s";
> -      break;
> -#endif
> -
> -    case COGL_TEXTURE_TYPE_2D:
> -      target_string = "2D";
> -      tex_coord_swizzle = "st";
> -      break;
> -
> -    case COGL_TEXTURE_TYPE_3D:
> -      target_string = "3D";
> -      tex_coord_swizzle = "stp";
> -      break;
> -
> -    case COGL_TEXTURE_TYPE_RECTANGLE:
> -      target_string = "2DRect";
> -      tex_coord_swizzle = "st";
> -      break;
> -    }
> -
> -  if (target_string_out)
> -    *target_string_out = target_string;
> -  if (swizzle_out)
> -    *swizzle_out = tex_coord_swizzle;
> -}
> -
> -static void
>  ensure_texture_lookup_generated (CoglPipelineShaderState *shader_state,
>                                   CoglPipeline *pipeline,
>                                   CoglPipelineLayer *layer)
> @@ -391,9 +390,9 @@ ensure_texture_lookup_generated (CoglPipelineShaderState *shader_state,
>
>    texture_type =
>      _cogl_pipeline_layer_get_texture_type (layer);
> -  get_texture_target_string (texture_type,
> -                             &target_string,
> -                             &tex_coord_swizzle);
> +  _cogl_gl_util_get_texture_target_string (texture_type,
> +                                           &target_string,
> +                                           &tex_coord_swizzle);
>
>    shader_state->unit_state[unit_index].sampled = TRUE;
>
> @@ -990,29 +989,6 @@ _cogl_pipeline_fragend_glsl_end (CoglPipeline *pipeline,
>            CoglPipelineLayer *last_layer;
>            LayerData *layer_data, *tmp;
>
> -          /* We always emit sampler uniforms in case there will be custom
> -           * layer snippets that want to sample arbitrary layers. */
> -
> -          COGL_LIST_FOREACH (layer_data, &shader_state->layers, list_node)
> -            {
> -              CoglPipelineLayer *layer = layer_data->layer;
> -              CoglTextureType texture_type =
> -                _cogl_pipeline_layer_get_texture_type (layer);
> -              const char *target_string;
> -
> -              get_texture_target_string (texture_type, &target_string, NULL);
> -
> -              g_string_append_printf (shader_state->header,
> -                                      "varying vec4 _cogl_tex_coord%i;\n"
> -                                      "#define cogl_tex_coord%i_in _cogl_tex_coord%i\n"
> -                                      "uniform sampler%s cogl_sampler%i;\n",
> -                                      layer->index,
> -                                      layer->index,
> -                                      layer->index,
> -                                      target_string,
> -                                      layer->index);
> -            }
> -
>            last_layer = COGL_LIST_FIRST (&shader_state->layers)->layer;
>
>            ensure_layer_generated (pipeline, last_layer->index);
> diff --git a/cogl/driver/gl/cogl-pipeline-vertend-glsl.c b/cogl/driver/gl/cogl-pipeline-vertend-glsl.c
> index 3a2b155..9ae4a83 100644
> --- a/cogl/driver/gl/cogl-pipeline-vertend-glsl.c
> +++ b/cogl/driver/gl/cogl-pipeline-vertend-glsl.c
> @@ -139,6 +139,44 @@ get_layer_vertex_snippets (CoglPipelineLayer *layer)
>    return &layer->big_state->vertex_snippets;
>  }
>
> +static CoglBool
> +add_layer_declaration_cb (CoglPipelineLayer *layer,
> +                          void *user_data)
> +{
> +  CoglPipelineShaderState *shader_state = user_data;
> +  CoglTextureType texture_type =
> +    _cogl_pipeline_layer_get_texture_type (layer);
> +  const char *target_string;
> +
> +  _cogl_gl_util_get_texture_target_string (texture_type, &target_string, NULL);
> +
> +  g_string_append_printf (shader_state->header,
> +                          "attribute vec4 cogl_tex_coord%i_in;\n"
> +                          "varying vec4 _cogl_tex_coord%i;\n"
> +                          "#define cogl_tex_coord%i_out _cogl_tex_coord%i\n"
> +                          "uniform sampler%s cogl_sampler%i;\n",
> +                          layer->index,
> +                          layer->index,
> +                          layer->index,
> +                          layer->index,
> +                          target_string,
> +                          layer->index);
> +
> +  return TRUE;
> +}
> +
> +static void
> +add_layer_declarations (CoglPipeline *pipeline,
> +                        CoglPipelineShaderState *shader_state)
> +{
> +  /* We always emit sampler uniforms in case there will be custom
> +   * layer snippets that want to sample arbitrary layers. */
> +
> +  _cogl_pipeline_foreach_layer_internal (pipeline,
> +                                         add_layer_declaration_cb,
> +                                         shader_state);
> +}
> +
>  static void
>  add_global_declarations (CoglPipeline *pipeline,
>                           CoglPipelineShaderState *shader_state)
> @@ -233,6 +271,7 @@ _cogl_pipeline_vertend_glsl_start (CoglPipeline *pipeline,
>    shader_state->header = ctx->codegen_header_buffer;
>    shader_state->source = ctx->codegen_source_buffer;
>
> +  add_layer_declarations (pipeline, shader_state);
>    add_global_declarations (pipeline, shader_state);
>
>    g_string_append (shader_state->source,
> @@ -265,15 +304,6 @@ _cogl_pipeline_vertend_glsl_add_layer (CoglPipeline *pipeline,
>    if (shader_state->source == NULL)
>      return TRUE;
>
> -  g_string_append_printf (shader_state->header,
> -                          "attribute vec4 cogl_tex_coord%i_in;\n"
> -                          "varying vec4 _cogl_tex_coord%i;\n"
> -                          "#define cogl_tex_coord%i_out _cogl_tex_coord%i\n",
> -                          layer_index,
> -                          layer_index,
> -                          layer_index,
> -                          layer_index);
> -
>    /* Hook to transform the texture coordinates. By default this just
>     * directly uses the texture coordinates.
>     */
> diff --git a/cogl/driver/gl/cogl-util-gl-private.h b/cogl/driver/gl/cogl-util-gl-private.h
> index 2abd6cb..b47f301 100644
> --- a/cogl/driver/gl/cogl-util-gl-private.h
> +++ b/cogl/driver/gl/cogl-util-gl-private.h
> @@ -3,7 +3,7 @@
>   *
>   * An object oriented GL/GLES Abstraction/Utility Layer
>   *
> - * Copyright (C) 2012 Intel Corporation.
> + * Copyright (C) 2012, 2013 Intel Corporation.
>   *
>   * This library is free software; you can redistribute it and/or
>   * modify it under the terms of the GNU Lesser General Public
> @@ -28,6 +28,7 @@
>  #include "cogl-types.h"
>  #include "cogl-context.h"
>  #include "cogl-gl-header.h"
> +#include "cogl-texture.h"
>
>  #ifdef COGL_GL_DEBUG
>
> @@ -66,4 +67,9 @@ _cogl_gl_error_to_string (GLenum error_code);
>  CoglBool
>  _cogl_gl_util_catch_out_of_memory (CoglContext *ctx, CoglError **error);
>
> +void
> +_cogl_gl_util_get_texture_target_string (CoglTextureType texture_type,
> +                                         const char **target_string_out,
> +                                         const char **swizzle_out);
> +
>  #endif /* _COGL_UTIL_GL_PRIVATE_H_ */
> diff --git a/cogl/driver/gl/cogl-util-gl.c b/cogl/driver/gl/cogl-util-gl.c
> index aadfb54..7a4ec0c 100644
> --- a/cogl/driver/gl/cogl-util-gl.c
> +++ b/cogl/driver/gl/cogl-util-gl.c
> @@ -3,7 +3,7 @@
>   *
>   * An object oriented GL/GLES Abstraction/Utility Layer
>   *
> - * Copyright (C) 2012 Intel Corporation.
> + * Copyright (C) 2012, 2013 Intel Corporation.
>   *
>   * This library is free software; you can redistribute it and/or
>   * modify it under the terms of the GNU Lesser General Public
> @@ -101,3 +101,41 @@ _cogl_gl_util_catch_out_of_memory (CoglContext *ctx, CoglError **error)
>
>    return FALSE;
>  }
> +
> +void
> +_cogl_gl_util_get_texture_target_string (CoglTextureType texture_type,
> +                                         const char **target_string_out,
> +                                         const char **swizzle_out)
> +{
> +  const char *target_string, *tex_coord_swizzle;
> +
> +  switch (texture_type)
> +    {
> +#if 0 /* TODO */
> +    case COGL_TEXTURE_TYPE_1D:
> +      target_string = "1D";
> +      tex_coord_swizzle = "s";
> +      break;
> +#endif
> +
> +    case COGL_TEXTURE_TYPE_2D:
> +      target_string = "2D";
> +      tex_coord_swizzle = "st";
> +      break;
> +
> +    case COGL_TEXTURE_TYPE_3D:
> +      target_string = "3D";
> +      tex_coord_swizzle = "stp";
> +      break;
> +
> +    case COGL_TEXTURE_TYPE_RECTANGLE:
> +      target_string = "2DRect";
> +      tex_coord_swizzle = "st";
> +      break;
> +    }
> +
> +  if (target_string_out)
> +    *target_string_out = target_string;
> +  if (swizzle_out)
> +    *swizzle_out = tex_coord_swizzle;
> +}
> --
> 1.7.11.3.g3c3efa5
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl


More information about the Cogl mailing list