Use COGL to establish GL state for ClutterGLXTexturePixmap

Using glEnable() directly confuses COGL and can result in problems
like subsequent pick operations not working correctly. Get the
material for the ClutterTexture and call cogl_material_flush_gl_state()
instead.

http://bugzilla.openedhand.com/show_bug.cgi?id=1483
This commit is contained in:
Owen W. Taylor 2009-02-27 13:39:53 -05:00 committed by Robert Bragg
parent 65c5188c7e
commit f9d996a460

View File

@ -126,26 +126,18 @@ G_DEFINE_TYPE (ClutterGLXTexturePixmap, \
static gboolean
texture_bind (ClutterGLXTexturePixmap *tex)
{
GLuint handle = 0;
GLenum target = 0;
CoglHandle cogl_material;
CoglHandle cogl_tex;
cogl_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE(tex));
if (!cogl_texture_get_gl_texture (cogl_tex, &handle, &target))
/* It might be better to track if we've succesfully set a texture yet
* explicitly, rather than doing it indirectly like this.
*/
cogl_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE(tex));
if (cogl_tex == COGL_INVALID_HANDLE)
return FALSE;
glEnable(target);
/* FIXME: fire off an error here? */
glBindTexture (target, handle);
if (clutter_texture_get_filter_quality (CLUTTER_TEXTURE (tex))
== CLUTTER_TEXTURE_QUALITY_HIGH && tex->priv->can_mipmap)
{
cogl_texture_set_filters (cogl_tex,
CGL_LINEAR_MIPMAP_LINEAR,
CGL_LINEAR);
}
cogl_material = clutter_texture_get_cogl_material (CLUTTER_TEXTURE(tex));
cogl_material_flush_gl_state (cogl_material, NULL);
return TRUE;
}