Changeset 165525 in webkit


Ignore:
Timestamp:
Mar 12, 2014 9:46:26 PM (10 years ago)
Author:
ryuan.choi@samsung.com
Message:

[EFL] Revise AcceleratedCompositingEfl implementation.
https://bugs.webkit.org/show_bug.cgi?id=130072

Patch by Hyowon Kim <hw1008.kim@samsung.com> on 2014-03-12
Reviewed by Gyuyoung Kim.

This patch revises the AcceleratedCompositingEfl class implementation
similar with gtk port.
And accelerated compositing will be enabled by default on WK1 efl.

  • WebCoreSupport/AcceleratedCompositingContextEfl.cpp:

(WebCore::AcceleratedCompositingContext::AcceleratedCompositingContext):
(WebCore::AcceleratedCompositingContext::initialize):
(WebCore::AcceleratedCompositingContext::syncLayers):
(WebCore::AcceleratedCompositingContext::resize):
(WebCore::AcceleratedCompositingContext::canComposite):
(WebCore::AcceleratedCompositingContext::flushAndRenderLayers):
(WebCore::AcceleratedCompositingContext::flushPendingLayerChanges):
(WebCore::AcceleratedCompositingContext::compositeLayersToContext):
(WebCore::AcceleratedCompositingContext::attachRootGraphicsLayer):

  • WebCoreSupport/AcceleratedCompositingContextEfl.h:
  • ewk/ewk_view.cpp:

(_ewk_view_priv_new):
(_ewk_view_accelerated_compositing_cb):
(_ewk_view_accelerated_compositing_context_create_if_needed):

