Remove the fragment shader generation from the GLES2 wrapper

The GLES2 wrapper no longer needs to generate any fragment shader
state because the GLSL pipeline backend will always give the wrapper a
custom fragment shader. This simplifies a lot of the state comparison
done by the wrapper. The fog generation is also removed even though
it's actually part of the vertex shader because only the fixed
function pipeline backend actually calls the fog functions so it would
be disabled when using any of the other backends anyway. We can fix
this when the two shader backends also start generating vertex
shaders.
This commit is contained in:
Neil Roberts 2010-11-23 14:47:17 +00:00
parent 9089d95b3f
commit c50cb72748
5 changed files with 21 additions and 860 deletions

View File

@ -114,9 +114,7 @@ cogl_driver_sources += \
BUILT_SOURCES += \ BUILT_SOURCES += \
cogl-fixed-vertex-shader.h \ cogl-fixed-vertex-shader.h \
cogl-fixed-vertex-shader.c \ cogl-fixed-vertex-shader.c
cogl-fixed-fragment-shader.h \
cogl-fixed-fragment-shader.c
%.h: $(srcdir)/driver/gles/%.glsl %.h: $(srcdir)/driver/gles/%.glsl
/bin/sh $(top_srcdir)/build/stringify.sh -h $< > $@ /bin/sh $(top_srcdir)/build/stringify.sh -h $< > $@
@ -128,7 +126,6 @@ endif # COGL_DRIVER_GLES
EXTRA_DIST += \ EXTRA_DIST += \
$(srcdir)/driver/gles/cogl-fixed-vertex-shader.glsl \ $(srcdir)/driver/gles/cogl-fixed-vertex-shader.glsl \
$(srcdir)/driver/gles/cogl-fixed-fragment-shader.glsl \
$(NULL) $(NULL)
# winsys sources, common to all backends # winsys sources, common to all backends

View File

