Changeset 116549 in webkit


Ignore:
Timestamp:
May 9, 2012 12:36:05 PM (12 years ago)
Author:
leviw@chromium.org
Message:

Fix performance regression for floats caused by LayoutUnit change
https://bugs.webkit.org/show_bug.cgi?id=85834

Reviewed by Ojan Vafai.

Refactoring FractionalLayout types to alleviate performance issues. Explicitly
inlining constructor and operator functions in FractionalLayoutUnit, as well as
pixelSnappedIntSize and pixelSnappedIntRect (particularly hot code paths). Also
further simplifying round and ceil functions when sub-pixel layout is not enabled.

pixelSnappedIntSize was the only function defined in FractionalLayoutSize.cpp,
so it is removed.

No new tests. No change in functionality.

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • Target.pri:
  • WebCore.gypi:
  • WebCore.vcproj/WebCore.vcproj:
  • WebCore.xcodeproj/project.pbxproj:
  • platform/FractionalLayoutUnit.h:

(WebCore::FractionalLayoutUnit::FractionalLayoutUnit):
(FractionalLayoutUnit):
(WebCore::FractionalLayoutUnit::toInt):
(WebCore::FractionalLayoutUnit::toFloat):
(WebCore::FractionalLayoutUnit::toDouble):
(WebCore::FractionalLayoutUnit::toUnsigned):
(WebCore::FractionalLayoutUnit::operator int):
(WebCore::FractionalLayoutUnit::operator unsigned):
(WebCore::FractionalLayoutUnit::operator float):
(WebCore::FractionalLayoutUnit::operator double):
(WebCore::FractionalLayoutUnit::operator bool):
(WebCore::FractionalLayoutUnit::ceil):
(WebCore::FractionalLayoutUnit::round):

  • platform/graphics/FractionalLayoutRect.cpp:

(WebCore):

  • platform/graphics/FractionalLayoutRect.h:

(WebCore::FractionalLayoutRect::pixelSnappedSize):
(WebCore::pixelSnappedIntRect):
(WebCore):

  • platform/graphics/FractionalLayoutSize.cpp: Removed.
  • platform/graphics/FractionalLayoutSize.h:

(WebCore):

  • rendering/LayoutTypes.h:

(WebCore::pixelSnappedIntSize):
(WebCore):

