| Index: src/gpu/GrContextFactory.h
|
| diff --git a/src/gpu/GrContextFactory.h b/src/gpu/GrContextFactory.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7afa3108c69d8984e0d63cd76350570dc764d4be
|
| --- /dev/null
|
| +++ b/src/gpu/GrContextFactory.h
|
| @@ -0,0 +1,144 @@
|
| +/*
|
| + * Copyright 2012 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#ifndef GrContextFactory_DEFINED
|
| +#define GrContextFactory_DEFINED
|
| +
|
| +#include "GrContext.h"
|
| +#include "GrContextOptions.h"
|
| +
|
| +#include "gl/SkGLContext.h"
|
| +#include "SkTArray.h"
|
| +
|
| +/**
|
| + * This is a simple class that is useful in test apps that use different
|
| + * GrContexts backed by different types of GL contexts. It manages creating the
|
| + * GL context and a GrContext that uses it. The GL/Gr contexts persist until the
|
| + * factory is destroyed (though the caller can always grab a ref on the returned
|
| + * Gr and GL contexts to make them outlive the factory).
|
| + */
|
| +class GrContextFactory : SkNoncopyable {
|
| +public:
|
| + enum GLContextType {
|
| + kNative_GLContextType, //! OpenGL or OpenGL ES context.
|
| + kGL_GLContextType, //! OpenGL context.
|
| + kGLES_GLContextType, //! OpenGL ES context.
|
| +#if SK_ANGLE
|
| +#ifdef SK_BUILD_FOR_WIN
|
| + kANGLE_GLContextType, //! ANGLE on DirectX OpenGL ES context.
|
| +#endif
|
| + kANGLE_GL_GLContextType, //! ANGLE on OpenGL OpenGL ES context.
|
| +#endif
|
| +#if SK_COMMAND_BUFFER
|
| + kCommandBuffer_GLContextType, //! Chromium command buffer OpenGL ES context.
|
| +#endif
|
| +#if SK_MESA
|
| + kMESA_GLContextType, //! MESA OpenGL context
|
| +#endif
|
| + kNull_GLContextType, //! Non-rendering OpenGL mock context.
|
| + kDebug_GLContextType, //! Non-rendering, state verifying OpenGL context.
|
| + kLastGLContextType = kDebug_GLContextType
|
| + };
|
| +
|
| + static const int kGLContextTypeCnt = kLastGLContextType + 1;
|
| +
|
| + /**
|
| + * Options for GL context creation. For historical and testing reasons the options will default
|
| + * to not using GL_NV_path_rendering extension even when the driver supports it.
|
| + */
|
| + enum GLContextOptions {
|
| + kNone_GLContextOptions = 0,
|
| + kEnableNVPR_GLContextOptions = 0x1,
|
| + };
|
| +
|
| + static bool IsRenderingGLContext(GLContextType type) {
|
| + switch (type) {
|
| + case kNull_GLContextType:
|
| + case kDebug_GLContextType:
|
| + return false;
|
| + default:
|
| + return true;
|
| + }
|
| + }
|
| +
|
| + static const char* GLContextTypeName(GLContextType type) {
|
| + switch (type) {
|
| + case kNative_GLContextType:
|
| + return "native";
|
| + case kGL_GLContextType:
|
| + return "gl";
|
| + case kGLES_GLContextType:
|
| + return "gles";
|
| +#if SK_ANGLE
|
| +#ifdef SK_BUILD_FOR_WIN
|
| + case kANGLE_GLContextType:
|
| + return "angle";
|
| +#endif
|
| + case kANGLE_GL_GLContextType:
|
| + return "angle-gl";
|
| +#endif
|
| +#if SK_COMMAND_BUFFER
|
| + case kCommandBuffer_GLContextType:
|
| + return "commandbuffer";
|
| +#endif
|
| +#if SK_MESA
|
| + case kMESA_GLContextType:
|
| + return "mesa";
|
| +#endif
|
| + case kNull_GLContextType:
|
| + return "null";
|
| + case kDebug_GLContextType:
|
| + return "debug";
|
| + default:
|
| + SkFAIL("Unknown GL Context type.");
|
| + }
|
| + }
|
| +
|
| + explicit GrContextFactory(const GrContextOptions& opts);
|
| + GrContextFactory();
|
| +
|
| + ~GrContextFactory();
|
| +
|
| + void destroyContexts();
|
| + void abandonContexts();
|
| +
|
| + struct ContextInfo {
|
| + ContextInfo()
|
| + : fGrContext(nullptr), fGLContext(nullptr) { }
|
| + ContextInfo(GrContext* grContext, SkGLContext* glContext)
|
| + : fGrContext(grContext), fGLContext(glContext) { }
|
| + GrContext* fGrContext;
|
| + SkGLContext* fGLContext; //! Valid until the factory destroys it via abandonContexts() or
|
| + //! destroyContexts().
|
| + };
|
| +
|
| + /**
|
| + * Get a context initialized with a type of GL context. It also makes the GL context current.
|
| + */
|
| + ContextInfo getContextInfo(GLContextType type,
|
| + GLContextOptions options = kNone_GLContextOptions);
|
| + /**
|
| + * Get a GrContext initialized with a type of GL context. It also makes the GL context current.
|
| + */
|
| + GrContext* get(GLContextType type,
|
| + GLContextOptions options = kNone_GLContextOptions) {
|
| + return this->getContextInfo(type, options).fGrContext;
|
| + }
|
| + const GrContextOptions& getGlobalOptions() const { return fGlobalOptions; }
|
| +
|
| +private:
|
| + struct Context {
|
| + GLContextType fType;
|
| + GLContextOptions fOptions;
|
| + SkGLContext* fGLContext;
|
| + GrContext* fGrContext;
|
| + };
|
| + SkTArray<Context, true> fContexts;
|
| + const GrContextOptions fGlobalOptions;
|
| +};
|
| +
|
| +#endif
|
|
|