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

Side by Side Diff: app/surface/accelerated_surface_mac.h

Issue 2782006: Remove duplicated code in AcceleratedSurface using PbufferGLContext instead.... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: Address review comments. Created 10 years, 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « app/gfx/gl/gl_context_mac.cc ('k') | app/surface/accelerated_surface_mac.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef APP_SURFACE_ACCELERATED_SURFACE_MAC_H_ 5 #ifndef APP_SURFACE_ACCELERATED_SURFACE_MAC_H_
6 #define APP_SURFACE_ACCELERATED_SURFACE_MAC_H_ 6 #define APP_SURFACE_ACCELERATED_SURFACE_MAC_H_
7 7
8 #include <CoreFoundation/CoreFoundation.h> 8 #include <CoreFoundation/CoreFoundation.h>
9 9
10 #include "app/gfx/gl/gl_context.h"
10 #include "app/surface/transport_dib.h" 11 #include "app/surface/transport_dib.h"
11 #include "base/callback.h" 12 #include "base/callback.h"
12 #include "base/scoped_cftyperef.h" 13 #include "base/scoped_cftyperef.h"
13 #include "base/scoped_ptr.h" 14 #include "base/scoped_ptr.h"
14 #include "gfx/rect.h" 15 #include "gfx/rect.h"
15 #include "gfx/size.h" 16 #include "gfx/size.h"
16 17
17 // Should not include GL headers in a header file. Forward declare these types 18 // Should not include GL headers in a header file. Forward declare these types
18 // instead. 19 // instead.
19 typedef struct _CGLContextObject* CGLContextObj; 20 typedef struct _CGLContextObject* CGLContextObj;
20 typedef struct _CGLPBufferObject* CGLPBufferObj;
21 typedef unsigned int GLenum; 21 typedef unsigned int GLenum;
22 typedef unsigned int GLuint; 22 typedef unsigned int GLuint;
23 23
24 namespace gfx { 24 namespace gfx {
25 class Rect; 25 class Rect;
26 } 26 }
27 27
28 // Encapsulates an accelerated GL surface that can be shared across processes 28 // Encapsulates an accelerated GL surface that can be shared across processes
29 // on systems that support it (10.6 and above). For systems that do not, it 29 // on systems that support it (10.6 and above). For systems that do not, it
30 // uses a regular dib. There will either be a GL Context or a TransportDIB, 30 // uses a regular dib. There will either be an IOSurface or a TransportDIB,
31 // never both. 31 // never both.
32 32
33 class AcceleratedSurface { 33 class AcceleratedSurface {
34 public: 34 public:
35 AcceleratedSurface(); 35 AcceleratedSurface();
36 virtual ~AcceleratedSurface() { } 36 virtual ~AcceleratedSurface() { }
37 37
38 // Set up internal buffers. |share_context|, if non-NULL, is a context 38 // Set up internal buffers. |share_context|, if non-NULL, is a context
39 // with which the internally created OpenGL context shares textures and 39 // with which the internally created OpenGL context shares textures and
40 // other resources. |allocate_fbo| indicates whether or not this surface 40 // other resources. |allocate_fbo| indicates whether or not this surface
41 // should allocate an offscreen frame buffer object (FBO) internally. If 41 // should allocate an offscreen frame buffer object (FBO) internally. If
42 // not, then the user is expected to allocate one. NOTE that allocating 42 // not, then the user is expected to allocate one. NOTE that allocating
43 // an FBO internally does NOT work properly with client code which uses 43 // an FBO internally does NOT work properly with client code which uses
44 // OpenGL (i.e., via GLES2 command buffers), because the GLES2 44 // OpenGL (i.e., via GLES2 command buffers), because the GLES2
45 // implementation does not know to bind the accelerated surface's 45 // implementation does not know to bind the accelerated surface's
46 // internal FBO when the default FBO is bound. Returns false upon 46 // internal FBO when the default FBO is bound. Returns false upon
47 // failure. 47 // failure.
48 bool Initialize(CGLContextObj share_context, bool allocate_fbo); 48 bool Initialize(gfx::GLContext* share_context, bool allocate_fbo);
49 // Tear down. Must be called before destructor to prevent leaks. 49 // Tear down. Must be called before destructor to prevent leaks.
50 void Destroy(); 50 void Destroy();
51 51
52 // These methods are used only when there is a GL surface. 52 // These methods are used only once the accelerated surface is initialized.
53 53
54 // Sets the accelerated surface to the given size, creating a new one if 54 // Sets the accelerated surface to the given size, creating a new one if
55 // the height or width changes. Returns a unique id of the IOSurface to 55 // the height or width changes. Returns a unique id of the IOSurface to
56 // which the surface is bound, or 0 if no changes were made or an error 56 // which the surface is bound, or 0 if no changes were made or an error
57 // occurred. MakeCurrent() will have been called on the new surface. 57 // occurred. MakeCurrent() will have been called on the new surface.
58 uint64 SetSurfaceSize(const gfx::Size& size); 58 uint64 SetSurfaceSize(const gfx::Size& size);
59 59
60 // Sets the GL context to be the current one for drawing. Returns true if 60 // Sets the GL context to be the current one for drawing. Returns true if
61 // it succeeded. 61 // it succeeded.
62 bool MakeCurrent(); 62 bool MakeCurrent();
(...skipping 14 matching lines...) Expand all
77 // AcceleratedSurface contains is responsible for the production of 77 // AcceleratedSurface contains is responsible for the production of
78 // the pixels, then when this entry point is called, the color 78 // the pixels, then when this entry point is called, the color
79 // buffer must be in a state where a glCopyTexSubImage2D or 79 // buffer must be in a state where a glCopyTexSubImage2D or
80 // glReadPixels is legal. (For example, if using multisampled FBOs, 80 // glReadPixels is legal. (For example, if using multisampled FBOs,
81 // the FBO must have been resolved into a non-multisampled color 81 // the FBO must have been resolved into a non-multisampled color
82 // texture.) Additionally, in this situation, the contexts must 82 // texture.) Additionally, in this situation, the contexts must
83 // share server-side GL objects, so that this AcceleratedSurface's 83 // share server-side GL objects, so that this AcceleratedSurface's
84 // texture is a legal name in the namespace of the current context. 84 // texture is a legal name in the namespace of the current context.
85 void SwapBuffers(); 85 void SwapBuffers();
86 86
87 CGLContextObj context() { return gl_context_; } 87 CGLContextObj context() {
88 return static_cast<CGLContextObj>(gl_context_->GetHandle());
89 }
88 90
89 // These methods are only used when there is a transport DIB. 91 // These methods are only used when there is a transport DIB.
90 92
91 // Sets the transport DIB to the given size, creating a new one if the 93 // Sets the transport DIB to the given size, creating a new one if the
92 // height or width changes. Returns a handle to the new DIB, or a default 94 // height or width changes. Returns a handle to the new DIB, or a default
93 // handle if no changes were made. 95 // handle if no changes were made. Assumes the caller has already called
96 // MakeCurrent().
94 TransportDIB::Handle SetTransportDIBSize(const gfx::Size& size); 97 TransportDIB::Handle SetTransportDIBSize(const gfx::Size& size);
95 // Sets the methods to use for allocating and freeing memory for the 98 // Sets the methods to use for allocating and freeing memory for the
96 // transport DIB. 99 // transport DIB.
97 void SetTransportDIBAllocAndFree( 100 void SetTransportDIBAllocAndFree(
98 Callback2<size_t, TransportDIB::Handle*>::Type* allocator, 101 Callback2<size_t, TransportDIB::Handle*>::Type* allocator,
99 Callback1<TransportDIB::Id>::Type* deallocator); 102 Callback1<TransportDIB::Id>::Type* deallocator);
100 103
101 // Get the accelerated surface size. 104 // Get the accelerated surface size.
102 gfx::Size GetSize() const { return surface_size_; } 105 gfx::Size GetSize() const { return surface_size_; }
103 106
104 private: 107 private:
105 // Helper function to generate names for the backing texture, render buffers 108 // Helper function to generate names for the backing texture, render buffers
106 // and FBO. On return, the resulting buffer names can be attached to |fbo_|. 109 // and FBO. On return, the resulting buffer names can be attached to |fbo_|.
107 // |target| is the target type for the color buffer. 110 // |target| is the target type for the color buffer.
108 void AllocateRenderBuffers(GLenum target, const gfx::Size& size); 111 void AllocateRenderBuffers(GLenum target, const gfx::Size& size);
109 112
110 // Helper function to attach the buffers previously allocated by a call to 113 // Helper function to attach the buffers previously allocated by a call to
111 // AllocateRenderBuffers(). On return, |fbo_| can be used for 114 // AllocateRenderBuffers(). On return, |fbo_| can be used for
112 // rendering. |target| must be the same value as used in the call to 115 // rendering. |target| must be the same value as used in the call to
113 // AllocateRenderBuffers(). Returns |true| if the resulting framebuffer 116 // AllocateRenderBuffers(). Returns |true| if the resulting framebuffer
114 // object is valid. 117 // object is valid.
115 bool SetupFrameBufferObject(GLenum target); 118 bool SetupFrameBufferObject(GLenum target);
116 119
117 // The OpenGL context, and pbuffer drawable, used to transfer data 120 // The OpenGL context, and pbuffer drawable, used to transfer data
118 // to the shared region (IOSurface or TransportDIB). Strictly 121 // to the shared region (IOSurface or TransportDIB). Strictly
119 // speaking, we do not need to allocate a GL context all of the 122 // speaking, we do not need to allocate a GL context all of the
120 // time. We only need one if (a) we are using the IOSurface code 123 // time. We only need one if (a) we are using the IOSurface code
121 // path, or (b) if we are allocating an FBO internally. 124 // path, or (b) if we are allocating an FBO internally.
122 CGLContextObj gl_context_; 125 scoped_ptr<gfx::GLContext> gl_context_;
123 CGLPBufferObj pbuffer_;
124 // Either |io_surface_| or |transport_dib_| is a valid pointer, but not both. 126 // Either |io_surface_| or |transport_dib_| is a valid pointer, but not both.
125 // |io_surface_| is non-NULL if the IOSurface APIs are supported (Mac OS X 127 // |io_surface_| is non-NULL if the IOSurface APIs are supported (Mac OS X
126 // 10.6 and later). 128 // 10.6 and later).
127 // TODO(dspringer,kbr): Should the GPU backing store be encapsulated in its 129 // TODO(dspringer,kbr): Should the GPU backing store be encapsulated in its
128 // own class so all this implementation detail is hidden? 130 // own class so all this implementation detail is hidden?
129 scoped_cftyperef<CFTypeRef> io_surface_; 131 scoped_cftyperef<CFTypeRef> io_surface_;
130 // TODO(dspringer): If we end up keeping this TransportDIB mechanism, this 132 // TODO(dspringer): If we end up keeping this TransportDIB mechanism, this
131 // should really be a scoped_ptr_malloc<>, with a deallocate functor that 133 // should really be a scoped_ptr_malloc<>, with a deallocate functor that
132 // runs |dib_free_callback_|. I was not able to figure out how to 134 // runs |dib_free_callback_|. I was not able to figure out how to
133 // make this work (or even compile). 135 // make this work (or even compile).
(...skipping 12 matching lines...) Expand all
146 // true. 148 // true.
147 GLuint fbo_; 149 GLuint fbo_;
148 GLuint depth_stencil_renderbuffer_; 150 GLuint depth_stencil_renderbuffer_;
149 // Allocate a TransportDIB in the renderer. 151 // Allocate a TransportDIB in the renderer.
150 scoped_ptr<Callback2<size_t, TransportDIB::Handle*>::Type> 152 scoped_ptr<Callback2<size_t, TransportDIB::Handle*>::Type>
151 dib_alloc_callback_; 153 dib_alloc_callback_;
152 scoped_ptr<Callback1<TransportDIB::Id>::Type> dib_free_callback_; 154 scoped_ptr<Callback1<TransportDIB::Id>::Type> dib_free_callback_;
153 }; 155 };
154 156
155 #endif // APP_SURFACE_ACCELERATED_SURFACE_MAC_H_ 157 #endif // APP_SURFACE_ACCELERATED_SURFACE_MAC_H_
OLDNEW
« no previous file with comments | « app/gfx/gl/gl_context_mac.cc ('k') | app/surface/accelerated_surface_mac.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698