15abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick/*
25abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * Copyright (c) 2010, Google Inc. All rights reserved.
35abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *
45abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * Redistribution and use in source and binary forms, with or without
55abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * modification, are permitted provided that the following conditions are
65abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * met:
75abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *
85abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *     * Redistributions of source code must retain the above copyright
95abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * notice, this list of conditions and the following disclaimer.
105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *     * Redistributions in binary form must reproduce the above
115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * copyright notice, this list of conditions and the following disclaimer
125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * in the documentation and/or other materials provided with the
135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * distribution.
145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *     * Neither the name of Google Inc. nor the names of its
155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * contributors may be used to endorse or promote products derived from
165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * this software without specific prior written permission.
175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *
185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick */
305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "config.h"
325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "DrawingBuffer.h"
345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
3528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "Extensions3DChromium.h"
365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "GraphicsContext3D.h"
375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "SharedGraphicsContext3D.h"
385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(SKIA_GPU)
402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "GrContext.h"
412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if USE(ACCELERATED_COMPOSITING)
445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "Canvas2DLayerChromium.h"
455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricknamespace WebCore {
485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstruct DrawingBufferInternal {
505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    unsigned offscreenColorTexture;
515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if USE(ACCELERATED_COMPOSITING)
525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    RefPtr<Canvas2DLayerChromium> platformLayer;
535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick};
555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
56a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic unsigned generateColorTexture(GraphicsContext3D* context, const IntSize& size)
575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    unsigned offscreenColorTexture = context->createTexture();
595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!offscreenColorTexture)
605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return 0;
615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    context->bindTexture(GraphicsContext3D::TEXTURE_2D, offscreenColorTexture);
635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::NEAREST);
645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::NEAREST);
655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE);
665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE);
67f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    context->texImage2DResourceSafe(GraphicsContext3D::TEXTURE_2D, 0, GraphicsContext3D::RGBA, size.width(), size.height(), 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE);
685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, offscreenColorTexture, 0);
695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return offscreenColorTexture;
715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochDrawingBuffer::DrawingBuffer(GraphicsContext3D* context,
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             const IntSize& size,
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             bool multisampleExtensionSupported,
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             bool packedDepthStencilExtensionSupported)
785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    : m_context(context)
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_size(-1, -1)
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_multisampleExtensionSupported(multisampleExtensionSupported)
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_packedDepthStencilExtensionSupported(packedDepthStencilExtensionSupported)
8228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , m_fbo(0)
836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    , m_colorBuffer(0)
846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    , m_depthStencilBuffer(0)
85ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    , m_depthBuffer(0)
86ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    , m_stencilBuffer(0)
876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    , m_multisampleFBO(0)
886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    , m_multisampleColorBuffer(0)
895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    , m_internal(new DrawingBufferInternal)
902bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(SKIA_GPU)
912bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_grContext(0)
922bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
9428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!m_context->getExtensions()->supports("GL_CHROMIUM_copy_texture_to_parent_texture")) {
9528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        m_context.clear();
9628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return;
9728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    }
9828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    m_fbo = context->createFramebuffer();
99a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo);
1006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_colorBuffer = generateColorTexture(context, size);
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    createSecondaryBuffers();
102ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    reset(size);
1035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickDrawingBuffer::~DrawingBuffer()
1065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if USE(ACCELERATED_COMPOSITING)
1085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (m_internal->platformLayer)
1095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_internal->platformLayer->setDrawingBuffer(0);
1105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
111a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
112a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_context)
113a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
114a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
115a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo);
1166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_context->deleteTexture(m_colorBuffer);
117a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
118a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    clear();
1195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if USE(ACCELERATED_COMPOSITING)
1225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid DrawingBuffer::publishToPlatformLayer()
1235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
124a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_context)
125a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
126a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (m_callback)
1285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_callback->willPublish();
1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (multisample())
1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        commit();
1315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    unsigned parentTexture = m_internal->platformLayer->textureId();
1325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // FIXME: We do the copy in the canvas' (child) context so that it executes in the correct order relative to
1335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // other commands in the child context.  This ensures that the parent texture always contains a complete
1345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // frame and not some intermediate result.  However, there is no synchronization to ensure that this copy
1355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // happens before the compositor draws.  This means we might draw stale frames sometimes.  Ideally this
1365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // would insert a fence into the child command stream that the compositor could wait for.
1375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    m_context->makeContextCurrent();
1382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(SKIA_GPU)
1392bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_grContext)
1402bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_grContext->flush(0);
1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
1426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    static_cast<Extensions3DChromium*>(m_context->getExtensions())->copyTextureToParentTextureCHROMIUM(m_colorBuffer, parentTexture);
14368513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_context->flush();
1445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
1465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid DrawingBuffer::didReset()
1485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if USE(ACCELERATED_COMPOSITING)
1505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (m_internal->platformLayer)
1515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_internal->platformLayer->setTextureChanged();
1525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
1535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if USE(ACCELERATED_COMPOSITING)
1565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickPlatformLayer* DrawingBuffer::platformLayer()
1575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!m_internal->platformLayer)
1595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_internal->platformLayer = Canvas2DLayerChromium::create(this, 0);
1605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return m_internal->platformLayer.get();
1615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
1635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerPlatform3DObject DrawingBuffer::platformColorBuffer() const
1655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return m_colorBuffer;
1675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1692bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(SKIA_GPU)
1702bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid DrawingBuffer::setGrContext(GrContext* context)
1712bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1722bde8e466a4451c7319e3a072d118917957d6554Steve Block    // We just take a ptr without referencing it, as we require that we never outlive
1732bde8e466a4451c7319e3a072d118917957d6554Steve Block    // the SharedGraphicsContext3D object that is giving us the context.
1742bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_grContext = context;
1752bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid DrawingBuffer::getGrPlatformSurfaceDesc(GrPlatformSurfaceDesc* desc)
1782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    desc->fSurfaceType = kTextureRenderTarget_GrPlatformSurfaceType;
1802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    desc->fPlatformTexture = m_colorBuffer;
1822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (multisample()) {
1832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        desc->fRenderTargetFlags = kIsMultisampled_GrPlatformRenderTargetFlagBit | kGrCanResolve_GrPlatformRenderTargetFlagBit;
1842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        desc->fPlatformRenderTarget = m_multisampleFBO;
1852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        desc->fPlatformResolveDestination = m_fbo;
1862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    } else {
1872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        desc->fRenderTargetFlags = kNone_GrPlatformRenderTargetFlagBit;
1882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        desc->fPlatformRenderTarget = m_fbo;
1892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        desc->fPlatformResolveDestination = 0;
1902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
1912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    desc->fWidth = m_size.width();
1932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    desc->fHeight = m_size.height();
1942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    desc->fConfig = kRGBA_8888_GrPixelConfig;
1952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    desc->fStencilBits = (m_depthStencilBuffer || m_stencilBuffer) ? 8 : 0;
1972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1992bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
2002bde8e466a4451c7319e3a072d118917957d6554Steve Block
2015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
202