blob: 4814e7870e8f0f16e118e824d526abea7122f0a7 [file] [log] [blame]
djsollene4545212014-11-13 11:12:41 -08001
2/*
3 * Copyright 2014 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#include "GrContextFactory.h"
10
11#if SK_ANGLE
12 #include "gl/angle/SkANGLEGLContext.h"
13#endif
hendrikw885bf092015-08-27 10:38:39 -070014#if SK_COMMAND_BUFFER
15 #include "gl/command_buffer/SkCommandBufferGLContext.h"
16#endif
djsollene4545212014-11-13 11:12:41 -080017#include "gl/debug/SkDebugGLContext.h"
18#if SK_MESA
19 #include "gl/mesa/SkMesaGLContext.h"
20#endif
21#include "gl/SkGLContext.h"
22#include "gl/SkNullGLContext.h"
kkinnunencfe62e32015-07-01 02:58:50 -070023#include "gl/GrGLGpu.h"
24#include "GrCaps.h"
djsollene4545212014-11-13 11:12:41 -080025
kkinnunen179a8f52015-11-20 13:32:24 -080026GrContextFactory::ContextInfo* GrContextFactory::getContextInfo(GLContextType type,
kkinnunen5219fd92015-12-10 06:28:13 -080027 GLContextOptions options) {
djsollene4545212014-11-13 11:12:41 -080028 for (int i = 0; i < fContexts.count(); ++i) {
kkinnunen5219fd92015-12-10 06:28:13 -080029 if (fContexts[i]->fType == type &&
kkinnunen9ebc3f02015-12-21 23:48:13 -080030 fContexts[i]->fOptions == options) {
kkinnunen179a8f52015-11-20 13:32:24 -080031 fContexts[i]->fGLContext->makeCurrent();
32 return fContexts[i];
djsollene4545212014-11-13 11:12:41 -080033 }
34 }
35 SkAutoTUnref<SkGLContext> glCtx;
36 SkAutoTUnref<GrContext> grCtx;
37 switch (type) {
djsollene4545212014-11-13 11:12:41 -080038 case kNative_GLContextType:
kkinnunen9ebc3f02015-12-21 23:48:13 -080039 glCtx.reset(SkCreatePlatformGLContext(kNone_GrGLStandard));
djsollene4545212014-11-13 11:12:41 -080040 break;
kkinnunen9ebc3f02015-12-21 23:48:13 -080041 case kGL_GLContextType:
42 glCtx.reset(SkCreatePlatformGLContext(kGL_GrGLStandard));
43 break;
44 case kGLES_GLContextType:
45 glCtx.reset(SkCreatePlatformGLContext(kGLES_GrGLStandard));
46 break;
47#if SK_ANGLE
48#ifdef SK_BUILD_FOR_WIN
djsollene4545212014-11-13 11:12:41 -080049 case kANGLE_GLContextType:
kkinnunen9ebc3f02015-12-21 23:48:13 -080050 glCtx.reset(SkANGLEGLContext::CreateDirectX());
hendrikweddbefb2015-09-11 13:07:29 -070051 break;
kkinnunen9ebc3f02015-12-21 23:48:13 -080052#endif
hendrikweddbefb2015-09-11 13:07:29 -070053 case kANGLE_GL_GLContextType:
kkinnunen9ebc3f02015-12-21 23:48:13 -080054 glCtx.reset(SkANGLEGLContext::CreateOpenGL());
djsollene4545212014-11-13 11:12:41 -080055 break;
56#endif
kkinnunen9ebc3f02015-12-21 23:48:13 -080057#if SK_COMMAND_BUFFER
hendrikw885bf092015-08-27 10:38:39 -070058 case kCommandBuffer_GLContextType:
kkinnunen9ebc3f02015-12-21 23:48:13 -080059 glCtx.reset(SkCommandBufferGLContext::Create());
hendrikw885bf092015-08-27 10:38:39 -070060 break;
61#endif
kkinnunen9ebc3f02015-12-21 23:48:13 -080062#if SK_MESA
djsollene4545212014-11-13 11:12:41 -080063 case kMESA_GLContextType:
kkinnunen9ebc3f02015-12-21 23:48:13 -080064 glCtx.reset(SkMesaGLContext::Create());
djsollene4545212014-11-13 11:12:41 -080065 break;
66#endif
67 case kNull_GLContextType:
kkinnunen9ebc3f02015-12-21 23:48:13 -080068 glCtx.reset(SkNullGLContext::Create());
djsollene4545212014-11-13 11:12:41 -080069 break;
70 case kDebug_GLContextType:
kkinnunen9ebc3f02015-12-21 23:48:13 -080071 glCtx.reset(SkDebugGLContext::Create());
djsollene4545212014-11-13 11:12:41 -080072 break;
73 }
halcanary96fcdcc2015-08-27 07:41:13 -070074 if (nullptr == glCtx.get()) {
75 return nullptr;
djsollene4545212014-11-13 11:12:41 -080076 }
77
78 SkASSERT(glCtx->isValid());
79
kkinnunencfe62e32015-07-01 02:58:50 -070080 // Block NVPR from non-NVPR types.
djsollene4545212014-11-13 11:12:41 -080081 SkAutoTUnref<const GrGLInterface> glInterface(SkRef(glCtx->gl()));
kkinnunen5219fd92015-12-10 06:28:13 -080082 if (!(kEnableNVPR_GLContextOptions & options)) {
djsollene4545212014-11-13 11:12:41 -080083 glInterface.reset(GrGLInterfaceRemoveNVPR(glInterface));
84 if (!glInterface) {
halcanary96fcdcc2015-08-27 07:41:13 -070085 return nullptr;
djsollene4545212014-11-13 11:12:41 -080086 }
87 }
88
89 glCtx->makeCurrent();
90 GrBackendContext p3dctx = reinterpret_cast<GrBackendContext>(glInterface.get());
jvanvertha50e17a2015-08-12 12:19:36 -070091#ifdef SK_VULKAN
92 grCtx.reset(GrContext::Create(kVulkan_GrBackend, p3dctx, fGlobalOptions));
93#else
bsalomon682c2692015-05-22 14:01:46 -070094 grCtx.reset(GrContext::Create(kOpenGL_GrBackend, p3dctx, fGlobalOptions));
jvanvertha50e17a2015-08-12 12:19:36 -070095#endif
djsollene4545212014-11-13 11:12:41 -080096 if (!grCtx.get()) {
halcanary96fcdcc2015-08-27 07:41:13 -070097 return nullptr;
djsollene4545212014-11-13 11:12:41 -080098 }
kkinnunen5219fd92015-12-10 06:28:13 -080099 if (kEnableNVPR_GLContextOptions & options) {
kkinnunencfe62e32015-07-01 02:58:50 -0700100 if (!grCtx->caps()->shaderCaps()->pathRenderingSupport()) {
kkinnunena18a8bc2015-12-03 23:04:50 -0800101 return nullptr;
kkinnunencfe62e32015-07-01 02:58:50 -0700102 }
103 }
104
kkinnunen179a8f52015-11-20 13:32:24 -0800105 ContextInfo* ctx = fContexts.emplace_back(new ContextInfo);
106 ctx->fGLContext = SkRef(glCtx.get());
107 ctx->fGrContext = SkRef(grCtx.get());
108 ctx->fType = type;
kkinnunen5219fd92015-12-10 06:28:13 -0800109 ctx->fOptions = options;
kkinnunen179a8f52015-11-20 13:32:24 -0800110 return ctx;
djsollene4545212014-11-13 11:12:41 -0800111}