Changeset 95870 in webkit


Ignore:
Timestamp:
Sep 23, 2011 3:28:55 PM (13 years ago)
Author:
commit-queue@webkit.org
Message:

[Chromium] Fix CSS 3D corner anti-aliasing.
https://bugs.webkit.org/show_bug.cgi?id=68087

Patch by David Reveman <reveman@chromium.org> on 2011-09-23
Reviewed by James Robinson.

Source/WebCore:

Render sharp corners more correctly by adding bounding box
edges to anti-aliasing shaders.

Test: platform/chromium/compositing/3d-corners.html

  • platform/graphics/chromium/ShaderChromium.cpp:

(WebCore::FragmentShaderRGBATexAlphaAA::getShaderString):
(WebCore::FragmentShaderRGBATexClampAlphaAA::getShaderString):
(WebCore::FragmentShaderRGBATexClampSwizzleAlphaAA::getShaderString):
(WebCore::FragmentShaderRGBATexAlphaMaskAA::getShaderString):

  • platform/graphics/chromium/cc/CCRenderSurface.cpp:

(WebCore::CCRenderSurface::drawLayer):
(WebCore::CCRenderSurface::drawSurface):

  • platform/graphics/chromium/cc/CCRenderSurface.h:
  • platform/graphics/chromium/cc/CCTiledLayerImpl.cpp:

(WebCore::CCTiledLayerImpl::draw):
(WebCore::CCTiledLayerImpl::drawTiles):

  • platform/graphics/chromium/cc/CCTiledLayerImpl.h:

LayoutTests:

Add a test to check sharp corner rendering of CSS 3D transformed
elements.

  • platform/chromium-gpu-linux/compositing/flat-with-transformed-child-expected.checksum: Removed.
  • platform/chromium-gpu-linux/compositing/flat-with-transformed-child-expected.png: Added.
  • platform/chromium-gpu-linux/platform/chromium/compositing/3d-corners-expected.png: Added.
  • platform/chromium-gpu-linux/platform/chromium/compositing/backface-visibility-transformed-expected.png:
  • platform/chromium-gpu-linux/platform/chromium/compositing/perpendicular-layer-sorting-expected.png:
  • platform/chromium/compositing/3d-corners-expected.txt: Added.
  • platform/chromium/compositing/3d-corners.html: Added.
  • platform/chromium/test_expectations.txt:
