Skip to content

Commit

Permalink
Remove CSS3DTransformInteroperabilityEnabled preference
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=271124

Reviewed by Matt Woodrow.

It's been stable for at least a year. The one unfortunate side effect
of this patch is that it more clearly highlights that some underlying
code continues to branch. Arguably those booleans should be turned into
clearly named enum classes.

* Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml:
* Source/WebCore/dom/ViewTransition.cpp:
(WebCore::ViewTransition::copyElementBaseProperties):
* Source/WebCore/rendering/LayerOverlapMap.cpp:
(WebCore::LayerOverlapMap::LayerOverlapMap):
* Source/WebCore/rendering/RenderLayer.cpp:
(WebCore::RenderLayer::createLocalTransformState const):
(WebCore::RenderLayer::hitTestLayer):
(WebCore::RenderLayer::hitTestList):
(WebCore::isHitCandidateLegacy): Deleted.
* Source/WebCore/rendering/RenderLayer.h:
* Source/WebCore/rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::useCSS3DTransformInteroperability const): Deleted.
* Source/WebCore/rendering/RenderLayerBacking.h:
* Source/WebCore/rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::layerStyleChanged):
* Source/WebCore/rendering/RenderObject.cpp:
(WebCore::RenderObject::localToAbsolute const):
(WebCore::RenderObject::absoluteToLocal const):
(WebCore::RenderObject::absoluteToLocalQuad const):
(WebCore::RenderObject::shouldUseTransformFromContainer const):
(WebCore::RenderObject::getTransformFromContainer const):
(WebCore::RenderObject::pushOntoTransformState const):
(WebCore::RenderObject::pushOntoGeometryMap const):
(WebCore::RenderObject::localToContainerQuad const):
(WebCore::RenderObject::localToContainerPoint const):
(WebCore::RenderObject::participatesInPreserve3D const):
* Source/WebCore/rendering/RenderObject.h:
* Source/WebCore/rendering/RenderView.cpp:
(WebCore::RenderView::mapLocalToContainer const):
(WebCore::RenderView::pushMappingToContainer const):
(WebCore::RenderView::mapAbsoluteToLocalPoint const):
* Source/WebCore/rendering/svg/RenderSVGRoot.cpp:
(WebCore::RenderSVGRoot::mapLocalToContainer const):
* Source/WebCore/rendering/svg/SVGLayerTransformComputation.h:
(WebCore::SVGLayerTransformComputation::computeAccumulatedTransform const):
* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeHost.h:
* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeHost.mm:
(WebKit::RemoteLayerTreeHost::createLayer):
(WebKit::RemoteLayerTreeHost::css3DTransformInteroperabilityEnabled const): Deleted.

Canonical link: https://commits.webkit.org/276257@main
  • Loading branch information
annevk committed Mar 18, 2024
1 parent 9bcc76d commit 670a1d8
Show file tree
Hide file tree
Showing 15 changed files with 50 additions and 138 deletions.
14 changes: 0 additions & 14 deletions Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -889,20 +889,6 @@ CSS3DTransformBackfaceVisibilityInteroperabilityEnabled:
WebCore:
default: false

CSS3DTransformInteroperabilityEnabled:
type: bool
status: stable
category: css
humanReadableName: "CSS 3D Transform Interoperability"
humanReadableDescription: "Enable 3D transform behavior that is specification-compliant but backwards incompatible"
defaultValue:
WebKitLegacy:
default: true
WebKit:
default: true
WebCore:
default: true

CSSCascadeLayersEnabled:
type: bool
status: stable
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/dom/ViewTransition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -606,7 +606,7 @@ Ref<MutableStyleProperties> ViewTransition::copyElementBaseProperties(Element& e
break;
LayoutSize containerOffset = renderer->offsetFromContainer(*container, LayoutPoint());
TransformationMatrix localTransform;
renderer->getTransformFromContainer(container, containerOffset, localTransform);
renderer->getTransformFromContainer(containerOffset, localTransform);
transform = localTransform * transform;
renderer = container;
}
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/rendering/LayerOverlapMap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ String OverlapMapContainer::dump(unsigned indent) const
}

