| Index: Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp
|
| ===================================================================
|
| --- Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp (revision 122257)
|
| +++ Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp (working copy)
|
| @@ -35,7 +35,6 @@
|
| #include "LayerRendererChromium.h"
|
|
|
| #include "Extensions3D.h"
|
| -#include "Extensions3DChromium.h"
|
| #include "FloatQuad.h"
|
| #include "GeometryBinding.h"
|
| #include "GrTexture.h"
|
| @@ -222,11 +221,7 @@
|
| void onGpuMemoryAllocationChangedOnImpl(Extensions3DChromium::GpuMemoryAllocationCHROMIUM allocation)
|
| {
|
| ASSERT(CCProxy::isImplThread());
|
| - if (!allocation.suggestHaveBackbuffer)
|
| - m_layerRenderer->discardFramebuffer();
|
| - else
|
| - m_layerRenderer->ensureFramebuffer();
|
| - m_layerRenderer->m_client->setContentsMemoryAllocationLimitBytes(allocation.gpuResourceSizeInBytes);
|
| + m_layerRenderer->setGpuMemoryAllocation(allocation);
|
| }
|
|
|
| LayerRendererChromium* m_layerRenderer;
|
| @@ -254,6 +249,7 @@
|
| , m_defaultRenderPass(0)
|
| , m_isViewportChanged(false)
|
| , m_isFramebufferDiscarded(false)
|
| + , m_visible(true)
|
| , m_textureUploaderSetting(textureUploaderSetting)
|
| {
|
| ASSERT(m_context.get());
|
| @@ -337,7 +333,7 @@
|
| Extensions3DChromium* extensions3DChromium = static_cast<Extensions3DChromium*>(extensions);
|
| extensions3DChromium->setGpuMemoryAllocationChangedCallbackCHROMIUM(LayerRendererGpuMemoryAllocationChangedCallbackAdapter::create(this));
|
| } else {
|
| - m_client->setContentsMemoryAllocationLimitBytes(TextureManager::highLimitBytes(viewportSize()));
|
| + m_client->setMemoryAllocationLimitBytes(TextureManager::highLimitBytes(viewportSize()));
|
| }
|
|
|
| m_capabilities.usingDiscardFramebuffer = extensions->supports("GL_CHROMIUM_discard_framebuffer");
|
| @@ -378,8 +374,9 @@
|
|
|
| void LayerRendererChromium::setVisible(bool visible)
|
| {
|
| - if (!visible)
|
| - releaseRenderPassTextures();
|
| + if (m_visible == visible)
|
| + return;
|
| + m_visible = visible;
|
|
|
| // TODO: Replace setVisibilityCHROMIUM with an extension to explicitly manage front/backbuffers
|
| // crbug.com/116049
|
| @@ -1267,6 +1264,22 @@
|
| -1);
|
| }
|
|
|
| +void LayerRendererChromium::setGpuMemoryAllocation(Extensions3DChromium::GpuMemoryAllocationCHROMIUM allocation)
|
| +{
|
| + if (m_visible && !allocation.gpuResourceSizeInBytes)
|
| + return;
|
| +
|
| + if (!allocation.suggestHaveBackbuffer && !m_visible)
|
| + discardFramebuffer();
|
| +
|
| + if (!allocation.gpuResourceSizeInBytes) {
|
| + releaseRenderPassTextures();
|
| + m_client->releaseContentsTextures();
|
| + GLC(m_context, m_context->flush());
|
| + } else
|
| + m_client->setMemoryAllocationLimitBytes(allocation.gpuResourceSizeInBytes);
|
| +}
|
| +
|
| void LayerRendererChromium::finish()
|
| {
|
| TRACE_EVENT("LayerRendererChromium::finish", this, 0);
|
| @@ -1275,12 +1288,8 @@
|
|
|
| bool LayerRendererChromium::swapBuffers(const IntRect& subBuffer)
|
| {
|
| - // FIXME: Remove this once gpu process supports ignoring swap buffers command while framebuffer is discarded.
|
| - // Alternatively (preferably?), protect all cc code so as not to attempt a swap after a framebuffer discard.
|
| - if (m_isFramebufferDiscarded) {
|
| - m_client->setFullRootLayerDamage();
|
| - return false;
|
| - }
|
| + ASSERT(m_visible);
|
| + ASSERT(!m_isFramebufferDiscarded);
|
|
|
| TRACE_EVENT("LayerRendererChromium::swapBuffers", this, 0);
|
| // We're done! Time to swapbuffers!
|
| @@ -1384,6 +1393,14 @@
|
| GLC(context, context->deleteFramebuffer(temporaryFBO));
|
| GLC(context, context->deleteTexture(temporaryTexture));
|
| }
|
| +
|
| + if (!m_visible) {
|
| + TRACE_EVENT0("cc", "LayerRendererChromium::getFramebufferPixels dropping resources after readback");
|
| + discardFramebuffer();
|
| + releaseRenderPassTextures();
|
| + m_client->releaseContentsTextures();
|
| + GLC(m_context, m_context->flush());
|
| + }
|
| }
|
|
|
| bool LayerRendererChromium::getFramebufferTexture(ManagedTexture* texture, const IntRect& deviceRect)
|
|
|