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