| Index: include/gpu/gl/SkGLContextHelper.h
|
| diff --git a/include/gpu/gl/SkGLContextHelper.h b/include/gpu/gl/SkGLContextHelper.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c4d9bdf9979c4165cd67f404d708711b0f716291
|
| --- /dev/null
|
| +++ b/include/gpu/gl/SkGLContextHelper.h
|
| @@ -0,0 +1,95 @@
|
| +
|
| +/*
|
| + * Copyright 2013 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +#ifndef SkGLContextHelper_DEFINED
|
| +#define SkGLContextHelper_DEFINED
|
| +
|
| +#include "GrGLInterface.h"
|
| +
|
| +/**
|
| + * Create an offscreen opengl context with an RGBA8 / 8bit stencil FBO.
|
| + * Provides a GrGLInterface struct of function pointers for the context.
|
| + */
|
| +
|
| +class SK_API SkGLContextHelper : public SkRefCnt {
|
| +public:
|
| + SK_DECLARE_INST_COUNT(SkGLContextHelper)
|
| +
|
| + SkGLContextHelper();
|
| + virtual ~SkGLContextHelper();
|
| +
|
| + /**
|
| + * Initializes the context and makes it current.
|
| + */
|
| + bool init(GrGLStandard forcedGpuAPI, const int width, const int height);
|
| +
|
| + int getFBOID() const { return fFBO; }
|
| +
|
| + const GrGLInterface* gl() const { return fGL; }
|
| +
|
| + virtual void makeCurrent() const = 0;
|
| +
|
| + /**
|
| + * The primary purpose of this function it to provide a means of scheduling
|
| + * work on the GPU (since all of the subclasses create primary buffers for
|
| + * testing that are small and not meant to be rendered to the screen).
|
| + *
|
| + * If the drawing surface provided by the platform is double buffered this
|
| + * call will cause the platform to swap which buffer is currently being
|
| + * targeted. If the current surface does not include a back buffer, this
|
| + * call has no effect.
|
| + */
|
| + virtual void swapBuffers() const = 0;
|
| +
|
| + bool hasExtension(const char* extensionName) const {
|
| + SkASSERT(fGL);
|
| + return fGL->hasExtension(extensionName);
|
| + }
|
| +
|
| + /**
|
| + * This notifies the context that we are deliberately testing abandoning
|
| + * the context. It is useful for debugging contexts that would otherwise
|
| + * test that GPU resources are properly deleted. It also allows a debugging
|
| + * context to test that further GL calls are not made by Skia GPU code.
|
| + */
|
| + void testAbandon();
|
| +
|
| +protected:
|
| + /**
|
| + * Subclass implements this to make a GL context. The returned GrGLInterface
|
| + * should be populated with functions compatible with the context. The
|
| + * format and size of backbuffers does not matter since an FBO will be
|
| + * created.
|
| + */
|
| + virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) = 0;
|
| +
|
| + /**
|
| + * Subclass should destroy the underlying GL context.
|
| + */
|
| + virtual void destroyGLContext() = 0;
|
| +
|
| +private:
|
| + GrGLuint fFBO;
|
| + GrGLuint fColorBufferID;
|
| + GrGLuint fDepthStencilBufferID;
|
| + const GrGLInterface* fGL;
|
| +
|
| + typedef SkRefCnt INHERITED;
|
| +};
|
| +
|
| +/**
|
| + * Helper macros for using the GL context through the GrGLInterface. Example:
|
| + * SK_GL(glCtx, GenTextures(1, &texID));
|
| + */
|
| +#define SK_GL(ctx, X) (ctx).gl()->fFunctions.f ## X; \
|
| + SkASSERT(0 == (ctx).gl()->fFunctions.fGetError())
|
| +#define SK_GL_RET(ctx, RET, X) (RET) = (ctx).gl()->fFunctions.f ## X; \
|
| + SkASSERT(0 == (ctx).gl()->fFunctions.fGetError())
|
| +#define SK_GL_NOERRCHECK(ctx, X) (ctx).gl()->fFunctions.f ## X
|
| +#define SK_GL_RET_NOERRCHECK(ctx, RET, X) (RET) = (ctx).gl()->fFunctions.f ## X
|
| +
|
| +#endif
|
|
|