Location:
trunk/Source/WebCore
Files:
1 deleted
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r116487 r116549  
    11581158    platform/graphics/FontFeatureSettings.cpp
    11591159    platform/graphics/FractionalLayoutRect.cpp
    1160     platform/graphics/FractionalLayoutSize.cpp 
    11611160    platform/graphics/GeneratorGeneratedImage.cpp
    11621161    platform/graphics/GlyphPageTreeNode.cpp
  • trunk/Source/WebCore/ChangeLog

    r116545 r116549  
     12012-05-09  Levi Weintraub  <leviw@chromium.org>
     2
     3        Fix performance regression for floats caused by LayoutUnit change
     4        https://bugs.webkit.org/show_bug.cgi?id=85834
     5
     6        Reviewed by Ojan Vafai.
     7
     8        Refactoring FractionalLayout types to alleviate performance issues. Explicitly
     9        inlining constructor and operator functions in FractionalLayoutUnit, as well as
     10        pixelSnappedIntSize and pixelSnappedIntRect (particularly hot code paths). Also
     11        further simplifying round and ceil functions when sub-pixel layout is not enabled.
     12
     13        pixelSnappedIntSize was the only function defined in FractionalLayoutSize.cpp,
     14        so it is removed.
     15
     16        No new tests. No change in functionality.
     17
     18        * CMakeLists.txt:
     19        * GNUmakefile.list.am:
     20        * Target.pri:
     21        * WebCore.gypi:
     22        * WebCore.vcproj/WebCore.vcproj:
     23        * WebCore.xcodeproj/project.pbxproj:
     24        * platform/FractionalLayoutUnit.h:
     25        (WebCore::FractionalLayoutUnit::FractionalLayoutUnit):
     26        (FractionalLayoutUnit):
     27        (WebCore::FractionalLayoutUnit::toInt):
     28        (WebCore::FractionalLayoutUnit::toFloat):
     29        (WebCore::FractionalLayoutUnit::toDouble):
     30        (WebCore::FractionalLayoutUnit::toUnsigned):
     31        (WebCore::FractionalLayoutUnit::operator int):
     32        (WebCore::FractionalLayoutUnit::operator unsigned):
     33        (WebCore::FractionalLayoutUnit::operator float):
     34        (WebCore::FractionalLayoutUnit::operator double):
     35        (WebCore::FractionalLayoutUnit::operator bool):
     36        (WebCore::FractionalLayoutUnit::ceil):
     37        (WebCore::FractionalLayoutUnit::round):
     38        * platform/graphics/FractionalLayoutRect.cpp:
     39        (WebCore):
     40        * platform/graphics/FractionalLayoutRect.h:
     41        (WebCore::FractionalLayoutRect::pixelSnappedSize):
     42        (WebCore::pixelSnappedIntRect):
     43        (WebCore):
     44        * platform/graphics/FractionalLayoutSize.cpp: Removed.
     45        * platform/graphics/FractionalLayoutSize.h:
     46        (WebCore):
     47        * rendering/LayoutTypes.h:
     48        (WebCore::pixelSnappedIntSize):
     49        (WebCore):
     50
    1512012-05-09  Abhishek Arya  <inferno@chromium.org>
    252
  • trunk/Source/WebCore/GNUmakefile.list.am

    r116487 r116549  
    32533253        Source/WebCore/platform/graphics/FractionalLayoutRect.cpp \
    32543254        Source/WebCore/platform/graphics/FractionalLayoutRect.h \
    3255         Source/WebCore/platform/graphics/FractionalLayoutSize.cpp \
    32563255        Source/WebCore/platform/graphics/FractionalLayoutSize.h \
    32573256        Source/WebCore/platform/graphics/GeneratorGeneratedImage.cpp \
  • trunk/Source/WebCore/Target.pri

    r116487 r116549  
    11041104    platform/graphics/FontCache.cpp \
    11051105    platform/graphics/FractionalLayoutRect.cpp \
    1106     platform/graphics/FractionalLayoutSize.cpp \
    11071106    platform/graphics/GeneratorGeneratedImage.cpp \
    11081107    platform/graphics/Gradient.cpp \
  • trunk/Source/WebCore/WebCore.exp.in

    r116473 r116549  
    608608__ZN7WebCore19TextResourceDecoderD1Ev
    609609__ZN7WebCore19applicationIsSafariEv
    610 __ZN7WebCore19pixelSnappedIntRectERKNS_20FractionalLayoutRectE
    611610__ZN7WebCore20DictationAlternativeC1Ejjy
    612611__ZN7WebCore20DictationAlternativeC1Ev
     
    941940__ZN7WebCore7IntRect5uniteERKS0_
    942941__ZN7WebCore7IntRect9intersectERKS0_
     942__ZN7WebCore7IntRectC1ERKNS_20FractionalLayoutRectE
    943943__ZN7WebCore7IntRectC1ERKNS_9FloatRectE
    944944__ZN7WebCore7IntSizeC1ERK6CGSize
  • trunk/Source/WebCore/WebCore.gypi

    r116487 r116549  
    34043404            'platform/graphics/CrossfadeGeneratedImage.h',
    34053405            'platform/graphics/Extensions3D.h',
    3406             'platform/graphics/FractionalLayoutSize.cpp',
    34073406            'platform/graphics/FloatPoint.cpp',
    34083407            'platform/graphics/FloatPoint3D.cpp',
     
    34213420            'platform/graphics/FontPlatformData.h',
    34223421            'platform/graphics/FractionalLayoutRect.cpp',
    3423             'platform/graphics/FractionalLayoutSize.cpp',
    34243422            'platform/graphics/GeneratorGeneratedImage.cpp',
    34253423            'platform/graphics/GeneratedImage.h',
  • trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj

    r116487 r116549  
    2883028830                                </File>
    2883128831                                <File
    28832                                         RelativePath="..\platform\graphics\FractionalLayoutSize.cpp"
    28833                                         >
    28834                                 </File>
    28835                                 <File
    2883628832                                        RelativePath="..\platform\graphics\FractionalLayoutSize.h"
    2883728833                                        >
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r116487 r116549  
    296296                1449E287107D4DB400B5793F /* JSCallbackData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1449E286107D4DB400B5793F /* JSCallbackData.cpp */; };
    297297                144FCE5214EC79BC000D17A3 /* FractionalLayoutUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 144FCE5114EC79BC000D17A3 /* FractionalLayoutUnit.h */; settings = {ATTRIBUTES = (Private, ); }; };
    298                 144FCE5C14EC79E7000D17A3 /* FractionalLayoutSize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 144FCE5714EC79E7000D17A3 /* FractionalLayoutSize.cpp */; };
    299298                144FCE5D14EC79E7000D17A3 /* FractionalLayoutSize.h in Headers */ = {isa = PBXBuildFile; fileRef = 144FCE5814EC79E7000D17A3 /* FractionalLayoutSize.h */; settings = {ATTRIBUTES = (Private, ); }; };
    300299                144FCFE014EF2509000D17A3 /* FractionalLayoutRect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 144FCFDE14EF2509000D17A3 /* FractionalLayoutRect.cpp */; };
     
    71727171                144FCE5114EC79BC000D17A3 /* FractionalLayoutUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FractionalLayoutUnit.h; sourceTree = "<group>"; };
    71737172                144FCE5414EC79E7000D17A3 /* FractionalLayoutPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FractionalLayoutPoint.h; sourceTree = "<group>"; };
    7174                 144FCE5714EC79E7000D17A3 /* FractionalLayoutSize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FractionalLayoutSize.cpp; sourceTree = "<group>"; };
    71757173                144FCE5814EC79E7000D17A3 /* FractionalLayoutSize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FractionalLayoutSize.h; sourceTree = "<group>"; };
    71767174                144FCFDE14EF2509000D17A3 /* FractionalLayoutRect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FractionalLayoutRect.cpp; sourceTree = "<group>"; };
     
    1940019398                                144FCFDE14EF2509000D17A3 /* FractionalLayoutRect.cpp */,
    1940119399                                144FCFDF14EF2509000D17A3 /* FractionalLayoutRect.h */,
    19402                                 144FCE5714EC79E7000D17A3 /* FractionalLayoutSize.cpp */,
    1940319400                                144FCE5814EC79E7000D17A3 /* FractionalLayoutSize.h */,
    1940419401                                BC23F0DA0DAFF4A4009FDC91 /* GeneratedImage.h */,
     
    2600826005                                41885B9411B6FDA6003383BB /* FormSubmission.cpp in Sources */,
    2600926006                                144FCFE014EF2509000D17A3 /* FractionalLayoutRect.cpp in Sources */,
    26010                                 144FCE5C14EC79E7000D17A3 /* FractionalLayoutSize.cpp in Sources */,
    2601126007                                65BF022E0974816300C43196 /* Frame.cpp in Sources */,
    2601226008                                A7B070D2130A409C00A3763C /* FrameActionScheduler.cpp in Sources */,
  • trunk/Source/WebCore/platform/FractionalLayoutUnit.h

    r116392 r116549  
    6767    // See https://bugs.webkit.org/show_bug.cgi?id=83848 for details.
    6868   
    69     FractionalLayoutUnit() : m_value(0) { }
    70     FractionalLayoutUnit(int value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value * kFixedPointDenominator; }
    71     FractionalLayoutUnit(unsigned short value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value * kFixedPointDenominator; }
    72     FractionalLayoutUnit(unsigned int value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value * kFixedPointDenominator; }
    73     FractionalLayoutUnit(float value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value * kFixedPointDenominator; }
    74     FractionalLayoutUnit(double value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value * kFixedPointDenominator; }
    75     FractionalLayoutUnit(const FractionalLayoutUnit& value) { m_value = value.rawValue(); }
    76 
     69    inline FractionalLayoutUnit() : m_value(0) { }
     70#if ENABLE(SUBPIXEL_LAYOUT)
     71    inline FractionalLayoutUnit(int value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value * kFixedPointDenominator; }
     72    inline FractionalLayoutUnit(unsigned short value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value * kFixedPointDenominator; }
     73    inline FractionalLayoutUnit(unsigned int value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value * kFixedPointDenominator; }
     74    inline FractionalLayoutUnit(float value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value * kFixedPointDenominator; }
     75    inline FractionalLayoutUnit(double value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value * kFixedPointDenominator; }
     76#else
     77    inline FractionalLayoutUnit(int value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value; }
     78    inline FractionalLayoutUnit(unsigned short value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value; }
     79    inline FractionalLayoutUnit(unsigned int value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value; }
     80    inline FractionalLayoutUnit(float value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value; }
     81    inline FractionalLayoutUnit(double value) { REPORT_OVERFLOW(isInBounds(value)); m_value = value; }
     82#endif
     83    inline FractionalLayoutUnit(const FractionalLayoutUnit& value) { m_value = value.rawValue(); }
     84
     85#if ENABLE(SUBPIXEL_LAYOUT)
    7786    inline int toInt() const { return m_value / kFixedPointDenominator; }
    78     inline unsigned toUnsigned() const { REPORT_OVERFLOW(m_value >= 0); return toInt(); }
    7987    inline float toFloat() const { return static_cast<float>(m_value) / kFixedPointDenominator; }
    8088    inline double toDouble() const { return static_cast<double>(m_value) / kFixedPointDenominator; }
    81 
    82     operator int() const { return toInt(); }
    83     operator unsigned() const { return toUnsigned(); }
    84     operator float() const { return toFloat(); }
    85     operator double() const { return toDouble(); }
    86     operator bool() const { return m_value; }
     89#else
     90    inline int toInt() const { return m_value; }
     91    inline float toFloat() const { return static_cast<float>(m_value); }
     92    inline double toDouble() const { return static_cast<double>(m_value); }
     93#endif
     94    inline unsigned toUnsigned() const { REPORT_OVERFLOW(m_value >= 0); return toInt(); }
     95
     96    inline operator int() const { return toInt(); }
     97    inline operator unsigned() const { return toUnsigned(); }
     98    inline operator float() const { return toFloat(); }
     99    inline operator double() const { return toDouble(); }
     100    inline operator bool() const { return m_value; }
    87101
    88102    inline FractionalLayoutUnit operator++(int)
     
    112126#endif
    113127    {
     128#if ENABLE(SUBPIXEL_LAYOUT)
    114129        if (m_value > 0)
    115130            return (m_value + kFixedPointDenominator - 1) / kFixedPointDenominator;
    116131        return (m_value - kFixedPointDenominator + 1) / kFixedPointDenominator;
     132#else
     133        return m_value;
     134#endif
    117135    }
    118136    inline int round() const
    119137    {
     138#if ENABLE(SUBPIXEL_LAYOUT)
    120139        if (m_value > 0)
    121140            return (m_value + (kFixedPointDenominator / 2)) / kFixedPointDenominator;
    122141        return (m_value - (kFixedPointDenominator / 2)) / kFixedPointDenominator;
     142#else
     143        return m_value;
     144#endif
    123145    }
    124146
  • trunk/Source/WebCore/platform/graphics/FractionalLayoutRect.cpp

    r115647 r116549  
    149149}
    150150
    151 IntRect pixelSnappedIntRect(const FractionalLayoutRect& rect)
    152 {
    153     IntPoint roundedLocation = roundedIntPoint(rect.location());
    154     return IntRect(roundedLocation, IntSize((rect.x() + rect.width()).round() - roundedLocation.x(),
    155                                             (rect.y() + rect.height()).round() - roundedLocation.y()));
    156 }
    157 
    158151} // namespace WebCore
  • trunk/Source/WebCore/platform/graphics/FractionalLayoutRect.h

    r116392 r116549  
    5757
    5858    IntPoint pixelSnappedLocation() const { return roundedIntPoint(m_location); }
    59     IntSize pixelSnappedSize() const { return pixelSnappedIntSize(m_size, m_location); }
     59    IntSize pixelSnappedSize() const { return IntSize(snapSizeToPixel(m_size.width(), m_location.x()), snapSizeToPixel(m_size.height(), m_location.y())); }
    6060
    6161    void setLocation(const FractionalLayoutPoint& location) { m_location = location; }
     
    185185}
    186186
     187inline IntRect pixelSnappedIntRect(const FractionalLayoutRect& rect)
     188{
     189#if ENABLE(SUBPIXEL_LAYOUT)
     190    IntPoint roundedLocation = roundedIntPoint(rect.location());
     191    return IntRect(roundedLocation, IntSize((rect.x() + rect.width()).round() - roundedLocation.x(),
     192                                            (rect.y() + rect.height()).round() - roundedLocation.y()));
     193#else
     194    return IntRect(rect);
     195#endif
     196}
     197
    187198IntRect enclosingIntRect(const FractionalLayoutRect&);
    188199FractionalLayoutRect enclosingFractionalLayoutRect(const FloatRect&);
    189 IntRect pixelSnappedIntRect(const FractionalLayoutRect&);
    190200
    191201} // namespace WebCore
  • trunk/Source/WebCore/platform/graphics/FractionalLayoutSize.h

    r108138 r116549  
    146146}
    147147
    148 IntSize pixelSnappedIntSize(const FractionalLayoutSize&, const FractionalLayoutPoint&);
    149 
    150148} // namespace WebCore
    151149
  • trunk/Source/WebCore/rendering/LayoutTypes.h

    r116009 r116549  
    156156}
    157157
     158inline IntSize pixelSnappedIntSize(const FractionalLayoutSize& s, const FractionalLayoutPoint& p)
     159{
     160    return IntSize(snapSizeToPixel(s.width(), p.x()), snapSizeToPixel(s.height(), p.y()));
     161}
     162
    158163inline IntRect pixelSnappedIntRect(LayoutPoint location, LayoutSize size)
    159164{
Note: See TracChangeset for help on using the changeset viewer.