Don't create a layer when enabling texture coordinate attributes
When a primitive is drawn with an attribute that contains texture coordinates Cogl will fetch the corresponding layer in order to determine the unit number. However if the pipeline didn't actually have a layer it would end up redundantly creating it. It's probably not a good idea to be modifying the pipeline while flushing the attributes state so this patch makes it pass the no-create flag to the get_layer function and then skips out enabling the attribute if the layer didn't already exist. https://bugzilla.gnome.org/show_bug.cgi?id=702570 Reviewed-by: Robert Bragg <robert@linux.intel.com> (cherry picked from commit 7507ad1a55a2aeb5beb8c0e3343e1e1f2805ddde)
This commit is contained in:
parent
e926c1dab4
commit
2f4d66f950
@ -251,17 +251,25 @@ setup_legacy_buffered_attribute (CoglContext *ctx,
|
||||
case COGL_ATTRIBUTE_NAME_ID_TEXTURE_COORD_ARRAY:
|
||||
{
|
||||
int layer_number = attribute->name_state->layer_number;
|
||||
const CoglPipelineGetLayerFlags flags =
|
||||
COGL_PIPELINE_GET_LAYER_NO_CREATE;
|
||||
CoglPipelineLayer *layer =
|
||||
_cogl_pipeline_get_layer (pipeline, layer_number);
|
||||
int unit = _cogl_pipeline_layer_get_unit_index (layer);
|
||||
_cogl_pipeline_get_layer_with_flags (pipeline, layer_number, flags);
|
||||
|
||||
_cogl_bitmask_set (&ctx->enable_texcoord_attributes_tmp, unit, TRUE);
|
||||
if (layer)
|
||||
{
|
||||
int unit = _cogl_pipeline_layer_get_unit_index (layer);
|
||||
|
||||
GE (ctx, glClientActiveTexture (GL_TEXTURE0 + unit));
|
||||
GE (ctx, glTexCoordPointer (attribute->d.buffered.n_components,
|
||||
attribute->d.buffered.type,
|
||||
attribute->d.buffered.stride,
|
||||
base + attribute->d.buffered.offset));
|
||||
_cogl_bitmask_set (&ctx->enable_texcoord_attributes_tmp,
|
||||
unit,
|
||||
TRUE);
|
||||
|
||||
GE (ctx, glClientActiveTexture (GL_TEXTURE0 + unit));
|
||||
GE (ctx, glTexCoordPointer (attribute->d.buffered.n_components,
|
||||
attribute->d.buffered.type,
|
||||
attribute->d.buffered.stride,
|
||||
base + attribute->d.buffered.offset));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case COGL_ATTRIBUTE_NAME_ID_POSITION_ARRAY:
|
||||
@ -316,13 +324,24 @@ setup_legacy_const_attribute (CoglContext *ctx,
|
||||
case COGL_ATTRIBUTE_NAME_ID_TEXTURE_COORD_ARRAY:
|
||||
{
|
||||
int layer_number = attribute->name_state->layer_number;
|
||||
const CoglPipelineGetLayerFlags flags =
|
||||
COGL_PIPELINE_GET_LAYER_NO_CREATE;
|
||||
CoglPipelineLayer *layer =
|
||||
_cogl_pipeline_get_layer (pipeline, layer_number);
|
||||
int unit = _cogl_pipeline_layer_get_unit_index (layer);
|
||||
_cogl_pipeline_get_layer_with_flags (pipeline,
|
||||
layer_number,
|
||||
flags);
|
||||
|
||||
GE (ctx, glClientActiveTexture (GL_TEXTURE0 + unit));
|
||||
if (layer)
|
||||
{
|
||||
int unit = _cogl_pipeline_layer_get_unit_index (layer);
|
||||
|
||||
GE (ctx, glMultiTexCoord4f (vector[0], vector[1], vector[2], vector[3]));
|
||||
GE (ctx, glClientActiveTexture (GL_TEXTURE0 + unit));
|
||||
|
||||
GE (ctx, glMultiTexCoord4f (vector[0],
|
||||
vector[1],
|
||||
vector[2],
|
||||
vector[3]));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case COGL_ATTRIBUTE_NAME_ID_POSITION_ARRAY:
|
||||
|
Loading…
Reference in New Issue
Block a user