Location:
trunk
Files:
4 added
1 deleted
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r95869 r95870  
     12011-09-23  David Reveman  <reveman@chromium.org>
     2
     3        [Chromium] Fix CSS 3D corner anti-aliasing.
     4        https://bugs.webkit.org/show_bug.cgi?id=68087
     5
     6        Reviewed by James Robinson.
     7
     8        Add a test to check sharp corner rendering of CSS 3D transformed
     9        elements.
     10
     11        * platform/chromium-gpu-linux/compositing/flat-with-transformed-child-expected.checksum: Removed.
     12        * platform/chromium-gpu-linux/compositing/flat-with-transformed-child-expected.png: Added.
     13        * platform/chromium-gpu-linux/platform/chromium/compositing/3d-corners-expected.png: Added.
     14        * platform/chromium-gpu-linux/platform/chromium/compositing/backface-visibility-transformed-expected.png:
     15        * platform/chromium-gpu-linux/platform/chromium/compositing/perpendicular-layer-sorting-expected.png:
     16        * platform/chromium/compositing/3d-corners-expected.txt: Added.
     17        * platform/chromium/compositing/3d-corners.html: Added.
     18        * platform/chromium/test_expectations.txt:
     19
    1202011-09-23  Mihai Parparita  <mihaip@chromium.org>
    221
  • trunk/LayoutTests/platform/chromium/test_expectations.txt

    r95869 r95870  
    33393339BUGWK57311 SKIP : fast/exclusions = PASS
    33403340
     3341BUGWK68087 WIN MAC GPU GPU-CG : compositing/flat-with-transformed-child.html = IMAGE
     3342BUGWK68087 WIN MAC GPU GPU-CG : platform/chromium/compositing/3d-corners.html = IMAGE
     3343BUGWK68087 WIN MAC GPU GPU-CG : platform/chromium/compositing/backface-visibility-transformed.html  = IMAGE
     3344BUGWK68087 WIN MAC GPU GPU-CG : platform/chromium/compositing/perpendicular-layer-sorting.html = IMAGE
     3345
    33413346BUGCR85755 : fast/js/exception-properties.html = TEXT
    33423347
  • trunk/Source/WebCore/ChangeLog

    r95865 r95870  
     12011-09-23  David Reveman  <reveman@chromium.org>
     2
     3        [Chromium] Fix CSS 3D corner anti-aliasing.
     4        https://bugs.webkit.org/show_bug.cgi?id=68087
     5
     6        Reviewed by James Robinson.
     7
     8        Render sharp corners more correctly by adding bounding box
     9        edges to anti-aliasing shaders.
     10
     11        Test: platform/chromium/compositing/3d-corners.html
     12
     13        * platform/graphics/chromium/ShaderChromium.cpp:
     14        (WebCore::FragmentShaderRGBATexAlphaAA::getShaderString):
     15        (WebCore::FragmentShaderRGBATexClampAlphaAA::getShaderString):
     16        (WebCore::FragmentShaderRGBATexClampSwizzleAlphaAA::getShaderString):
     17        (WebCore::FragmentShaderRGBATexAlphaMaskAA::getShaderString):
     18        * platform/graphics/chromium/cc/CCRenderSurface.cpp:
     19        (WebCore::CCRenderSurface::drawLayer):
     20        (WebCore::CCRenderSurface::drawSurface):
     21        * platform/graphics/chromium/cc/CCRenderSurface.h:
     22        * platform/graphics/chromium/cc/CCTiledLayerImpl.cpp:
     23        (WebCore::CCTiledLayerImpl::draw):
     24        (WebCore::CCTiledLayerImpl::drawTiles):
     25        * platform/graphics/chromium/cc/CCTiledLayerImpl.h:
     26
    1272011-09-23  Oliver Hunt  <oliver@apple.com>
    228
  • trunk/Source/WebCore/platform/graphics/chromium/ShaderChromium.cpp

    r94703 r95870  
    306306        uniform sampler2D s_texture;
    307307        uniform float alpha;
    308         uniform vec3 edge[4];
     308        uniform vec3 edge[8];
    309309        void main()
    310310        {
     
    315315            float a2 = clamp(dot(edge[2], pos), 0.0, 1.0);
    316316            float a3 = clamp(dot(edge[3], pos), 0.0, 1.0);
    317             gl_FragColor = texColor * alpha * min(a0, a2) * min(a1, a3);
     317            float a4 = clamp(dot(edge[4], pos), 0.0, 1.0);
     318            float a5 = clamp(dot(edge[5], pos), 0.0, 1.0);
     319            float a6 = clamp(dot(edge[6], pos), 0.0, 1.0);
     320            float a7 = clamp(dot(edge[7], pos), 0.0, 1.0);
     321            gl_FragColor = texColor * alpha * min(min(a0, a2) * min(a1, a3), min(a4, a6) * min(a5, a7));
    318322        }
    319323    );
     
    346350        uniform float alpha;
    347351        uniform vec4 fragmentTexTransform;
    348         uniform vec3 edge[4];
     352        uniform vec3 edge[8];
    349353        void main()
    350354        {
     
    356360            float a2 = clamp(dot(edge[2], pos), 0.0, 1.0);
    357361            float a3 = clamp(dot(edge[3], pos), 0.0, 1.0);
    358             gl_FragColor = texColor * alpha * min(a0, a2) * min(a1, a3);
     362            float a4 = clamp(dot(edge[4], pos), 0.0, 1.0);
     363            float a5 = clamp(dot(edge[5], pos), 0.0, 1.0);
     364            float a6 = clamp(dot(edge[6], pos), 0.0, 1.0);
     365            float a7 = clamp(dot(edge[7], pos), 0.0, 1.0);
     366            gl_FragColor = texColor * alpha * min(min(a0, a2) * min(a1, a3), min(a4, a6) * min(a5, a7));
    359367        }
    360368    );
     
    369377        uniform float alpha;
    370378        uniform vec4 fragmentTexTransform;
    371         uniform vec3 edge[4];
     379        uniform vec3 edge[8];
    372380        void main()
    373381        {
     
    379387            float a2 = clamp(dot(edge[2], pos), 0.0, 1.0);
    380388            float a3 = clamp(dot(edge[3], pos), 0.0, 1.0);
    381             gl_FragColor = vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha * min(a0, a2) * min(a1, a3);
     389            float a4 = clamp(dot(edge[4], pos), 0.0, 1.0);
     390            float a5 = clamp(dot(edge[5], pos), 0.0, 1.0);
     391            float a6 = clamp(dot(edge[6], pos), 0.0, 1.0);
     392            float a7 = clamp(dot(edge[7], pos), 0.0, 1.0);
     393            gl_FragColor = vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha * min(min(a0, a2) * min(a1, a3), min(a4, a6) * min(a5, a7));
    382394        }
    383395    );
     
    441453        uniform sampler2D s_mask;
    442454        uniform float alpha;
    443         uniform vec3 edge[4];
     455        uniform vec3 edge[8];
    444456        void main()
    445457        {
     
    451463            float a2 = clamp(dot(edge[2], pos), 0.0, 1.0);
    452464            float a3 = clamp(dot(edge[3], pos), 0.0, 1.0);
    453             gl_FragColor = vec4(texColor.x, texColor.y, texColor.z, texColor.w) * alpha * maskColor.w * min(a0, a2) * min(a1, a3);
     465            float a4 = clamp(dot(edge[4], pos), 0.0, 1.0);
     466            float a5 = clamp(dot(edge[5], pos), 0.0, 1.0);
     467            float a6 = clamp(dot(edge[6], pos), 0.0, 1.0);
     468            float a7 = clamp(dot(edge[7], pos), 0.0, 1.0);
     469            gl_FragColor = vec4(texColor.x, texColor.y, texColor.z, texColor.w) * alpha * maskColor.w * min(min(a0, a2) * min(a1, a3), min(a4, a6) * min(a5, a7));
    454470        }
    455471    );
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp

    r95341 r95870  
    138138
    139139    FloatQuad quad = deviceMatrix.mapQuad(layerRenderer->sharedGeometryQuad());
     140    CCLayerQuad deviceRect = CCLayerQuad(FloatQuad(quad.boundingBox()));
    140141    CCLayerQuad layerQuad = CCLayerQuad(quad);
    141142
     
    148149#endif
    149150
    150     if (useAA)
     151    if (useAA) {
     152        deviceRect.inflateAntiAliasingDistance();
    151153        layerQuad.inflateAntiAliasingDistance();
     154    }
    152155
    153156    bool useMask = false;
     
    159162        if (useAA) {
    160163            const MaskProgramAA* program = layerRenderer->renderSurfaceMaskProgramAA();
    161             drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, layerQuad, program, program->fragmentShader().maskSamplerLocation(), program->vertexShader().pointLocation(), program->fragmentShader().edgeLocation());
     164            drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, deviceRect, layerQuad, program, program->fragmentShader().maskSamplerLocation(), program->vertexShader().pointLocation(), program->fragmentShader().edgeLocation());
    162165        } else {
    163166            const MaskProgram* program = layerRenderer->renderSurfaceMaskProgram();
    164             drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, layerQuad, program, program->fragmentShader().maskSamplerLocation(), -1, -1);
     167            drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, deviceRect, layerQuad, program, program->fragmentShader().maskSamplerLocation(), -1, -1);
    165168        }
    166169    } else {
    167170        if (useAA) {
    168171            const ProgramAA* program = layerRenderer->renderSurfaceProgramAA();
    169             drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, layerQuad, program, -1, program->vertexShader().pointLocation(), program->fragmentShader().edgeLocation());
     172            drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, deviceRect, layerQuad, program, -1, program->vertexShader().pointLocation(), program->fragmentShader().edgeLocation());
    170173        } else {
    171174            const Program* program = layerRenderer->renderSurfaceProgram();
    172             drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, layerQuad, program, -1, -1, -1);
     175            drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, deviceRect, layerQuad, program, -1, -1, -1);
    173176        }
    174177    }
     
    176179
    177180template <class T>
    178 void CCRenderSurface::drawSurface(LayerRendererChromium* layerRenderer, CCLayerImpl* maskLayer, const TransformationMatrix& drawTransform, const TransformationMatrix& deviceTransform, const CCLayerQuad& layerQuad, const T* program, int shaderMaskSamplerLocation, int shaderQuadLocation, int shaderEdgeLocation)
     181void CCRenderSurface::drawSurface(LayerRendererChromium* layerRenderer, CCLayerImpl* maskLayer, const TransformationMatrix& drawTransform, const TransformationMatrix& deviceTransform, const CCLayerQuad& deviceRect, const CCLayerQuad& layerQuad, const T* program, int shaderMaskSamplerLocation, int shaderQuadLocation, int shaderEdgeLocation)
    179182{
    180183    GraphicsContext3D* context3D = layerRenderer->context();
     
    195198
    196199    if (shaderEdgeLocation != -1) {
    197         float edge[12];
     200        float edge[24];
    198201        layerQuad.toFloatArray(edge);
    199         GLC(context3D, context3D->uniform3fv(shaderEdgeLocation, edge, 4));
     202        deviceRect.toFloatArray(&edge[12]);
     203        GLC(context3D, context3D->uniform3fv(shaderEdgeLocation, edge, 8));
    200204    }
    201205
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.h

    r95135 r95870  
    101101    void drawLayer(LayerRendererChromium*, CCLayerImpl*, const TransformationMatrix&);
    102102    template <class T>
    103     void drawSurface(LayerRendererChromium*, CCLayerImpl*, const TransformationMatrix& drawTransform, const TransformationMatrix& deviceTransform, const CCLayerQuad&, const T* program, int shaderMaskSamplerLocation, int shaderQuadLocation, int shaderEdgeLocation);
     103    void drawSurface(LayerRendererChromium*, CCLayerImpl*, const TransformationMatrix& drawTransform, const TransformationMatrix& deviceTransform, const CCLayerQuad& deviceRect, const CCLayerQuad&, const T* program, int shaderMaskSamplerLocation, int shaderQuadLocation, int shaderEdgeLocation);
    104104
    105105    CCLayerImpl* m_owningLayer;
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCTiledLayerImpl.cpp

    r95348 r95870  
    107107
    108108    FloatQuad quad = deviceMatrix.mapQuad(FloatQuad(layerRect));
     109    CCLayerQuad deviceRect = CCLayerQuad(FloatQuad(quad.boundingBox()));
    109110    CCLayerQuad layerQuad = CCLayerQuad(quad);
    110111
     
    117118#endif
    118119
    119     if (useAA)
     120    if (useAA) {
     121        deviceRect.inflateAntiAliasingDistance();
    120122        layerQuad.inflateAntiAliasingDistance();
     123    }
    121124
    122125    GraphicsContext3D* context = layerRenderer->context();
     
    130133        if (useAA) {
    131134            const ProgramAA* program = layerRenderer->tilerProgramAA();
    132             drawTiles(layerRenderer, layerRect, m_tilingTransform, deviceMatrix, layerQuad, drawOpacity(), program, program->fragmentShader().fragmentTexTransformLocation(), program->fragmentShader().edgeLocation());
     135            drawTiles(layerRenderer, layerRect, m_tilingTransform, deviceMatrix, deviceRect, layerQuad, drawOpacity(), program, program->fragmentShader().fragmentTexTransformLocation(), program->fragmentShader().edgeLocation());
    133136        } else {
    134137            const Program* program = layerRenderer->tilerProgram();
    135             drawTiles(layerRenderer, layerRect, m_tilingTransform, deviceMatrix, layerQuad, drawOpacity(), program, -1, -1);
     138            drawTiles(layerRenderer, layerRect, m_tilingTransform, deviceMatrix, deviceRect, layerQuad, drawOpacity(), program, -1, -1);
    136139        }
    137140        break;
     
    139142        if (useAA) {
    140143            const ProgramSwizzleAA* program = layerRenderer->tilerProgramSwizzleAA();
    141             drawTiles(layerRenderer, layerRect, m_tilingTransform, deviceMatrix, layerQuad, drawOpacity(), program, program->fragmentShader().fragmentTexTransformLocation(), program->fragmentShader().edgeLocation());
     144            drawTiles(layerRenderer, layerRect, m_tilingTransform, deviceMatrix, deviceRect, layerQuad, drawOpacity(), program, program->fragmentShader().fragmentTexTransformLocation(), program->fragmentShader().edgeLocation());
    142145        } else {
    143146            const ProgramSwizzle* program = layerRenderer->tilerProgramSwizzle();
    144             drawTiles(layerRenderer, layerRect, m_tilingTransform, deviceMatrix, layerQuad, drawOpacity(), program, -1, -1);
     147            drawTiles(layerRenderer, layerRect, m_tilingTransform, deviceMatrix, deviceRect, layerQuad, drawOpacity(), program, -1, -1);
    145148        }
    146149        break;
     
    173176
    174177template <class T>
    175 void CCTiledLayerImpl::drawTiles(LayerRendererChromium* layerRenderer, const IntRect& contentRect, const TransformationMatrix& globalTransform, const TransformationMatrix& deviceTransform, const CCLayerQuad& contentQuad, float opacity, const T* program, int fragmentTexTransformLocation, int edgeLocation)
     178void CCTiledLayerImpl::drawTiles(LayerRendererChromium* layerRenderer, const IntRect& contentRect, const TransformationMatrix& globalTransform, const TransformationMatrix& deviceTransform, const CCLayerQuad& deviceRect, const CCLayerQuad& contentQuad, float opacity, const T* program, int fragmentTexTransformLocation, int edgeLocation)
    176179{
    177180    GraphicsContext3D* context = layerRenderer->context();
     
    183186
    184187    if (edgeLocation != -1) {
    185         float edge[12];
     188        float edge[24];
    186189        contentQuad.toFloatArray(edge);
    187         GLC(context, context->uniform3fv(edgeLocation, edge, 4));
     190        deviceRect.toFloatArray(&edge[12]);
     191        GLC(context, context->uniform3fv(edgeLocation, edge, 8));
    188192    }
    189193
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCTiledLayerImpl.h

    r95135 r95870  
    7878    // Draw all tiles that intersect with contentRect.
    7979    template <class T>
    80     void drawTiles(LayerRendererChromium*, const IntRect& contentRect, const TransformationMatrix& globalTransform, const TransformationMatrix& deviceTransform, const CCLayerQuad&, float opacity, const T* program, int fragmentTexTransformLocation, int edgeLocation);
     80    void drawTiles(LayerRendererChromium*, const IntRect& contentRect, const TransformationMatrix& globalTransform, const TransformationMatrix& deviceTransform, const CCLayerQuad& deviceRect, const CCLayerQuad& contentQuad, float opacity, const T* program, int fragmentTexTransformLocation, int edgeLocation);
    8181
    8282    TransformationMatrix m_tilingTransform;
Note: See TracChangeset for help on using the changeset viewer.