LayerOverlapMap::LayerOverlapMap(const RenderLayer& rootLayer)
: m_geometryMap(UseTransforms, rootLayer.renderer().settings().css3DTransformInteroperabilityEnabled())
: m_geometryMap(UseTransforms, true)
, m_rootLayer(rootLayer)
{
// Begin assuming the root layer will be composited so that there is
Expand Down
92 changes: 19 additions & 73 deletions Source/WebCore/rendering/RenderLayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4103,7 +4103,7 @@ Ref<HitTestingTransformState> RenderLayer::createLocalTransformState(RenderLayer
RenderObject* containerRenderer = containerLayer ? &containerLayer->renderer() : nullptr;
if (renderer().shouldUseTransformFromContainer(containerRenderer)) {
TransformationMatrix containerTransform;
renderer().getTransformFromContainer(containerRenderer, offset, containerTransform);
renderer().getTransformFromContainer(offset, containerTransform);
transformState->applyTransform(containerTransform, HitTestingTransformState::AccumulateTransform);
} else {
transformState->translate(offset.width(), offset.height(), HitTestingTransformState::AccumulateTransform);
Expand All @@ -4121,30 +4121,6 @@ static bool parentLayerIsDOMParent(const RenderLayer& layer)
return layer.parent()->renderer().element() == layer.renderer().element()->parentElementInComposedTree();
}

static bool isHitCandidateLegacy(const RenderLayer* hitLayer, bool canDepthSort, double* zOffset, const HitTestingTransformState* transformState)
{
if (!hitLayer)
return false;

// The hit layer is depth-sorting with other layers, so just say that it was hit.
if (canDepthSort)
return true;

// We need to look at z-depth to decide if this layer was hit.
if (zOffset) {
ASSERT(transformState);
// This is actually computing our z, but that's OK because the hitLayer is coplanar with us.
double childZOffset = computeZOffset(*transformState);
if (childZOffset > *zOffset) {
*zOffset = childZOffset;
return true;
}
return false;
}

return true;
}

bool RenderLayer::participatesInPreserve3D() const
{
return parentLayerIsDOMParent(*this) && parent()->preserves3D() && (transform() || renderer().style().backfaceVisibility() == BackfaceVisibility::Hidden || preserves3D());
Expand Down Expand Up @@ -4220,32 +4196,18 @@ RenderLayer::HitLayer RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLa
return { nullptr, 0 };
}

bool using3DTransformsInterop = renderer().settings().css3DTransformInteroperabilityEnabled();
RefPtr<HitTestingTransformState> unflattenedTransformState = localTransformState;
if (!using3DTransformsInterop && localTransformState && !preserves3D()) {
// Keep a copy of the pre-flattening state, for computing z-offsets for the container
unflattenedTransformState = HitTestingTransformState::create(*localTransformState);
// This layer is flattening, so flatten the state passed to descendants.
localTransformState->flatten();
}

// The following are used for keeping track of the z-depth of the hit point of 3d-transformed
// descendants.
double localZOffset = -std::numeric_limits<double>::infinity();
double* zOffsetForDescendantsPtr = nullptr;
double* zOffsetForContentsPtr = nullptr;

bool depthSortDescendants = false;
if (preserves3D()) {
depthSortDescendants = true;
// Our layers can depth-test with our container, so share the z depth pointer with the container, if it passed one down.
zOffsetForDescendantsPtr = zOffset ? zOffset : &localZOffset;
zOffsetForContentsPtr = zOffset ? zOffset : &localZOffset;
} else if (zOffset) {
} else if (zOffset)
zOffsetForDescendantsPtr = nullptr;
// Container needs us to give back a z offset for the hit layer.
zOffsetForContentsPtr = zOffset;
}

double selfZOffset = localTransformState ? computeZOffset(*localTransformState) : 0;

Expand All @@ -4261,27 +4223,24 @@ RenderLayer::HitLayer RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLa
return { nullptr };

// Begin by walking our list of positive layers from highest z-index down to the lowest z-index.
auto hitLayer = hitTestList(positiveZOrderLayers(), rootLayer, request, result, hitTestRect, hitTestLocation, localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants);
auto hitLayer = hitTestList(positiveZOrderLayers(), rootLayer, request, result, hitTestRect, hitTestLocation, localTransformState.get(), zOffsetForDescendantsPtr, depthSortDescendants);
if (hitLayer.layer) {
if (!depthSortDescendants)
return hitLayer;
if (using3DTransformsInterop) {
if (hitLayer.zOffset > candidateLayer.zOffset)
candidateLayer = hitLayer;
} else
if (hitLayer.zOffset > candidateLayer.zOffset)
candidateLayer = hitLayer;
}

// Now check our overflow objects.
{
HitTestResult tempResult(result.hitTestLocation());
hitLayer = hitTestList(normalFlowLayers(), rootLayer, request, tempResult, hitTestRect, hitTestLocation, localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants);
hitLayer = hitTestList(normalFlowLayers(), rootLayer, request, tempResult, hitTestRect, hitTestLocation, localTransformState.get(), zOffsetForDescendantsPtr, depthSortDescendants);

if (request.resultIsElementList())
result.append(tempResult, request);

if (hitLayer.layer) {
if (!depthSortDescendants || !using3DTransformsInterop || hitLayer.zOffset > candidateLayer.zOffset) {
if (!depthSortDescendants || hitLayer.zOffset > candidateLayer.zOffset) {
if (!request.resultIsElementList())
result = tempResult;

Expand All @@ -4304,10 +4263,7 @@ RenderLayer::HitLayer RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLa
}

auto isHitCandidate = [&]() {
if (using3DTransformsInterop)
return !depthSortDescendants || selfZOffset > candidateLayer.zOffset;

return isHitCandidateLegacy(this, false, zOffsetForContentsPtr, unflattenedTransformState.get());
return !depthSortDescendants || selfZOffset > candidateLayer.zOffset;
};

// Next we want to see if the mouse pos is inside the child RenderObjects of the layer. Check
Expand All @@ -4334,13 +4290,13 @@ RenderLayer::HitLayer RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLa
// Now check our negative z-index children.
{
HitTestResult tempResult(result.hitTestLocation());
hitLayer = hitTestList(negativeZOrderLayers(), rootLayer, request, tempResult, hitTestRect, hitTestLocation, localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants);
hitLayer = hitTestList(negativeZOrderLayers(), rootLayer, request, tempResult, hitTestRect, hitTestLocation, localTransformState.get(), zOffsetForDescendantsPtr, depthSortDescendants);

if (request.resultIsElementList())
result.append(tempResult, request);

if (hitLayer.layer) {
if (!depthSortDescendants || !using3DTransformsInterop || hitLayer.zOffset > candidateLayer.zOffset) {
if (!depthSortDescendants || hitLayer.zOffset > candidateLayer.zOffset) {
if (!request.resultIsElementList())
result = tempResult;

Expand All @@ -4353,7 +4309,7 @@ RenderLayer::HitLayer RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLa
}

// If we found a layer, return. Child layers, and foreground always render in front of background.
if (candidateLayer.layer && (!depthSortDescendants || !using3DTransformsInterop))
if (candidateLayer.layer && !depthSortDescendants)
return candidateLayer;

if (isSelfPaintingLayer()) {
Expand Down Expand Up @@ -4491,7 +4447,7 @@ bool RenderLayer::hitTestContents(const HitTestRequest& request, HitTestResult&
return true;
}

RenderLayer::HitLayer RenderLayer::hitTestList(LayerList layerIterator, RenderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result, const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffsetForDescendants, double* zOffset, const HitTestingTransformState* unflattenedTransformState, bool depthSortDescendants)
RenderLayer::HitLayer RenderLayer::hitTestList(LayerList layerIterator, RenderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result, const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffsetForDescendants, bool depthSortDescendants)
{
if (layerIterator.begin() == layerIterator.end())
return { nullptr };
Expand All @@ -4509,7 +4465,7 @@ RenderLayer::HitLayer RenderLayer::hitTestList(LayerList layerIterator, RenderLa
// If we're about to cross a flattening boundary, then pass the (lazily-initialized)
// flattened transfomState to the child layer.
auto* transformStateForChild = transformState;
if (transformState && !childLayer->participatesInPreserve3D() && renderer().settings().css3DTransformInteroperabilityEnabled()) {
if (transformState && !childLayer->participatesInPreserve3D()) {
if (!flattenedTransformState) {
flattenedTransformState = HitTestingTransformState::create(*transformState);
flattenedTransformState->flatten();
Expand All @@ -4527,23 +4483,13 @@ RenderLayer::HitLayer RenderLayer::hitTestList(LayerList layerIterator, RenderLa
if (request.resultIsElementList())
result.append(tempResult, request);

if (renderer().settings().css3DTransformInteroperabilityEnabled()) {
if (hitLayer.layer) {
// If the child was flattened, then override the returned depth with the depth of the
// plane we flattened into (ourselves) instead.
if (transformStateForChild == flattenedTransformState)
hitLayer.zOffset = unflattenedZOffset;

if (!depthSortDescendants || hitLayer.zOffset > resultLayer.zOffset) {
resultLayer = hitLayer;
if (!request.resultIsElementList())
result = tempResult;
if (!depthSortDescendants)
break;
}
}
} else {
if (isHitCandidateLegacy(hitLayer.layer, depthSortDescendants, zOffset, unflattenedTransformState)) {
if (hitLayer.layer) {
// If the child was flattened, then override the returned depth with the depth of the
// plane we flattened into (ourselves) instead.
if (transformStateForChild == flattenedTransformState)
hitLayer.zOffset = unflattenedZOffset;

if (!depthSortDescendants || hitLayer.zOffset > resultLayer.zOffset) {
resultLayer = hitLayer;
if (!request.resultIsElementList())
result = tempResult;
Expand Down
3 changes: 1 addition & 2 deletions Source/WebCore/rendering/RenderLayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -1137,8 +1137,7 @@ class RenderLayer : public CanMakeSingleThreadWeakPtr<RenderLayer>, public CanMa
const LayoutSize& translationOffset = LayoutSize());
HitLayer hitTestList(LayerList, RenderLayer* rootLayer, const HitTestRequest&, HitTestResult&,
const LayoutRect& hitTestRect, const HitTestLocation&,
const HitTestingTransformState*, double* zOffsetForDescendants, double* zOffset,
const HitTestingTransformState* unflattenedTransformState, bool depthSortDescendants);
const HitTestingTransformState*, double* zOffsetForDescendants, bool depthSortDescendants);

Ref<HitTestingTransformState> createLocalTransformState(RenderLayer* rootLayer, RenderLayer* containerLayer,
const LayoutRect& hitTestRect, const HitTestLocation&,
Expand Down
5 changes: 0 additions & 5 deletions Source/WebCore/rendering/RenderLayerBacking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3956,11 +3956,6 @@ bool RenderLayerBacking::useGiantTiles() const
return renderer().settings().useGiantTiles();
}

bool RenderLayerBacking::useCSS3DTransformInteroperability() const
{
return renderer().settings().css3DTransformInteroperabilityEnabled();
}

void RenderLayerBacking::logFilledVisibleFreshTile(unsigned blankPixelCount)
{
if (auto* loggingClient = renderer().page().performanceLoggingClient())
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/rendering/RenderLayerBacking.h
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ class RenderLayerBacking final : public GraphicsLayerClient {
bool shouldAggressivelyRetainTiles(const GraphicsLayer*) const override;
bool shouldTemporarilyRetainTileCohorts(const GraphicsLayer*) const override;
bool useGiantTiles() const override;
bool useCSS3DTransformInteroperability() const override;
bool useCSS3DTransformInteroperability() const override { return true; }
void logFilledVisibleFreshTile(unsigned) override;
bool needsPixelAligment() const override { return !m_isMainFrameRenderViewLayer; }

Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/rendering/RenderLayerCompositor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1979,7 +1979,7 @@ void RenderLayerCompositor::layerStyleChanged(StyleDifference diff, RenderLayer&
layer.setNeedsPostLayoutCompositingUpdate();
layer.setNeedsCompositingGeometryUpdate();
}
if (m_renderView.settings().css3DTransformInteroperabilityEnabled() && oldStyle && recompositeChangeRequiresChildrenGeometryUpdate(*oldStyle, newStyle))
if (oldStyle && recompositeChangeRequiresChildrenGeometryUpdate(*oldStyle, newStyle))
layer.setChildrenNeedCompositingGeometryUpdate();
}
}
Expand Down
Loading

0 comments on commit 670a1d8

Please sign in to comment.