Changeset 64361 in webkit


Ignore:
Timestamp:
Jul 30, 2010 10:37:55 AM (14 years ago)
Author:
Adam Roben
Message:

Remove uses of CACFContextRef and CARender* from WebCore

These types are now wrapped in a WKCACFContext type exported by
WebKitSystemInterface.

Fixes <http://webkit.org/b/43244>.

Reviewed by Sam Weinig.

WebCore:

  • platform/graphics/win/WKCACFContextFlusher.cpp:

(WebCore::WKCACFContextFlusher::addContext):
(WebCore::WKCACFContextFlusher::removeContext):
(WebCore::WKCACFContextFlusher::flushAllContexts):

  • platform/graphics/win/WKCACFContextFlusher.h:

Changed to use WKCACFContext. We don't retain/release the context when
putting it into/taking it out of the set. WKCACFContext is not a
ref-counted type, so we can't retain/release it, but the
retain/release was also unnecessary as WKCACFLayerRenderer calls
removeContext before the context is destroyed.

  • platform/graphics/win/WKCACFLayer.cpp:

(WebCore::WKCACFLayer::becomeRootLayerForContext):

  • platform/graphics/win/WKCACFLayer.h:

Changed to use WKCACFContext.

  • platform/graphics/win/WKCACFLayerRenderer.cpp:

(WebCore::WKCACFLayerRenderer::didFlushContext):
(WebCore::WKCACFLayerRenderer::WKCACFLayerRenderer):
(WebCore::WKCACFLayerRenderer::~WKCACFLayerRenderer):
(WebCore::WKCACFLayerRenderer::layerTreeDidChange):
(WebCore::WKCACFLayerRenderer::createRenderer):
(WebCore::WKCACFLayerRenderer::destroyRenderer):
(WebCore::WKCACFLayerRenderer::render): Also replaced uses of
CGSRegion with WebKitSystemInterface functions/types.
(WebCore::WKCACFLayerRenderer::resetDevice):

  • platform/graphics/win/WKCACFLayerRenderer.h:

Replaced our CACFContextRef, CARenderContext, and CARenderOGLContext
with a single WKCACFContext, which wraps all three. We hold a bare
pointer to it and destroy it in our destructor.

WebKitLibraries:

Add WKCACFContext and related functions

