Diff
Modified: trunk/Source/WebCore/ChangeLog (113452 => 113453)
--- trunk/Source/WebCore/ChangeLog 2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/ChangeLog 2012-04-06 17:29:11 UTC (rev 113453)
@@ -1,3 +1,36 @@
+2012-04-06 Dana Jansens <[email protected]>
+
+ [chromium] Surface replica should have a separate quad in the render pass
+ https://bugs.webkit.org/show_bug.cgi?id=83287
+
+ Reviewed by Adrienne Walker.
+
+ Generate separate quads for a RenderSurface and its replica. The replica
+ quad is drawn independently of the surface itself. This allows us to
+ cull each one independently.
+
+ Covered by existing tests.
+
+ * platform/graphics/chromium/LayerRendererChromium.cpp:
+ (WebCore::LayerRendererChromium::drawRenderSurfaceQuad):
+ (WebCore::LayerRendererChromium::copyOffscreenTextureToDisplay):
+ * platform/graphics/chromium/cc/CCRenderPass.cpp:
+ (WebCore::CCRenderPass::appendQuadsForRenderSurfaceLayer):
+ * platform/graphics/chromium/cc/CCRenderSurface.cpp:
+ (WebCore::CCRenderSurface::setScissorRect):
+ (WebCore):
+ (WebCore::CCRenderSurface::drawContents):
+ (WebCore::CCRenderSurface::drawReplica):
+ (WebCore::CCRenderSurface::hasReplica):
+ * platform/graphics/chromium/cc/CCRenderSurface.h:
+ (CCRenderSurface):
+ * platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.cpp:
+ (WebCore::CCRenderSurfaceDrawQuad::create):
+ (WebCore::CCRenderSurfaceDrawQuad::CCRenderSurfaceDrawQuad):
+ * platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.h:
+ (CCRenderSurfaceDrawQuad):
+ (WebCore::CCRenderSurfaceDrawQuad::isReplica):
+
2012-04-05 Martin Robinson <[email protected]>
[GObject bindings] Fix the coding style issues in the generated bindings
Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp (113452 => 113453)
--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp 2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp 2012-04-06 17:29:11 UTC (rev 113453)
@@ -515,7 +515,11 @@
void LayerRendererChromium::drawRenderSurfaceQuad(const CCRenderSurfaceDrawQuad* quad)
{
CCLayerImpl* layer = quad->layer();
- layer->renderSurface()->draw(this, quad->surfaceDamageRect());
+ layer->renderSurface()->setScissorRect(this, quad->surfaceDamageRect());
+ if (quad->isReplica())
+ layer->renderSurface()->drawReplica(this);
+ else
+ layer->renderSurface()->drawContents(this);
layer->renderSurface()->releaseContentsTexture();
}
@@ -1197,7 +1201,11 @@
drawTransform.translate3d(0.5 * m_defaultRenderSurface->contentRect().width(), 0.5 * m_defaultRenderSurface->contentRect().height(), 0);
m_defaultRenderSurface->setDrawTransform(drawTransform);
m_defaultRenderSurface->setDrawOpacity(1);
- m_defaultRenderSurface->draw(this, m_defaultRenderSurface->contentRect());
+
+ m_defaultRenderSurface->setScissorRect(this, m_defaultRenderSurface->contentRect());
+ if (m_defaultRenderSurface->hasReplica())
+ m_defaultRenderSurface->drawReplica(this);
+ m_defaultRenderSurface->drawContents(this);
}
}
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp (113452 => 113453)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp 2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp 2012-04-06 17:29:11 UTC (rev 113453)
@@ -72,20 +72,25 @@
// not be handled specially here.
CCRenderSurface* surface = layer->renderSurface();
OwnPtr<CCSharedQuadState> sharedQuadState = surface->createSharedQuadState();
-
if (layer->hasDebugBorders()) {
Color color(debugSurfaceBorderColorRed, debugSurfaceBorderColorGreen, debugSurfaceBorderColorBlue, debugSurfaceBorderAlpha);
m_quadList.append(CCDebugBorderDrawQuad::create(sharedQuadState.get(), surface->contentRect(), color, debugSurfaceBorderWidth));
- if (surface->hasReplica()) {
- OwnPtr<CCSharedQuadState> sharedQuadState = surface->createReplicaSharedQuadState();
+ }
+ bool isReplica = false;
+ m_quadList.append(CCRenderSurfaceDrawQuad::create(sharedQuadState.get(), surface->contentRect(), layer, surfaceDamageRect(), isReplica));
+ m_sharedQuadStateList.append(sharedQuadState.release());
+
+ // Add replica after the surface so that it appears below the surface.
+ if (surface->hasReplica()) {
+ OwnPtr<CCSharedQuadState> sharedQuadState = surface->createReplicaSharedQuadState();
+ if (layer->hasDebugBorders()) {
Color color(debugReplicaBorderColorRed, debugReplicaBorderColorGreen, debugReplicaBorderColorBlue, debugSurfaceBorderAlpha);
m_quadList.append(CCDebugBorderDrawQuad::create(sharedQuadState.get(), surface->contentRect(), color, debugSurfaceBorderWidth));
- m_sharedQuadStateList.append(sharedQuadState.release());
}
+ bool isReplica = true;
+ m_quadList.append(CCRenderSurfaceDrawQuad::create(sharedQuadState.get(), surface->contentRect(), layer, surfaceDamageRect(), isReplica));
+ m_sharedQuadStateList.append(sharedQuadState.release());
}
-
- m_quadList.append(CCRenderSurfaceDrawQuad::create(sharedQuadState.get(), surface->contentRect(), layer, surfaceDamageRect()));
- m_sharedQuadStateList.append(sharedQuadState.release());
}
}
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp (113452 => 113453)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp 2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp 2012-04-06 17:29:11 UTC (rev 113453)
@@ -104,12 +104,37 @@
m_contentsTexture->unreserve();
}
-void CCRenderSurface::draw(LayerRendererChromium* layerRenderer, const FloatRect& surfaceDamageRect)
+void CCRenderSurface::setScissorRect(LayerRendererChromium* layerRenderer, const FloatRect& surfaceDamageRect) const
{
+ if (m_owningLayer->parent() && m_owningLayer->parent()->usesLayerClipping() && layerRenderer->capabilities().usingPartialSwap) {
+ FloatRect clipAndDamageRect = m_clipRect;
+ clipAndDamageRect.intersect(surfaceDamageRect);
+ layerRenderer->setScissorToRect(enclosingIntRect(clipAndDamageRect));
+ } else if (layerRenderer->capabilities().usingPartialSwap)
+ layerRenderer->setScissorToRect(enclosingIntRect(surfaceDamageRect));
+ else if (m_owningLayer->parent() && m_owningLayer->parent()->usesLayerClipping())
+ layerRenderer->setScissorToRect(m_clipRect);
+ else
+ GLC(layerRenderer->context(), layerRenderer->context()->disable(GraphicsContext3D::SCISSOR_TEST));
+}
+
+void CCRenderSurface::drawContents(LayerRendererChromium* layerRenderer)
+{
if (m_skipsDraw || !m_contentsTexture)
return;
+ // FIXME: Cache this value so that we don't have to do it for both the surface and its replica.
SkBitmap filterBitmap = applyFilters(layerRenderer);
+ drawLayer(layerRenderer, m_maskLayer, m_drawTransform, filterBitmap);
+}
+
+void CCRenderSurface::drawReplica(LayerRendererChromium* layerRenderer)
+{
+ ASSERT(hasReplica());
+ if (!hasReplica() || m_skipsDraw || !m_contentsTexture)
+ return;
+
+ SkBitmap filterBitmap = applyFilters(layerRenderer);
// FIXME: By using the same RenderSurface for both the content and its reflection,
// it's currently not possible to apply a separate mask to the reflection layer
// or correctly handle opacity in reflections (opacity must be applied after drawing
@@ -120,22 +145,7 @@
if (!m_maskLayer && m_owningLayer->replicaLayer())
replicaMaskLayer = m_owningLayer->replicaLayer()->maskLayer();
- if (m_owningLayer->parent() && m_owningLayer->parent()->usesLayerClipping() && layerRenderer->capabilities().usingPartialSwap) {
- FloatRect clipAndDamageRect = m_clipRect;
- clipAndDamageRect.intersect(surfaceDamageRect);
- layerRenderer->setScissorToRect(enclosingIntRect(clipAndDamageRect));
- } else if (layerRenderer->capabilities().usingPartialSwap)
- layerRenderer->setScissorToRect(enclosingIntRect(surfaceDamageRect));
- else if (m_owningLayer->parent() && m_owningLayer->parent()->usesLayerClipping())
- layerRenderer->setScissorToRect(m_clipRect);
- else
- GLC(layerRenderer->context(), layerRenderer->context()->disable(GraphicsContext3D::SCISSOR_TEST));
-
- // Reflection draws before the layer.
- if (m_owningLayer->replicaLayer())
- drawLayer(layerRenderer, replicaMaskLayer, m_replicaDrawTransform, filterBitmap);
-
- drawLayer(layerRenderer, m_maskLayer, m_drawTransform, filterBitmap);
+ drawLayer(layerRenderer, replicaMaskLayer, m_replicaDrawTransform, filterBitmap);
}
void CCRenderSurface::drawLayer(LayerRendererChromium* layerRenderer, CCLayerImpl* maskLayer, const TransformationMatrix& drawTransform, const SkBitmap& filterBitmap)
@@ -273,7 +283,7 @@
return m_owningLayer ? m_owningLayer->id() : 0;
}
-bool CCRenderSurface::hasReplica()
+bool CCRenderSurface::hasReplica() const
{
return m_owningLayer->replicaLayer();
}
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.h (113452 => 113453)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.h 2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.h 2012-04-06 17:29:11 UTC (rev 113453)
@@ -57,8 +57,11 @@
bool prepareContentsTexture(LayerRendererChromium*);
void releaseContentsTexture();
- void draw(LayerRendererChromium*, const FloatRect& surfaceDamageRect);
+ void setScissorRect(LayerRendererChromium*, const FloatRect& surfaceDamageRect) const;
+ void drawContents(LayerRendererChromium*);
+ void drawReplica(LayerRendererChromium*);
+
String name() const;
void dumpSurface(TextStream&, int indent) const;
@@ -127,7 +130,7 @@
int owningLayerId() const;
- bool hasReplica();
+ bool hasReplica() const;
void resetPropertyChangedFlag() { m_surfacePropertyChanged = false; }
bool surfacePropertyChanged() const;
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.cpp (113452 => 113453)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.cpp 2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.cpp 2012-04-06 17:29:11 UTC (rev 113453)
@@ -29,15 +29,16 @@
namespace WebCore {
-PassOwnPtr<CCRenderSurfaceDrawQuad> CCRenderSurfaceDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer, const FloatRect& surfaceDamageRect)
+PassOwnPtr<CCRenderSurfaceDrawQuad> CCRenderSurfaceDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer, const FloatRect& surfaceDamageRect, bool isReplica)
{
- return adoptPtr(new CCRenderSurfaceDrawQuad(sharedQuadState, quadRect, layer, surfaceDamageRect));
+ return adoptPtr(new CCRenderSurfaceDrawQuad(sharedQuadState, quadRect, layer, surfaceDamageRect, isReplica));
}
-CCRenderSurfaceDrawQuad::CCRenderSurfaceDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer, const FloatRect& surfaceDamageRect)
+CCRenderSurfaceDrawQuad::CCRenderSurfaceDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer, const FloatRect& surfaceDamageRect, bool isReplica)
: CCDrawQuad(sharedQuadState, CCDrawQuad::RenderSurface, quadRect)
, m_layer(layer)
, m_surfaceDamageRect(surfaceDamageRect)
+ , m_isReplica(isReplica)
{
ASSERT(m_layer);
}
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.h (113452 => 113453)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.h 2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.h 2012-04-06 17:29:11 UTC (rev 113453)
@@ -36,19 +36,21 @@
class CCRenderSurfaceDrawQuad : public CCDrawQuad {
WTF_MAKE_NONCOPYABLE(CCRenderSurfaceDrawQuad);
public:
- static PassOwnPtr<CCRenderSurfaceDrawQuad> create(const CCSharedQuadState*, const IntRect&, CCLayerImpl*, const FloatRect& surfaceDamageRect);
+ static PassOwnPtr<CCRenderSurfaceDrawQuad> create(const CCSharedQuadState*, const IntRect&, CCLayerImpl*, const FloatRect& surfaceDamageRect, bool isReplica);
CCLayerImpl* layer() const { return m_layer; }
+ bool isReplica() const { return m_isReplica; }
// The surface damage rect for the target surface this quad draws into.
// FIXME: This can be removed once render surfaces get their own layer type.
const FloatRect& surfaceDamageRect() const { return m_surfaceDamageRect; }
private:
- CCRenderSurfaceDrawQuad(const CCSharedQuadState*, const IntRect&, CCLayerImpl*, const FloatRect& surfaceDamageRect);
+ CCRenderSurfaceDrawQuad(const CCSharedQuadState*, const IntRect&, CCLayerImpl*, const FloatRect& surfaceDamageRect, bool isReplica);
CCLayerImpl* m_layer;
FloatRect m_surfaceDamageRect;
+ bool m_isReplica;
};
}