Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(940)

Unified Diff: content/browser/renderer_host/compositing_iosurface_transformer_mac.h

Issue 13749002: Cache OpenGL textures and other objects in CompositingIOSurfaceMac copy/transform code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Tweaks, per nick@'s comments. Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/compositing_iosurface_transformer_mac.h
diff --git a/content/browser/renderer_host/compositing_iosurface_transformer_mac.h b/content/browser/renderer_host/compositing_iosurface_transformer_mac.h
index d401b92d12f96e1e0c92c001b08cd2b078af25f6..48900741944157c88996db823c9c66345eb9ac38 100644
--- a/content/browser/renderer_host/compositing_iosurface_transformer_mac.h
+++ b/content/browser/renderer_host/compositing_iosurface_transformer_mac.h
@@ -9,10 +9,10 @@
#include "base/basictypes.h"
#include "content/browser/renderer_host/compositing_iosurface_shader_programs_mac.h"
+#include "ui/gfx/size.h"
namespace gfx {
class Rect;
-class Size;
} // namespace gfx
namespace content {
@@ -35,9 +35,15 @@ class CompositingIOSurfaceTransformer {
~CompositingIOSurfaceTransformer();
+ // Delete any references to currently-cached OpenGL objects. This must be
+ // called within the OpenGL context just before destruction.
+ void ReleaseCachedGLObjects();
+
// Resize using bilinear interpolation. Returns false on error. Otherwise,
- // the |texture| argument will point to the result and the caller is
- // responsible for calling glDeleteTexture(*texture).
+ // the |texture| argument will point to the result. Ownership of the returned
+ // |texture| remains with CompositingIOSurfaceTransformer (i.e., the caller
+ // must not delete this texture). The |texture| remains valid until the next
+ // call to ResizeBilinear() or ReleaseCachedGLObjects().
//
// If the src and dst sizes are identical, this becomes a simple copy into a
// new texture.
@@ -51,15 +57,20 @@ class CompositingIOSurfaceTransformer {
//
// YV12 is effectively a twelve bit per pixel format consisting of a full-
// size y (luminance) plane and half-width, half-height u and v (blue and
- // red chrominance) planes. This method will allocate three off-screen
- // textures, one for each plane, and return them via the output arguments
- // |texture_y|, |texture_u|, and |texture_v|. While the textures are in
- // GL_RGBA format, they should be interpreted as the appropriate single-byte,
- // planar format after reading the pixel data. The output arguments
- // |packed_y_size| and |packed_uv_size| follow from these special semantics:
- // They represent the size of their corresponding texture, if it was to be
- // treated like RGBA pixel data. That means their widths are in terms of
- // "quads," where one quad contains 4 Y (or U or V) pixels.
+ // red chrominance) planes. This method will return three off-screen
+ // textures, one for each plane, via the output arguments |texture_y|,
+ // |texture_u|, and |texture_v|. While the textures are in GL_RGBA format,
+ // they should be interpreted as the appropriate single-byte, planar format
+ // after reading the pixel data. The output arguments |packed_y_size| and
+ // |packed_uv_size| follow from these special semantics: They represent the
+ // size of their corresponding texture, if it was to be treated like RGBA
+ // pixel data. That means their widths are in terms of "quads," where one
+ // quad contains 4 Y (or U or V) pixels.
+ //
+ // Ownership of the returned textures remains with
+ // CompositingIOSurfaceTransformer (i.e., the caller must not delete the
+ // textures). The textures remain valid until the next call to
+ // TransformRGBToYV12() or ReleaseCachedGLObjects().
//
// If |src_subrect|'s size does not match |dst_size|, the source will be
// bilinearly interpolated during conversion.
@@ -73,6 +84,22 @@ class CompositingIOSurfaceTransformer {
gfx::Size* packed_y_size, gfx::Size* packed_uv_size);
private:
+ enum CachedTexture {
+ RGBA_OUTPUT = 0,
+ Y_PLANE_OUTPUT,
+ UUVV_INTERMEDIATE,
+ U_PLANE_OUTPUT,
+ V_PLANE_OUTPUT,
+ NUM_CACHED_TEXTURES
+ };
+
+ // If necessary, generate the texture and/or resize it to the given |size|.
+ void PrepareTexture(CachedTexture which, const gfx::Size& size);
+
+ // If necessary, generate a framebuffer object to be used as an intermediate
+ // destination for drawing.
+ void PrepareFramebuffer();
+
// Target to bind all input and output textures to (which defines the type of
// textures being created and read). Generally, this is
// GL_TEXTURE_RECTANGLE_ARB.
@@ -80,6 +107,11 @@ class CompositingIOSurfaceTransformer {
const bool src_texture_needs_y_flip_;
CompositingIOSurfaceShaderPrograms* const shader_program_cache_;
+ // Cached OpenGL objects.
+ GLuint textures_[NUM_CACHED_TEXTURES];
+ gfx::Size texture_sizes_[NUM_CACHED_TEXTURES];
+ GLuint frame_buffer_;
+
// Auto-detected and set once in the constructor.
bool system_supports_multiple_draw_buffers_;

Powered by Google App Engine
This is Rietveld 408576698