Changeset 95658 in webkit


Ignore:
Timestamp:
Sep 21, 2011 12:11:40 PM (13 years ago)
Author:
senorblanco@chromium.org
Message:

[chromium] Optimize ImageBuffer constructor when accelerated
https://bugs.webkit.org/show_bug.cgi?id=68501

If the accelerated rendering mode is passed in to ImageBuffer, instead
of creating a bitmap PlatformCanvas and subsequently replacing its
device with an SkGpuDevice, create an SkCanvas and SkGpuDevice first,
and fall back to raster creation only failure. This saves on system
RAM for the backing store (and possibly GDI resources).

Reviewed by James Robinson.

Covered by existing tests.

  • platform/graphics/gpu/SharedGraphicsContext3D.cpp:

(WebCore::SharedGraphicsContext3D::get):

  • platform/graphics/gpu/SharedGraphicsContext3D.h:

Rename "SharedGraphicsContext3D::create()" to "get()" to more
accurately reflect its function.

  • platform/graphics/skia/ImageBufferSkia.cpp:

(WebCore::createAcceleratedCanvas):
Refactor creation of accelerated ImageBuffer.
(WebCore::ImageBuffer::ImageBuffer):
Attempt creation of accelerated ImageBuffer first, and only fall back
to bitmap-backed canvas creation if it fails.

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r95655 r95658  
     12011-09-21  Stephen White  <senorblanco@chromium.org>
     2
     3        [chromium] Optimize ImageBuffer constructor when accelerated
     4        https://bugs.webkit.org/show_bug.cgi?id=68501
     5
     6        If the accelerated rendering mode is passed in to ImageBuffer, instead
     7        of creating a bitmap PlatformCanvas and subsequently replacing its
     8        device with an SkGpuDevice, create an SkCanvas and SkGpuDevice first,
     9        and fall back to raster creation only failure.  This saves on system
     10        RAM for the backing store (and possibly GDI resources).
     11
     12        Reviewed by James Robinson.
     13
     14        Covered by existing tests.
     15
     16        * platform/graphics/gpu/SharedGraphicsContext3D.cpp:
     17        (WebCore::SharedGraphicsContext3D::get):
     18        * platform/graphics/gpu/SharedGraphicsContext3D.h:
     19        Rename "SharedGraphicsContext3D::create()" to "get()" to more
     20        accurately reflect its function.
     21        * platform/graphics/skia/ImageBufferSkia.cpp:
     22        (WebCore::createAcceleratedCanvas):
     23        Refactor creation of accelerated ImageBuffer.
     24        (WebCore::ImageBuffer::ImageBuffer):
     25        Attempt creation of accelerated ImageBuffer first, and only fall back
     26        to bitmap-backed canvas creation if it fails.
     27
    1282011-09-21  Dan Bernstein  <mitz@apple.com>
    229
  • trunk/Source/WebCore/platform/graphics/gpu/SharedGraphicsContext3D.cpp

    r93625 r95658  
    3131namespace WebCore {
    3232
    33 GraphicsContext3D* SharedGraphicsContext3D::create(HostWindow* window)
     33GraphicsContext3D* SharedGraphicsContext3D::get()
    3434{
    3535    GraphicsContext3D::Attributes attributes;
     
    3939    attributes.canRecoverFromContextLoss = false; // Canvas contexts can not handle lost contexts.
    4040    attributes.shareResources = true;
    41     static RefPtr<GraphicsContext3D> context = GraphicsContext3D::create(attributes, window);
     41    static RefPtr<GraphicsContext3D> context = GraphicsContext3D::create(attributes, 0);
    4242    return context.get();
    4343}
  • trunk/Source/WebCore/platform/graphics/gpu/SharedGraphicsContext3D.h

    r93013 r95658  
    3535class SharedGraphicsContext3D {
    3636public:
    37     static GraphicsContext3D* create(HostWindow*);
     37    static GraphicsContext3D* get();
    3838};
    3939
  • trunk/Source/WebCore/platform/graphics/skia/ImageBufferSkia.cpp

    r95192 r95658  
    6565}
    6666
     67static SkCanvas* createAcceleratedCanvas(const IntSize& size, ImageBufferData* data)
     68{
     69    GraphicsContext3D* context3D = SharedGraphicsContext3D::get();
     70    if (!context3D)
     71        return 0;
     72    GrContext* gr = context3D->grContext();
     73    if (!gr)
     74        return 0;
     75    gr->resetContext();
     76    GrTextureDesc desc;
     77    desc.fFlags = kRenderTarget_GrTextureFlagBit;
     78    desc.fAALevel = kNone_GrAALevel;
     79    desc.fWidth = size.width();
     80    desc.fHeight = size.height();
     81    desc.fFormat = kRGBA_8888_GrPixelConfig;
     82    SkAutoTUnref<GrTexture> texture(gr->createUncachedTexture(desc, 0, 0));
     83    if (!texture.get())
     84        return 0;
     85    SkCanvas* canvas = new SkCanvas();
     86    canvas->setDevice(new SkGpuDevice(gr, texture.get()))->unref();
     87    data->m_platformContext.setGraphicsContext3D(context3D);
     88#if USE(ACCELERATED_COMPOSITING)
     89    data->m_platformLayer = Canvas2DLayerChromium::create(context3D);
     90    data->m_platformLayer->setTextureId(texture.get()->getTextureHandle());
     91#endif
     92    return canvas;
     93}
     94
    6795ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, RenderingMode renderingMode, bool& success)
    6896    : m_data(size)
    6997    , m_size(size)
    7098{
    71     OwnPtr<SkCanvas> canvas = adoptPtr(skia::TryCreateBitmapCanvas(size.width(), size.height(), false));
     99    OwnPtr<SkCanvas> canvas;
     100
     101    if (renderingMode == Accelerated)
     102        canvas = adoptPtr(createAcceleratedCanvas(size, &m_data));
     103
     104    if (!canvas)
     105        canvas = adoptPtr(skia::TryCreateBitmapCanvas(size.width(), size.height(), false));
     106
    72107    if (!canvas) {
    73108        success = false;
     
    84119    // color. Can we have another way to manage this?
    85120    m_data.m_canvas->drawARGB(0, 0, 0, 0, SkXfermode::kClear_Mode);
    86     if (renderingMode == Accelerated) {
    87         GraphicsContext3D* context3D = SharedGraphicsContext3D::create(0);
    88         if (context3D) {
    89             GrContext* gr = context3D->grContext();
    90             if (gr) {
    91                 gr->resetContext();
    92                 GrTextureDesc desc;
    93                 desc.fFlags = kRenderTarget_GrTextureFlagBit;
    94                 desc.fAALevel = kNone_GrAALevel;
    95                 desc.fWidth = size.width();
    96                 desc.fHeight = size.height();
    97                 desc.fFormat = kRGBA_8888_GrPixelConfig;
    98                 SkAutoTUnref<GrTexture> texture(gr->createUncachedTexture(desc, 0, 0));
    99                 if (texture.get()) {
    100                     m_data.m_canvas->setDevice(new SkGpuDevice(gr, texture.get()))->unref();
    101                     m_context->platformContext()->setGraphicsContext3D(context3D);
    102 #if USE(ACCELERATED_COMPOSITING)
    103                     m_data.m_platformLayer = Canvas2DLayerChromium::create(context3D);
    104                     m_data.m_platformLayer->setTextureId(texture.get()->getTextureHandle());
    105 #endif
    106                 }
    107             }
    108         }
    109     }
    110121
    111122    success = true;
Note: See TracChangeset for help on using the changeset viewer.