Location:
trunk/Source/WebKit/efl
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/efl/ChangeLog

    r165428 r165525  
     12014-03-12  Hyowon Kim  <hw1008.kim@samsung.com>
     2
     3        [EFL] Revise AcceleratedCompositingEfl implementation.
     4        https://bugs.webkit.org/show_bug.cgi?id=130072
     5
     6        Reviewed by Gyuyoung Kim.
     7
     8        This patch revises the AcceleratedCompositingEfl class implementation
     9        similar with gtk port.
     10        And accelerated compositing will be enabled by default on WK1 efl.
     11
     12        * WebCoreSupport/AcceleratedCompositingContextEfl.cpp:
     13        (WebCore::AcceleratedCompositingContext::AcceleratedCompositingContext):
     14        (WebCore::AcceleratedCompositingContext::initialize):
     15        (WebCore::AcceleratedCompositingContext::syncLayers):
     16        (WebCore::AcceleratedCompositingContext::resize):
     17        (WebCore::AcceleratedCompositingContext::canComposite):
     18        (WebCore::AcceleratedCompositingContext::flushAndRenderLayers):
     19        (WebCore::AcceleratedCompositingContext::flushPendingLayerChanges):
     20        (WebCore::AcceleratedCompositingContext::compositeLayersToContext):
     21        (WebCore::AcceleratedCompositingContext::attachRootGraphicsLayer):
     22        * WebCoreSupport/AcceleratedCompositingContextEfl.h:
     23        * ewk/ewk_view.cpp:
     24        (_ewk_view_priv_new):
     25        (_ewk_view_accelerated_compositing_cb):
     26        (_ewk_view_accelerated_compositing_context_create_if_needed):
     27
    1282014-03-10  Hyowon Kim  <hw1008.kim@samsung.com>
    229
  • trunk/Source/WebKit/efl/WebCoreSupport/AcceleratedCompositingContextEfl.cpp

    r165314 r165525  
    2323
    2424#include "AcceleratedCompositingContextEfl.h"
    25 #include "FrameView.h"
    2625#include "GraphicsLayerTextureMapper.h"
    27 #include "HostWindow.h"
    2826#include "MainFrame.h"
    2927#include "TextureMapperGL.h"
     
    3129#include "ewk_view_private.h"
    3230
     31const double compositingFrameRate = 60;
     32
    3333namespace WebCore {
    3434
    35 PassOwnPtr<AcceleratedCompositingContext> AcceleratedCompositingContext::create(HostWindow* hostWindow)
     35AcceleratedCompositingContext::AcceleratedCompositingContext(Evas_Object* ewkView, Evas_Object* compositingObject)
     36    : m_view(ewkView)
     37    , m_compositingObject(compositingObject)
     38    , m_syncTimer(this, &AcceleratedCompositingContext::syncLayers)
    3639{
    37     OwnPtr<AcceleratedCompositingContext> context = adoptPtr(new AcceleratedCompositingContext);
    38     if (!context->initialize(hostWindow))
    39         return nullptr;
    40 
    41     return context.release();
    42 }
    43 
    44 AcceleratedCompositingContext::AcceleratedCompositingContext()
    45     : m_view(0)
    46     , m_rootTextureMapperLayer(0)
    47 {
     40    ASSERT(m_view);
     41    ASSERT(m_compositingObject);
    4842}
    4943
     
    5246}
    5347
    54 bool AcceleratedCompositingContext::initialize(HostWindow* hostWindow)
     48bool AcceleratedCompositingContext::initialize()
    5549{
    56     m_view = hostWindow->platformPageClient();
    57     if (!m_view)
    58         return false;
    59 
    6050    m_evasGL = adoptPtr(evas_gl_new(evas_object_evas_get(m_view)));
    6151    if (!m_evasGL)
     
    7767}
    7868
     69void AcceleratedCompositingContext::syncLayers(Timer<AcceleratedCompositingContext>*)
     70{
     71    ewk_view_mark_for_sync(m_view);
     72}
     73
    7974bool AcceleratedCompositingContext::resize(const IntSize& size)
    8075{
     
    9186        return false;
    9287
     88    Evas_Native_Surface nativeSurface;
     89    evas_gl_native_surface_get(m_evasGL.get(), m_evasGLSurface->surface(), &nativeSurface);
     90    evas_object_image_native_surface_set(m_compositingObject, &nativeSurface);
    9391    return true;
    9492}
    9593
    96 void AcceleratedCompositingContext::syncLayersNow()
     94bool AcceleratedCompositingContext::canComposite()
    9795{
    98     if (m_rootGraphicsLayer)
    99         m_rootGraphicsLayer->flushCompositingStateForThisLayerOnly();
    100 
    101     EWKPrivate::corePage(m_view)->mainFrame().view()->flushCompositingStateIncludingSubframes();
     96    return m_rootGraphicsLayer && m_textureMapper;
    10297}
    10398
    104 void AcceleratedCompositingContext::renderLayers()
     99void AcceleratedCompositingContext::flushAndRenderLayers()
    105100{
    106     if (!m_rootGraphicsLayer)
     101    if (!canComposite())
     102        return;
     103
     104    MainFrame& frame = EWKPrivate::corePage(m_view)->mainFrame();
     105    if (!frame.contentRenderer() || !frame.view())
     106        return;
     107    frame.view()->updateLayoutAndStyleIfNeededRecursive();
     108
     109    if (!canComposite())
    107110        return;
    108111
     
    110113        return;
    111114
     115    if (!flushPendingLayerChanges())
     116        return;
     117
     118    compositeLayersToContext();
     119
     120    if (toTextureMapperLayer(m_rootGraphicsLayer.get())->descendantsOrSelfHaveRunningAnimations() && !m_syncTimer.isActive())
     121        m_syncTimer.startOneShot(1 / compositingFrameRate);
     122}
     123
     124bool AcceleratedCompositingContext::flushPendingLayerChanges()
     125{
     126    m_rootGraphicsLayer->flushCompositingStateForThisLayerOnly();
     127    return EWKPrivate::corePage(m_view)->mainFrame().view()->flushCompositingStateIncludingSubframes();
     128}
     129
     130void AcceleratedCompositingContext::compositeLayersToContext()
     131{
    112132    Evas_Coord width = 0;
    113133    Evas_Coord height = 0;
    114134    evas_object_geometry_get(m_view, 0, 0, &width, &height);
     135
    115136    evas_gl_api_get(m_evasGL.get())->glViewport(0, 0, width, height);
     137    evas_gl_api_get(m_evasGL.get())->glClear(GL_COLOR_BUFFER_BIT);
    116138
    117139    m_textureMapper->beginPainting();
    118     m_rootTextureMapperLayer->paint();
     140    m_textureMapper->beginClip(TransformationMatrix(), FloatRect(0, 0, width, height));
     141    toTextureMapperLayer(m_rootGraphicsLayer.get())->paint();
    119142    m_fpsCounter.updateFPSAndDisplay(m_textureMapper.get());
     143    m_textureMapper->endClip();
    120144    m_textureMapper->endPainting();
    121145}
     
    125149    if (!rootLayer) {
    126150        m_rootGraphicsLayer = nullptr;
    127         m_rootTextureMapperLayer = 0;
    128151        return;
    129152    }
    130153
    131     m_rootGraphicsLayer = WebCore::GraphicsLayer::create(0, 0);
    132     m_rootTextureMapperLayer = toTextureMapperLayer(m_rootGraphicsLayer.get());
     154    if (!m_textureMapper) {
     155        evas_gl_make_current(m_evasGL.get(), m_evasGLSurface->surface(), m_evasGLContext->context());
     156        m_textureMapper = TextureMapperGL::create();
     157    }
     158
     159    m_rootGraphicsLayer = GraphicsLayer::create(0, 0);
    133160    m_rootGraphicsLayer->addChild(rootLayer);
    134161    m_rootGraphicsLayer->setDrawsContent(false);
    135162    m_rootGraphicsLayer->setMasksToBounds(false);
    136     m_rootGraphicsLayer->setSize(WebCore::IntSize(1, 1));
     163    m_rootGraphicsLayer->setSize(IntSize(1, 1));
    137164
    138     m_textureMapper = TextureMapperGL::create();
    139     m_rootTextureMapperLayer->setTextureMapper(m_textureMapper.get());
     165    toTextureMapperLayer(m_rootGraphicsLayer.get())->setTextureMapper(m_textureMapper.get());
    140166
    141167    m_rootGraphicsLayer->flushCompositingStateForThisLayerOnly();
  • trunk/Source/WebKit/efl/WebCoreSupport/AcceleratedCompositingContextEfl.h

    r165428 r165525  
    2525#include "EvasGLSurface.h"
    2626#include "TextureMapperFPSCounter.h"
     27#include "Timer.h"
    2728#include <wtf/Noncopyable.h>
    2829#include <wtf/OwnPtr.h>
     
    3839    WTF_MAKE_NONCOPYABLE(AcceleratedCompositingContext);
    3940public:
    40     static PassOwnPtr<AcceleratedCompositingContext> create(HostWindow*);
    41     virtual ~AcceleratedCompositingContext();
     41    AcceleratedCompositingContext(Evas_Object* ewkView, Evas_Object* compositingObject);
     42    ~AcceleratedCompositingContext();
     43
     44    bool initialize();
    4245
    4346    bool resize(const IntSize&);
     47    void attachRootGraphicsLayer(GraphicsLayer* rootLayer);
    4448
    45     virtual void syncLayersNow();
    46     virtual void renderLayers();
    47     virtual void attachRootGraphicsLayer(GraphicsLayer* rootLayer);
     49    void flushAndRenderLayers();
     50    bool flushPendingLayerChanges();
     51    void compositeLayersToContext();
     52
     53    bool canComposite();
     54
     55    void syncLayers(Timer<AcceleratedCompositingContext>*);
    4856
    4957private:
    50     AcceleratedCompositingContext();
    51 
    52     virtual bool initialize(HostWindow*);
    53 
    5458    Evas_Object* m_view;
     59    Evas_Object* m_compositingObject;
    5560
    5661    OwnPtr<TextureMapper> m_textureMapper;
    5762    std::unique_ptr<GraphicsLayer> m_rootGraphicsLayer;
    58     TextureMapperLayer* m_rootTextureMapperLayer;
     63    Timer<AcceleratedCompositingContext> m_syncTimer;
    5964
    6065    OwnPtr<Evas_GL> m_evasGL;
  • trunk/Source/WebKit/efl/ewk/ewk_view.cpp

    r165428 r165525  
    255255    WebCore::ViewportArguments viewportArguments;
    256256    Ewk_History* history;
    257     OwnPtr<WebCore::AcceleratedCompositingContext> acceleratedCompositingContext;
     257    std::unique_ptr<WebCore::AcceleratedCompositingContext> acceleratedCompositingContext;
    258258    bool isCompositingActive;
    259259    RefPtr<Evas_Object> compositingObject;
     
    747747#endif
    748748    pageSettings.setInteractiveFormValidationEnabled(true);
    749     pageSettings.setAcceleratedCompositingEnabled(false);
     749    pageSettings.setAcceleratedCompositingEnabled(true);
    750750    char* debugVisualsEnvironment = getenv("WEBKIT_SHOW_COMPOSITING_DEBUG_VISUALS");
    751751    bool showDebugVisuals = debugVisualsEnvironment && !strcmp(debugVisualsEnvironment, "1");
     
    46314631    Ewk_View_Private_Data* priv = static_cast<Ewk_View_Private_Data*>(data);
    46324632
    4633     if (priv->isCompositingActive) {
    4634         priv->acceleratedCompositingContext->syncLayersNow();
    4635         priv->acceleratedCompositingContext->renderLayers();
    4636     }
     4633    if (priv->isCompositingActive)
     4634        priv->acceleratedCompositingContext->flushAndRenderLayers();
    46374635}
    46384636
     
    46434641
    46444642    if (!priv->acceleratedCompositingContext) {
    4645         priv->acceleratedCompositingContext = WebCore::AcceleratedCompositingContext::create(&priv->page->chrome());
    4646         if (!priv->acceleratedCompositingContext)
     4643        priv->acceleratedCompositingContext = std::make_unique<WebCore::AcceleratedCompositingContext>(ewkView, priv->compositingObject.get());
     4644        if (!priv->acceleratedCompositingContext->initialize()) {
     4645            priv->acceleratedCompositingContext = nullptr;
    46474646            return false;
     4647        }
    46484648    }
    46494649    return true;
Note: See TracChangeset for help on using the changeset viewer.