OLD | NEW |
1 // Copyright 2010 The Chromium Authors. All rights reserved. | 1 // Copyright 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 #include "cc/output/gl_renderer.h" | 5 #include "cc/output/gl_renderer.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 << static_cast<int>(error) << "\n"; | 206 << static_cast<int>(error) << "\n"; |
207 } | 207 } |
208 | 208 |
209 void GLRenderer::SetVisible(bool visible) { | 209 void GLRenderer::SetVisible(bool visible) { |
210 if (visible_ == visible) | 210 if (visible_ == visible) |
211 return; | 211 return; |
212 visible_ = visible; | 212 visible_ = visible; |
213 | 213 |
214 EnforceMemoryPolicy(); | 214 EnforceMemoryPolicy(); |
215 | 215 |
216 // TODO: Replace setVisibilityCHROMIUM with an extension to explicitly manage | 216 // TODO: Replace setVisibilityCHROMIUM() with an extension to explicitly |
217 // front/backbuffers | 217 // manage front/backbuffers |
218 // crbug.com/116049 | 218 // crbug.com/116049 |
219 if (capabilities_.using_set_visibility) | 219 if (capabilities_.using_set_visibility) |
220 context_->setVisibilityCHROMIUM(visible); | 220 context_->setVisibilityCHROMIUM(visible); |
221 } | 221 } |
222 | 222 |
223 void GLRenderer::SendManagedMemoryStats(size_t bytes_visible, | 223 void GLRenderer::SendManagedMemoryStats(size_t bytes_visible, |
224 size_t bytes_visible_and_nearby, | 224 size_t bytes_visible_and_nearby, |
225 size_t bytes_allocated) { | 225 size_t bytes_allocated) { |
226 WebKit::WebGraphicsManagedMemoryStats stats; | 226 WebKit::WebGraphicsManagedMemoryStats stats; |
227 stats.bytesVisible = bytes_visible; | 227 stats.bytesVisible = bytes_visible; |
(...skipping 21 matching lines...) Expand all Loading... |
249 context_->clear(GL_COLOR_BUFFER_BIT); | 249 context_->clear(GL_COLOR_BUFFER_BIT); |
250 } | 250 } |
251 | 251 |
252 void GLRenderer::BeginDrawingFrame(DrawingFrame& frame) { | 252 void GLRenderer::BeginDrawingFrame(DrawingFrame& frame) { |
253 // FIXME: Remove this once backbuffer is automatically recreated on first use | 253 // FIXME: Remove this once backbuffer is automatically recreated on first use |
254 EnsureBackbuffer(); | 254 EnsureBackbuffer(); |
255 | 255 |
256 if (ViewportSize().IsEmpty()) | 256 if (ViewportSize().IsEmpty()) |
257 return; | 257 return; |
258 | 258 |
259 TRACE_EVENT0("cc", "GLRenderer::drawLayers"); | 259 TRACE_EVENT0("cc", "GLRenderer::DrawLayers"); |
260 if (is_viewport_changed_) { | 260 if (is_viewport_changed_) { |
261 // Only reshape when we know we are going to draw. Otherwise, the reshape | 261 // Only reshape when we know we are going to draw. Otherwise, the reshape |
262 // can leave the window at the wrong size if we never draw and the proper | 262 // can leave the window at the wrong size if we never draw and the proper |
263 // viewport size is never set. | 263 // viewport size is never set. |
264 is_viewport_changed_ = false; | 264 is_viewport_changed_ = false; |
265 output_surface_->Reshape(gfx::Size(ViewportWidth(), ViewportHeight())); | 265 output_surface_->Reshape(gfx::Size(ViewportWidth(), ViewportHeight())); |
266 } | 266 } |
267 | 267 |
268 MakeContextCurrent(); | 268 MakeContextCurrent(); |
269 // Bind the common vertex attributes used for drawing all the layers. | 269 // Bind the common vertex attributes used for drawing all the layers. |
(...skipping 1062 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1332 // set up premultiplied alpha. | 1332 // set up premultiplied alpha. |
1333 if (!draw_cache_.use_premultiplied_alpha) { | 1333 if (!draw_cache_.use_premultiplied_alpha) { |
1334 // As it turns out, the premultiplied alpha blending function (ONE, | 1334 // As it turns out, the premultiplied alpha blending function (ONE, |
1335 // ONE_MINUS_SRC_ALPHA) will never cause the alpha channel to be set to | 1335 // ONE_MINUS_SRC_ALPHA) will never cause the alpha channel to be set to |
1336 // anything less than 1.0f if it is initialized to that value! Therefore, | 1336 // anything less than 1.0f if it is initialized to that value! Therefore, |
1337 // premultiplied_alpha being false is the first situation we can generally | 1337 // premultiplied_alpha being false is the first situation we can generally |
1338 // see an alpha channel less than 1.0f coming out of the compositor. This is | 1338 // see an alpha channel less than 1.0f coming out of the compositor. This is |
1339 // causing platform differences in some layout tests (see | 1339 // causing platform differences in some layout tests (see |
1340 // https://bugs.webkit.org/show_bug.cgi?id=82412), so in this situation, use | 1340 // https://bugs.webkit.org/show_bug.cgi?id=82412), so in this situation, use |
1341 // a separate blend function for the alpha channel to avoid modifying it. | 1341 // a separate blend function for the alpha channel to avoid modifying it. |
1342 // Don't use colorMask for this as it has performance implications on some | 1342 // Don't use colorMask() for this as it has performance implications on some |
1343 // platforms. | 1343 // platforms. |
1344 GLC(Context(), | 1344 GLC(Context(), |
1345 Context()->blendFuncSeparate( | 1345 Context()->blendFuncSeparate( |
1346 GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE)); | 1346 GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE)); |
1347 } | 1347 } |
1348 | 1348 |
1349 COMPILE_ASSERT(sizeof(Float4) == 4 * sizeof(float), struct_is_densely_packed); | 1349 COMPILE_ASSERT(sizeof(Float4) == 4 * sizeof(float), struct_is_densely_packed); |
1350 COMPILE_ASSERT(sizeof(Float16) == 16 * sizeof(float), | 1350 COMPILE_ASSERT(sizeof(Float16) == 16 * sizeof(float), |
1351 struct_is_densely_packed); | 1351 struct_is_densely_packed); |
1352 | 1352 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1464 | 1464 |
1465 if (!quad->premultiplied_alpha) { | 1465 if (!quad->premultiplied_alpha) { |
1466 // As it turns out, the premultiplied alpha blending function (ONE, | 1466 // As it turns out, the premultiplied alpha blending function (ONE, |
1467 // ONE_MINUS_SRC_ALPHA) will never cause the alpha channel to be set to | 1467 // ONE_MINUS_SRC_ALPHA) will never cause the alpha channel to be set to |
1468 // anything less than 1.0f if it is initialized to that value! Therefore, | 1468 // anything less than 1.0f if it is initialized to that value! Therefore, |
1469 // premultiplied_alpha being false is the first situation we can generally | 1469 // premultiplied_alpha being false is the first situation we can generally |
1470 // see an alpha channel less than 1.0f coming out of the compositor. This is | 1470 // see an alpha channel less than 1.0f coming out of the compositor. This is |
1471 // causing platform differences in some layout tests (see | 1471 // causing platform differences in some layout tests (see |
1472 // https://bugs.webkit.org/show_bug.cgi?id=82412), so in this situation, use | 1472 // https://bugs.webkit.org/show_bug.cgi?id=82412), so in this situation, use |
1473 // a separate blend function for the alpha channel to avoid modifying it. | 1473 // a separate blend function for the alpha channel to avoid modifying it. |
1474 // Don't use colorMask for this as it has performance implications on some | 1474 // Don't use colorMask() for this as it has performance implications on some |
1475 // platforms. | 1475 // platforms. |
1476 GLC(Context(), | 1476 GLC(Context(), |
1477 Context()->blendFuncSeparate( | 1477 Context()->blendFuncSeparate( |
1478 GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE)); | 1478 GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE)); |
1479 } | 1479 } |
1480 | 1480 |
1481 DrawQuadGeometry( | 1481 DrawQuadGeometry( |
1482 frame, quad->quadTransform(), quad->rect, binding.matrix_location); | 1482 frame, quad->quadTransform(), quad->rect, binding.matrix_location); |
1483 | 1483 |
1484 if (!quad->premultiplied_alpha) | 1484 if (!quad->premultiplied_alpha) |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1643 | 1643 |
1644 void GLRenderer::Finish() { | 1644 void GLRenderer::Finish() { |
1645 TRACE_EVENT0("cc", "GLRenderer::finish"); | 1645 TRACE_EVENT0("cc", "GLRenderer::finish"); |
1646 context_->finish(); | 1646 context_->finish(); |
1647 } | 1647 } |
1648 | 1648 |
1649 bool GLRenderer::SwapBuffers() { | 1649 bool GLRenderer::SwapBuffers() { |
1650 DCHECK(visible_); | 1650 DCHECK(visible_); |
1651 DCHECK(!is_backbuffer_discarded_); | 1651 DCHECK(!is_backbuffer_discarded_); |
1652 | 1652 |
1653 TRACE_EVENT0("cc", "GLRenderer::swapBuffers"); | 1653 TRACE_EVENT0("cc", "GLRenderer::SwapBuffers"); |
1654 // We're done! Time to swapbuffers! | 1654 // We're done! Time to swapbuffers! |
1655 | 1655 |
1656 if (capabilities_.using_partial_swap) { | 1656 if (capabilities_.using_partial_swap) { |
1657 // If supported, we can save significant bandwidth by only swapping the | 1657 // If supported, we can save significant bandwidth by only swapping the |
1658 // damaged/scissored region (clamped to the viewport) | 1658 // damaged/scissored region (clamped to the viewport) |
1659 swap_buffer_rect_.Intersect(gfx::Rect(gfx::Point(), ViewportSize())); | 1659 swap_buffer_rect_.Intersect(gfx::Rect(gfx::Point(), ViewportSize())); |
1660 int flipped_y_pos_of_rect_bottom = | 1660 int flipped_y_pos_of_rect_bottom = |
1661 ViewportHeight() - swap_buffer_rect_.y() - swap_buffer_rect_.height(); | 1661 ViewportHeight() - swap_buffer_rect_.y() - swap_buffer_rect_.height(); |
1662 output_surface_->PostSubBuffer(gfx::Rect(swap_buffer_rect_.x(), | 1662 output_surface_->PostSubBuffer(gfx::Rect(swap_buffer_rect_.x(), |
1663 flipped_y_pos_of_rect_bottom, | 1663 flipped_y_pos_of_rect_bottom, |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1727 return ManagedMemoryPolicy::CUTOFF_ALLOW_NICE_TO_HAVE; | 1727 return ManagedMemoryPolicy::CUTOFF_ALLOW_NICE_TO_HAVE; |
1728 case WebKit::WebGraphicsMemoryAllocation::PriorityCutoffAllowEverything: | 1728 case WebKit::WebGraphicsMemoryAllocation::PriorityCutoffAllowEverything: |
1729 return ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING; | 1729 return ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING; |
1730 } | 1730 } |
1731 NOTREACHED(); | 1731 NOTREACHED(); |
1732 return ManagedMemoryPolicy::CUTOFF_ALLOW_NOTHING; | 1732 return ManagedMemoryPolicy::CUTOFF_ALLOW_NOTHING; |
1733 } | 1733 } |
1734 | 1734 |
1735 void GLRenderer::EnforceMemoryPolicy() { | 1735 void GLRenderer::EnforceMemoryPolicy() { |
1736 if (!visible_) { | 1736 if (!visible_) { |
1737 TRACE_EVENT0("cc", "GLRenderer::enforceMemoryPolicy dropping resources"); | 1737 TRACE_EVENT0("cc", "GLRenderer::EnforceMemoryPolicy dropping resources"); |
1738 ReleaseRenderPassTextures(); | 1738 ReleaseRenderPassTextures(); |
1739 if (discard_backbuffer_when_not_visible_) | 1739 if (discard_backbuffer_when_not_visible_) |
1740 DiscardBackbuffer(); | 1740 DiscardBackbuffer(); |
1741 resource_provider_->ReleaseCachedData(); | 1741 resource_provider_->ReleaseCachedData(); |
1742 GLC(context_, context_->flush()); | 1742 GLC(context_, context_->flush()); |
1743 } | 1743 } |
1744 } | 1744 } |
1745 | 1745 |
1746 void GLRenderer::DiscardBackbuffer() { | 1746 void GLRenderer::DiscardBackbuffer() { |
1747 if (is_backbuffer_discarded_) | 1747 if (is_backbuffer_discarded_) |
(...skipping 25 matching lines...) Expand all Loading... |
1773 return; | 1773 return; |
1774 | 1774 |
1775 MakeContextCurrent(); | 1775 MakeContextCurrent(); |
1776 | 1776 |
1777 bool do_workaround = NeedsIOSurfaceReadbackWorkaround(); | 1777 bool do_workaround = NeedsIOSurfaceReadbackWorkaround(); |
1778 | 1778 |
1779 GLuint temporary_texture = 0; | 1779 GLuint temporary_texture = 0; |
1780 GLuint temporary_fbo = 0; | 1780 GLuint temporary_fbo = 0; |
1781 | 1781 |
1782 if (do_workaround) { | 1782 if (do_workaround) { |
1783 // On Mac OS X, calling glReadPixels against an FBO whose color attachment | 1783 // On Mac OS X, calling glReadPixels() against an FBO whose color attachment |
1784 // is an IOSurface-backed texture causes corruption of future glReadPixels | 1784 // is an IOSurface-backed texture causes corruption of future glReadPixels() |
1785 // calls, even those on different OpenGL contexts. It is believed that this | 1785 // calls, even those on different OpenGL contexts. It is believed that this |
1786 // is the root cause of top crasher | 1786 // is the root cause of top crasher |
1787 // http://crbug.com/99393. <rdar://problem/10949687> | 1787 // http://crbug.com/99393. <rdar://problem/10949687> |
1788 | 1788 |
1789 temporary_texture = context_->createTexture(); | 1789 temporary_texture = context_->createTexture(); |
1790 GLC(context_, context_->bindTexture(GL_TEXTURE_2D, temporary_texture)); | 1790 GLC(context_, context_->bindTexture(GL_TEXTURE_2D, temporary_texture)); |
1791 GLC(context_, | 1791 GLC(context_, |
1792 context_->texParameteri( | 1792 context_->texParameteri( |
1793 GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); | 1793 GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); |
1794 GLC(context_, | 1794 GLC(context_, |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1944 } | 1944 } |
1945 | 1945 |
1946 void GLRenderer::SetDrawViewportSize(gfx::Size viewport_size) { | 1946 void GLRenderer::SetDrawViewportSize(gfx::Size viewport_size) { |
1947 GLC(context_, | 1947 GLC(context_, |
1948 context_->viewport(0, 0, viewport_size.width(), viewport_size.height())); | 1948 context_->viewport(0, 0, viewport_size.width(), viewport_size.height())); |
1949 } | 1949 } |
1950 | 1950 |
1951 bool GLRenderer::MakeContextCurrent() { return context_->makeContextCurrent(); } | 1951 bool GLRenderer::MakeContextCurrent() { return context_->makeContextCurrent(); } |
1952 | 1952 |
1953 bool GLRenderer::InitializeSharedObjects() { | 1953 bool GLRenderer::InitializeSharedObjects() { |
1954 TRACE_EVENT0("cc", "GLRenderer::initializeSharedObjects"); | 1954 TRACE_EVENT0("cc", "GLRenderer::InitializeSharedObjects"); |
1955 MakeContextCurrent(); | 1955 MakeContextCurrent(); |
1956 | 1956 |
1957 // Create an FBO for doing offscreen rendering. | 1957 // Create an FBO for doing offscreen rendering. |
1958 GLC(context_, offscreen_framebuffer_id_ = context_->createFramebuffer()); | 1958 GLC(context_, offscreen_framebuffer_id_ = context_->createFramebuffer()); |
1959 | 1959 |
1960 // We will always need these programs to render, so create the programs | 1960 // We will always need these programs to render, so create the programs |
1961 // eagerly so that the shader compilation can start while we do other work. | 1961 // eagerly so that the shader compilation can start while we do other work. |
1962 // Other programs are created lazily on first access. | 1962 // Other programs are created lazily on first access. |
1963 shared_geometry_ = | 1963 shared_geometry_ = |
1964 make_scoped_ptr(new GeometryBinding(context_, QuadVertexRect())); | 1964 make_scoped_ptr(new GeometryBinding(context_, QuadVertexRect())); |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2229 GLC(context_, context_->deleteFramebuffer(offscreen_framebuffer_id_)); | 2229 GLC(context_, context_->deleteFramebuffer(offscreen_framebuffer_id_)); |
2230 | 2230 |
2231 ReleaseRenderPassTextures(); | 2231 ReleaseRenderPassTextures(); |
2232 } | 2232 } |
2233 | 2233 |
2234 bool GLRenderer::IsContextLost() { | 2234 bool GLRenderer::IsContextLost() { |
2235 return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); | 2235 return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); |
2236 } | 2236 } |
2237 | 2237 |
2238 } // namespace cc | 2238 } // namespace cc |
OLD | NEW |