blob: 097b99b0b75f50e5082e0a66ac93635feecea5fe [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,
bsalomona0a024e2015-12-01 07:58:44 -080027 GrGLStandard forcedGpuAPI) {
djsollene4545212014-11-13 11:12:41 -080028 for (int i = 0; i < fContexts.count(); ++i) {
bsalomona0a024e2015-12-01 07:58:44 -080029 if (forcedGpuAPI != kNone_GrGLStandard &&
30 forcedGpuAPI != fContexts[i]->fGLContext->gl()->fStandard)
31 continue;
32
33 if (fContexts[i]->fType == type) {
kkinnunen179a8f52015-11-20 13:32:24 -080034 fContexts[i]->fGLContext->makeCurrent();
35 return fContexts[i];
djsollene4545212014-11-13 11:12:41 -080036 }
37 }
38 SkAutoTUnref<SkGLContext> glCtx;
39 SkAutoTUnref<GrContext> grCtx;
40 switch (type) {
bsalomona0a024e2015-12-01 07:58:44 -080041 case kNVPR_GLContextType: // fallthru
djsollene4545212014-11-13 11:12:41 -080042 case kNative_GLContextType:
43 glCtx.reset(SkCreatePlatformGLContext(forcedGpuAPI));
44 break;
45#ifdef SK_ANGLE
46 case kANGLE_GLContextType:
hendrikweddbefb2015-09-11 13:07:29 -070047 glCtx.reset(SkANGLEGLContext::Create(forcedGpuAPI, false));
48 break;
49 case kANGLE_GL_GLContextType:
50 glCtx.reset(SkANGLEGLContext::Create(forcedGpuAPI, true));
djsollene4545212014-11-13 11:12:41 -080051 break;
52#endif
hendrikw885bf092015-08-27 10:38:39 -070053#ifdef SK_COMMAND_BUFFER
54 case kCommandBuffer_GLContextType:
55 glCtx.reset(SkCommandBufferGLContext::Create(forcedGpuAPI));
56 break;
57#endif
djsollene4545212014-11-13 11:12:41 -080058#ifdef SK_MESA
59 case kMESA_GLContextType:
60 glCtx.reset(SkMesaGLContext::Create(forcedGpuAPI));
61 break;
62#endif
63 case kNull_GLContextType:
64 glCtx.reset(SkNullGLContext::Create(forcedGpuAPI));
65 break;
66 case kDebug_GLContextType:
67 glCtx.reset(SkDebugGLContext::Create(forcedGpuAPI));
68 break;
69 }
halcanary96fcdcc2015-08-27 07:41:13 -070070 if (nullptr == glCtx.get()) {
71 return nullptr;
djsollene4545212014-11-13 11:12:41 -080072 }
73
74 SkASSERT(glCtx->isValid());
75
kkinnunencfe62e32015-07-01 02:58:50 -070076 // Block NVPR from non-NVPR types.
djsollene4545212014-11-13 11:12:41 -080077 SkAutoTUnref<const GrGLInterface> glInterface(SkRef(glCtx->gl()));
bsalomona0a024e2015-12-01 07:58:44 -080078 if (kNVPR_GLContextType != type) {
djsollene4545212014-11-13 11:12:41 -080079 glInterface.reset(GrGLInterfaceRemoveNVPR(glInterface));
80 if (!glInterface) {
halcanary96fcdcc2015-08-27 07:41:13 -070081 return nullptr;
djsollene4545212014-11-13 11:12:41 -080082 }
83 }
84
85 glCtx->makeCurrent();
86 GrBackendContext p3dctx = reinterpret_cast<GrBackendContext>(glInterface.get());
jvanvertha50e17a2015-08-12 12:19:36 -070087#ifdef SK_VULKAN
88 grCtx.reset(GrContext::Create(kVulkan_GrBackend, p3dctx, fGlobalOptions));
89#else
bsalomon682c2692015-05-22 14:01:46 -070090 grCtx.reset(GrContext::Create(kOpenGL_GrBackend, p3dctx, fGlobalOptions));
jvanvertha50e17a2015-08-12 12:19:36 -070091#endif
djsollene4545212014-11-13 11:12:41 -080092 if (!grCtx.get()) {
halcanary96fcdcc2015-08-27 07:41:13 -070093 return nullptr;
djsollene4545212014-11-13 11:12:41 -080094 }
bsalomona0a024e2015-12-01 07:58:44 -080095 if (kNVPR_GLContextType == type) {
kkinnunencfe62e32015-07-01 02:58:50 -070096 if (!grCtx->caps()->shaderCaps()->pathRenderingSupport()) {
kkinnunena18a8bc2015-12-03 23:04:50 -080097 return nullptr;
kkinnunencfe62e32015-07-01 02:58:50 -070098 }
99 }
100
kkinnunen179a8f52015-11-20 13:32:24 -0800101 ContextInfo* ctx = fContexts.emplace_back(new ContextInfo);
102 ctx->fGLContext = SkRef(glCtx.get());
103 ctx->fGrContext = SkRef(grCtx.get());
104 ctx->fType = type;
105 return ctx;
djsollene4545212014-11-13 11:12:41 -0800106}