OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 #include "cc/gl_renderer.h" | 5 #include "cc/gl_renderer.h" |
6 | 6 |
7 #include "cc/draw_quad.h" | 7 #include "cc/draw_quad.h" |
8 #include "cc/prioritized_resource_manager.h" | 8 #include "cc/prioritized_resource_manager.h" |
9 #include "cc/resource_provider.h" | 9 #include "cc/resource_provider.h" |
10 #include "cc/test/fake_impl_proxy.h" | 10 #include "cc/test/fake_impl_proxy.h" |
(...skipping 22 matching lines...) Expand all Loading... |
33 FrameCountingMemoryAllocationSettingContext() : m_frame(0) { } | 33 FrameCountingMemoryAllocationSettingContext() : m_frame(0) { } |
34 | 34 |
35 // WebGraphicsContext3D methods. | 35 // WebGraphicsContext3D methods. |
36 | 36 |
37 // This method would normally do a glSwapBuffers under the hood. | 37 // This method would normally do a glSwapBuffers under the hood. |
38 virtual void prepareTexture() { m_frame++; } | 38 virtual void prepareTexture() { m_frame++; } |
39 virtual void setMemoryAllocationChangedCallbackCHROMIUM(WebGraphicsMemoryAll
ocationChangedCallbackCHROMIUM* callback) { m_memoryAllocationChangedCallback =
callback; } | 39 virtual void setMemoryAllocationChangedCallbackCHROMIUM(WebGraphicsMemoryAll
ocationChangedCallbackCHROMIUM* callback) { m_memoryAllocationChangedCallback =
callback; } |
40 virtual WebString getString(WebKit::WGC3Denum name) | 40 virtual WebString getString(WebKit::WGC3Denum name) |
41 { | 41 { |
42 if (name == GL_EXTENSIONS) | 42 if (name == GL_EXTENSIONS) |
43 return WebString("GL_CHROMIUM_set_visibility GL_CHROMIUM_gpu_memory_
manager GL_CHROMIUM_discard_framebuffer"); | 43 return WebString("GL_CHROMIUM_set_visibility GL_CHROMIUM_gpu_memory_
manager GL_CHROMIUM_discard_backbuffer"); |
44 return WebString(); | 44 return WebString(); |
45 } | 45 } |
46 | 46 |
47 // Methods added for test. | 47 // Methods added for test. |
48 int frameCount() { return m_frame; } | 48 int frameCount() { return m_frame; } |
49 void setMemoryAllocation(WebGraphicsMemoryAllocation allocation) | 49 void setMemoryAllocation(WebGraphicsMemoryAllocation allocation) |
50 { | 50 { |
51 m_memoryAllocationChangedCallback->onMemoryAllocationChanged(allocation)
; | 51 m_memoryAllocationChangedCallback->onMemoryAllocationChanged(allocation)
; |
52 } | 52 } |
53 | 53 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 }; | 105 }; |
106 | 106 |
107 class FakeRendererGL : public GLRenderer { | 107 class FakeRendererGL : public GLRenderer { |
108 public: | 108 public: |
109 FakeRendererGL(RendererClient* client, ResourceProvider* resourceProvider) :
GLRenderer(client, resourceProvider) { } | 109 FakeRendererGL(RendererClient* client, ResourceProvider* resourceProvider) :
GLRenderer(client, resourceProvider) { } |
110 | 110 |
111 // GLRenderer methods. | 111 // GLRenderer methods. |
112 | 112 |
113 // Changing visibility to public. | 113 // Changing visibility to public. |
114 using GLRenderer::initialize; | 114 using GLRenderer::initialize; |
115 using GLRenderer::isFramebufferDiscarded; | 115 using GLRenderer::isBackbufferDiscarded; |
116 using GLRenderer::drawQuad; | 116 using GLRenderer::drawQuad; |
117 using GLRenderer::beginDrawingFrame; | 117 using GLRenderer::beginDrawingFrame; |
118 using GLRenderer::finishDrawingQuadList; | 118 using GLRenderer::finishDrawingQuadList; |
119 }; | 119 }; |
120 | 120 |
121 class GLRendererTest : public testing::Test { | 121 class GLRendererTest : public testing::Test { |
122 protected: | 122 protected: |
123 GLRendererTest() | 123 GLRendererTest() |
124 : m_suggestHaveBackbufferYes(1, true) | 124 : m_suggestHaveBackbufferYes(1, true) |
125 , m_suggestHaveBackbufferNo(1, false) | 125 , m_suggestHaveBackbufferNo(1, false) |
(...skipping 17 matching lines...) Expand all Loading... |
143 | 143 |
144 WebGraphicsMemoryAllocation m_suggestHaveBackbufferYes; | 144 WebGraphicsMemoryAllocation m_suggestHaveBackbufferYes; |
145 WebGraphicsMemoryAllocation m_suggestHaveBackbufferNo; | 145 WebGraphicsMemoryAllocation m_suggestHaveBackbufferNo; |
146 | 146 |
147 scoped_ptr<OutputSurface> m_context; | 147 scoped_ptr<OutputSurface> m_context; |
148 FakeRendererClient m_mockClient; | 148 FakeRendererClient m_mockClient; |
149 scoped_ptr<ResourceProvider> m_resourceProvider; | 149 scoped_ptr<ResourceProvider> m_resourceProvider; |
150 FakeRendererGL m_renderer; | 150 FakeRendererGL m_renderer; |
151 }; | 151 }; |
152 | 152 |
153 // Test GLRenderer discardFramebuffer functionality: | 153 // Test GLRenderer discardBackbuffer functionality: |
154 // Suggest recreating framebuffer when one already exists. | 154 // Suggest recreating framebuffer when one already exists. |
155 // Expected: it does nothing. | 155 // Expected: it does nothing. |
156 TEST_F(GLRendererTest, SuggestBackbufferYesWhenItAlreadyExistsShouldDoNothing) | 156 TEST_F(GLRendererTest, SuggestBackbufferYesWhenItAlreadyExistsShouldDoNothing) |
157 { | 157 { |
158 context()->setMemoryAllocation(m_suggestHaveBackbufferYes); | 158 context()->setMemoryAllocation(m_suggestHaveBackbufferYes); |
159 EXPECT_EQ(0, m_mockClient.setFullRootLayerDamageCount()); | 159 EXPECT_EQ(0, m_mockClient.setFullRootLayerDamageCount()); |
160 EXPECT_FALSE(m_renderer.isFramebufferDiscarded()); | 160 EXPECT_FALSE(m_renderer.isBackbufferDiscarded()); |
161 | 161 |
162 swapBuffers(); | 162 swapBuffers(); |
163 EXPECT_EQ(1, context()->frameCount()); | 163 EXPECT_EQ(1, context()->frameCount()); |
164 } | 164 } |
165 | 165 |
166 // Test GLRenderer discardFramebuffer functionality: | 166 // Test GLRenderer discardBackbuffer functionality: |
167 // Suggest discarding framebuffer when one exists and the renderer is not visibl
e. | 167 // Suggest discarding framebuffer when one exists and the renderer is not visibl
e. |
168 // Expected: it is discarded and damage tracker is reset. | 168 // Expected: it is discarded and damage tracker is reset. |
169 TEST_F(GLRendererTest, SuggestBackbufferNoShouldDiscardBackbufferAndDamageRootLa
yerWhileNotVisible) | 169 TEST_F(GLRendererTest, SuggestBackbufferNoShouldDiscardBackbufferAndDamageRootLa
yerWhileNotVisible) |
170 { | 170 { |
171 m_renderer.setVisible(false); | 171 m_renderer.setVisible(false); |
172 context()->setMemoryAllocation(m_suggestHaveBackbufferNo); | 172 context()->setMemoryAllocation(m_suggestHaveBackbufferNo); |
173 EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); | 173 EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); |
174 EXPECT_TRUE(m_renderer.isFramebufferDiscarded()); | 174 EXPECT_TRUE(m_renderer.isBackbufferDiscarded()); |
175 } | 175 } |
176 | 176 |
177 // Test GLRenderer discardFramebuffer functionality: | 177 // Test GLRenderer discardBackbuffer functionality: |
178 // Suggest discarding framebuffer when one exists and the renderer is visible. | 178 // Suggest discarding framebuffer when one exists and the renderer is visible. |
179 // Expected: the allocation is ignored. | 179 // Expected: the allocation is ignored. |
180 TEST_F(GLRendererTest, SuggestBackbufferNoDoNothingWhenVisible) | 180 TEST_F(GLRendererTest, SuggestBackbufferNoDoNothingWhenVisible) |
181 { | 181 { |
182 m_renderer.setVisible(true); | 182 m_renderer.setVisible(true); |
183 context()->setMemoryAllocation(m_suggestHaveBackbufferNo); | 183 context()->setMemoryAllocation(m_suggestHaveBackbufferNo); |
184 EXPECT_EQ(0, m_mockClient.setFullRootLayerDamageCount()); | 184 EXPECT_EQ(0, m_mockClient.setFullRootLayerDamageCount()); |
185 EXPECT_FALSE(m_renderer.isFramebufferDiscarded()); | 185 EXPECT_FALSE(m_renderer.isBackbufferDiscarded()); |
186 } | 186 } |
187 | 187 |
188 | 188 |
189 // Test GLRenderer discardFramebuffer functionality: | 189 // Test GLRenderer discardBackbuffer functionality: |
190 // Suggest discarding framebuffer when one does not exist. | 190 // Suggest discarding framebuffer when one does not exist. |
191 // Expected: it does nothing. | 191 // Expected: it does nothing. |
192 TEST_F(GLRendererTest, SuggestBackbufferNoWhenItDoesntExistShouldDoNothing) | 192 TEST_F(GLRendererTest, SuggestBackbufferNoWhenItDoesntExistShouldDoNothing) |
193 { | 193 { |
194 m_renderer.setVisible(false); | 194 m_renderer.setVisible(false); |
195 context()->setMemoryAllocation(m_suggestHaveBackbufferNo); | 195 context()->setMemoryAllocation(m_suggestHaveBackbufferNo); |
196 EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); | 196 EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); |
197 EXPECT_TRUE(m_renderer.isFramebufferDiscarded()); | 197 EXPECT_TRUE(m_renderer.isBackbufferDiscarded()); |
198 | 198 |
199 context()->setMemoryAllocation(m_suggestHaveBackbufferNo); | 199 context()->setMemoryAllocation(m_suggestHaveBackbufferNo); |
200 EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); | 200 EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); |
201 EXPECT_TRUE(m_renderer.isFramebufferDiscarded()); | 201 EXPECT_TRUE(m_renderer.isBackbufferDiscarded()); |
202 } | 202 } |
203 | 203 |
204 // Test GLRenderer discardFramebuffer functionality: | 204 // Test GLRenderer discardBackbuffer functionality: |
205 // Begin drawing a frame while a framebuffer is discarded. | 205 // Begin drawing a frame while a framebuffer is discarded. |
206 // Expected: will recreate framebuffer. | 206 // Expected: will recreate framebuffer. |
207 TEST_F(GLRendererTest, DiscardedBackbufferIsRecreatedForScopeDuration) | 207 TEST_F(GLRendererTest, DiscardedBackbufferIsRecreatedForScopeDuration) |
208 { | 208 { |
209 m_renderer.setVisible(false); | 209 m_renderer.setVisible(false); |
210 context()->setMemoryAllocation(m_suggestHaveBackbufferNo); | 210 context()->setMemoryAllocation(m_suggestHaveBackbufferNo); |
211 EXPECT_TRUE(m_renderer.isFramebufferDiscarded()); | 211 EXPECT_TRUE(m_renderer.isBackbufferDiscarded()); |
212 EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); | 212 EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); |
213 | 213 |
214 m_renderer.setVisible(true); | 214 m_renderer.setVisible(true); |
215 m_renderer.drawFrame(m_mockClient.renderPassesInDrawOrder(), m_mockClient.re
nderPasses()); | 215 m_renderer.drawFrame(m_mockClient.renderPassesInDrawOrder(), m_mockClient.re
nderPasses()); |
216 EXPECT_FALSE(m_renderer.isFramebufferDiscarded()); | 216 EXPECT_FALSE(m_renderer.isBackbufferDiscarded()); |
217 | 217 |
218 swapBuffers(); | 218 swapBuffers(); |
219 EXPECT_EQ(1, context()->frameCount()); | 219 EXPECT_EQ(1, context()->frameCount()); |
220 } | 220 } |
221 | 221 |
222 TEST_F(GLRendererTest, FramebufferDiscardedAfterReadbackWhenNotVisible) | 222 TEST_F(GLRendererTest, FramebufferDiscardedAfterReadbackWhenNotVisible) |
223 { | 223 { |
224 m_renderer.setVisible(false); | 224 m_renderer.setVisible(false); |
225 context()->setMemoryAllocation(m_suggestHaveBackbufferNo); | 225 context()->setMemoryAllocation(m_suggestHaveBackbufferNo); |
226 EXPECT_TRUE(m_renderer.isFramebufferDiscarded()); | 226 EXPECT_TRUE(m_renderer.isBackbufferDiscarded()); |
227 EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); | 227 EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); |
228 | 228 |
229 char pixels[4]; | 229 char pixels[4]; |
230 m_renderer.drawFrame(m_mockClient.renderPassesInDrawOrder(), m_mockClient.re
nderPasses()); | 230 m_renderer.drawFrame(m_mockClient.renderPassesInDrawOrder(), m_mockClient.re
nderPasses()); |
231 EXPECT_FALSE(m_renderer.isFramebufferDiscarded()); | 231 EXPECT_FALSE(m_renderer.isBackbufferDiscarded()); |
232 | 232 |
233 m_renderer.getFramebufferPixels(pixels, gfx::Rect(0, 0, 1, 1)); | 233 m_renderer.getFramebufferPixels(pixels, gfx::Rect(0, 0, 1, 1)); |
234 EXPECT_TRUE(m_renderer.isFramebufferDiscarded()); | 234 EXPECT_TRUE(m_renderer.isBackbufferDiscarded()); |
235 EXPECT_EQ(2, m_mockClient.setFullRootLayerDamageCount()); | 235 EXPECT_EQ(2, m_mockClient.setFullRootLayerDamageCount()); |
236 } | 236 } |
237 | 237 |
238 class ForbidSynchronousCallContext : public FakeWebGraphicsContext3D { | 238 class ForbidSynchronousCallContext : public FakeWebGraphicsContext3D { |
239 public: | 239 public: |
240 ForbidSynchronousCallContext() { } | 240 ForbidSynchronousCallContext() { } |
241 | 241 |
242 virtual bool getActiveAttrib(WebGLId program, WGC3Duint index, ActiveInfo&)
{ ADD_FAILURE(); return false; } | 242 virtual bool getActiveAttrib(WebGLId program, WGC3Duint index, ActiveInfo&)
{ ADD_FAILURE(); return false; } |
243 virtual bool getActiveUniform(WebGLId program, WGC3Duint index, ActiveInfo&)
{ ADD_FAILURE(); return false; } | 243 virtual bool getActiveUniform(WebGLId program, WGC3Duint index, ActiveInfo&)
{ ADD_FAILURE(); return false; } |
244 virtual void getAttachedShaders(WebGLId program, WGC3Dsizei maxCount, WGC3Ds
izei* count, WebGLId* shaders) { ADD_FAILURE(); } | 244 virtual void getAttachedShaders(WebGLId program, WGC3Dsizei maxCount, WGC3Ds
izei* count, WebGLId* shaders) { ADD_FAILURE(); } |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 } | 450 } |
451 virtual void flush() { if (m_lastCallWasSetVisibility) *m_lastCallWasSetVisi
bility = false; } | 451 virtual void flush() { if (m_lastCallWasSetVisibility) *m_lastCallWasSetVisi
bility = false; } |
452 virtual void deleteTexture(WebGLId) { if (m_lastCallWasSetVisibility) *m_las
tCallWasSetVisibility = false; } | 452 virtual void deleteTexture(WebGLId) { if (m_lastCallWasSetVisibility) *m_las
tCallWasSetVisibility = false; } |
453 virtual void deleteFramebuffer(WebGLId) { if (m_lastCallWasSetVisibility) *m
_lastCallWasSetVisibility = false; } | 453 virtual void deleteFramebuffer(WebGLId) { if (m_lastCallWasSetVisibility) *m
_lastCallWasSetVisibility = false; } |
454 virtual void deleteRenderbuffer(WebGLId) { if (m_lastCallWasSetVisibility) *
m_lastCallWasSetVisibility = false; } | 454 virtual void deleteRenderbuffer(WebGLId) { if (m_lastCallWasSetVisibility) *
m_lastCallWasSetVisibility = false; } |
455 | 455 |
456 // This method would normally do a glSwapBuffers under the hood. | 456 // This method would normally do a glSwapBuffers under the hood. |
457 virtual WebString getString(WebKit::WGC3Denum name) | 457 virtual WebString getString(WebKit::WGC3Denum name) |
458 { | 458 { |
459 if (name == GL_EXTENSIONS) | 459 if (name == GL_EXTENSIONS) |
460 return WebString("GL_CHROMIUM_set_visibility GL_CHROMIUM_gpu_memory_
manager GL_CHROMIUM_discard_framebuffer"); | 460 return WebString("GL_CHROMIUM_set_visibility GL_CHROMIUM_gpu_memory_
manager GL_CHROMIUM_discard_backbuffer"); |
461 return WebString(); | 461 return WebString(); |
462 } | 462 } |
463 | 463 |
464 // Methods added for test. | 464 // Methods added for test. |
465 void setLastCallWasSetVisibilityPointer(bool* lastCallWasSetVisibility) { m_
lastCallWasSetVisibility = lastCallWasSetVisibility; } | 465 void setLastCallWasSetVisibilityPointer(bool* lastCallWasSetVisibility) { m_
lastCallWasSetVisibility = lastCallWasSetVisibility; } |
466 | 466 |
467 private: | 467 private: |
468 bool* m_lastCallWasSetVisibility; | 468 bool* m_lastCallWasSetVisibility; |
469 }; | 469 }; |
470 | 470 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 it != pass->quad_list.backToFrontEnd(); ++it) { | 573 it != pass->quad_list.backToFrontEnd(); ++it) { |
574 renderer.drawQuad(drawingFrame, *it); | 574 renderer.drawQuad(drawingFrame, *it); |
575 } | 575 } |
576 renderer.finishDrawingQuadList(); | 576 renderer.finishDrawingQuadList(); |
577 EXPECT_EQ(context->activeTexture(), GL_TEXTURE0); | 577 EXPECT_EQ(context->activeTexture(), GL_TEXTURE0); |
578 Mock::VerifyAndClearExpectations(context); | 578 Mock::VerifyAndClearExpectations(context); |
579 } | 579 } |
580 | 580 |
581 } // namespace | 581 } // namespace |
582 } // namespace cc | 582 } // namespace cc |
OLD | NEW |