diff options
Diffstat (limited to 'media-libs/clutter/files/clutter-9999-perfneu1.patch')
-rw-r--r-- | media-libs/clutter/files/clutter-9999-perfneu1.patch | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/media-libs/clutter/files/clutter-9999-perfneu1.patch b/media-libs/clutter/files/clutter-9999-perfneu1.patch new file mode 100644 index 0000000..59b2d27 --- /dev/null +++ b/media-libs/clutter/files/clutter-9999-perfneu1.patch @@ -0,0 +1,248 @@ +From 2b5eb9205ae85c8b459d993da803a31c847e5776 Mon Sep 17 00:00:00 2001 +From: Neil Roberts <neil@linux.intel.com> +Date: Thu, 11 Nov 2010 15:28:44 +0000 +Subject: [PATCH] Add an internal _cogl_offscreen_new_to_texture_full function + +This function is the same as cogl_offscreen_new_to_texture but it +takes a level parameter and a set of flags so that FBOs can be used to +render to higher mipmap levels and to disable the depth and stencil +buffers. cogl_offscreen_new_to_texture now just calls the new function +with the level set to zero. This function could be useful in a few +places in Cogl where we want to use FBOs as an implementation detail +such as when copying between textures. + +http://bugzilla.clutter-project.org/show_bug.cgi?id=2414 +--- + clutter/cogl/cogl/cogl-framebuffer-private.h | 24 ++++++ + clutter/cogl/cogl/cogl-framebuffer.c | 100 +++++++++++++++++++------ + 2 files changed, 100 insertions(+), 24 deletions(-) + +diff --git a/clutter/cogl/cogl/cogl-framebuffer-private.h b/clutter/cogl/cogl/cogl-framebuffer-private.h +index 1ae102e..803befd 100644 +--- a/clutter/cogl/cogl/cogl-framebuffer-private.h ++++ b/clutter/cogl/cogl/cogl-framebuffer-private.h +@@ -66,6 +66,12 @@ typedef struct _CoglOffscreen + CoglHandle texture; + } CoglOffscreen; + ++/* Flags to pass to _cogl_offscreen_new_to_texture_full */ ++typedef enum ++{ ++ COGL_OFFSCREEN_DISABLE_DEPTH_STENCIL = 1 ++} CoglOffscreenFlags; ++ + #define COGL_OFFSCREEN(X) ((CoglOffscreen *)(X)) + + typedef struct _CoglOnscreen +@@ -143,5 +149,23 @@ _cogl_create_framebuffer_stack (void); + void + _cogl_free_framebuffer_stack (GSList *stack); + ++/* ++ * _cogl_offscreen_new_to_texture_full: ++ * @texhandle: A handle to the texture to target ++ * @create_flags: Flags specifying how to create the FBO ++ * @level: The mipmap level within the texture to target ++ * ++ * Creates a new offscreen buffer which will target the given ++ * texture. By default the buffer will have a depth and stencil ++ * buffer. This can be disabled by passing ++ * %COGL_OFFSCREEN_DISABLE_DEPTH_STENCIL in @create_flags. ++ * ++ * Return value: the new CoglOffscreen object. ++ */ ++CoglHandle ++_cogl_offscreen_new_to_texture_full (CoglHandle texhandle, ++ CoglOffscreenFlags create_flags, ++ unsigned int level); ++ + #endif /* __COGL_FRAMEBUFFER_PRIVATE_H */ + +diff --git a/clutter/cogl/cogl/cogl-framebuffer.c b/clutter/cogl/cogl/cogl-framebuffer.c +index 2042c0a..5e832b1 100644 +--- a/clutter/cogl/cogl/cogl-framebuffer.c ++++ b/clutter/cogl/cogl/cogl-framebuffer.c +@@ -324,10 +324,18 @@ _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer) + framebuffer->dirty_bitmasks = FALSE; + } + ++typedef struct ++{ ++ CoglHandle texture; ++ unsigned int level; ++ unsigned int level_width; ++ unsigned int level_height; ++} CoglFramebufferTryFBOData; ++ + static gboolean + try_creating_fbo (CoglOffscreen *offscreen, + TryFBOFlags flags, +- CoglHandle texture) ++ CoglFramebufferTryFBOData *data) + { + GLuint gl_depth_stencil_handle; + GLuint gl_depth_handle; +@@ -339,7 +347,8 @@ try_creating_fbo (CoglOffscreen *offscreen, + + _COGL_GET_CONTEXT (ctx, FALSE); + +- if (!cogl_texture_get_gl_texture (texture, &tex_gl_handle, &tex_gl_target)) ++ if (!cogl_texture_get_gl_texture (data->texture, ++ &tex_gl_handle, &tex_gl_target)) + return FALSE; + + if (tex_gl_target != GL_TEXTURE_2D +@@ -362,7 +371,7 @@ try_creating_fbo (CoglOffscreen *offscreen, + offscreen->fbo_handle = fbo_gl_handle; + + GE (glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, +- tex_gl_target, tex_gl_handle, 0)); ++ tex_gl_target, tex_gl_handle, data->level)); + + if (flags & _TRY_DEPTH_STENCIL) + { +@@ -370,8 +379,8 @@ try_creating_fbo (CoglOffscreen *offscreen, + GE (glGenRenderbuffers (1, &gl_depth_stencil_handle)); + GE (glBindRenderbuffer (GL_RENDERBUFFER, gl_depth_stencil_handle)); + GE (glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_STENCIL, +- cogl_texture_get_width (texture), +- cogl_texture_get_height (texture))); ++ data->level_width, ++ data->level_height)); + GE (glBindRenderbuffer (GL_RENDERBUFFER, 0)); + GE (glFramebufferRenderbuffer (GL_FRAMEBUFFER, + GL_STENCIL_ATTACHMENT, +@@ -391,8 +400,8 @@ try_creating_fbo (CoglOffscreen *offscreen, + /* For now we just ask for GL_DEPTH_COMPONENT16 since this is all that's + * available under GLES */ + GE (glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, +- cogl_texture_get_width (texture), +- cogl_texture_get_height (texture))); ++ data->level_width, ++ data->level_height)); + GE (glBindRenderbuffer (GL_RENDERBUFFER, 0)); + GE (glFramebufferRenderbuffer (GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, +@@ -407,8 +416,8 @@ try_creating_fbo (CoglOffscreen *offscreen, + GE (glGenRenderbuffers (1, &gl_stencil_handle)); + GE (glBindRenderbuffer (GL_RENDERBUFFER, gl_stencil_handle)); + GE (glRenderbufferStorage (GL_RENDERBUFFER, GL_STENCIL_INDEX8, +- cogl_texture_get_width (texture), +- cogl_texture_get_height (texture))); ++ data->level_width, ++ data->level_height)); + GE (glBindRenderbuffer (GL_RENDERBUFFER, 0)); + GE (glFramebufferRenderbuffer (GL_FRAMEBUFFER, + GL_STENCIL_ATTACHMENT, +@@ -443,11 +452,16 @@ try_creating_fbo (CoglOffscreen *offscreen, + } + + CoglHandle +-cogl_offscreen_new_to_texture (CoglHandle texhandle) ++_cogl_offscreen_new_to_texture_full (CoglHandle texhandle, ++ CoglOffscreenFlags create_flags, ++ unsigned int level) + { + CoglOffscreen *offscreen; + static TryFBOFlags flags; + static gboolean have_working_flags = FALSE; ++ unsigned int i; ++ CoglFramebufferTryFBOData data; ++ gboolean fbo_created; + + _COGL_GET_CONTEXT (ctx, COGL_INVALID_HANDLE); + +@@ -462,6 +476,27 @@ cogl_offscreen_new_to_texture (CoglHandle texhandle) + if (cogl_texture_is_sliced (texhandle)) + return COGL_INVALID_HANDLE; + ++ data.texture = texhandle; ++ data.level = level; ++ ++ /* Calculate the size of the texture at this mipmap level to ensure ++ that it's a valid level */ ++ data.level_width = cogl_texture_get_width (texhandle); ++ data.level_height = cogl_texture_get_height (texhandle); ++ ++ for (i = 0; i < level; i++) ++ { ++ /* If neither dimension can be further divided then the level is ++ invalid */ ++ if (data.level_width == 1 && data.level_height == 1) ++ return COGL_INVALID_HANDLE; ++ ++ if (data.level_width > 1) ++ data.level_width >>= 1; ++ if (data.level_height > 1) ++ data.level_height >>= 1; ++ } ++ + /* XXX: The framebuffer_object spec isn't clear in defining whether attaching + * a texture as a renderbuffer with mipmap filtering enabled while the + * mipmaps have not been uploaded should result in an incomplete framebuffer +@@ -477,25 +512,36 @@ cogl_offscreen_new_to_texture (CoglHandle texhandle) + offscreen = g_new0 (CoglOffscreen, 1); + offscreen->texture = cogl_handle_ref (texhandle); + +- if ((have_working_flags && +- try_creating_fbo (offscreen, flags, texhandle)) || ++ if ((create_flags & COGL_OFFSCREEN_DISABLE_DEPTH_STENCIL)) ++ fbo_created = try_creating_fbo (offscreen, flags = 0, &data); ++ else ++ { ++ if ((have_working_flags && ++ try_creating_fbo (offscreen, flags, &data)) || + #ifdef HAVE_COGL_GL +- try_creating_fbo (offscreen, flags = _TRY_DEPTH_STENCIL, texhandle) || ++ try_creating_fbo (offscreen, flags = _TRY_DEPTH_STENCIL, &data) || + #endif +- try_creating_fbo (offscreen, flags = _TRY_DEPTH | _TRY_STENCIL, +- texhandle) || +- try_creating_fbo (offscreen, flags = _TRY_STENCIL, texhandle) || +- try_creating_fbo (offscreen, flags = _TRY_DEPTH, texhandle) || +- try_creating_fbo (offscreen, flags = 0, texhandle)) +- { +- /* Record that the last set of flags succeeded so that we can +- try that set first next time */ +- have_working_flags = TRUE; ++ try_creating_fbo (offscreen, flags = _TRY_DEPTH | _TRY_STENCIL, ++ &data) || ++ try_creating_fbo (offscreen, flags = _TRY_STENCIL, &data) || ++ try_creating_fbo (offscreen, flags = _TRY_DEPTH, &data) || ++ try_creating_fbo (offscreen, flags = 0, &data)) ++ { ++ /* Record that the last set of flags succeeded so that we can ++ try that set first next time */ ++ have_working_flags = TRUE; ++ fbo_created = TRUE; ++ } ++ else ++ fbo_created = FALSE; ++ } + ++ if (fbo_created) ++ { + _cogl_framebuffer_init (COGL_FRAMEBUFFER (offscreen), + COGL_FRAMEBUFFER_TYPE_OFFSCREEN, +- cogl_texture_get_width (texhandle), +- cogl_texture_get_height (texhandle)); ++ data.level_width, ++ data.level_height); + + return _cogl_offscreen_object_new (offscreen); + } +@@ -508,6 +554,12 @@ cogl_offscreen_new_to_texture (CoglHandle texhandle) + } + } + ++CoglHandle ++cogl_offscreen_new_to_texture (CoglHandle texhandle) ++{ ++ return _cogl_offscreen_new_to_texture_full (texhandle, 0, 0); ++} ++ + static void + _cogl_offscreen_free (CoglOffscreen *offscreen) + { +-- +1.7.3.16.g9464b
\ No newline at end of file |