mirror of
https://github.com/brl/mutter.git
synced 2025-02-18 14:14:10 +00:00
[ClutterTexture] Attach the FBO texture to a layer in the material
Bug 1565 - test-fbo case failed in many platform clutter_texture_new_from_actor was broken because it created the FBO texture but then never attached it to the material so it was never used for rendering. The old behaviour in Clutter 0.8 was to assign the texture directly to priv->tex. In 0.9 priv->tex is replaced with priv->material which has a reference to the tex in layer 0. So putting the FBO texture directly in layer 0 more closely matches the original behaviour.
This commit is contained in:
parent
8e6e09c8ef
commit
4f692cc3ee
@ -82,7 +82,6 @@ struct _ClutterTexturePrivate
|
|||||||
gint max_tile_waste;
|
gint max_tile_waste;
|
||||||
ClutterTextureQuality filter_quality;
|
ClutterTextureQuality filter_quality;
|
||||||
CoglHandle material;
|
CoglHandle material;
|
||||||
CoglHandle fbo_texture;
|
|
||||||
gboolean no_slice;
|
gboolean no_slice;
|
||||||
|
|
||||||
ClutterActor *fbo_source;
|
ClutterActor *fbo_source;
|
||||||
@ -289,31 +288,34 @@ clutter_texture_realize (ClutterActor *actor)
|
|||||||
CoglTextureFlags flags = COGL_TEXTURE_NONE;
|
CoglTextureFlags flags = COGL_TEXTURE_NONE;
|
||||||
gint min_filter, mag_filter;
|
gint min_filter, mag_filter;
|
||||||
gint max_waste = -1;
|
gint max_waste = -1;
|
||||||
|
CoglHandle tex;
|
||||||
|
|
||||||
/* Handle FBO's */
|
/* Handle FBO's */
|
||||||
|
|
||||||
if (priv->fbo_texture != COGL_INVALID_HANDLE)
|
|
||||||
cogl_handle_unref (priv->fbo_texture);
|
|
||||||
|
|
||||||
if (!priv->no_slice)
|
if (!priv->no_slice)
|
||||||
max_waste = priv->max_tile_waste;
|
max_waste = priv->max_tile_waste;
|
||||||
|
|
||||||
if (priv->filter_quality == CLUTTER_TEXTURE_QUALITY_HIGH)
|
if (priv->filter_quality == CLUTTER_TEXTURE_QUALITY_HIGH)
|
||||||
flags |= COGL_TEXTURE_AUTO_MIPMAP;
|
flags |= COGL_TEXTURE_AUTO_MIPMAP;
|
||||||
|
|
||||||
priv->fbo_texture =
|
tex = cogl_texture_new_with_size (priv->width,
|
||||||
cogl_texture_new_with_size (priv->width,
|
priv->height,
|
||||||
priv->height,
|
max_waste, flags,
|
||||||
max_waste, flags,
|
COGL_PIXEL_FORMAT_RGBA_8888);
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888);
|
|
||||||
|
cogl_material_set_layer (priv->material, 0, tex);
|
||||||
|
|
||||||
clutter_texture_quality_to_filters (priv->filter_quality,
|
clutter_texture_quality_to_filters (priv->filter_quality,
|
||||||
&min_filter,
|
&min_filter,
|
||||||
&mag_filter);
|
&mag_filter);
|
||||||
|
|
||||||
cogl_texture_set_filters (priv->fbo_texture, min_filter, mag_filter);
|
cogl_texture_set_filters (tex, min_filter, mag_filter);
|
||||||
|
|
||||||
priv->fbo_handle = cogl_offscreen_new_to_texture (priv->fbo_texture);
|
priv->fbo_handle = cogl_offscreen_new_to_texture (tex);
|
||||||
|
|
||||||
|
/* The material now has a reference to the texture so it will
|
||||||
|
stick around */
|
||||||
|
cogl_handle_unref (tex);
|
||||||
|
|
||||||
if (priv->fbo_handle == COGL_INVALID_HANDLE)
|
if (priv->fbo_handle == COGL_INVALID_HANDLE)
|
||||||
{
|
{
|
||||||
@ -1216,7 +1218,6 @@ clutter_texture_init (ClutterTexture *self)
|
|||||||
priv->repeat_y = FALSE;
|
priv->repeat_y = FALSE;
|
||||||
priv->sync_actor_size = TRUE;
|
priv->sync_actor_size = TRUE;
|
||||||
priv->material = cogl_material_new ();
|
priv->material = cogl_material_new ();
|
||||||
priv->fbo_texture = COGL_INVALID_HANDLE;
|
|
||||||
priv->fbo_handle = COGL_INVALID_HANDLE;
|
priv->fbo_handle = COGL_INVALID_HANDLE;
|
||||||
priv->local_data = NULL;
|
priv->local_data = NULL;
|
||||||
priv->keep_aspect_ratio = FALSE;
|
priv->keep_aspect_ratio = FALSE;
|
||||||
@ -2299,6 +2300,7 @@ on_fbo_source_size_change (GObject *object,
|
|||||||
{
|
{
|
||||||
CoglTextureFlags flags = COGL_TEXTURE_NONE;
|
CoglTextureFlags flags = COGL_TEXTURE_NONE;
|
||||||
gint min_filter, mag_filter;
|
gint min_filter, mag_filter;
|
||||||
|
CoglHandle tex;
|
||||||
|
|
||||||
/* tear down the FBO */
|
/* tear down the FBO */
|
||||||
cogl_handle_unref (priv->fbo_handle);
|
cogl_handle_unref (priv->fbo_handle);
|
||||||
@ -2311,20 +2313,25 @@ on_fbo_source_size_change (GObject *object,
|
|||||||
if (priv->filter_quality == CLUTTER_TEXTURE_QUALITY_HIGH)
|
if (priv->filter_quality == CLUTTER_TEXTURE_QUALITY_HIGH)
|
||||||
flags |= COGL_TEXTURE_AUTO_MIPMAP;
|
flags |= COGL_TEXTURE_AUTO_MIPMAP;
|
||||||
|
|
||||||
priv->fbo_texture =
|
tex = cogl_texture_new_with_size (MAX (priv->width, 1),
|
||||||
cogl_texture_new_with_size (MAX (priv->width, 1),
|
MAX (priv->height, 1),
|
||||||
MAX (priv->height, 1),
|
-1,
|
||||||
-1,
|
flags,
|
||||||
flags,
|
COGL_PIXEL_FORMAT_RGBA_8888);
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888);
|
|
||||||
|
cogl_material_set_layer (priv->material, 0, tex);
|
||||||
|
|
||||||
clutter_texture_quality_to_filters (priv->filter_quality,
|
clutter_texture_quality_to_filters (priv->filter_quality,
|
||||||
&min_filter,
|
&min_filter,
|
||||||
&mag_filter);
|
&mag_filter);
|
||||||
|
|
||||||
cogl_texture_set_filters (priv->fbo_texture, min_filter, mag_filter);
|
cogl_texture_set_filters (tex, min_filter, mag_filter);
|
||||||
|
|
||||||
priv->fbo_handle = cogl_offscreen_new_to_texture (priv->fbo_texture);
|
priv->fbo_handle = cogl_offscreen_new_to_texture (tex);
|
||||||
|
|
||||||
|
/* The material now has a reference to the texture so it will
|
||||||
|
stick around */
|
||||||
|
cogl_handle_unref (tex);
|
||||||
|
|
||||||
if (priv->fbo_handle == COGL_INVALID_HANDLE)
|
if (priv->fbo_handle == COGL_INVALID_HANDLE)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user