| /* | |
| Copyright 2010 Google Inc. | |
| Licensed under the Apache License, Version 2.0 (the "License"); | |
| you may not use this file except in compliance with the License. | |
| You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| */ | |
| #ifndef GrContext_DEFINED | |
| #define GrContext_DEFINED | |
| #include "GrClip.h" | |
| #include "GrGpu.h" | |
| #include "GrTextureCache.h" | |
| #include "GrPaint.h" | |
| class GrFontCache; | |
| class GrPathIter; | |
| class GrVertexBufferAllocPool; | |
| class GrIndexBufferAllocPool; | |
| class GrInOrderDrawBuffer; | |
| class GrContext : public GrRefCnt { | |
| public: | |
| /** | |
| * Creates a GrContext from within a 3D context. | |
| */ | |
| static GrContext* Create(GrGpu::Engine engine, | |
| GrGpu::Platform3DContext context3D); | |
| /** | |
| * Helper to create a opengl-shader based context | |
| */ | |
| static GrContext* CreateGLShaderContext(); | |
| virtual ~GrContext(); | |
| /** | |
| * The GrContext normally assumes that no outsider is setting state | |
| * within the underlying 3D API's context/device/whatever. This call informs | |
| * the context that the state was modified and it should resend. Shouldn't | |
| * be called frequently for good performance. | |
| */ | |
| void resetContext(); | |
| /////////////////////////////////////////////////////////////////////////// | |
| // Textures | |
| /** | |
| * Abandons all textures. Call this if you have lost the associated GPU | |
| * context, and thus internal texture references/IDs are now invalid. | |
| */ | |
| void abandonAllTextures(); | |
| /** | |
| * Search for an entry with the same Key. If found, "lock" it and return it. | |
| * If not found, return null. | |
| */ | |
| GrTextureEntry* findAndLockTexture(GrTextureKey*, | |
| const GrSamplerState&); | |
| /** | |
| * Create a new entry, based on the specified key and texture, and return | |
| * its "locked" entry. | |
| * | |
| * Ownership of the texture is transferred to the Entry, which will unref() | |
| * it when we are purged or deleted. | |
| */ | |
| GrTextureEntry* createAndLockTexture(GrTextureKey* key, | |
| const GrSamplerState&, | |
| const GrGpu::TextureDesc&, | |
| void* srcData, size_t rowBytes); | |
| /** | |
| * When done with an entry, call unlockTexture(entry) on it, which returns | |
| * it to the cache, where it may be purged. | |
| */ | |
| void unlockTexture(GrTextureEntry* entry); | |
| /** | |
| * Removes an texture from the cache. This prevents the texture from | |
| * being found by a subsequent findAndLockTexture() until it is | |
| * reattached. The entry still counts against the cache's budget and should | |
| * be reattached when exclusive access is no longer needed. | |
| */ | |
| void detachCachedTexture(GrTextureEntry*); | |
| /** | |
| * Reattaches a texture to the cache and unlocks it. Allows it to be found | |
| * by a subsequent findAndLock or be purged (provided its lock count is | |
| * now 0.) | |
| */ | |
| void reattachAndUnlockCachedTexture(GrTextureEntry*); | |
| /** | |
| * Creates a texture that is outside the cache. Does not count against | |
| * cache's budget. | |
| */ | |
| GrTexture* createUncachedTexture(const GrGpu::TextureDesc&, | |
| void* srcData, | |
| size_t rowBytes); | |
| /** | |
| * Returns true if the specified use of an indexed texture is supported. | |
| */ | |
| bool supportsIndex8PixelConfig(const GrSamplerState&, int width, int height); | |
| /** | |
| * Return the current texture cache limits. | |
| * | |
| * @param maxTextures If non-null, returns maximum number of textures that | |
| * can be held in the cache. | |
| * @param maxTextureBytes If non-null, returns maximum number of bytes of | |
| * texture memory that can be held in the cache. | |
| */ | |
| void getTextureCacheLimits(int* maxTextures, size_t* maxTextureBytes) const; | |
| /** | |
| * Specify the texture cache limits. If the current cache exceeds either | |
| * of these, it will be purged (LRU) to keep the cache within these limits. | |
| * | |
| * @param maxTextures The maximum number of textures that can be held in | |
| * the cache. | |
| * @param maxTextureBytes The maximum number of bytes of texture memory | |
| * that can be held in the cache. | |
| */ | |
| void setTextureCacheLimits(int maxTextures, size_t maxTextureBytes); | |
| /** | |
| * Return the max width or height of a texture supported by the current gpu | |
| */ | |
| int getMaxTextureDimension(); | |
| /////////////////////////////////////////////////////////////////////////// | |
| // Render targets | |
| /** | |
| * Wraps an externally-created rendertarget in a GrRenderTarget. | |
| * e.g. in GL platforamRenderTarget is an FBO id. | |
| */ | |
| GrRenderTarget* createPlatformRenderTarget(intptr_t platformRenderTarget, | |
| int width, int height); | |
| /** | |
| * Reads the current target object (e.g. FBO or IDirect3DSurface9*) and | |
| * viewport state from the underlying 3D API and wraps it in a | |
| * GrRenderTarget. The GrRenderTarget will not attempt to delete/destroy the | |
| * underlying object in its destructor and it is up to caller to guarantee | |
| * that it remains valid while the GrRenderTarget is used. | |
| * | |
| * @return the newly created GrRenderTarget | |
| */ | |
| GrRenderTarget* createRenderTargetFrom3DApiState() { | |
| return fGpu->createRenderTargetFrom3DApiState(); | |
| } | |
| /** | |
| * Sets the render target. | |
| * @param target the render target to set. (should not be NULL.) | |
| */ | |
| void setRenderTarget(GrRenderTarget* target); | |
| /** | |
| * Gets the current render target. | |
| * @return the currently bound render target. Should never be NULL. | |
| */ | |
| const GrRenderTarget* getRenderTarget() const; | |
| GrRenderTarget* getRenderTarget(); | |
| /////////////////////////////////////////////////////////////////////////// | |
| // Matrix state | |
| /** | |
| * Gets the current transformation matrix. | |
| * @return the current matrix. | |
| */ | |
| const GrMatrix& getMatrix() const; | |
| /** | |
| * Sets the transformation matrix. | |
| * @param m the matrix to set. | |
| */ | |
| void setMatrix(const GrMatrix& m); | |
| /** | |
| * Concats the current matrix. The passed matrix is applied before the | |
| * current matrix. | |
| * @param m the matrix to concat. | |
| */ | |
| void concatMatrix(const GrMatrix& m) const; | |
| /////////////////////////////////////////////////////////////////////////// | |
| // Clip state | |
| /** | |
| * Gets the current clip. | |
| * @return the current clip. | |
| */ | |
| const GrClip& getClip() const { return fGpu->getClip(); } | |
| /** | |
| * Sets the clip. | |
| * @param clip the clip to set. | |
| */ | |
| void setClip(const GrClip& clip); | |
| /** | |
| * Convenience method for setting the clip to a rect. | |
| * @param rect the rect to set as the new clip. | |
| */ | |
| void setClip(const GrIRect& rect); | |
| /////////////////////////////////////////////////////////////////////////// | |
| // Draws | |
| /** | |
| * Erase the entire render target, ignoring any clips | |
| */ | |
| void eraseColor(GrColor color); | |
| /** | |
| * Draw everywhere (respecting the clip) with the paint. | |
| */ | |
| void drawPaint(const GrPaint& paint); | |
| /** | |
| * Draw the rect using a paint. | |
| * @param paint describes how to color pixels. | |
| * @param strokeWidth If strokeWidth < 0, then the rect is filled, else | |
| * the rect is mitered stroked based on strokeWidth. If | |
| * strokeWidth == 0, then the stroke is always a single | |
| * pixel thick. | |
| * @param matrix Optional matrix applied to the rect. Applied before | |
| * context's matrix or the paint's matrix. | |
| * The rects coords are used to access the paint (through texture matrix) | |
| */ | |
| void drawRect(const GrPaint& paint, | |
| const GrRect&, | |
| GrScalar strokeWidth = -1, | |
| const GrMatrix* matrix = NULL); | |
| /** | |
| * Maps a rect of paint coordinates onto the a rect of destination | |
| * coordinates. Each rect can optionally be transformed. The srcRect | |
| * is stretched over the dstRect. The dstRect is transformed by the | |
| * context's matrix and the srcRect is transformed by the paint's matrix. | |
| * Additional optional matrices can be provided by parameters. | |
| * | |
| * @param paint describes how to color pixels. | |
| * @param dstRect the destination rect to draw. | |
| * @param srcRect rect of paint coordinates to be mapped onto dstRect | |
| * @param dstMatrix Optional matrix to transform dstRect. Applied before | |
| * context's matrix. | |
| * @param srcMatrix Optional matrix to transform srcRect Applied before | |
| * paint's matrix. | |
| */ | |
| void drawRectToRect(const GrPaint& paint, | |
| const GrRect& dstRect, | |
| const GrRect& srcRect, | |
| const GrMatrix* dstMatrix = NULL, | |
| const GrMatrix* srcMatrix = NULL); | |
| /** | |
| * Path filling rules | |
| */ | |
| enum PathFills { | |
| kWinding_PathFill, | |
| kEvenOdd_PathFill, | |
| kInverseWinding_PathFill, | |
| kInverseEvenOdd_PathFill, | |
| kHairLine_PathFill, | |
| kPathFillCount | |
| }; | |
| /** | |
| * Tessellates and draws a path. | |
| * | |
| * @param paint describes how to color pixels. | |
| * @param path the path to draw | |
| * @param fill the path filling rule to use. | |
| * @param translate optional additional translation applied to the | |
| * path. | |
| */ | |
| void drawPath(const GrPaint& paint, | |
| GrPathIter* path, | |
| PathFills fill, | |
| const GrPoint* translate = NULL); | |
| /** | |
| * Draws vertices with a paint. | |
| * | |
| * @param paint describes how to color pixels. | |
| * @param primitiveType primitives type to draw. | |
| * @param vertexCount number of vertices. | |
| * @param positions array of vertex positions, required. | |
| * @param texCoords optional array of texture coordinates used | |
| * to access the paint. | |
| * @param colors optional array of per-vertex colors, supercedes | |
| * the paint's color field. | |
| * @param indices optional array of indices. If NULL vertices | |
| * are drawn non-indexed. | |
| * @param indexCount if indices is non-null then this is the | |
| * number of indices. | |
| */ | |
| void drawVertices(const GrPaint& paint, | |
| GrDrawTarget::PrimitiveType primitiveType, | |
| int vertexCount, | |
| const GrPoint positions[], | |
| const GrPoint texs[], | |
| const GrColor colors[], | |
| const uint16_t indices[], | |
| int indexCount); | |
| /** | |
| * Similar to drawVertices but caller provides objects that convert to Gr | |
| * types. The count of vertices is given by posSrc. | |
| * | |
| * @param paint describes how to color pixels. | |
| * @param primitiveType primitives type to draw. | |
| * @param posSrc Source of vertex positions. Must implement | |
| * int count() const; | |
| * void writeValue(int i, GrPoint* point) const; | |
| * count returns the total number of vertices and | |
| * writeValue writes a vertex position to point. | |
| * @param texSrc optional, pass NULL to not use explicit tex | |
| * coords. If present provides tex coords with | |
| * method: | |
| * void writeValue(int i, GrPoint* point) const; | |
| * @param texSrc optional, pass NULL to not use per-vertex colors | |
| * If present provides colors with method: | |
| * void writeValue(int i, GrColor* point) const; | |
| * @param indices optional, pass NULL for non-indexed drawing. If | |
| * present supplies indices for indexed drawing | |
| * with following methods: | |
| * int count() const; | |
| * void writeValue(int i, uint16_t* point) const; | |
| * count returns the number of indices and | |
| * writeValue supplies each index. | |
| */ | |
| template <typename POS_SRC, | |
| typename TEX_SRC, | |
| typename COL_SRC, | |
| typename IDX_SRC> | |
| void drawCustomVertices(const GrPaint& paint, | |
| GrDrawTarget::PrimitiveType primitiveType, | |
| const POS_SRC& posSrc, | |
| const TEX_SRC* texCoordSrc, | |
| const COL_SRC* colorSrc, | |
| const IDX_SRC* idxSrc); | |
| /** | |
| * To avoid the problem of having to create a typename for NULL parameters, | |
| * these reduced versions of drawCustomVertices are provided. | |
| */ | |
| template <typename POS_SRC> | |
| void drawCustomVertices(const GrPaint& paint, | |
| GrDrawTarget::PrimitiveType primitiveType, | |
| const POS_SRC& posSrc); | |
| template <typename POS_SRC, typename TEX_SRC> | |
| void drawCustomVertices(const GrPaint& paint, | |
| GrDrawTarget::PrimitiveType primitiveType, | |
| const POS_SRC& posSrc, | |
| const TEX_SRC* texCoordSrc); | |
| template <typename POS_SRC, typename TEX_SRC, typename COL_SRC> | |
| void drawCustomVertices(const GrPaint& paint, | |
| GrDrawTarget::PrimitiveType primitiveType, | |
| const POS_SRC& posSrc, | |
| const TEX_SRC* texCoordSrc, | |
| const COL_SRC* colorSrc); | |
| /////////////////////////////////////////////////////////////////////////// | |
| // Misc. | |
| /** | |
| * Call to ensure all drawing to the context has been issued to the | |
| * underlying 3D API. | |
| * if flushRenderTarget is true then after the call the last | |
| * rendertarget set will be current in the underlying 3D API, otherwise | |
| * it may not be. It is useful to set if the caller plans to use the 3D | |
| * context outside of Ganesh to render into the current RT. | |
| */ | |
| void flush(bool flushRenderTarget); | |
| /** | |
| * Return true on success, i.e. if we could copy the specified range of | |
| * pixels from the current render-target into the buffer, converting into | |
| * the specified pixel-config. | |
| */ | |
| bool readPixels(int left, int top, int width, int height, | |
| GrTexture::PixelConfig, void* buffer); | |
| /** | |
| * Copy the src pixels [buffer, stride, pixelconfig] into the current | |
| * render-target at the specified rectangle. | |
| */ | |
| void writePixels(int left, int top, int width, int height, | |
| GrTexture::PixelConfig, const void* buffer, size_t stride); | |
| /////////////////////////////////////////////////////////////////////////// | |
| // Statistics | |
| void resetStats(); | |
| const GrGpu::Stats& getStats() const; | |
| void printStats() const; | |
| /////////////////////////////////////////////////////////////////////////// | |
| // Helpers | |
| class AutoRenderTarget : ::GrNoncopyable { | |
| public: | |
| AutoRenderTarget(GrContext* context, GrRenderTarget* target) { | |
| fContext = NULL; | |
| fPrevTarget = context->getRenderTarget(); | |
| if (fPrevTarget != target) { | |
| context->setRenderTarget(target); | |
| fContext = context; | |
| } | |
| } | |
| ~AutoRenderTarget() { | |
| if (fContext) { | |
| fContext->setRenderTarget(fPrevTarget); | |
| } | |
| } | |
| private: | |
| GrContext* fContext; | |
| GrRenderTarget* fPrevTarget; | |
| }; | |
| /////////////////////////////////////////////////////////////////////////// | |
| // Functions intended for internal use only. | |
| GrGpu* getGpu() { return fGpu; } | |
| GrFontCache* getFontCache() { return fFontCache; } | |
| GrDrawTarget* getTextTarget(const GrPaint& paint); | |
| void flushText(); | |
| const GrIndexBuffer* quadIndexBuffer() const; | |
| int maxQuadsInIndexBuffer() const; | |
| private: | |
| GrGpu* fGpu; | |
| GrTextureCache* fTextureCache; | |
| GrFontCache* fFontCache; | |
| GrVertexBufferAllocPool* fTextVBAllocPool; | |
| GrIndexBufferAllocPool* fTextIBAllocPool; | |
| GrInOrderDrawBuffer* fTextDrawBuffer; | |
| GrContext(GrGpu* gpu); | |
| static void SetPaint(const GrPaint& paint, GrDrawTarget* target); | |
| bool finalizeTextureKey(GrTextureKey*, const GrSamplerState&) const; | |
| void prepareToDraw(const GrPaint& paint); | |
| void drawClipIntoStencil(); | |
| }; | |
| /** | |
| * Save/restore the view-matrix in the context. | |
| */ | |
| class GrAutoMatrix : GrNoncopyable { | |
| public: | |
| GrAutoMatrix(GrContext* ctx) : fContext(ctx) { | |
| fMatrix = ctx->getMatrix(); | |
| } | |
| GrAutoMatrix(GrContext* ctx, const GrMatrix& matrix) : fContext(ctx) { | |
| fMatrix = ctx->getMatrix(); | |
| ctx->setMatrix(matrix); | |
| } | |
| ~GrAutoMatrix() { | |
| fContext->setMatrix(fMatrix); | |
| } | |
| private: | |
| GrContext* fContext; | |
| GrMatrix fMatrix; | |
| }; | |
| #endif | |
| #include "GrContext_impl.h" |