@ -521,6 +521,9 @@ _cogl_pipeline_flush_color_blend_alpha_depth_state (
blend_state->blend_dst_factor_rgb)); blend_state->blend_dst_factor_rgb));
} }
/* Under GLES2 the alpha function is implemented as part of the
fragment shader */
#ifndef HAVE_COGL_GLES2
if (pipelines_difference & (COGL_PIPELINE_STATE_ALPHA_FUNC | if (pipelines_difference & (COGL_PIPELINE_STATE_ALPHA_FUNC |
COGL_PIPELINE_STATE_ALPHA_FUNC_REFERENCE)) COGL_PIPELINE_STATE_ALPHA_FUNC_REFERENCE))
{ {
@ -533,6 +536,7 @@ _cogl_pipeline_flush_color_blend_alpha_depth_state (
GE (glAlphaFunc (alpha_state->alpha_func, GE (glAlphaFunc (alpha_state->alpha_func,
alpha_state->alpha_func_reference)); alpha_state->alpha_func_reference));
} }
#endif /* HAVE_COGL_GLES2 */
if (pipelines_difference & COGL_PIPELINE_STATE_DEPTH) if (pipelines_difference & COGL_PIPELINE_STATE_DEPTH)
{ {
@ -738,6 +742,9 @@ flush_layers_common_gl_state_cb (CoglPipelineLayer *layer, void *user_data)
_cogl_matrix_stack_flush_to_gl (unit->matrix_stack, COGL_MATRIX_TEXTURE); _cogl_matrix_stack_flush_to_gl (unit->matrix_stack, COGL_MATRIX_TEXTURE);
} }
/* Under GLES2 the fragment shader will use gl_PointCoord instead of
replacing the texture coordinates */
#ifndef HAVE_COGL_GLES2
if (layers_difference & COGL_PIPELINE_LAYER_STATE_POINT_SPRITE_COORDS) if (layers_difference & COGL_PIPELINE_LAYER_STATE_POINT_SPRITE_COORDS)
{ {
CoglPipelineState change = COGL_PIPELINE_LAYER_STATE_POINT_SPRITE_COORDS; CoglPipelineState change = COGL_PIPELINE_LAYER_STATE_POINT_SPRITE_COORDS;
@ -750,6 +757,7 @@ flush_layers_common_gl_state_cb (CoglPipelineLayer *layer, void *user_data)
GE (glTexEnvi (GL_POINT_SPRITE, GL_COORD_REPLACE, GE (glTexEnvi (GL_POINT_SPRITE, GL_COORD_REPLACE,
big_state->point_sprite_coords)); big_state->point_sprite_coords));
} }
#endif /* HAVE_COGL_GLES2 */
cogl_handle_ref (layer); cogl_handle_ref (layer);
if (unit->layer != COGL_INVALID_HANDLE) if (unit->layer != COGL_INVALID_HANDLE)

View File

@ -1,64 +0,0 @@
/*** _cogl_fixed_fragment_shader_variables_start ***/
/* There is no default precision for floats in fragment shaders in
GLES 2 so we need to define one */
precision highp float;
/*** _cogl_fixed_fragment_shader_inputs ***/
/* Inputs from the vertex shader */
varying vec4 _cogl_color;
varying float _cogl_fog_amount;
/*** _cogl_fixed_fragment_shader_texturing_options ***/
/* Texturing options */
/*** _cogl_fixed_fragment_shader_fogging_options ***/
/* Fogging options */
uniform vec4 _cogl_fog_color;
/* Alpha test options */
uniform float _cogl_alpha_test_ref;
/*** _cogl_fixed_fragment_shader_main_declare ***/
void
main (void)
{
/*** _cogl_fixed_fragment_shader_main_start ***/
/*** _cogl_fixed_fragment_shader_fog ***/
/* Mix the calculated color with the fog color */
gl_FragColor.rgb = mix (_cogl_fog_color.rgb, gl_FragColor.rgb,
_cogl_fog_amount);
/* Alpha testing */
/*** _cogl_fixed_fragment_shader_alpha_never ***/
discard;
/*** _cogl_fixed_fragment_shader_alpha_less ***/
if (gl_FragColor.a >= _cogl_alpha_test_ref)
discard;
/*** _cogl_fixed_fragment_shader_alpha_equal ***/
if (gl_FragColor.a != _cogl_alpha_test_ref)
discard;
/*** _cogl_fixed_fragment_shader_alpha_lequal ***/
if (gl_FragColor.a > _cogl_alpha_test_ref)
discard;
/*** _cogl_fixed_fragment_shader_alpha_greater ***/
if (gl_FragColor.a <= _cogl_alpha_test_ref)
discard;
/*** _cogl_fixed_fragment_shader_alpha_notequal ***/
if (gl_FragColor.a == _cogl_alpha_test_ref)
discard;
/*** _cogl_fixed_fragment_shader_alpha_gequal ***/
if (gl_FragColor.a < _cogl_alpha_test_ref)
discard;
/*** _cogl_fixed_fragment_shader_end ***/
}

View File

@ -36,7 +36,6 @@
#include "cogl.h" #include "cogl.h"
#include "cogl-gles2-wrapper.h" #include "cogl-gles2-wrapper.h"
#include "cogl-fixed-vertex-shader.h" #include "cogl-fixed-vertex-shader.h"
#include "cogl-fixed-fragment-shader.h"
#include "cogl-context.h" #include "cogl-context.h"
#include "cogl-shader-private.h" #include "cogl-shader-private.h"
#include "cogl-shader.h" #include "cogl-shader.h"
@ -129,34 +128,6 @@ initialize_texture_units (CoglGles2Wrapper *w)
w->active_texture_unit = i; w->active_texture_unit = i;
GE( _cogl_wrap_glMatrixMode (GL_TEXTURE)); GE( _cogl_wrap_glMatrixMode (GL_TEXTURE));
GE( _cogl_wrap_glLoadIdentity ()); GE( _cogl_wrap_glLoadIdentity ());
/* The real GL default is GL_MODULATE but the shader only
supports GL_COMBINE so let's default to that instead */
GE( _cogl_wrap_glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_COMBINE) );
GE( _cogl_wrap_glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB,
GL_MODULATE) );
GE( _cogl_wrap_glTexEnvi (GL_TEXTURE_ENV, GL_SRC0_RGB,
GL_PREVIOUS) );
GE( _cogl_wrap_glTexEnvi (GL_TEXTURE_ENV, GL_SRC1_RGB,
GL_TEXTURE) );
GE( _cogl_wrap_glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB,
GL_SRC_COLOR) );
GE( _cogl_wrap_glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_RGB,
GL_SRC_COLOR) );
GE( _cogl_wrap_glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_ALPHA,
GL_MODULATE) );
GE( _cogl_wrap_glTexEnvi (GL_TEXTURE_ENV, GL_SRC0_ALPHA,
GL_PREVIOUS) );
GE( _cogl_wrap_glTexEnvi (GL_TEXTURE_ENV, GL_SRC1_ALPHA,
GL_TEXTURE) );
GE( _cogl_wrap_glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA,
GL_SRC_COLOR) );
GE( _cogl_wrap_glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA,
GL_SRC_COLOR) );
GE( _cogl_wrap_glTexEnvi (GL_POINT_SPRITE, GL_COORD_REPLACE,
GL_FALSE) );
} }
GE( _cogl_wrap_glMatrixMode ((GLenum) prev_mode)); GE( _cogl_wrap_glMatrixMode ((GLenum) prev_mode));
@ -169,8 +140,6 @@ initialize_texture_units (CoglGles2Wrapper *w)
void void
_cogl_gles2_wrapper_init (CoglGles2Wrapper *wrapper) _cogl_gles2_wrapper_init (CoglGles2Wrapper *wrapper)
{ {
GLfloat default_fog_color[4] = { 0, 0, 0, 0 };
memset (wrapper, 0, sizeof (CoglGles2Wrapper)); memset (wrapper, 0, sizeof (CoglGles2Wrapper));
/* Initialize the stacks */ /* Initialize the stacks */
@ -184,111 +153,19 @@ _cogl_gles2_wrapper_init (CoglGles2Wrapper *wrapper)
_cogl_wrap_glActiveTexture (GL_TEXTURE0); _cogl_wrap_glActiveTexture (GL_TEXTURE0);
_cogl_wrap_glClientActiveTexture (GL_TEXTURE0); _cogl_wrap_glClientActiveTexture (GL_TEXTURE0);
/* Initialize the fogging options */
_cogl_wrap_glDisable (GL_FOG);
_cogl_wrap_glFogf (GL_FOG_MODE, GL_LINEAR);
_cogl_wrap_glFogf (GL_FOG_DENSITY, 1.0);
_cogl_wrap_glFogf (GL_FOG_START, 0);
_cogl_wrap_glFogf (GL_FOG_END, 1);
_cogl_wrap_glFogfv (GL_FOG_COLOR, default_fog_color);
/* Initialize alpha testing */
_cogl_wrap_glDisable (GL_ALPHA_TEST);
_cogl_wrap_glAlphaFunc (GL_ALWAYS, 0.0f);
/* Initialize the point size */ /* Initialize the point size */
_cogl_wrap_glPointSize (1.0f); _cogl_wrap_glPointSize (1.0f);
initialize_texture_units (wrapper); initialize_texture_units (wrapper);
} }
static int
cogl_gles2_get_n_args_for_combine_func (GLenum func)
{
switch (func)
{
case GL_REPLACE:
return 1;
case GL_MODULATE:
case GL_ADD:
case GL_ADD_SIGNED:
case GL_SUBTRACT:
case GL_DOT3_RGB:
case GL_DOT3_RGBA:
return 2;
case GL_INTERPOLATE:
return 3;
default:
return 0;
}
}
static gboolean static gboolean
cogl_gles2_settings_equal (const CoglGles2WrapperSettings *a, cogl_gles2_settings_equal (const CoglGles2WrapperSettings *a,
const CoglGles2WrapperSettings *b, const CoglGles2WrapperSettings *b)
gboolean vertex_tests,
gboolean fragment_tests)
{ {
int i;
if (a->texture_units != b->texture_units) if (a->texture_units != b->texture_units)
return FALSE; return FALSE;
if (fragment_tests)
{
if (a->alpha_test_enabled != b->alpha_test_enabled)
return FALSE;
if (a->alpha_test_enabled && a->alpha_test_func != b->alpha_test_func)
return FALSE;
}
if (a->fog_enabled != b->fog_enabled)
return FALSE;
if (vertex_tests && a->fog_enabled && a->fog_mode != b->fog_mode)
return FALSE;
/* Compare layer combine operation for each active unit */
if (fragment_tests)
for (i = 0; i < COGL_GLES2_MAX_TEXTURE_UNITS; i++)
{
if (!!COGL_GLES2_TEXTURE_UNIT_IS_ENABLED (a->texture_units, i) !=
!!COGL_GLES2_TEXTURE_UNIT_IS_ENABLED (b->texture_units, i))
return FALSE;
if (COGL_GLES2_TEXTURE_UNIT_IS_ENABLED (a->texture_units, i))
{
const CoglGles2WrapperTexEnv *tex_env_a = a->tex_env + i;
const CoglGles2WrapperTexEnv *tex_env_b = b->tex_env + i;
int arg, n_args;
GLenum func;
if (tex_env_a->texture_target != tex_env_b->texture_target)
return FALSE;
if (tex_env_a->point_sprite_coords !=
tex_env_b->point_sprite_coords)
return FALSE;
func = tex_env_a->texture_combine_rgb_func;
if (func != tex_env_b->texture_combine_rgb_func)
return FALSE;
n_args = cogl_gles2_get_n_args_for_combine_func (func);
for (arg = 0; arg < n_args; arg++)
{
if (tex_env_a->texture_combine_rgb_src[arg] !=
tex_env_b->texture_combine_rgb_src[arg])
return FALSE;
if (tex_env_a->texture_combine_rgb_op[arg] !=
tex_env_b->texture_combine_rgb_op[arg])
return FALSE;
}
}
}
return TRUE; return TRUE;
} }
@ -308,8 +185,7 @@ cogl_gles2_get_vertex_shader (const CoglGles2WrapperSettings *settings)
for (node = w->compiled_vertex_shaders; node; node = node->next) for (node = w->compiled_vertex_shaders; node; node = node->next)
if (cogl_gles2_settings_equal (settings, if (cogl_gles2_settings_equal (settings,
&((CoglGles2WrapperShader *) &((CoglGles2WrapperShader *)
node->data)->settings, node->data)->settings))
TRUE, FALSE))
return (CoglGles2WrapperShader *) node->data; return (CoglGles2WrapperShader *) node->data;
/* Otherwise create a new shader */ /* Otherwise create a new shader */
@ -344,8 +220,7 @@ cogl_gles2_get_vertex_shader (const CoglGles2WrapperSettings *settings)
g_string_append (shader_source, _cogl_fixed_vertex_shader_main_start); g_string_append (shader_source, _cogl_fixed_vertex_shader_main_start);
for (i = 0; i < COGL_GLES2_MAX_TEXTURE_UNITS; i++) for (i = 0; i < COGL_GLES2_MAX_TEXTURE_UNITS; i++)
if (COGL_GLES2_TEXTURE_UNIT_IS_ENABLED (settings->texture_units, i) && if (COGL_GLES2_TEXTURE_UNIT_IS_ENABLED (settings->texture_units, i))
!settings->tex_env[i].point_sprite_coords)
{ {
g_string_append_printf (shader_source, g_string_append_printf (shader_source,
"transformed_tex_coord = " "transformed_tex_coord = "
@ -360,28 +235,6 @@ cogl_gles2_get_vertex_shader (const CoglGles2WrapperSettings *settings)
g_string_append (shader_source, _cogl_fixed_vertex_shader_frag_color_start); g_string_append (shader_source, _cogl_fixed_vertex_shader_frag_color_start);
if (settings->fog_enabled)
{
g_string_append (shader_source, _cogl_fixed_vertex_shader_fog_start);
switch (settings->fog_mode)
{
case GL_EXP:
g_string_append (shader_source, _cogl_fixed_vertex_shader_fog_exp);
break;
case GL_EXP2:
g_string_append (shader_source, _cogl_fixed_vertex_shader_fog_exp2);
break;
default:
g_string_append (shader_source, _cogl_fixed_vertex_shader_fog_linear);
break;
}
g_string_append (shader_source, _cogl_fixed_vertex_shader_fog_end);
}
g_string_append (shader_source, _cogl_fixed_vertex_shader_end); g_string_append (shader_source, _cogl_fixed_vertex_shader_end);
shader_obj = cogl_gles2_wrapper_create_shader (GL_VERTEX_SHADER, shader_obj = cogl_gles2_wrapper_create_shader (GL_VERTEX_SHADER,
@ -402,366 +255,6 @@ cogl_gles2_get_vertex_shader (const CoglGles2WrapperSettings *settings)
return shader; return shader;
} }
static void
cogl_gles2_add_texture_lookup (int unit,
const char *swizzle,
GString *shader_source)
{
_COGL_GET_GLES2_WRAPPER (w, NO_RETVAL);
if (w->settings.tex_env[unit].texture_target == GL_TEXTURE_3D_OES)
g_string_append_printf (shader_source,
"texture3D (_cogl_texture_unit[%d], ",
unit);
else
g_string_append_printf (shader_source,
"texture2D (_cogl_texture_unit[%d], ",
unit);
/* If point sprite coord generation is being used then divert to the
built-in varying var for that instead of the texture
coordinates */
if (w->settings.tex_env[unit].point_sprite_coords)
g_string_append (shader_source, "_cogl_point_coord");
else
g_string_append_printf (shader_source, "_cogl_tex_coord[%d]", unit);
g_string_append_printf (shader_source, ").%s", swizzle);
}
static void
cogl_gles2_add_arg (int unit,
GLenum src,
GLenum operand,
const char *swizzle,
GString *shader_source)
{
char alpha_swizzle[5] = "aaaa";
g_string_append_c (shader_source, '(');
if (operand == GL_ONE_MINUS_SRC_COLOR || operand == GL_ONE_MINUS_SRC_ALPHA)
g_string_append_printf (shader_source,
"vec4(1.0, 1.0, 1.0, 1.0).%s - ",
swizzle);
/* If the operand is reading from the alpha then replace the swizzle
with the same number of copies of the alpha */
if (operand == GL_SRC_ALPHA || operand == GL_ONE_MINUS_SRC_ALPHA)
{
alpha_swizzle[strlen (swizzle)] = '\0';
swizzle = alpha_swizzle;
}
switch (src)
{
case GL_TEXTURE:
cogl_gles2_add_texture_lookup (unit, swizzle, shader_source);
break;
case GL_CONSTANT:
g_string_append_printf (shader_source, "_cogl_combine_constant[%d].%s",
unit, swizzle);
break;
case GL_PREVIOUS:
if (unit > 0)
{
g_string_append_printf (shader_source, "gl_FragColor.%s", swizzle);
break;
}
/* flow through */
case GL_PRIMARY_COLOR:
g_string_append_printf (shader_source, "_cogl_color.%s", swizzle);
break;
default:
if (src >= GL_TEXTURE0 &&
src < GL_TEXTURE0 + COGL_GLES2_MAX_TEXTURE_UNITS)
cogl_gles2_add_texture_lookup (src - GL_TEXTURE0,
swizzle, shader_source);
break;
}
g_string_append_c (shader_source, ')');
}
static void
cogl_gles2_add_operation (int unit,
GLenum combine_func,
const GLenum *sources,
const GLenum *operands,
const char *swizzle,
GString *shader_source)
{
switch (combine_func)
{
case GL_REPLACE:
cogl_gles2_add_arg (unit, sources[0], operands[0],
swizzle, shader_source);
break;
case GL_MODULATE:
cogl_gles2_add_arg (unit, sources[0], operands[0],
swizzle, shader_source);
g_string_append (shader_source, " * ");
cogl_gles2_add_arg (unit, sources[1], operands[1],
swizzle, shader_source);
break;
case GL_ADD:
cogl_gles2_add_arg (unit, sources[0], operands[0],
swizzle, shader_source);
g_string_append (shader_source, " + ");
cogl_gles2_add_arg (unit, sources[1], operands[1],
swizzle, shader_source);
break;
case GL_ADD_SIGNED:
cogl_gles2_add_arg (unit, sources[0], operands[0],
swizzle, shader_source);
g_string_append (shader_source, " + ");
cogl_gles2_add_arg (unit, sources[1], operands[1],
swizzle, shader_source);
g_string_append_printf (shader_source,
" - vec4(0.5, 0.5, 0.5, 0.5).%s",
swizzle);
break;
case GL_SUBTRACT:
cogl_gles2_add_arg (unit, sources[0], operands[0],
swizzle, shader_source);
g_string_append (shader_source, " - ");
cogl_gles2_add_arg (unit, sources[1], operands[1],
swizzle, shader_source);
break;
case GL_INTERPOLATE:
cogl_gles2_add_arg (unit, sources[0], operands[0],
swizzle, shader_source);
g_string_append (shader_source, " * ");
cogl_gles2_add_arg (unit, sources[2], operands[2],
swizzle, shader_source);
g_string_append (shader_source, " + ");
cogl_gles2_add_arg (unit, sources[1], operands[1],
swizzle, shader_source);
g_string_append_printf (shader_source,
" * (vec4(1.0, 1.0, 1.0, 1.0).%s - ",
swizzle);
cogl_gles2_add_arg (unit, sources[2], operands[2],
swizzle, shader_source);
g_string_append_c (shader_source, ')');
break;
case GL_DOT3_RGB:
case GL_DOT3_RGBA:
g_string_append (shader_source, "vec4(4 * ((");
cogl_gles2_add_arg (unit, sources[0], operands[0],
"r", shader_source);
g_string_append (shader_source, " - 0.5) * (");
cogl_gles2_add_arg (unit, sources[1], operands[1],
"r", shader_source);
g_string_append (shader_source, " - 0.5) + (");
cogl_gles2_add_arg (unit, sources[0], operands[0],
"g", shader_source);
g_string_append (shader_source, " - 0.5) * (");
cogl_gles2_add_arg (unit, sources[1], operands[1],
"g", shader_source);
g_string_append (shader_source, " - 0.5) + (");
cogl_gles2_add_arg (unit, sources[0], operands[0],
"b", shader_source);
g_string_append (shader_source, " - 0.5) * (");
cogl_gles2_add_arg (unit, sources[1], operands[1],
"b", shader_source);
g_string_append_printf (shader_source, " - 0.5))).%s", swizzle);
break;
}
}
static gboolean
cogl_gles2_rgb_and_alpha_equal (const CoglGles2WrapperTexEnv *tex_env)
{
int arg, n_args;
if (tex_env->texture_combine_rgb_func != tex_env->texture_combine_alpha_func)
return FALSE;
n_args =
cogl_gles2_get_n_args_for_combine_func (tex_env->texture_combine_rgb_func);
for (arg = 0; arg < n_args; arg++)
{
if (tex_env->texture_combine_rgb_src[arg] !=
tex_env->texture_combine_alpha_src[arg])
return FALSE;
if (tex_env->texture_combine_rgb_op[arg] != GL_SRC_COLOR ||
tex_env->texture_combine_alpha_op[arg] != GL_SRC_ALPHA)
return FALSE;
}
return TRUE;
}
static CoglGles2WrapperShader *
cogl_gles2_get_fragment_shader (const CoglGles2WrapperSettings *settings)
{
GString *shader_source;
GLuint shader_obj;
CoglGles2WrapperShader *shader;
GSList *node;
int i;
int n_texture_units = 0;
_COGL_GET_GLES2_WRAPPER (w, NULL);
/* Check if we already have a fragment shader for these settings */
for (node = w->compiled_fragment_shaders; node; node = node->next)
if (cogl_gles2_settings_equal (settings,
&((CoglGles2WrapperShader *)
node->data)->settings,
FALSE, TRUE))
return (CoglGles2WrapperShader *) node->data;
/* Otherwise create a new shader */
shader_source = g_string_new (_cogl_fixed_fragment_shader_variables_start);
/* Find the biggest enabled texture unit index */
for (i = 0; i < COGL_GLES2_MAX_TEXTURE_UNITS; i++)
if (COGL_GLES2_TEXTURE_UNIT_IS_ENABLED (settings->texture_units, i))
n_texture_units = i + 1;
g_string_append (shader_source, _cogl_fixed_fragment_shader_inputs);
if (n_texture_units > 0)
{
g_string_append_printf (shader_source,
"varying vec2 _cogl_tex_coord[%d];\n",
n_texture_units);
g_string_append (shader_source,
_cogl_fixed_fragment_shader_texturing_options);
g_string_append_printf (shader_source,
"uniform sampler2D _cogl_texture_unit[%d];\n",
n_texture_units);
}
g_string_append (shader_source, _cogl_fixed_fragment_shader_fogging_options);
g_string_append (shader_source, _cogl_fixed_fragment_shader_main_declare);
g_string_append (shader_source, _cogl_fixed_fragment_shader_main_start);
/* This pointless extra variable is needed to work around an
apparent bug in the PowerVR drivers. Without it the alpha
blending seems to stop working */
g_string_append (shader_source,
"vec4 frag_color_copy = _cogl_color;\n");
/* If there are no textures units enabled then we can just directly
use the color from the vertex shader */
if (n_texture_units == 0)
g_string_append (shader_source, "gl_FragColor = _cogl_color;\n");
else
/* Otherwise we need to calculate the value based on the layer
combine settings */
for (i = 0; i < n_texture_units; i++)
if (COGL_GLES2_TEXTURE_UNIT_IS_ENABLED (settings->texture_units, i))
{
const CoglGles2WrapperTexEnv *tex_env = settings->tex_env + i;
/* If the rgb and alpha combine functions are the same then
we can do both with a single statement, otherwise we need
to do them separately */
if (cogl_gles2_rgb_and_alpha_equal (tex_env))
{
g_string_append (shader_source, "gl_FragColor.rgba = ");
cogl_gles2_add_operation (i,
tex_env->texture_combine_rgb_func,
tex_env->texture_combine_rgb_src,
tex_env->texture_combine_rgb_op,
"rgba",
shader_source);
g_string_append (shader_source, ";\n");
}
else
{
g_string_append (shader_source, "gl_FragColor.rgb = ");
cogl_gles2_add_operation (i,
tex_env->texture_combine_rgb_func,
tex_env->texture_combine_rgb_src,
tex_env->texture_combine_rgb_op,
"rgb",
shader_source);
g_string_append (shader_source,
";\n"
"gl_FragColor.a = ");
cogl_gles2_add_operation (i,
tex_env->texture_combine_alpha_func,
tex_env->texture_combine_alpha_src,
tex_env->texture_combine_alpha_op,
"a",
shader_source);
g_string_append (shader_source, ";\n");
}
}
if (settings->fog_enabled)
g_string_append (shader_source, _cogl_fixed_fragment_shader_fog);
if (settings->alpha_test_enabled)
switch (settings->alpha_test_func)
{
case GL_NEVER:
g_string_append (shader_source,
_cogl_fixed_fragment_shader_alpha_never);
break;
case GL_LESS:
g_string_append (shader_source,
_cogl_fixed_fragment_shader_alpha_less);
break;
case GL_EQUAL:
g_string_append (shader_source,
_cogl_fixed_fragment_shader_alpha_equal);
break;
case GL_LEQUAL:
g_string_append (shader_source,
_cogl_fixed_fragment_shader_alpha_lequal);
break;
case GL_GREATER:
g_string_append (shader_source,
_cogl_fixed_fragment_shader_alpha_greater);
break;
case GL_NOTEQUAL:
g_string_append (shader_source,
_cogl_fixed_fragment_shader_alpha_notequal);
break;
case GL_GEQUAL:
g_string_append (shader_source,
_cogl_fixed_fragment_shader_alpha_gequal);
}
g_string_append (shader_source, _cogl_fixed_fragment_shader_end);
shader_obj = cogl_gles2_wrapper_create_shader (GL_FRAGMENT_SHADER,
shader_source->str);
g_string_free (shader_source, TRUE);
if (shader_obj == 0)
return NULL;
shader = g_slice_new (CoglGles2WrapperShader);
shader->shader = shader_obj;
shader->settings = *settings;
w->compiled_fragment_shaders = g_slist_prepend (w->compiled_fragment_shaders,
shader);
return shader;
}
static void static void
cogl_gles2_wrapper_get_locations (GLuint program, cogl_gles2_wrapper_get_locations (GLuint program,
CoglGles2WrapperSettings *settings, CoglGles2WrapperSettings *settings,
@ -779,40 +272,23 @@ cogl_gles2_wrapper_get_locations (GLuint program,
if (COGL_GLES2_TEXTURE_UNIT_IS_ENABLED (settings->texture_units, i)) if (COGL_GLES2_TEXTURE_UNIT_IS_ENABLED (settings->texture_units, i))
{ {
char *matrix_var_name = g_strdup_printf ("cogl_texture_matrix[%d]", i); char *matrix_var_name = g_strdup_printf ("cogl_texture_matrix[%d]", i);
char *sampler_var_name = g_strdup_printf ("_cogl_texture_unit[%d]", i);
char *tex_coord_var_name = char *tex_coord_var_name =
g_strdup_printf ("cogl_tex_coord%d_in", i); g_strdup_printf ("cogl_tex_coord%d_in", i);
uniforms->texture_matrix_uniforms[i] uniforms->texture_matrix_uniforms[i]
= glGetUniformLocation (program, matrix_var_name); = glGetUniformLocation (program, matrix_var_name);
uniforms->texture_sampler_uniforms[i]
= glGetUniformLocation (program, sampler_var_name);
attribs->multi_texture_coords[i] attribs->multi_texture_coords[i]
= glGetAttribLocation (program, tex_coord_var_name); = glGetAttribLocation (program, tex_coord_var_name);
g_free (tex_coord_var_name); g_free (tex_coord_var_name);
g_free (sampler_var_name);
g_free (matrix_var_name); g_free (matrix_var_name);
} }
else else
{ {
uniforms->texture_matrix_uniforms[i] = -1; uniforms->texture_matrix_uniforms[i] = -1;
uniforms->texture_sampler_uniforms[i] = -1;
attribs->multi_texture_coords[i] = -1; attribs->multi_texture_coords[i] = -1;
} }
uniforms->fog_density_uniform
= glGetUniformLocation (program, "_cogl_fog_density");
uniforms->fog_start_uniform
= glGetUniformLocation (program, "_cogl_fog_start");
uniforms->fog_end_uniform
= glGetUniformLocation (program, "_cogl_fog_end");
uniforms->fog_color_uniform
= glGetUniformLocation (program, "_cogl_fog_color");
uniforms->alpha_test_ref_uniform
= glGetUniformLocation (program, "_cogl_alpha_test_ref");
uniforms->point_size_uniform uniforms->point_size_uniform
= glGetUniformLocation (program, "cogl_point_size_in"); = glGetUniformLocation (program, "cogl_point_size_in");
} }
@ -833,7 +309,7 @@ cogl_gles2_wrapper_get_program (const CoglGles2WrapperSettings *settings)
{ {
GSList *node; GSList *node;
CoglGles2WrapperProgram *program; CoglGles2WrapperProgram *program;
CoglGles2WrapperShader *vertex_shader, *fragment_shader; CoglGles2WrapperShader *vertex_shader;
GLint status; GLint status;
gboolean custom_vertex_shader = FALSE, custom_fragment_shader = FALSE; gboolean custom_vertex_shader = FALSE, custom_fragment_shader = FALSE;
GLuint shaders[16]; GLuint shaders[16];
@ -847,7 +323,7 @@ cogl_gles2_wrapper_get_program (const CoglGles2WrapperSettings *settings)
{ {
program = (CoglGles2WrapperProgram *) node->data; program = (CoglGles2WrapperProgram *) node->data;
if (cogl_gles2_settings_equal (settings, &program->settings, TRUE, TRUE) if (cogl_gles2_settings_equal (settings, &program->settings)
&& program->settings.user_program == settings->user_program) && program->settings.user_program == settings->user_program)
return (CoglGles2WrapperProgram *) node->data; return (CoglGles2WrapperProgram *) node->data;
} }
@ -875,6 +351,10 @@ cogl_gles2_wrapper_get_program (const CoglGles2WrapperSettings *settings)
} }
} }
/* We should always have a custom fragment shader because the
pipeline backend should create one for us */
g_assert (custom_fragment_shader);
/* Get or create the fixed functionality shaders for these settings /* Get or create the fixed functionality shaders for these settings
if there is no custom replacement */ if there is no custom replacement */
if (!custom_vertex_shader) if (!custom_vertex_shader)
@ -883,20 +363,12 @@ cogl_gles2_wrapper_get_program (const CoglGles2WrapperSettings *settings)
if (vertex_shader == NULL) if (vertex_shader == NULL)
return NULL; return NULL;
} }
if (!custom_fragment_shader)
{
fragment_shader = cogl_gles2_get_fragment_shader (settings);
if (fragment_shader == NULL)
return NULL;
}
program = g_slice_new (CoglGles2WrapperProgram); program = g_slice_new (CoglGles2WrapperProgram);
program->program = glCreateProgram (); program->program = glCreateProgram ();
if (!custom_vertex_shader) if (!custom_vertex_shader)
glAttachShader (program->program, vertex_shader->shader); glAttachShader (program->program, vertex_shader->shader);
if (!custom_fragment_shader)
glAttachShader (program->program, fragment_shader->shader);
/* Attach all the shaders stolen from the user program */ /* Attach all the shaders stolen from the user program */
for (i = 0; i < n_shaders; i++) for (i = 0; i < n_shaders; i++)
glAttachShader (program->program, shaders[i]); glAttachShader (program->program, shaders[i]);
@ -953,14 +425,6 @@ _cogl_gles2_wrapper_deinit (CoglGles2Wrapper *wrapper)
g_slist_free1 (node); g_slist_free1 (node);
} }
wrapper->compiled_vertex_shaders = NULL; wrapper->compiled_vertex_shaders = NULL;
for (node = wrapper->compiled_fragment_shaders; node; node = next)
{
next = node->next;
glDeleteShader (((CoglGles2WrapperShader *) node->data)->shader);
g_slist_free1 (node);
}
wrapper->compiled_fragment_shaders = NULL;
} }
static void static void
@ -1170,36 +634,6 @@ _cogl_wrap_prepare_for_draw (void)
} }
} }
if ((w->dirty_uniforms & COGL_GLES2_DIRTY_FOG_DENSITY)
&& program->uniforms.fog_density_uniform != -1)
glUniform1f (program->uniforms.fog_density_uniform, w->fog_density);
if ((w->dirty_uniforms & COGL_GLES2_DIRTY_FOG_START)
&& program->uniforms.fog_start_uniform != -1)
glUniform1f (program->uniforms.fog_start_uniform, w->fog_start);
if ((w->dirty_uniforms & COGL_GLES2_DIRTY_FOG_END)
&& program->uniforms.fog_end_uniform != -1)
glUniform1f (program->uniforms.fog_end_uniform, w->fog_end);
if ((w->dirty_uniforms & COGL_GLES2_DIRTY_ALPHA_TEST_REF)
&& program->uniforms.alpha_test_ref_uniform != -1)
glUniform1f (program->uniforms.alpha_test_ref_uniform,
w->alpha_test_ref);
if ((w->dirty_uniforms & COGL_GLES2_DIRTY_TEXTURE_UNITS))
{
int i;
/* TODO - we should probably have a per unit dirty flag too */
for (i = 0; i < COGL_GLES2_MAX_TEXTURE_UNITS; i++)
{
GLint uniform = program->uniforms.texture_sampler_uniforms[i];
if (uniform != -1)
glUniform1i (uniform, i);
}
}
if ((w->dirty_uniforms & COGL_GLES2_DIRTY_POINT_SIZE)) if ((w->dirty_uniforms & COGL_GLES2_DIRTY_POINT_SIZE))
glUniform1f (program->uniforms.point_size_uniform, glUniform1f (program->uniforms.point_size_uniform,
w->point_size); w->point_size);
@ -1279,77 +713,6 @@ _cogl_wrap_glDrawElements (GLenum mode, GLsizei count, GLenum type,
glDrawElements (mode, count, type, indices); glDrawElements (mode, count, type, indices);
} }
void
_cogl_wrap_glTexEnvi (GLenum target, GLenum pname, GLint param)
{
CoglGles2WrapperTexEnv *tex_env;
_COGL_GET_GLES2_WRAPPER (w, NO_RETVAL);
tex_env = w->settings.tex_env + w->active_texture_unit;
if (target == GL_TEXTURE_ENV)
{
switch (pname)
{
case GL_COMBINE_RGB:
tex_env->texture_combine_rgb_func = param;
break;
case GL_COMBINE_ALPHA:
tex_env->texture_combine_alpha_func = param;
break;
case GL_SRC0_RGB:
case GL_SRC1_RGB:
case GL_SRC2_RGB:
tex_env->texture_combine_rgb_src[pname - GL_SRC0_RGB] = param;
break;
case GL_SRC0_ALPHA:
case GL_SRC1_ALPHA:
case GL_SRC2_ALPHA:
tex_env->texture_combine_alpha_src[pname - GL_SRC0_ALPHA] = param;
break;
case GL_OPERAND0_RGB:
case GL_OPERAND1_RGB:
case GL_OPERAND2_RGB:
tex_env->texture_combine_rgb_op[pname - GL_OPERAND0_RGB] = param;
break;
case GL_OPERAND0_ALPHA:
case GL_OPERAND1_ALPHA:
case GL_OPERAND2_ALPHA:
tex_env->texture_combine_alpha_op[pname - GL_OPERAND0_ALPHA] = param;
break;
}
w->settings_dirty = TRUE;
}
else if (target == GL_POINT_SPRITE)
{
switch (pname)
{
case GL_COORD_REPLACE:
tex_env->point_sprite_coords = param;
break;
}
w->settings_dirty = TRUE;
}
}
void
_cogl_wrap_glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params)
{
if (target == GL_TEXTURE_ENV && pname == GL_TEXTURE_ENV_COLOR)
{
CoglGles2WrapperTexEnv *tex_env;
_COGL_GET_GLES2_WRAPPER (w, NO_RETVAL);
tex_env = w->settings.tex_env + w->active_texture_unit;
memcpy (tex_env->texture_combine_constant, params, sizeof (GLfloat) * 4);
}
}
void void
_cogl_wrap_glClientActiveTexture (GLenum texture) _cogl_wrap_glClientActiveTexture (GLenum texture)
{ {
@ -1389,20 +752,6 @@ _cogl_wrap_glEnable (GLenum cap)
TRUE); TRUE);
w->settings_dirty = TRUE; w->settings_dirty = TRUE;
} }
/* Keep track of the last enabled texture unit */
if (w->settings.tex_env[w->active_texture_unit].texture_target != cap)
{
w->settings.tex_env[w->active_texture_unit].texture_target = cap;
w->settings_dirty = TRUE;
}
break;
case GL_FOG:
_COGL_GLES2_CHANGE_SETTING (w, fog_enabled, TRUE);
break;
case GL_ALPHA_TEST:
_COGL_GLES2_CHANGE_SETTING (w, alpha_test_enabled, TRUE);
break; break;
default: default:
@ -1422,8 +771,7 @@ _cogl_wrap_glDisable (GLenum cap)
/* If this was the last enabled texture target then we'll /* If this was the last enabled texture target then we'll
completely disable the unit */ completely disable the unit */
if (COGL_GLES2_TEXTURE_UNIT_IS_ENABLED (w->settings.texture_units, if (COGL_GLES2_TEXTURE_UNIT_IS_ENABLED (w->settings.texture_units,
w->active_texture_unit) && w->active_texture_unit))
w->settings.tex_env[w->active_texture_unit].texture_target == cap)
{ {
COGL_GLES2_TEXTURE_UNIT_SET_ENABLED (w->settings.texture_units, COGL_GLES2_TEXTURE_UNIT_SET_ENABLED (w->settings.texture_units,
w->active_texture_unit, w->active_texture_unit,
@ -1432,14 +780,6 @@ _cogl_wrap_glDisable (GLenum cap)
} }
break; break;
case GL_FOG:
_COGL_GLES2_CHANGE_SETTING (w, fog_enabled, FALSE);
break;
case GL_ALPHA_TEST:
_COGL_GLES2_CHANGE_SETTING (w, alpha_test_enabled, FALSE);
break;
default: default:
glDisable (cap); glDisable (cap);
} }
@ -1507,20 +847,6 @@ _cogl_wrap_glDisableClientState (GLenum array)
} }
} }
void
_cogl_wrap_glAlphaFunc (GLenum func, GLclampf ref)
{
_COGL_GET_GLES2_WRAPPER (w, NO_RETVAL);
if (ref < 0.0f)
ref = 0.0f;
else if (ref > 1.0f)
ref = 1.0f;
_COGL_GLES2_CHANGE_SETTING (w, alpha_test_func, func);
_COGL_GLES2_CHANGE_UNIFORM (w, ALPHA_TEST_REF, alpha_test_ref, ref);
}
void void
_cogl_wrap_glColor4f (GLclampf r, GLclampf g, GLclampf b, GLclampf a) _cogl_wrap_glColor4f (GLclampf r, GLclampf g, GLclampf b, GLclampf a)
{ {
@ -1595,49 +921,6 @@ _cogl_wrap_glGetFloatv (GLenum pname, GLfloat *params)
} }
} }
void
_cogl_wrap_glFogf (GLenum pname, GLfloat param)
{
_COGL_GET_GLES2_WRAPPER (w, NO_RETVAL);
switch (pname)
{
case GL_FOG_MODE:
_COGL_GLES2_CHANGE_SETTING (w, fog_mode, param);
break;
case GL_FOG_DENSITY:
_COGL_GLES2_CHANGE_UNIFORM (w, FOG_DENSITY, fog_density,
(param));
break;
case GL_FOG_START:
_COGL_GLES2_CHANGE_UNIFORM (w, FOG_START, fog_start,
(param));
break;
case GL_FOG_END:
_COGL_GLES2_CHANGE_UNIFORM (w, FOG_END, fog_end,
(param));
break;
}
}
void
_cogl_wrap_glFogfv (GLenum pname, const GLfloat *params)
{
int i;
_COGL_GET_GLES2_WRAPPER (w, NO_RETVAL);
if (pname == GL_FOG_COLOR)
{
for (i = 0; i < 4; i++)
w->fog_color[i] = (params[i]);
w->dirty_uniforms |= COGL_GLES2_DIRTY_FOG_COLOR;
}
}
void void
_cogl_wrap_glTexParameteri (GLenum target, GLenum pname, GLfloat param) _cogl_wrap_glTexParameteri (GLenum target, GLenum pname, GLfloat param)
{ {

View File

@ -37,7 +37,6 @@ typedef struct _CoglGles2WrapperTextureUnit
typedef struct _CoglGles2WrapperAttributes CoglGles2WrapperAttributes; typedef struct _CoglGles2WrapperAttributes CoglGles2WrapperAttributes;
typedef struct _CoglGles2WrapperUniforms CoglGles2WrapperUniforms; typedef struct _CoglGles2WrapperUniforms CoglGles2WrapperUniforms;
typedef struct _CoglGles2WrapperTexEnv CoglGles2WrapperTexEnv;
typedef struct _CoglGles2WrapperTextureUnitSettings typedef struct _CoglGles2WrapperTextureUnitSettings
CoglGles2WrapperTextureUnitSettings; CoglGles2WrapperTextureUnitSettings;
typedef struct _CoglGles2WrapperSettings CoglGles2WrapperSettings; typedef struct _CoglGles2WrapperSettings CoglGles2WrapperSettings;
@ -65,15 +64,9 @@ enum
COGL_GLES2_DIRTY_MVP_MATRIX = 1 << 0, COGL_GLES2_DIRTY_MVP_MATRIX = 1 << 0,
COGL_GLES2_DIRTY_MODELVIEW_MATRIX = 1 << 1, COGL_GLES2_DIRTY_MODELVIEW_MATRIX = 1 << 1,
COGL_GLES2_DIRTY_TEXTURE_MATRICES = 1 << 2, COGL_GLES2_DIRTY_TEXTURE_MATRICES = 1 << 2,
COGL_GLES2_DIRTY_FOG_DENSITY = 1 << 3, COGL_GLES2_DIRTY_POINT_SIZE = 1 << 3,
COGL_GLES2_DIRTY_FOG_START = 1 << 4,
COGL_GLES2_DIRTY_FOG_END = 1 << 5,
COGL_GLES2_DIRTY_FOG_COLOR = 1 << 6,
COGL_GLES2_DIRTY_ALPHA_TEST_REF = 1 << 7,
COGL_GLES2_DIRTY_TEXTURE_UNITS = 1 << 8,
COGL_GLES2_DIRTY_POINT_SIZE = 1 << 9,
COGL_GLES2_DIRTY_ALL = (1 << 10) - 1 COGL_GLES2_DIRTY_ALL = (1 << 4) - 1
}; };
/* Dirty flags for shader vertex attribute pointers */ /* Dirty flags for shader vertex attribute pointers */
@ -98,39 +91,10 @@ struct _CoglGles2WrapperUniforms
GLint mvp_matrix_uniform; GLint mvp_matrix_uniform;
GLint modelview_matrix_uniform; GLint modelview_matrix_uniform;
GLint texture_matrix_uniforms[COGL_GLES2_MAX_TEXTURE_UNITS]; GLint texture_matrix_uniforms[COGL_GLES2_MAX_TEXTURE_UNITS];
GLint texture_sampler_uniforms[COGL_GLES2_MAX_TEXTURE_UNITS];
GLint fog_density_uniform;
GLint fog_start_uniform;
GLint fog_end_uniform;
GLint fog_color_uniform;
GLint alpha_test_ref_uniform;
GLint texture_unit_uniform;
GLint point_size_uniform; GLint point_size_uniform;
}; };
struct _CoglGles2WrapperTexEnv
{
GLenum texture_combine_rgb_func;
GLenum texture_combine_rgb_src[3];
GLenum texture_combine_rgb_op[3];
GLenum texture_combine_alpha_func;
GLenum texture_combine_alpha_src[3];
GLenum texture_combine_alpha_op[3];
GLfloat texture_combine_constant[4];
GLboolean point_sprite_coords;
/* Texture target that was last enabled for this unit. This assumes
that there can only be one target enabled per unit */
GLenum texture_target;
};
/* NB: We get a copy of this for each fragment/vertex /* NB: We get a copy of this for each fragment/vertex
* program varient we generate so we try to keep it * program varient we generate so we try to keep it
* fairly lean */ * fairly lean */
@ -138,16 +102,8 @@ struct _CoglGles2WrapperSettings
{ {
guint32 texture_units; guint32 texture_units;
GLint alpha_test_func;
GLint fog_mode;
/* The current in-use user program */ /* The current in-use user program */
GLuint user_program; GLuint user_program;
unsigned int alpha_test_enabled:1;
unsigned int fog_enabled:1;
CoglGles2WrapperTexEnv tex_env[COGL_GLES2_MAX_TEXTURE_UNITS];
}; };
struct _CoglGles2WrapperTextureUnit struct _CoglGles2WrapperTextureUnit
@ -201,15 +157,7 @@ struct _CoglGles2Wrapper
/* List of all compiled vertex shaders */ /* List of all compiled vertex shaders */
GSList *compiled_vertex_shaders; GSList *compiled_vertex_shaders;
/* List of all compiled fragment shaders */
GSList *compiled_fragment_shaders;
/* Values for the uniforms */ /* Values for the uniforms */
GLfloat alpha_test_ref;
GLfloat fog_density;
GLfloat fog_start;
GLfloat fog_end;
GLfloat fog_color[4];
GLfloat point_size; GLfloat point_size;
}; };
@ -356,17 +304,12 @@ void _cogl_wrap_glColorPointer (GLint size, GLenum type, GLsizei stride,
void _cogl_wrap_glNormalPointer (GLenum type, GLsizei stride, void _cogl_wrap_glNormalPointer (GLenum type, GLsizei stride,
const GLvoid *pointer); const GLvoid *pointer);
void _cogl_wrap_glTexEnvi (GLenum target, GLenum pname, GLint param);
void _cogl_wrap_glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params);
void _cogl_wrap_glClientActiveTexture (GLenum texture); void _cogl_wrap_glClientActiveTexture (GLenum texture);
void _cogl_wrap_glActiveTexture (GLenum texture); void _cogl_wrap_glActiveTexture (GLenum texture);
void _cogl_wrap_glEnableClientState (GLenum array); void _cogl_wrap_glEnableClientState (GLenum array);
void _cogl_wrap_glDisableClientState (GLenum array); void _cogl_wrap_glDisableClientState (GLenum array);
void _cogl_wrap_glAlphaFunc (GLenum func, GLclampf ref);
void _cogl_wrap_glColor4f (GLclampf r, GLclampf g, GLclampf b, GLclampf a); void _cogl_wrap_glColor4f (GLclampf r, GLclampf g, GLclampf b, GLclampf a);
void _cogl_wrap_glColor4ub (GLubyte r, GLubyte g, GLubyte b, GLubyte a); void _cogl_wrap_glColor4ub (GLubyte r, GLubyte g, GLubyte b, GLubyte a);
@ -375,9 +318,6 @@ void _cogl_wrap_glClipPlanef (GLenum plane, GLfloat *equation);
void _cogl_wrap_glGetIntegerv (GLenum pname, GLint *params); void _cogl_wrap_glGetIntegerv (GLenum pname, GLint *params);
void _cogl_wrap_glGetFloatv (GLenum pname, GLfloat *params); void _cogl_wrap_glGetFloatv (GLenum pname, GLfloat *params);
void _cogl_wrap_glFogf (GLenum pname, GLfloat param);
void _cogl_wrap_glFogfv (GLenum pname, const GLfloat *params);
void _cogl_wrap_glDrawArrays (GLenum mode, GLint first, GLsizei count); void _cogl_wrap_glDrawArrays (GLenum mode, GLint first, GLsizei count);
void _cogl_wrap_glDrawElements (GLenum mode, GLsizei count, GLenum type, void _cogl_wrap_glDrawElements (GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices); const GLvoid *indices);
@ -420,14 +360,11 @@ void _cogl_gles2_clear_cache_for_program (GLuint gl_program);
#define glClientActiveTexture _cogl_wrap_glClientActiveTexture #define glClientActiveTexture _cogl_wrap_glClientActiveTexture
#define glEnableClientState _cogl_wrap_glEnableClientState #define glEnableClientState _cogl_wrap_glEnableClientState
#define glDisableClientState _cogl_wrap_glDisableClientState #define glDisableClientState _cogl_wrap_glDisableClientState
#define glAlphaFunc _cogl_wrap_glAlphaFunc
#define glColor4f _cogl_wrap_glColor4f #define glColor4f _cogl_wrap_glColor4f
#define glColor4ub _cogl_wrap_glColor4ub #define glColor4ub _cogl_wrap_glColor4ub
#define glClipPlanef _cogl_wrap_glClipPlanef #define glClipPlanef _cogl_wrap_glClipPlanef
#define glGetIntegerv _cogl_wrap_glGetIntegerv #define glGetIntegerv _cogl_wrap_glGetIntegerv
#define glGetFloatv _cogl_wrap_glGetFloatv #define glGetFloatv _cogl_wrap_glGetFloatv
#define glFogf _cogl_wrap_glFogf
#define glFogfv _cogl_wrap_glFogfv
#define glTexParameteri _cogl_wrap_glTexParameteri #define glTexParameteri _cogl_wrap_glTexParameteri
#define glMaterialfv _cogl_wrap_glMaterialfv #define glMaterialfv _cogl_wrap_glMaterialfv
#define glPointSize _cogl_wrap_glPointSize #define glPointSize _cogl_wrap_glPointSize