Also added some functions used by WKCAImageQueue.

  • win/include/WebKitSystemInterface/WebKitSystemInterface.h:
  • win/lib/WebKitSystemInterface.lib:
  • win/lib/WebKitSystemInterface_debug.lib:
Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r64360 r64361  
     12010-07-30  Adam Roben  <aroben@apple.com>
     2
     3        Remove uses of CACFContextRef and CARender* from WebCore
     4
     5        These types are now wrapped in a WKCACFContext type exported by
     6        WebKitSystemInterface.
     7
     8        Fixes <http://webkit.org/b/43244>.
     9
     10        Reviewed by Sam Weinig.
     11
     12        * platform/graphics/win/WKCACFContextFlusher.cpp:
     13        (WebCore::WKCACFContextFlusher::addContext):
     14        (WebCore::WKCACFContextFlusher::removeContext):
     15        (WebCore::WKCACFContextFlusher::flushAllContexts):
     16        * platform/graphics/win/WKCACFContextFlusher.h:
     17        Changed to use WKCACFContext. We don't retain/release the context when
     18        putting it into/taking it out of the set. WKCACFContext is not a
     19        ref-counted type, so we can't retain/release it, but the
     20        retain/release was also unnecessary as WKCACFLayerRenderer calls
     21        removeContext before the context is destroyed.
     22
     23        * platform/graphics/win/WKCACFLayer.cpp:
     24        (WebCore::WKCACFLayer::becomeRootLayerForContext):
     25        * platform/graphics/win/WKCACFLayer.h:
     26        Changed to use WKCACFContext.
     27
     28        * platform/graphics/win/WKCACFLayerRenderer.cpp:
     29        (WebCore::WKCACFLayerRenderer::didFlushContext):
     30        (WebCore::WKCACFLayerRenderer::WKCACFLayerRenderer):
     31        (WebCore::WKCACFLayerRenderer::~WKCACFLayerRenderer):
     32        (WebCore::WKCACFLayerRenderer::layerTreeDidChange):
     33        (WebCore::WKCACFLayerRenderer::createRenderer):
     34        (WebCore::WKCACFLayerRenderer::destroyRenderer):
     35        (WebCore::WKCACFLayerRenderer::render): Also replaced uses of
     36        CGSRegion with WebKitSystemInterface functions/types.
     37        (WebCore::WKCACFLayerRenderer::resetDevice):
     38        * platform/graphics/win/WKCACFLayerRenderer.h:
     39        Replaced our CACFContextRef, CARenderContext, and CARenderOGLContext
     40        with a single WKCACFContext, which wraps all three. We hold a bare
     41        pointer to it and destroy it in our destructor.
     42
    1432010-07-30  Adam Roben  <aroben@apple.com>
    244
  • trunk/WebCore/platform/graphics/win/WKCACFContextFlusher.cpp

    r59897 r64361  
    3030#include "WKCACFContextFlusher.h"
    3131
     32#include <WebKitSystemInterface/WebKitSystemInterface.h>
    3233#include <wtf/StdLibExtras.h>
    33 #include <QuartzCore/CACFContext.h>
    3434
    3535namespace WebCore {
     
    4949}
    5050
    51 void WKCACFContextFlusher::addContext(CACFContextRef context)
     51void WKCACFContextFlusher::addContext(WKCACFContext* context)
    5252{
    5353    ASSERT(context);
    5454
    55     if (m_contexts.add(context).second)
    56         CFRetain(context);
     55    m_contexts.add(context);
    5756}
    5857
    59 void WKCACFContextFlusher::removeContext(CACFContextRef context)
     58void WKCACFContextFlusher::removeContext(WKCACFContext* context)
    6059{
    6160    ASSERT(context);
    6261
    63     ContextSet::iterator found = m_contexts.find(context);
    64     if (found == m_contexts.end())
    65         return;
    66 
    67     CFRelease(*found);
    68     m_contexts.remove(found);
     62    m_contexts.remove(context);
    6963}
    7064
     
    7771
    7872    ContextSet::const_iterator end = contextsToFlush.end();
    79     for (ContextSet::const_iterator it = contextsToFlush.begin(); it != end; ++it) {
    80         CACFContextRef context = *it;
    81         CACFContextFlush(context);
    82         CFRelease(context);
    83     }
     73    for (ContextSet::const_iterator it = contextsToFlush.begin(); it != end; ++it)
     74        wkCACFContextFlush(*it);
    8475}
    8576
  • trunk/WebCore/platform/graphics/win/WKCACFContextFlusher.h

    r51371 r64361  
    3333#include <wtf/HashSet.h>
    3434
    35 typedef struct _CACFContext* CACFContextRef;
     35struct WKCACFContext;
    3636
    3737namespace WebCore {
     
    4141    static WKCACFContextFlusher& shared();
    4242
    43     void addContext(CACFContextRef);
    44     void removeContext(CACFContextRef);
     43    void addContext(WKCACFContext*);
     44    void removeContext(WKCACFContext*);
    4545
    4646    void flushAllContexts();
     
    5050    ~WKCACFContextFlusher();
    5151
    52     typedef HashSet<CACFContextRef> ContextSet;
     52    typedef HashSet<WKCACFContext*> ContextSet;
    5353    ContextSet m_contexts;
    5454};
  • trunk/WebCore/platform/graphics/win/WKCACFLayer.cpp

    r64360 r64361  
    3131
    3232#include "WKCACFLayerRenderer.h"
     33#include <WebKitSystemInterface/WebKitSystemInterface.h>
     34#include <stdio.h>
     35#include <wtf/CurrentTime.h>
    3336#include <wtf/text/CString.h>
    34 
    35 #include <stdio.h>
    36 #include <QuartzCore/CACFContext.h>
    37 #include <QuartzCore/CARender.h>
    38 
    39 #ifndef NDEBUG
    40 #include <wtf/CurrentTime.h>
    41 #endif
    4237
    4338namespace WebCore {
     
    166161}
    167162
    168 void WKCACFLayer::becomeRootLayerForContext(CACFContextRef context)
    169 {
    170     CACFContextSetLayer(context, layer());
     163void WKCACFLayer::becomeRootLayerForContext(WKCACFContext* context)
     164{
     165    wkCACFContextSetLayer(context, layer());
    171166    setNeedsCommit();
    172167}
  • trunk/WebCore/platform/graphics/win/WKCACFLayer.h

    r64295 r64361  
    4343#include "TransformationMatrix.h"
    4444
     45struct WKCACFContext;
     46
    4547namespace WebCore {
    4648
     
    8183
    8284    // Makes this layer the root when the passed context is rendered
    83     void becomeRootLayerForContext(CACFContextRef);
     85    void becomeRootLayerForContext(WKCACFContext*);
    8486
    8587    static RetainPtr<CFTypeRef> cfValue(float value) { return RetainPtr<CFTypeRef>(AdoptCF, CFNumberCreate(0, kCFNumberFloat32Type, &value)); }
  • trunk/WebCore/platform/graphics/win/WKCACFLayerRenderer.cpp

    r64360 r64361  
    3737#include "WKCACFLayer.h"
    3838#include "WebCoreInstanceHandle.h"
    39 #include <CoreGraphics/CGSRegion.h>
    40 #include <QuartzCore/CACFContext.h>
    41 #include <QuartzCore/CARenderOGL.h>
     39#include <WebKitSystemInterface/WebKitSystemInterface.h>
    4240#include <wtf/HashMap.h>
    4341#include <wtf/OwnArrayPtr.h>
     
    109107};
    110108
    111 typedef HashMap<CACFContextRef, WKCACFLayerRenderer*> ContextToWindowMap;
     109typedef HashMap<WKCACFContext*, WKCACFLayerRenderer*> ContextToWindowMap;
    112110
    113111static ContextToWindowMap& windowsForContexts()
     
    207205}
    208206
    209 void WKCACFLayerRenderer::didFlushContext(CACFContextRef context)
     207void WKCACFLayerRenderer::didFlushContext(WKCACFContext* context)
    210208{
    211209    WKCACFLayerRenderer* window = windowsForContexts().get(context);
     
    229227    , m_scrollLayer(WKCACFLayer::create(WKCACFLayer::Layer))
    230228    , m_clipLayer(WKCACFLayer::create(WKCACFLayer::Layer))
    231     , m_context(AdoptCF, CACFContextCreate(0))
    232     , m_renderContext(static_cast<CARenderContext*>(CACFContextGetRenderContext(m_context.get())))
    233     , m_renderer(0)
     229    , m_context(wkCACFContextCreate())
    234230    , m_hostWindow(0)
    235231    , m_renderTimer(this, &WKCACFLayerRenderer::renderTimerFired)
     
    239235    , m_mustResetLostDeviceBeforeRendering(false)
    240236{
    241     windowsForContexts().set(m_context.get(), this);
     237    windowsForContexts().set(m_context, this);
    242238
    243239    // Under the root layer, we have a clipping layer to clip the content,
     
    268264
    269265    if (m_context)
    270         m_rootLayer->becomeRootLayerForContext(m_context.get());
     266        m_rootLayer->becomeRootLayerForContext(m_context);
    271267
    272268#ifndef NDEBUG
     
    279275{
    280276    destroyRenderer();
     277    wkCACFContextDestroy(m_context);
    281278}
    282279
     
    336333void WKCACFLayerRenderer::layerTreeDidChange()
    337334{
    338     WKCACFContextFlusher::shared().addContext(m_context.get());
     335    WKCACFContextFlusher::shared().addContext(m_context);
    339336    renderSoon();
    340337}
     
    414411    m_d3dDevice->SetTransform(D3DTS_PROJECTION, &projection);
    415412
    416     m_renderer = CARenderOGLNew(&kCARenderDX9Callbacks, m_d3dDevice.get(), 0);
     413    wkCACFContextInitializeD3DDevice(m_context, m_d3dDevice.get());
    417414
    418415    if (IsWindow(m_hostWindow))
     
    425422{
    426423    if (m_context) {
    427         CACFContextSetLayer(m_context.get(), 0);
    428         windowsForContexts().remove(m_context.get());
    429         WKCACFContextFlusher::shared().removeContext(m_context.get());
    430     }
    431 
    432     if (m_renderer)
    433         CARenderOGLDestroy(m_renderer);
    434     m_renderer = 0;
     424        windowsForContexts().remove(m_context);
     425        WKCACFContextFlusher::shared().removeContext(m_context);
     426    }
     427
    435428    m_d3dDevice = 0;
    436429    if (s_d3d)
     
    520513}
    521514
    522 void WKCACFLayerRenderer::render(const Vector<CGRect>& dirtyRects)
     515void WKCACFLayerRenderer::render(const Vector<CGRect>& windowDirtyRects)
    523516{
    524517    ASSERT(m_d3dDevice);
     
    543536
    544537    // Give the renderer some space to use. This needs to be valid until the
    545     // CARenderUpdateFinish() call below.
     538    // wkCACFContextFinishUpdate() call below.
    546539    char space[4096];
    547     CARenderUpdate* u = CARenderUpdateBegin(space, sizeof(space), t, 0, 0, &bounds);
    548     if (!u)
    549         return;
    550 
    551     CARenderContextLock(m_renderContext);
    552     CARenderUpdateAddContext(u, m_renderContext);
    553     CARenderContextUnlock(m_renderContext);
    554 
    555     for (size_t i = 0; i < dirtyRects.size(); ++i)
    556         CARenderUpdateAddRect(u, &dirtyRects[i]);
     540    if (!wkCACFContextBeginUpdate(m_context, space, sizeof(space), t, bounds, windowDirtyRects.data(), windowDirtyRects.size()))
     541        return;
    557542
    558543    HRESULT err = S_OK;
    559544    do {
    560         CGSRegionObj rgn = CARenderUpdateCopyRegion(u);
    561 
    562         if (!rgn)
     545        // FIXME: don't need to clear dirty region if layer tree is opaque.
     546
     547        WKCACFUpdateRectEnumerator* e = wkCACFContextCopyUpdateRectEnumerator(m_context);
     548        if (!e)
    563549            break;
    564550
    565         // FIXME: don't need to clear dirty region if layer tree is opaque.
    566 
    567551        Vector<D3DRECT, 64> rects;
    568         CGSRegionEnumeratorObj e = CGSRegionEnumerator(rgn);
    569         for (const CGRect* r = CGSNextRect(e); r; r = CGSNextRect(e)) {
     552        for (const CGRect* r = wkCACFUpdateRectEnumeratorNextRect(e); r; r = wkCACFUpdateRectEnumeratorNextRect(e)) {
    570553            D3DRECT rect;
    571554            rect.x1 = r->origin.x;
     
    576559            rects.append(rect);
    577560        }
    578         CGSReleaseRegionEnumerator(e);
    579         CGSReleaseRegion(rgn);
     561        wkCACFUpdateRectEnumeratorRelease(e);
    580562
    581563        if (rects.isEmpty())
     
    585567
    586568        m_d3dDevice->BeginScene();
    587         CARenderOGLRender(m_renderer, u);
     569        wkCACFContextRenderUpdate(m_context);
    588570        m_d3dDevice->EndScene();
    589571
     
    591573
    592574        if (err == D3DERR_DEVICELOST) {
    593             CARenderUpdateAddRect(u, &bounds);
     575            wkCACFContextAddUpdateRect(m_context, bounds);
    594576            if (!resetDevice(LostDevice)) {
    595577                // We can't reset the device right now. Try again soon.
     
    600582    } while (err == D3DERR_DEVICELOST);
    601583
    602     CARenderUpdateFinish(u);
     584    wkCACFContextFinishUpdate(m_context);
    603585
    604586#ifndef NDEBUG
     
    642624{
    643625    ASSERT(m_d3dDevice);
    644     ASSERT(m_renderContext);
     626    ASSERT(m_context);
    645627
    646628    HRESULT hr = m_d3dDevice->TestCooperativeLevel();
     
    661643    // We can reset the device.
    662644
    663     // We have to purge the CARenderOGLContext whenever we reset the IDirect3DDevice9 in order to
     645    // We have to release the context's D3D resrouces whenever we reset the IDirect3DDevice9 in order to
    664646    // destroy any D3DPOOL_DEFAULT resources that Core Animation has allocated (e.g., textures used
    665647    // for mask layers). See <http://msdn.microsoft.com/en-us/library/bb174425(v=VS.85).aspx>.
    666     CARenderOGLPurge(m_renderer);
     648    wkCACFContextReleaseD3DResources(m_context);
    667649
    668650    D3DPRESENT_PARAMETERS parameters = initialPresentationParameters();
  • trunk/WebCore/platform/graphics/win/WKCACFLayerRenderer.h

    r64360 r64361  
    4242
    4343interface IDirect3DDevice9;
    44 typedef struct _CACFContext* CACFContextRef;
    45 typedef struct _CARenderContext CARenderContext;
    46 typedef struct _CARenderOGLContext CARenderOGLContext;
     44struct WKCACFContext;
    4745
    4846namespace WebCore {
     
    6563
    6664    static bool acceleratedCompositingAvailable();
    67     static void didFlushContext(CACFContextRef);
     65    static void didFlushContext(WKCACFContext*);
    6866
    6967    void setScrollFrame(const IntPoint&, const IntSize&);
     
    109107    RefPtr<WKCACFLayer> m_rootChildLayer;
    110108    RefPtr<WKCACFLayer> m_clipLayer;
    111     RetainPtr<CACFContextRef> m_context;
    112     CARenderContext* m_renderContext;
    113     CARenderOGLContext* m_renderer;
     109    WKCACFContext* m_context;
    114110    HWND m_hostWindow;
    115111    Timer<WKCACFLayerRenderer> m_renderTimer;
  • trunk/WebKitLibraries/ChangeLog

    r64189 r64361  
     12010-07-30  Adam Roben  <aroben@apple.com>
     2
     3        Add WKCACFContext and related functions
     4
     5        Also added some functions used by WKCAImageQueue.
     6
     7        Fixes <http://webkit.org/b/43244>.
     8
     9        Reviewed by Sam Weinig.
     10
     11        * win/include/WebKitSystemInterface/WebKitSystemInterface.h:
     12        * win/lib/WebKitSystemInterface.lib:
     13        * win/lib/WebKitSystemInterface_debug.lib:
     14
    1152010-07-27  Kinuko Yasuda  <kinuko@chromium.org>
    216
  • trunk/WebKitLibraries/win/include/WebKitSystemInterface/WebKitSystemInterface.h

    r60115 r64361  
    2929struct CGAffineTransform;
    3030struct CGPoint;
     31struct CGRect;
    3132struct CGSize;
     33struct IDirect3DDevice9;
     34struct WKCACFContext;
     35struct WKCACFUpdateRectEnumerator;
    3236
     37typedef struct _CACFLayer* CACFLayerRef;
    3338typedef const struct __CFData* CFDataRef;
    3439typedef const struct __CFString* CFStringRef;
     40typedef double CFTimeInterval;
    3541typedef struct CGColor* CGColorRef;
    3642typedef struct CGContext* CGContextRef;
     
    3945typedef CGFontIndex CGGlyph;
    4046typedef wchar_t UChar;
     47typedef struct _CFURLCredential* CFURLCredentialRef;
    4148typedef struct _CFURLResponse* CFURLResponseRef;
    4249typedef struct OpaqueCFHTTPCookieStorage*  CFHTTPCookieStorageRef;
    4350typedef struct _CFURLRequest* CFMutableURLRequestRef;
    4451typedef const struct _CFURLRequest* CFURLRequestRef;
    45 typedef struct _CFURLCredential* CFURLCredentialRef;
    4652typedef struct __CFHTTPMessage* CFHTTPMessageRef;
    4753typedef const struct __CFNumber* CFNumberRef;
     
    5157typedef struct tagLOGFONTW LOGFONTW;
    5258typedef LOGFONTW LOGFONT;
     59typedef struct _CACFLayer *CACFLayerRef;
     60typedef struct __CVBuffer *CVBufferRef;
     61typedef CVBufferRef CVImageBufferRef;
     62typedef CVImageBufferRef CVPixelBufferRef;
     63typedef struct _CAImageQueue *CAImageQueueRef;
     64typedef unsigned long CFTypeID;
    5365
    5466void wkSetFontSmoothingLevel(int type);
     
    90102CFStringRef wkCFNetworkErrorGetLocalizedDescription(CFIndex errorCode);
    91103
     104
     105enum wkCAImageQueueFlags {
     106    kWKCAImageQueueAsync = 1U << 0,
     107    kWKCAImageQueueFill = 1U << 1,
     108    kWKCAImageQueueProtected = 1U << 2,
     109    kWKCAImageQueueUseCleanAperture = 1U << 3,
     110    kWKCAImageQueueUseAspectRatio = 1U << 4,
     111    kWKCAImageQueueLowQualityColor = 1U << 5,
     112};
     113
     114enum wkWKCAImageQueueImageType {
     115    kWKCAImageQueueNil = 1,
     116    kWKCAImageQueueSurface,
     117    kWKCAImageQueueBuffer,
     118    kWKCAImageQueueIOSurface,
     119};
     120
     121enum wkWKCAImageQueueImageFlags {
     122    kWKCAImageQueueOpaque = 1U << 0,
     123    kWKCAImageQueueFlush = 1U << 1,
     124    kWKCAImageQueueWillFlush = 1U << 2,
     125    kWKCAImageQueueFlipped = 1U << 3,
     126    kWKCAImageQueueWaitGPU = 1U << 4,
     127};
     128
     129typedef void (*wkCAImageQueueReleaseCallback)(unsigned int type, uint64_t id, void *info);
     130CAImageQueueRef wkCAImageQueueCreate(uint32_t width, uint32_t height, uint32_t capacity);
     131void wkCAImageQueueInvalidate(CAImageQueueRef iq);
     132size_t wkCAImageQueueCollect(CAImageQueueRef iq);
     133bool wkCAImageQueueInsertImage(CAImageQueueRef iq, CFTimeInterval t, unsigned int type, uint64_t id, uint32_t flags, wkCAImageQueueReleaseCallback release, void *info);
     134uint64_t wkCAImageQueueRegisterPixelBuffer(CAImageQueueRef iq, void *data, size_t data_size, size_t rowbytes, size_t width, size_t height, OSType pixel_format, CFDictionaryRef attachments, uint32_t flags);
     135void wkCAImageQueueSetFlags(CAImageQueueRef iq, uint32_t mask, uint32_t flags);
     136uint32_t wkCAImageQueueGetFlags(CAImageQueueRef iq);
     137CFTypeID wkCAImageQueueGetTypeID(void);
     138
     139WKCACFContext* wkCACFContextCreate();
     140void wkCACFContextDestroy(WKCACFContext*);
     141
     142void wkCACFContextSetLayer(WKCACFContext*, CACFLayerRef);
     143void wkCACFContextFlush(WKCACFContext*);
     144
     145void wkCACFContextInitializeD3DDevice(WKCACFContext*, IDirect3DDevice9*);
     146void wkCACFContextReleaseD3DResources(WKCACFContext*);
     147
     148bool wkCACFContextBeginUpdate(WKCACFContext*, void* buffer, size_t bufferSize, CFTimeInterval time, const CGRect& bounds, const CGRect dirtyRects[], size_t dirtyRectCount);
     149void wkCACFContextRenderUpdate(WKCACFContext*);
     150void wkCACFContextFinishUpdate(WKCACFContext*);
     151void wkCACFContextAddUpdateRect(WKCACFContext*, const CGRect&);
     152
     153WKCACFUpdateRectEnumerator* wkCACFContextCopyUpdateRectEnumerator(WKCACFContext*);
     154const CGRect* wkCACFUpdateRectEnumeratorNextRect(WKCACFUpdateRectEnumerator*);
     155void wkCACFUpdateRectEnumeratorRelease(WKCACFUpdateRectEnumerator*);
     156
    92157#endif // WebKitSystemInterface_h
Note: See TracChangeset for help on using the changeset viewer.