cogl-material: Fix some problems with flushing texture overrides
authorNeil Roberts <neil@linux.intel.com>
Thu, 8 Jul 2010 17:28:11 +0000 (18:28 +0100)
committerNeil Roberts <neil@linux.intel.com>
Fri, 9 Jul 2010 10:14:15 +0000 (11:14 +0100)
There were a few problems flushing texture overrides so that sliced
textures would not work:

* In _cogl_material_set_layer_texture it ignored the 'overriden'
  parameter and always set texture_overridden to FALSE.

* cogl_texture_get_gl_texture wasn't being called correctly in
  override_layer_texture_cb. It returns a gboolean to indicate the
  error status but this boolean was being assigned to gl_target.

* _cogl_material_layer_texture_equal did not take into account the
  override.

* _cogl_material_layer_get_texture_info did not return the overridden
  texture so it would always use the first texture slice.

clutter/cogl/cogl/cogl-material.c

index bc9807e..4d8e420 100644 (file)
@@ -2042,7 +2042,7 @@ _cogl_material_set_layer_texture (CoglMaterial *material,
       layer->texture != COGL_INVALID_HANDLE)
     cogl_handle_unref (layer->texture);
   layer->texture = texture;
-  layer->texture_overridden = FALSE;
+  layer->texture_overridden = overriden;
   layer->slice_gl_texture = slice_gl_texture;
   layer->slice_gl_target = slice_gl_target;
 
@@ -2651,7 +2651,7 @@ override_layer_texture_cb (CoglMaterialLayer *layer, void *user_data)
   texture = _cogl_material_layer_get_texture (layer);
 
   if (texture != COGL_INVALID_HANDLE)
-    gl_target = cogl_texture_get_gl_texture (texture, NULL, &gl_target);
+    cogl_texture_get_gl_texture (texture, NULL, &gl_target);
   else
     gl_target = GL_TEXTURE_2D;
 
@@ -2736,6 +2736,15 @@ _cogl_material_layer_texture_equal (CoglMaterialLayer *authority0,
 {
   if (authority0->texture != authority1->texture)
     return FALSE;
+
+  if (authority0->texture_overridden != authority1->texture_overridden)
+    return FALSE;
+
+  if (authority0->texture_overridden &&
+      (authority0->slice_gl_texture != authority1->slice_gl_texture ||
+       authority0->slice_gl_target != authority1->slice_gl_target))
+    return FALSE;
+
   return TRUE;
 }
 
@@ -5358,8 +5367,13 @@ _cogl_material_layer_get_texture_info (CoglMaterialLayer *layer,
   *texture = layer->texture;
   if (G_UNLIKELY (*texture == COGL_INVALID_HANDLE))
     *texture = ctx->default_gl_texture_2d_tex;
-  cogl_texture_get_gl_texture (*texture, gl_texture, gl_target);
-  return;
+  if (layer->texture_overridden)
+    {
+      *gl_texture = layer->slice_gl_texture;
+      *gl_target = layer->slice_gl_target;
+    }
+  else
+    cogl_texture_get_gl_texture (*texture, gl_texture, gl_target);
 }
 
 #ifndef HAVE_COGL_GLES