13f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com/*
23f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Copyright 2011 Google Inc.
33f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com *
43f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
53f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * found in the LICENSE file.
63f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com */
73f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
83f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#ifndef GrGpu_DEFINED
93f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#define GrGpu_DEFINED
103f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
113f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrDrawTarget.h"
123f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrRefCnt.h"
13321f62ca78984b4e78d0f2c014af46327cf7331crobertphillips@google.com#include "GrClipMaskManager.h"
14290bf0ae34af76a4350a5df76ce02feb93d68196sugoi@google.com#include "SkPath.h"
15290bf0ae34af76a4350a5df76ce02feb93d68196sugoi@google.com
163f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrContext;
173f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrIndexBufferAllocPool;
1829a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.comclass GrPath;
193f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrPathRenderer;
203f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrPathRendererChain;
213f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrResource;
223f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrStencilBuffer;
233f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrVertexBufferAllocPool;
243f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
253f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrGpu : public GrDrawTarget {
263f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.compublic:
273f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
283f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    /**
29cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com     * Additional blend coefficients for dual source blending, not exposed
303f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * through GrPaint/GrContext.
313f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
323f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    enum ExtendedBlendCoeffs {
333f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        // source 2 refers to second output color when
343f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        // using dual source blending.
357de94cd88f290887d0c09549902c9f3890265ff2bsalomon@google.com        kS2C_GrBlendCoeff = kPublicGrBlendCoeffCount,
367de94cd88f290887d0c09549902c9f3890265ff2bsalomon@google.com        kIS2C_GrBlendCoeff,
377de94cd88f290887d0c09549902c9f3890265ff2bsalomon@google.com        kS2A_GrBlendCoeff,
387de94cd88f290887d0c09549902c9f3890265ff2bsalomon@google.com        kIS2A_GrBlendCoeff,
393f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
407de94cd88f290887d0c09549902c9f3890265ff2bsalomon@google.com        kTotalGrBlendCoeffCount
413f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    };
423f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
433f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    /**
44cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com     * Create an instance of GrGpu that matches the specified backend. If the requested backend is
450ad5bd91fd7dc876326ee0832ca8f7947dc1cc24bsalomon@google.com     * not supported (at compile-time or run-time) this returns NULL. The context will not be
460ad5bd91fd7dc876326ee0832ca8f7947dc1cc24bsalomon@google.com     * fully constructed and should not be used by GrGpu until after this function returns.
473f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
480ad5bd91fd7dc876326ee0832ca8f7947dc1cc24bsalomon@google.com    static GrGpu* Create(GrBackend, GrBackendContext, GrContext* context);
493f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
503f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    ////////////////////////////////////////////////////////////////////////////
513f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
520ad5bd91fd7dc876326ee0832ca8f7947dc1cc24bsalomon@google.com    GrGpu(GrContext* context);
533f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    virtual ~GrGpu();
543f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
550ad5bd91fd7dc876326ee0832ca8f7947dc1cc24bsalomon@google.com    GrContext* getContext() { return this->INHERITED::getContext(); }
560ad5bd91fd7dc876326ee0832ca8f7947dc1cc24bsalomon@google.com    const GrContext* getContext() const { return this->INHERITED::getContext(); }
573f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
583f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    /**
593f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * The GrGpu object normally assumes that no outsider is setting state
603f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * within the underlying 3D API's context/device/whatever. This call informs
613f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * the GrGpu that the state was modified and it shouldn't make assumptions
623f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * about the state.
633f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
64a955749f8bf09cf65154ca8d57a86444ffed85a5bsalomon@google.com    void markContextDirty(uint32_t state = kAll_GrBackendState) {
65a955749f8bf09cf65154ca8d57a86444ffed85a5bsalomon@google.com        fResetBits |= state;
66a955749f8bf09cf65154ca8d57a86444ffed85a5bsalomon@google.com    }
673f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
683f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    void unimpl(const char[]);
693f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
703f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    /**
713f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * Creates a texture object. If desc width or height is not a power of
723f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * two but underlying API requires a power of two texture then srcData
733f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * will be embedded in a power of two texture. The extra width and height
743f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * is filled as though srcData were rendered clamped into the texture.
753f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *
763f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * If kRenderTarget_TextureFlag is specified the GrRenderTarget is
773f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * accessible via GrTexture::asRenderTarget(). The texture will hold a ref
78f0d1179507b748694c617e72a6afaa3c83db6526bsalomon@google.com     * on the render target until the texture is destroyed.
793f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *
803f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param desc        describes the texture to be created.
813f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param srcData     texel data to load texture. Begins with full-size
823f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *                    palette data for paletted textures. Contains width*
833f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *                    height texels. If NULL texture data is uninitialized.
843f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *
853f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @return    The texture object if successful, otherwise NULL.
863f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
873f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GrTexture* createTexture(const GrTextureDesc& desc,
883f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                             const void* srcData, size_t rowBytes);
893f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
90015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com    /**
91cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com     * Implements GrContext::wrapBackendTexture
92015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com     */
93cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    GrTexture* wrapBackendTexture(const GrBackendTextureDesc&);
94015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com
95015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com    /**
96cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com     * Implements GrContext::wrapBackendTexture
97015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com     */
98cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    GrRenderTarget* wrapBackendRenderTarget(const GrBackendRenderTargetDesc&);
99015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com
100015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com    /**
1013f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * Creates a vertex buffer.
1023f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *
1033f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param size    size in bytes of the vertex buffer
1043f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param dynamic hints whether the data will be frequently changed
1053f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *                by either GrVertexBuffer::lock or
1063f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *                GrVertexBuffer::updateData.
1073f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *
1083f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @return    The vertex buffer if successful, otherwise NULL.
1093f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
1103f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GrVertexBuffer* createVertexBuffer(uint32_t size, bool dynamic);
1113f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
1123f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    /**
1133f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * Creates an index buffer.
1143f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *
1153f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param size    size in bytes of the index buffer
1163f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param dynamic hints whether the data will be frequently changed
1173f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *                by either GrIndexBuffer::lock or
1183f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *                GrIndexBuffer::updateData.
1193f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *
1203f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @return The index buffer if successful, otherwise NULL.
1213f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
1223f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GrIndexBuffer* createIndexBuffer(uint32_t size, bool dynamic);
1233f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
1243f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    /**
12529a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com     * Creates a path object that can be stenciled using stencilPath(). It is
12629a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com     * only legal to call this if the caps report support for path stenciling.
12729a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com     */
12829a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com    GrPath* createPath(const SkPath& path);
12929a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com
13029a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com    /**
1313f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * Returns an index buffer that can be used to render quads.
1323f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * Six indices per quad: 0, 1, 2, 0, 2, 3, etc.
1333f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * The max number of quads can be queried using GrIndexBuffer::maxQuads().
1347de94cd88f290887d0c09549902c9f3890265ff2bsalomon@google.com     * Draw with kTriangles_GrPrimitiveType
1353f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @ return the quad index buffer
1363f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
1373f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    const GrIndexBuffer* getQuadIndexBuffer() const;
1383f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
1393f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    /**
140cbada79e9157c827682b6ea170861d283d2de3a3bsalomon@google.com     * Resolves MSAA.
141cbada79e9157c827682b6ea170861d283d2de3a3bsalomon@google.com     */
142cbada79e9157c827682b6ea170861d283d2de3a3bsalomon@google.com    void resolveRenderTarget(GrRenderTarget* target);
143cbada79e9157c827682b6ea170861d283d2de3a3bsalomon@google.com
144cbada79e9157c827682b6ea170861d283d2de3a3bsalomon@google.com    /**
1453f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * Ensures that the current render target is actually set in the
1463f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * underlying 3D API. Used when client wants to use 3D API to directly
1473f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * render to the RT.
1483f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
1493f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    void forceRenderTargetFlush();
1503f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
1513f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    /**
15204ac20b5a0e769102205e2110008ae434c114d22commit-bot@chromium.org     * Gets a preferred 8888 config to use for writing/reading pixel data to/from a surface with
15304ac20b5a0e769102205e2110008ae434c114d22commit-bot@chromium.org     * config surfaceConfig. The returned config must have at least as many bits per channel as the
15404ac20b5a0e769102205e2110008ae434c114d22commit-bot@chromium.org     * readConfig or writeConfig param.
155a82039ac3862b7c487426f6adbb6c78d919bca30bsalomon@google.com     */
15604ac20b5a0e769102205e2110008ae434c114d22commit-bot@chromium.org    virtual GrPixelConfig preferredReadPixelsConfig(GrPixelConfig readConfig,
15704ac20b5a0e769102205e2110008ae434c114d22commit-bot@chromium.org                                                    GrPixelConfig surfaceConfig) const {
15804ac20b5a0e769102205e2110008ae434c114d22commit-bot@chromium.org        return readConfig;
15904ac20b5a0e769102205e2110008ae434c114d22commit-bot@chromium.org    }
16004ac20b5a0e769102205e2110008ae434c114d22commit-bot@chromium.org    virtual GrPixelConfig preferredWritePixelsConfig(GrPixelConfig writeConfig,
16104ac20b5a0e769102205e2110008ae434c114d22commit-bot@chromium.org                                                     GrPixelConfig surfaceConfig) const {
16204ac20b5a0e769102205e2110008ae434c114d22commit-bot@chromium.org        return writeConfig;
16304ac20b5a0e769102205e2110008ae434c114d22commit-bot@chromium.org    }
164a82039ac3862b7c487426f6adbb6c78d919bca30bsalomon@google.com
165a82039ac3862b7c487426f6adbb6c78d919bca30bsalomon@google.com    /**
166281391b6ca1b37738dfbcc934db460f88865d709bsalomon@google.com     * Called before uploading writing pixels to a GrTexture when the src pixel config doesn't
167281391b6ca1b37738dfbcc934db460f88865d709bsalomon@google.com     * match the texture's config.
168b93d4d5201d643f98709fdaa3efdcb28f475dd6ebsalomon@google.com     */
169281391b6ca1b37738dfbcc934db460f88865d709bsalomon@google.com    virtual bool canWriteTexturePixels(const GrTexture*, GrPixelConfig srcConfig) const = 0;
170b93d4d5201d643f98709fdaa3efdcb28f475dd6ebsalomon@google.com
171b93d4d5201d643f98709fdaa3efdcb28f475dd6ebsalomon@google.com    /**
17200e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     * OpenGL's readPixels returns the result bottom-to-top while the skia
17300e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     * API is top-to-bottom. Thus we have to do a y-axis flip. The obvious
17400e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     * solution is to have the subclass do the flip using either the CPU or GPU.
17500e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     * However, the caller (GrContext) may have transformations to apply and can
17600e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     * simply fold in the y-flip for free. On the other hand, the subclass may
17700e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     * be able to do it for free itself. For example, the subclass may have to
178dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com     * do memcpys to handle rowBytes that aren't tight. It could do the y-flip
17900e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     * concurrently.
18000e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     *
18100e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     * This function returns true if a y-flip is required to put the pixels in
18200e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     * top-to-bottom order and the subclass cannot do it for free.
18300e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     *
18400e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     * See read pixels for the params
18500e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     * @return true if calling readPixels with the same set of params will
18600e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     *              produce bottom-to-top data
18700e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     */
18800e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     virtual bool readPixelsWillPayForYFlip(GrRenderTarget* renderTarget,
18900e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com                                            int left, int top,
19000e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com                                            int width, int height,
19100e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com                                            GrPixelConfig config,
1929646b3b9d9c12a545bbee07a9a9e516f09e4aa49bsalomon@google.com                                            size_t rowBytes) const = 0;
1939646b3b9d9c12a545bbee07a9a9e516f09e4aa49bsalomon@google.com     /**
1949646b3b9d9c12a545bbee07a9a9e516f09e4aa49bsalomon@google.com      * This should return true if reading a NxM rectangle of pixels from a
1959646b3b9d9c12a545bbee07a9a9e516f09e4aa49bsalomon@google.com      * render target is faster if the target has dimensons N and M and the read
1969646b3b9d9c12a545bbee07a9a9e516f09e4aa49bsalomon@google.com      * rectangle has its top-left at 0,0.
1979646b3b9d9c12a545bbee07a9a9e516f09e4aa49bsalomon@google.com      */
1989646b3b9d9c12a545bbee07a9a9e516f09e4aa49bsalomon@google.com     virtual bool fullReadPixelsIsFasterThanPartial() const { return false; };
19900e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com
20000e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com    /**
201f71764d3272e28817cb5025d2b503aa0170ef9b8bsalomon@google.com     * Reads a rectangle of pixels from a render target.
20200e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     *
2033f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param renderTarget  the render target to read from. NULL means the
2043f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *                      current render target.
2053f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param left          left edge of the rectangle to read (inclusive)
2063f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param top           top edge of the rectangle to read (inclusive)
2073f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param width         width of rectangle to read in pixels.
2083f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param height        height of rectangle to read in pixels.
2093f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param config        the pixel config of the destination buffer
2103f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param buffer        memory to read the rectangle into.
2116cc3764f05b72f3064a99146c7b6d0b55a0634febsalomon@google.com     * @param rowBytes      the number of bytes between consecutive rows. Zero
2126cc3764f05b72f3064a99146c7b6d0b55a0634febsalomon@google.com     *                      means rows are tightly packed.
21300e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     * @param invertY       buffer should be populated bottom-to-top as opposed
21400e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com     *                      to top-to-bottom (skia's usual order)
2153f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *
2163f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @return true if the read succeeded, false if not. The read can fail
2173f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *              because of a unsupported pixel config or because no render
2183f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     *              target is currently set.
2193f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
2203f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    bool readPixels(GrRenderTarget* renderTarget,
2213f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                    int left, int top, int width, int height,
222e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org                    GrPixelConfig config, void* buffer, size_t rowBytes);
2233f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
22477e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com    /**
22577e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com     * Updates the pixels in a rectangle of a texture.
226b93d4d5201d643f98709fdaa3efdcb28f475dd6ebsalomon@google.com     *
22777e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com     * @param left          left edge of the rectangle to write (inclusive)
22877e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com     * @param top           top edge of the rectangle to write (inclusive)
22977e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com     * @param width         width of rectangle to write in pixels.
23077e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com     * @param height        height of rectangle to write in pixels.
23177e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com     * @param config        the pixel config of the source buffer
23277e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com     * @param buffer        memory to read pixels from
233cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com     * @param rowBytes      number of bytes between consecutive rows. Zero
23477e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com     *                      means rows are tightly packed.
23577e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com     */
236281391b6ca1b37738dfbcc934db460f88865d709bsalomon@google.com    bool writeTexturePixels(GrTexture* texture,
23777e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com                            int left, int top, int width, int height,
23877e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com                            GrPixelConfig config, const void* buffer,
23977e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com                            size_t rowBytes);
24077e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com
2413f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    /**
2423f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * Called to tell Gpu object that all GrResources have been lost and should
2433f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * be abandoned. Overrides must call INHERITED::abandonResources().
2443f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
2453f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    virtual void abandonResources();
2463f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
2473f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    /**
2483f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * Called to tell Gpu object to release all GrResources. Overrides must call
2493f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * INHERITED::releaseResources().
2503f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
2513f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    void releaseResources();
2523f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
2533f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    /**
2543f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * Add resource to list of resources. Should only be called by GrResource.
2553f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param resource  the resource to add.
2563f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
2573f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    void insertResource(GrResource* resource);
2583f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
2593f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    /**
2603f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * Remove resource from list of resources. Should only be called by
2613f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * GrResource.
2623f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     * @param resource  the resource to remove.
2633f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com     */
2643f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    void removeResource(GrResource* resource);
2653f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
2663f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // GrDrawTarget overrides
267a8cbc57c2d74f8024d149370377bd7dcbd8d204ccommit-bot@chromium.org    virtual void clear(const SkIRect* rect,
2681f218673ae464de98d775cfcb4bfd31f8949848brobertphillips@google.com                       GrColor color,
2691f218673ae464de98d775cfcb4bfd31f8949848brobertphillips@google.com                       GrRenderTarget* renderTarget = NULL) SK_OVERRIDE;
2703f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
2712a46d231cee3d3ae87a6090da78b9971078fc9c7robertphillips@google.com    virtual void purgeResources() SK_OVERRIDE {
2722a46d231cee3d3ae87a6090da78b9971078fc9c7robertphillips@google.com        // The clip mask manager can rebuild all its clip masks so just
2732a46d231cee3d3ae87a6090da78b9971078fc9c7robertphillips@google.com        // get rid of them all.
2742a46d231cee3d3ae87a6090da78b9971078fc9c7robertphillips@google.com        fClipMaskManager.releaseResources();
2752a46d231cee3d3ae87a6090da78b9971078fc9c7robertphillips@google.com    }
2762a46d231cee3d3ae87a6090da78b9971078fc9c7robertphillips@google.com
277f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    // After the client interacts directly with the 3D context state the GrGpu
278f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    // must resync its internal state and assumptions about 3D context state.
279f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    // Each time this occurs the GrGpu bumps a timestamp.
280f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    // state of the 3D context
281f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    // At 10 resets / frame and 60fps a 64bit timestamp will overflow in about
282f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    // a billion years.
283f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    typedef uint64_t ResetTimestamp;
284f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com
285f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    // This timestamp is always older than the current timestamp
286f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    static const ResetTimestamp kExpiredTimestamp = 0;
287f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    // Returns a timestamp based on the number of times the context was reset.
288f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    // This timestamp can be used to lazily detect when cached 3D context state
289f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    // is dirty.
290f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    ResetTimestamp getResetTimestamp() const {
291f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com        return fResetTimestamp;
292f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    }
293f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com
294e1f4ecccd0cd95301aab293853959a84860d1c56robertphillips@google.com    /**
295e1f4ecccd0cd95301aab293853959a84860d1c56robertphillips@google.com     * Can the provided configuration act as a color render target?
296e1f4ecccd0cd95301aab293853959a84860d1c56robertphillips@google.com     */
297e1f4ecccd0cd95301aab293853959a84860d1c56robertphillips@google.com    bool isConfigRenderable(GrPixelConfig config) const {
298c3abb7baff528b64f175e08350a92a0d72ca24bebsalomon@google.com        GrAssert(kGrPixelConfigCnt > config);
299e1f4ecccd0cd95301aab293853959a84860d1c56robertphillips@google.com        return fConfigRenderSupport[config];
300e1f4ecccd0cd95301aab293853959a84860d1c56robertphillips@google.com    }
301e1f4ecccd0cd95301aab293853959a84860d1c56robertphillips@google.com
30285d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com    /**
30385d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com     * These methods are called by the clip manager's setupClipping function
30452ea95b527d20df23da16f28b7db7de981fcd83bbsalomon@google.com     * which (called as part of GrGpu's implementation of onDraw and
30585d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com     * onStencilPath member functions.) The GrGpu subclass should flush the
30685d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com     * stencil state to the 3D API in its implementation of flushGraphicsState.
30785d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com     */
308a8cbc57c2d74f8024d149370377bd7dcbd8d204ccommit-bot@chromium.org    void enableScissor(const SkIRect& rect) {
30985d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com        fScissorState.fEnabled = true;
31085d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com        fScissorState.fRect = rect;
31185d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com    }
31285d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com    void disableScissor() { fScissorState.fEnabled = false; }
31385d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com
31485d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com    /**
31585d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com     * Like the scissor methods above this is called by setupClipping and
31685d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com     * should be flushed by the GrGpu subclass in flushGraphicsState. These
31785d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com     * stencil settings should be used in place of those on the GrDrawState.
31885d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com     * They have been adjusted to account for any interactions between the
31985d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com     * GrDrawState's stencil settings and stencil clipping.
32085d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com     */
32185d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com    void setStencilSettings(const GrStencilSettings& settings) {
32285d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com        fStencilSettings = settings;
32385d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com    }
32485d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com    void disableStencil() { fStencilSettings.setDisabled(); }
325b83a8386f2b423bd5957a39dda0679aa8c58f195robertphillips@google.com
326b83a8386f2b423bd5957a39dda0679aa8c58f195robertphillips@google.com    // GrGpu subclass sets clip bit in the stencil buffer. The subclass is
327b83a8386f2b423bd5957a39dda0679aa8c58f195robertphillips@google.com    // free to clear the remaining bits to zero if masked clears are more
328b83a8386f2b423bd5957a39dda0679aa8c58f195robertphillips@google.com    // expensive than clearing all bits.
329a8cbc57c2d74f8024d149370377bd7dcbd8d204ccommit-bot@chromium.org    virtual void clearStencilClip(const SkIRect& rect, bool insideClip) = 0;
330b83a8386f2b423bd5957a39dda0679aa8c58f195robertphillips@google.com
331c08edffbcbe0eed40d8855f8acfe439c237c43bdbsalomon@google.com    enum PrivateDrawStateStateBits {
332c08edffbcbe0eed40d8855f8acfe439c237c43bdbsalomon@google.com        kFirstBit = (GrDrawState::kLastPublicStateBit << 1),
3333f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
3343f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        kModifyStencilClip_StateBit = kFirstBit, // allows draws to modify
3353f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                                                 // stencil bits used for
3363f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                                                 // clipping.
3373f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    };
3383f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
339b83a8386f2b423bd5957a39dda0679aa8c58f195robertphillips@google.comprotected:
34029a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com    enum DrawType {
34129a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com        kDrawPoints_DrawType,
34229a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com        kDrawLines_DrawType,
34329a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com        kDrawTriangles_DrawType,
34429a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com        kStencilPath_DrawType,
34529a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com    };
34629a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com
34729a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com    DrawType PrimTypeToDrawType(GrPrimitiveType type) {
34829a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com        switch (type) {
34929a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com            case kTriangles_GrPrimitiveType:
35029a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com            case kTriangleStrip_GrPrimitiveType:
35129a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com            case kTriangleFan_GrPrimitiveType:
35229a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com                return kDrawTriangles_DrawType;
35329a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com            case kPoints_GrPrimitiveType:
35429a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com                return kDrawPoints_DrawType;
35529a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com            case kLines_GrPrimitiveType:
35629a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com            case kLineStrip_GrPrimitiveType:
35729a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com                return kDrawLines_DrawType;
35829a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com            default:
35929a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com                GrCrash("Unexpected primitive type");
36029a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com                return kDrawTriangles_DrawType;
36129a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com        }
36229a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com    }
36329a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com
3643f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // prepares clip flushes gpu state before a draw
365860912a0affd82bc6b30ad9006658df856ca1d17bsalomon@google.com    bool setupClipAndFlushState(DrawType,
366860912a0affd82bc6b30ad9006658df856ca1d17bsalomon@google.com                                const GrDeviceCoordTexture* dstCopy,
367860912a0affd82bc6b30ad9006658df856ca1d17bsalomon@google.com                                GrDrawState::AutoRestoreEffects* are);
3683f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
3693f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // Functions used to map clip-respecting stencil tests into normal
3703f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // stencil funcs supported by GPUs.
3713f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    static GrStencilFunc ConvertStencilFunc(bool stencilInClip,
3723f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                                            GrStencilFunc func);
3733f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    static void ConvertStencilFuncAndMask(GrStencilFunc func,
3743f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                                          bool clipInStencil,
3753f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                                          unsigned int clipBit,
3763f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                                          unsigned int userBits,
3773f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                                          unsigned int* ref,
3783f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                                          unsigned int* mask);
3793f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
380b83a8386f2b423bd5957a39dda0679aa8c58f195robertphillips@google.com    GrClipMaskManager           fClipMaskManager;
381b83a8386f2b423bd5957a39dda0679aa8c58f195robertphillips@google.com
3823f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    struct GeometryPoolState {
3833f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        const GrVertexBuffer* fPoolVertexBuffer;
3843f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        int                   fPoolStartVertex;
385dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com
3863f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        const GrIndexBuffer*  fPoolIndexBuffer;
3873f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        int                   fPoolStartIndex;
3883f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    };
389dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com    const GeometryPoolState& getGeomPoolState() {
390dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com        return fGeomPoolStateStack.back();
3913f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
3923f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
39385d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com    // The state of the scissor is controlled by the clip manager
39485d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com    struct ScissorState {
39585d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com        bool    fEnabled;
396a8cbc57c2d74f8024d149370377bd7dcbd8d204ccommit-bot@chromium.org        SkIRect fRect;
39785d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com    } fScissorState;
39885d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com
39985d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com    // The final stencil settings to use as determined by the clip manager.
40085d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com    GrStencilSettings fStencilSettings;
40185d47bf8e929c8eca60ce0fc5bda1f64481d5ef1bsalomon@google.com
402e1f4ecccd0cd95301aab293853959a84860d1c56robertphillips@google.com    // Derived classes need access to this so they can fill it out in their
403e1f4ecccd0cd95301aab293853959a84860d1c56robertphillips@google.com    // constructors
404c3abb7baff528b64f175e08350a92a0d72ca24bebsalomon@google.com    bool    fConfigRenderSupport[kGrPixelConfigCnt];
405e1f4ecccd0cd95301aab293853959a84860d1c56robertphillips@google.com
4068b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    // Helpers for setting up geometry state
4078b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    void finalizeReservedVertices();
4088b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    void finalizeReservedIndices();
4098b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com
4108b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.comprivate:
4113f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // GrDrawTarget overrides
4129d8e4b7e65a6b644564e2f2b94730f74b88941e5jvanverth@google.com    virtual bool onReserveVertexSpace(size_t vertexSize, int vertexCount, void** vertices) SK_OVERRIDE;
4138b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    virtual bool onReserveIndexSpace(int indexCount, void** indices) SK_OVERRIDE;
414d3042b0d0527b02b1f6fb329441d65b5ab34b5b5bsalomon@google.com    virtual void releaseReservedVertexSpace() SK_OVERRIDE;
415d3042b0d0527b02b1f6fb329441d65b5ab34b5b5bsalomon@google.com    virtual void releaseReservedIndexSpace() SK_OVERRIDE;
4168b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    virtual void onSetVertexSourceToArray(const void* vertexArray, int vertexCount) SK_OVERRIDE;
4178b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    virtual void onSetIndexSourceToArray(const void* indexArray, int indexCount) SK_OVERRIDE;
418d3042b0d0527b02b1f6fb329441d65b5ab34b5b5bsalomon@google.com    virtual void releaseVertexArray() SK_OVERRIDE;
419d3042b0d0527b02b1f6fb329441d65b5ab34b5b5bsalomon@google.com    virtual void releaseIndexArray() SK_OVERRIDE;
420d3042b0d0527b02b1f6fb329441d65b5ab34b5b5bsalomon@google.com    virtual void geometrySourceWillPush() SK_OVERRIDE;
4218b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) SK_OVERRIDE;
4223f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
4233f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
4242e672fefbcbee9f1f508e70e60dd688f701423d1bsalomon@google.com    // called when the 3D context state is unknown. Subclass should emit any
4250c4165f59a09574d521de66abeb3cc3101b04bd6bsalomon@google.com    // assumed 3D context state and dirty any state cache.
426a955749f8bf09cf65154ca8d57a86444ffed85a5bsalomon@google.com    virtual void onResetContext(uint32_t resetBits) = 0;
4273f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
428cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    // overridden by backend-specific derived class to create objects.
4293f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    virtual GrTexture* onCreateTexture(const GrTextureDesc& desc,
4303f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                                       const void* srcData,
4313f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                                       size_t rowBytes) = 0;
432cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    virtual GrTexture* onWrapBackendTexture(const GrBackendTextureDesc&) = 0;
433cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    virtual GrRenderTarget* onWrapBackendRenderTarget(const GrBackendRenderTargetDesc&) = 0;
4348b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    virtual GrVertexBuffer* onCreateVertexBuffer(uint32_t size, bool dynamic) = 0;
4358b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    virtual GrIndexBuffer* onCreateIndexBuffer(uint32_t size, bool dynamic) = 0;
43629a68d041dbf2f117fdb3205e923676ab375ab26bsalomon@google.com    virtual GrPath* onCreatePath(const SkPath& path) = 0;
4373f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
438cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    // overridden by backend-specific derived class to perform the clear and
4393f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // clearRect. NULL rect means clear whole target.
440a8cbc57c2d74f8024d149370377bd7dcbd8d204ccommit-bot@chromium.org    virtual void onClear(const SkIRect* rect, GrColor color) = 0;
4413f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
442cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    // overridden by backend-specific derived class to perform the draw call.
44352ea95b527d20df23da16f28b7db7de981fcd83bbsalomon@google.com    virtual void onGpuDraw(const DrawInfo&) = 0;
4448dc33d06f5759d2e587dbd266226fc0fe0c1562bbsalomon@google.com    // when GrDrawTarget::stencilPath is called the draw state's current stencil
4458dc33d06f5759d2e587dbd266226fc0fe0c1562bbsalomon@google.com    // settings are ignored. Instead the GrGpu decides the stencil rules
4468dc33d06f5759d2e587dbd266226fc0fe0c1562bbsalomon@google.com    // necessary to stencil the path. These are still subject to filtering by
4478dc33d06f5759d2e587dbd266226fc0fe0c1562bbsalomon@google.com    // the clip mask manager.
4488dc33d06f5759d2e587dbd266226fc0fe0c1562bbsalomon@google.com    virtual void setStencilPathSettings(const GrPath&,
449290bf0ae34af76a4350a5df76ce02feb93d68196sugoi@google.com                                        SkPath::FillType,
4508dc33d06f5759d2e587dbd266226fc0fe0c1562bbsalomon@google.com                                        GrStencilSettings* settings) = 0;
451cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    // overridden by backend-specific derived class to perform the path stenciling.
452290bf0ae34af76a4350a5df76ce02feb93d68196sugoi@google.com    virtual void onGpuStencilPath(const GrPath*, SkPath::FillType) = 0;
4533f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
454cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    // overridden by backend-specific derived class to perform flush
4553f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    virtual void onForceRenderTargetFlush() = 0;
4563f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
457cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    // overridden by backend-specific derived class to perform the read pixels.
4583f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    virtual bool onReadPixels(GrRenderTarget* target,
4593f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                              int left, int top, int width, int height,
46000e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com                              GrPixelConfig,
46100e32ee9f771bd4d9cd04e4c76e6f5f59b26a4dfbsalomon@google.com                              void* buffer,
462e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org                              size_t rowBytes) = 0;
4633f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
464cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    // overridden by backend-specific derived class to perform the texture update
465281391b6ca1b37738dfbcc934db460f88865d709bsalomon@google.com    virtual bool onWriteTexturePixels(GrTexture* texture,
46677e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com                                      int left, int top, int width, int height,
46777e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com                                      GrPixelConfig config, const void* buffer,
46877e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com                                      size_t rowBytes) = 0;
46977e39423f949e61a899e1bbe64b79b0fa8120d96bsalomon@google.com
470cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    // overridden by backend-specific derived class to perform the resolve
471cbada79e9157c827682b6ea170861d283d2de3a3bsalomon@google.com    virtual void onResolveRenderTarget(GrRenderTarget* target) = 0;
472cbada79e9157c827682b6ea170861d283d2de3a3bsalomon@google.com
4733f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // width and height may be larger than rt (if underlying API allows it).
4743f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // Should attach the SB to the RT. Returns false if compatible sb could
4753f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // not be created.
47652ea95b527d20df23da16f28b7db7de981fcd83bbsalomon@google.com    virtual bool createStencilBufferForRenderTarget(GrRenderTarget*, int width, int height) = 0;
4773f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
4783f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // attaches an existing SB to an existing RT.
47952ea95b527d20df23da16f28b7db7de981fcd83bbsalomon@google.com    virtual bool attachStencilBufferToRenderTarget(GrStencilBuffer*, GrRenderTarget*) = 0;
4803f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
4813f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // The GrGpu typically records the clients requested state and then flushes
4823f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // deltas from previous state at draw time. This function does the
48303d5ebc1af70a1c30c7b0ac72e7f0d3311f0e97dbsalomon@google.com    // backend-specific flush of the state.
4843f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // returns false if current state is unsupported.
48503d5ebc1af70a1c30c7b0ac72e7f0d3311f0e97dbsalomon@google.com    virtual bool flushGraphicsState(DrawType, const GrDeviceCoordTexture* dstCopy) = 0;
4863f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
4873f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // clears the entire stencil buffer to 0
4883f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    virtual void clearStencil() = 0;
4893f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
4903f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // Given a rt, find or create a stencil buffer and attach it
4913f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    bool attachStencilBufferToRenderTarget(GrRenderTarget* target);
4923f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
4933f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // GrDrawTarget overrides
49452ea95b527d20df23da16f28b7db7de981fcd83bbsalomon@google.com    virtual void onDraw(const DrawInfo&) SK_OVERRIDE;
4955c2ee5c5d8f8593d40a2a9ffd9ca834653ee6af1sugoi@google.com    virtual void onStencilPath(const GrPath* path, const SkStrokeRec& stroke,
496290bf0ae34af76a4350a5df76ce02feb93d68196sugoi@google.com                               SkPath::FillType) SK_OVERRIDE;
4973f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
4983f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // readies the pools to provide vertex/index data.
4993f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    void prepareVertexPool();
5003f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    void prepareIndexPool();
5013f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
5022e672fefbcbee9f1f508e70e60dd688f701423d1bsalomon@google.com    void resetContext() {
5030c4165f59a09574d521de66abeb3cc3101b04bd6bsalomon@google.com        // We call this because the client may have messed with the
5040c4165f59a09574d521de66abeb3cc3101b04bd6bsalomon@google.com        // stencil buffer. Perhaps we should detect whether it is a
5050c4165f59a09574d521de66abeb3cc3101b04bd6bsalomon@google.com        // internally created stencil buffer and if so skip the invalidate.
5060c4165f59a09574d521de66abeb3cc3101b04bd6bsalomon@google.com        fClipMaskManager.invalidateStencilMask();
507a955749f8bf09cf65154ca8d57a86444ffed85a5bsalomon@google.com        this->onResetContext(fResetBits);
508a955749f8bf09cf65154ca8d57a86444ffed85a5bsalomon@google.com        fResetBits = 0;
5092e672fefbcbee9f1f508e70e60dd688f701423d1bsalomon@google.com        ++fResetTimestamp;
5102e672fefbcbee9f1f508e70e60dd688f701423d1bsalomon@google.com    }
5112e672fefbcbee9f1f508e70e60dd688f701423d1bsalomon@google.com
5123f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    void handleDirtyContext() {
513a955749f8bf09cf65154ca8d57a86444ffed85a5bsalomon@google.com        if (fResetBits) {
5143f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            this->resetContext();
5153f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        }
5163f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
5173f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
5188b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    enum {
5198b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com        kPreallocGeomPoolStateStackCnt = 4,
5208b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    };
5218b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    typedef SkTInternalLList<GrResource> ResourceList;
5228b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    SkSTArray<kPreallocGeomPoolStateStackCnt, GeometryPoolState, true>  fGeomPoolStateStack;
5238b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    ResetTimestamp                                                      fResetTimestamp;
524a955749f8bf09cf65154ca8d57a86444ffed85a5bsalomon@google.com    uint32_t                                                            fResetBits;
5258b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    GrVertexBufferAllocPool*                                            fVertexPool;
5268b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    GrIndexBufferAllocPool*                                             fIndexPool;
5278b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    // counts number of uses of vertex/index pool in the geometry stack
5288b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    int                                                                 fVertexPoolUseCnt;
5298b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    int                                                                 fIndexPoolUseCnt;
5309b2fd0c3f52229a5618434a4236b96ec4c73dd98bsalomon@google.com    // these are mutable so they can be created on-demand
5318b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    mutable GrIndexBuffer*                                              fQuadIndexBuffer;
532dc390b101130efd7261d46252c713236846ad3cbskia.committer@gmail.com    // Used to abandon/release all resources created by this GrGpu. TODO: Move this
533c5bc4fb4223a39efc8ca42452b9d75a98c75c674bsalomon@google.com    // functionality to GrResourceCache.
5348b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com    ResourceList                                                        fResourceList;
5358b62219b7c4b5c543eb9cdb7da38184232c59812bsalomon@google.com
5363f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    typedef GrDrawTarget INHERITED;
5373f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com};
5383f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
5393f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#endif
540