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

Side by Side Diff: Source/WebCore/platform/graphics/chromium/DrawingBufferChromium.cpp

Issue 7671031: Merge 92520 - [chromium] Accelerated canvas breaks when moving canvases or resources between Pages (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/835/
Patch Set: Created 9 years, 4 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
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010, Google Inc. All rights reserved. 2 * Copyright (c) 2010, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 14 matching lines...) Expand all
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "config.h" 31 #include "config.h"
32 32
33 #include "DrawingBuffer.h" 33 #include "DrawingBuffer.h"
34 34
35 #include "Extensions3DChromium.h"
36 #include "GraphicsContext3D.h" 35 #include "GraphicsContext3D.h"
37
38 #if USE(SKIA) 36 #if USE(SKIA)
39 #include "GrContext.h" 37 #include "GrContext.h"
40 #endif 38 #endif
41 39
42 #if USE(ACCELERATED_COMPOSITING) 40 #if USE(ACCELERATED_COMPOSITING)
43 #include "Canvas2DLayerChromium.h" 41 #include "Canvas2DLayerChromium.h"
44 #endif 42 #endif
45 43
46 namespace WebCore { 44 namespace WebCore {
47 45
48 static unsigned generateColorTexture(GraphicsContext3D* context, const IntSize& size) 46 static unsigned generateColorTexture(GraphicsContext3D* context, const IntSize& size)
49 { 47 {
50 unsigned offscreenColorTexture = context->createTexture(); 48 unsigned offscreenColorTexture = context->createTexture();
51 if (!offscreenColorTexture) 49 if (!offscreenColorTexture)
52 return 0; 50 return 0;
53 51
54 context->bindTexture(GraphicsContext3D::TEXTURE_2D, offscreenColorTexture); 52 context->bindTexture(GraphicsContext3D::TEXTURE_2D, offscreenColorTexture);
55 context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEX TURE_MAG_FILTER, GraphicsContext3D::NEAREST); 53 context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEX TURE_MAG_FILTER, GraphicsContext3D::NEAREST);
56 context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEX TURE_MIN_FILTER, GraphicsContext3D::NEAREST); 54 context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEX TURE_MIN_FILTER, GraphicsContext3D::NEAREST);
57 context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEX TURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE); 55 context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEX TURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE);
58 context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEX TURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE); 56 context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEX TURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE);
59 context->texImage2DResourceSafe(GraphicsContext3D::TEXTURE_2D, 0, GraphicsCo ntext3D::RGBA, size.width(), size.height(), 0, GraphicsContext3D::RGBA, Graphics Context3D::UNSIGNED_BYTE); 57 context->texImage2DResourceSafe(GraphicsContext3D::TEXTURE_2D, 0, GraphicsCo ntext3D::RGBA, size.width(), size.height(), 0, GraphicsContext3D::RGBA, Graphics Context3D::UNSIGNED_BYTE);
60 context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContex t3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, offscreenColorTexture, 0) ; 58 context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContex t3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, offscreenColorTexture, 0) ;
61 59
62 return offscreenColorTexture; 60 return offscreenColorTexture;
63 } 61 }
64 62
65
66 DrawingBuffer::DrawingBuffer(GraphicsContext3D* context, 63 DrawingBuffer::DrawingBuffer(GraphicsContext3D* context,
67 const IntSize& size, 64 const IntSize& size,
68 bool multisampleExtensionSupported, 65 bool multisampleExtensionSupported,
69 bool packedDepthStencilExtensionSupported) 66 bool packedDepthStencilExtensionSupported)
70 : m_context(context) 67 : m_context(context)
71 , m_size(-1, -1) 68 , m_size(-1, -1)
72 , m_multisampleExtensionSupported(multisampleExtensionSupported) 69 , m_multisampleExtensionSupported(multisampleExtensionSupported)
73 , m_packedDepthStencilExtensionSupported(packedDepthStencilExtensionSupporte d) 70 , m_packedDepthStencilExtensionSupported(packedDepthStencilExtensionSupporte d)
74 , m_fbo(0) 71 , m_fbo(0)
75 , m_colorBuffer(0) 72 , m_colorBuffer(0)
76 , m_depthStencilBuffer(0) 73 , m_depthStencilBuffer(0)
77 , m_depthBuffer(0) 74 , m_depthBuffer(0)
78 , m_stencilBuffer(0) 75 , m_stencilBuffer(0)
79 , m_multisampleFBO(0) 76 , m_multisampleFBO(0)
80 , m_multisampleColorBuffer(0) 77 , m_multisampleColorBuffer(0)
81 #if USE(SKIA) 78 #if USE(SKIA)
82 , m_grContext(0) 79 , m_grContext(0)
83 #endif 80 #endif
84 { 81 {
85 if (!m_context->getExtensions()->supports("GL_CHROMIUM_copy_texture_to_paren t_texture")) {
86 m_context.clear();
87 return;
88 }
89 m_fbo = context->createFramebuffer(); 82 m_fbo = context->createFramebuffer();
90 context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo); 83 context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo);
91 m_colorBuffer = generateColorTexture(context, size); 84 m_colorBuffer = generateColorTexture(context, size);
92 createSecondaryBuffers(); 85 createSecondaryBuffers();
93 if (!reset(size)) { 86 if (!reset(size)) {
94 m_context.clear(); 87 m_context.clear();
95 return; 88 return;
96 } 89 }
97 } 90 }
98 91
99 DrawingBuffer::~DrawingBuffer() 92 DrawingBuffer::~DrawingBuffer()
100 { 93 {
101 #if USE(ACCELERATED_COMPOSITING) 94 #if USE(ACCELERATED_COMPOSITING)
102 if (m_platformLayer) 95 if (m_platformLayer)
103 m_platformLayer->setDrawingBuffer(0); 96 m_platformLayer->setDrawingBuffer(0);
104 #endif 97 #endif
105 98
106 if (!m_context) 99 if (!m_context)
107 return; 100 return;
108 101
109 clear(); 102 clear();
110 } 103 }
111 104
112 #if USE(ACCELERATED_COMPOSITING) 105 #if USE(ACCELERATED_COMPOSITING)
113 void DrawingBuffer::publishToPlatformLayer() 106 void DrawingBuffer::publishToPlatformLayer()
114 { 107 {
115 if (!m_context) 108 if (!m_context)
116 return; 109 return;
117 110
118 if (m_callback)
119 m_callback->willPublish();
120 if (multisample()) 111 if (multisample())
121 commit(); 112 commit();
122 unsigned parentTexture = m_platformLayer->textureId();
123 // We do the copy in the canvas' (child) context so that it executes in the correct order relative to
124 // other commands in the child context. This ensures that the parent texture always contains a complete
125 // frame and not some intermediate result.
126 m_context->makeContextCurrent(); 113 m_context->makeContextCurrent();
127 #if USE(SKIA) 114 #if USE(SKIA)
128 if (m_grContext) 115 if (m_grContext)
129 m_grContext->flush(0); 116 m_grContext->flush(0);
130 #endif 117 #endif
131 static_cast<Extensions3DChromium*>(m_context->getExtensions())->copyTextureT oParentTextureCHROMIUM(m_colorBuffer, parentTexture);
132 m_context->flush(); 118 m_context->flush();
133 } 119 }
134 #endif 120 #endif
135 121
136 void DrawingBuffer::didReset()
137 {
138 #if USE(ACCELERATED_COMPOSITING)
139 if (m_platformLayer)
140 m_platformLayer->setTextureChanged();
141 #endif
142 }
143
144 #if USE(ACCELERATED_COMPOSITING) 122 #if USE(ACCELERATED_COMPOSITING)
145 PlatformLayer* DrawingBuffer::platformLayer() 123 PlatformLayer* DrawingBuffer::platformLayer()
146 { 124 {
147 if (!m_platformLayer) 125 if (!m_platformLayer)
148 m_platformLayer = Canvas2DLayerChromium::create(this, 0); 126 m_platformLayer = Canvas2DLayerChromium::create(this, 0);
149 return m_platformLayer.get(); 127 return m_platformLayer.get();
150 } 128 }
151 #endif 129 #endif
152 130
153 Platform3DObject DrawingBuffer::platformColorBuffer() const 131 Platform3DObject DrawingBuffer::platformColorBuffer() const
(...skipping 27 matching lines...) Expand all
181 desc->fWidth = m_size.width(); 159 desc->fWidth = m_size.width();
182 desc->fHeight = m_size.height(); 160 desc->fHeight = m_size.height();
183 desc->fConfig = kRGBA_8888_GrPixelConfig; 161 desc->fConfig = kRGBA_8888_GrPixelConfig;
184 162
185 desc->fStencilBits = (m_depthStencilBuffer || m_stencilBuffer) ? 8 : 0; 163 desc->fStencilBits = (m_depthStencilBuffer || m_stencilBuffer) ? 8 : 0;
186 } 164 }
187 165
188 #endif 166 #endif
189 167
190 } 168 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698