cogl-attribute: Fix binding an attribute to cogl_tex_coord_in

If an application tries to bind an attribute to cogl_tex_coord_in then
on GLES2 it would try to directly use that as the name of the GL
attribute. However in the generated shader that is actually #defined
to cogl_tex_coord0_in so we need to remap the name. This adds a
parameter to validate_cogl_attribute_name so that it can optionally
return a real_attribute_name. If it doesn't set this then the calling
function will default to the Cogl attribute name.

This fixes test-texture-3d with the GLES2 driver.

Reviewed-by: Robert Bragg <robert@linux.intel.com>
This commit is contained in:
Neil Roberts 2012-02-22 15:51:57 +00:00
parent 2fdb7fc743
commit d3e6f2bc83

View File

@ -61,6 +61,7 @@ COGL_OBJECT_DEFINE (Attribute, attribute);
static gboolean static gboolean
validate_cogl_attribute_name (const char *name, validate_cogl_attribute_name (const char *name,
char **real_attribute_name,
CoglAttributeNameID *name_id, CoglAttributeNameID *name_id,
gboolean *normalized, gboolean *normalized,
int *texture_unit) int *texture_unit)
@ -78,7 +79,10 @@ validate_cogl_attribute_name (const char *name,
*normalized = TRUE; *normalized = TRUE;
} }
else if (strcmp (name, "tex_coord_in") == 0) else if (strcmp (name, "tex_coord_in") == 0)
{
*real_attribute_name = "cogl_tex_coord0_in";
*name_id = COGL_ATTRIBUTE_NAME_ID_TEXTURE_COORD_ARRAY; *name_id = COGL_ATTRIBUTE_NAME_ID_TEXTURE_COORD_ARRAY;
}
else if (strncmp (name, "tex_coord", strlen ("tex_coord")) == 0) else if (strncmp (name, "tex_coord", strlen ("tex_coord")) == 0)
{ {
char *endptr; char *endptr;
@ -86,7 +90,7 @@ validate_cogl_attribute_name (const char *name,
if (strcmp (endptr, "_in") != 0) if (strcmp (endptr, "_in") != 0)
{ {
g_warning ("Texture coordinate attributes should either be named " g_warning ("Texture coordinate attributes should either be named "
"\"cogl_tex_coord\" or named with a texture unit index " "\"cogl_tex_coord_in\" or named with a texture unit index "
"like \"cogl_tex_coord2_in\"\n"); "like \"cogl_tex_coord2_in\"\n");
return FALSE; return FALSE;
} }
@ -112,12 +116,14 @@ _cogl_attribute_register_attribute_name (CoglContext *context,
{ {
CoglAttributeNameState *name_state = g_new (CoglAttributeNameState, 1); CoglAttributeNameState *name_state = g_new (CoglAttributeNameState, 1);
int name_index = context->n_attribute_names++; int name_index = context->n_attribute_names++;
char *name_copy = g_strdup (name);
name_state->name = g_strdup (name); name_state->name = NULL;
name_state->name_index = name_index; name_state->name_index = name_index;
if (strncmp (name, "cogl_", 5) == 0) if (strncmp (name, "cogl_", 5) == 0)
{ {
if (!validate_cogl_attribute_name (name, if (!validate_cogl_attribute_name (name,
&name_state->name,
&name_state->name_id, &name_state->name_id,
&name_state->normalized_default, &name_state->normalized_default,
&name_state->texture_unit)) &name_state->texture_unit))
@ -130,8 +136,11 @@ _cogl_attribute_register_attribute_name (CoglContext *context,
name_state->texture_unit = 0; name_state->texture_unit = 0;
} }
if (name_state->name == NULL)
name_state->name = name_copy;
g_hash_table_insert (context->attribute_name_states_hash, g_hash_table_insert (context->attribute_name_states_hash,
name_state->name, name_state); name_copy, name_state);
if (G_UNLIKELY (context->attribute_name_index_map == NULL)) if (G_UNLIKELY (context->attribute_name_index_map == NULL))
context->attribute_name_index_map = context->attribute_name_index_map =