[Cogl] [PATCH 2/2] progend-glsl: Fix handling of the builtin uniforms on non-GLES2
Robert Bragg
robert at sixbynine.org
Mon Oct 1 09:17:12 PDT 2012
this looks good to land to me:
Reviewed-by: Robert Bragg <robert at linux.intel.com>
thanks,
- Robert
On Mon, Oct 1, 2012 at 3:03 PM, Neil Roberts <neil at linux.intel.com> wrote:
> The ‘builtin uniforms’ are added to the GLSL code generated for the
> GLES2 driver to implement missing fixed functionality such as the
> builtin point sprite size and the alpha test reference. Previously the
> code that accessed these was #ifdef'd to be compiled only when GLES2
> was enabled. However since 2701b93f part of this code is now always
> used even for non-GLES2 drivers. The code that accessed the builtin
> uniforms array was however no longer #ifdef'd which meant that it
> wouldn't compile any more if GLES2 was not enabled. This was further
> broken becase the GL3 driver actually should be using the alpha test
> uniform because that also does not provide any fixed functionality for
> alpha testing.
>
> To fix this the builtin uniform array is now always compiled in and
> the code to access it is always used. A new member has been added to
> the array to mark which private feature the uniform is used to
> replace. That is checked before updating the uniform so that under
> GLES2 it will update both uniforms but under GL3 it will only update
> the alpha test reference.
> ---
> cogl/driver/gl/cogl-pipeline-progend-glsl.c | 51 ++++++++++++++---------------
> 1 file changed, 25 insertions(+), 26 deletions(-)
>
> diff --git a/cogl/driver/gl/cogl-pipeline-progend-glsl.c b/cogl/driver/gl/cogl-pipeline-progend-glsl.c
> index 3300a2e..26504eb 100644
> --- a/cogl/driver/gl/cogl-pipeline-progend-glsl.c
> +++ b/cogl/driver/gl/cogl-pipeline-progend-glsl.c
> @@ -50,10 +50,9 @@
> #include "cogl-framebuffer-private.h"
> #include "cogl-pipeline-progend-glsl-private.h"
>
> -#ifdef HAVE_COGL_GLES2
> -
> /* These are used to generalise updating some uniforms that are
> - required when building for GLES2 */
> + required when building for drivers missing some fixed function
> + state that we use */
>
> typedef void (* UpdateUniformFunc) (CoglPipeline *pipeline,
> int uniform_location,
> @@ -69,20 +68,24 @@ typedef struct
> void *getter_func;
> UpdateUniformFunc update_func;
> CoglPipelineState change;
> +
> + /* This builtin is only necessary if the following private feature
> + * is not implemented in the driver */
> + CoglPrivateFeatureFlags feature_replacement;
> } BuiltinUniformData;
>
> static BuiltinUniformData builtin_uniforms[] =
> {
> { "cogl_point_size_in",
> cogl_pipeline_get_point_size, update_float_uniform,
> - COGL_PIPELINE_STATE_POINT_SIZE },
> + COGL_PIPELINE_STATE_POINT_SIZE,
> + COGL_PRIVATE_FEATURE_BUILTIN_POINT_SIZE_UNIFORM },
> { "_cogl_alpha_test_ref",
> cogl_pipeline_get_alpha_test_reference, update_float_uniform,
> - COGL_PIPELINE_STATE_ALPHA_FUNC_REFERENCE }
> + COGL_PIPELINE_STATE_ALPHA_FUNC_REFERENCE,
> + COGL_PRIVATE_FEATURE_ALPHA_TEST }
> };
>
> -#endif /* HAVE_COGL_GLES2 */
> -
> const CoglPipelineProgend _cogl_pipeline_glsl_progend;
>
> typedef struct _UnitState
> @@ -101,10 +104,8 @@ typedef struct
>
> GLuint program;
>
> -#ifdef HAVE_COGL_GLES2
> unsigned long dirty_builtin_uniforms;
> GLint builtin_uniform_locations[G_N_ELEMENTS (builtin_uniforms)];
> -#endif
>
> GLint modelview_uniform;
> GLint projection_uniform;
> @@ -423,10 +424,9 @@ update_constants_cb (CoglPipeline *pipeline,
> return TRUE;
> }
>
> -#ifdef HAVE_COGL_GLES2
> -
> static void
> -update_builtin_uniforms (CoglPipeline *pipeline,
> +update_builtin_uniforms (CoglContext *context,
> + CoglPipeline *pipeline,
> GLuint gl_program,
> CoglPipelineProgramState *program_state)
> {
> @@ -436,7 +436,9 @@ update_builtin_uniforms (CoglPipeline *pipeline,
> return;
>
> for (i = 0; i < G_N_ELEMENTS (builtin_uniforms); i++)
> - if ((program_state->dirty_builtin_uniforms & (1 << i)) &&
> + if ((context->private_feature_flags &
> + builtin_uniforms[i].feature_replacement) == 0 &&
> + (program_state->dirty_builtin_uniforms & (1 << i)) &&
> program_state->builtin_uniform_locations[i] != -1)
> builtin_uniforms[i].update_func (pipeline,
> program_state
> @@ -446,8 +448,6 @@ update_builtin_uniforms (CoglPipeline *pipeline,
> program_state->dirty_builtin_uniforms = 0;
> }
>
> -#endif /* HAVE_COGL_GLES2 */
> -
> typedef struct
> {
> CoglPipelineProgramState *program_state;
> @@ -740,9 +740,11 @@ _cogl_pipeline_progend_glsl_end (CoglPipeline *pipeline,
> clear_flushed_matrix_stacks (program_state);
>
> for (i = 0; i < G_N_ELEMENTS (builtin_uniforms); i++)
> - GE_RET( program_state->builtin_uniform_locations[i], ctx,
> - glGetUniformLocation (gl_program,
> - builtin_uniforms[i].uniform_name) );
> + if ((ctx->private_feature_flags &
> + builtin_uniforms[i].feature_replacement) == 0)
> + GE_RET( program_state->builtin_uniform_locations[i], ctx,
> + glGetUniformLocation (gl_program,
> + builtin_uniforms[i].uniform_name) );
>
> GE_RET( program_state->modelview_uniform, ctx,
> glGetUniformLocation (gl_program,
> @@ -757,13 +759,11 @@ _cogl_pipeline_progend_glsl_end (CoglPipeline *pipeline,
> "cogl_modelview_projection_matrix") );
> }
>
> -#ifdef HAVE_COGL_GLES2
> if (program_changed ||
> program_state->last_used_for_pipeline != pipeline)
> program_state->dirty_builtin_uniforms = ~(unsigned long) 0;
>
> - update_builtin_uniforms (pipeline, gl_program, program_state);
> -#endif
> + update_builtin_uniforms (ctx, pipeline, gl_program, program_state);
>
> _cogl_pipeline_progend_glsl_flush_uniforms (pipeline,
> program_state,
> @@ -784,14 +784,14 @@ _cogl_pipeline_progend_glsl_pre_change_notify (CoglPipeline *pipeline,
>
> if ((change & _cogl_pipeline_get_state_for_fragment_codegen (ctx)))
> dirty_program_state (pipeline);
> -
> -#ifdef HAVE_COGL_GLES2
> - else if (ctx->driver == COGL_DRIVER_GLES2)
> + else
> {
> int i;
>
> for (i = 0; i < G_N_ELEMENTS (builtin_uniforms); i++)
> - if ((change & builtin_uniforms[i].change))
> + if ((ctx->private_feature_flags &
> + builtin_uniforms[i].feature_replacement) == 0 &&
> + (change & builtin_uniforms[i].change))
> {
> CoglPipelineProgramState *program_state
> = get_program_state (pipeline);
> @@ -800,7 +800,6 @@ _cogl_pipeline_progend_glsl_pre_change_notify (CoglPipeline *pipeline,
> return;
> }
> }
> -#endif /* HAVE_COGL_GLES2 */
> }
>
> /* NB: layers are considered immutable once they have any dependants
> --
> 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