blob: acd5d93a04f846fb93d66b697dc89c55e630d280 [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
26GrContext* GrContextFactory::get(GLContextType type, GrGLStandard forcedGpuAPI) {
27 for (int i = 0; i < fContexts.count(); ++i) {
28 if (forcedGpuAPI != kNone_GrGLStandard &&
29 forcedGpuAPI != fContexts[i].fGLContext->gl()->fStandard)
30 continue;
31
32 if (fContexts[i].fType == type) {
33 fContexts[i].fGLContext->makeCurrent();
34 return fContexts[i].fGrContext;
35 }
36 }
37 SkAutoTUnref<SkGLContext> glCtx;
38 SkAutoTUnref<GrContext> grCtx;
39 switch (type) {
40 case kNVPR_GLContextType: // fallthru
41 case kNative_GLContextType:
42 glCtx.reset(SkCreatePlatformGLContext(forcedGpuAPI));
43 break;
44#ifdef SK_ANGLE
45 case kANGLE_GLContextType:
hendrikweddbefb2015-09-11 13:07:29 -070046 glCtx.reset(SkANGLEGLContext::Create(forcedGpuAPI, false));
47 break;
48 case kANGLE_GL_GLContextType:
49 glCtx.reset(SkANGLEGLContext::Create(forcedGpuAPI, true));
djsollene4545212014-11-13 11:12:41 -080050 break;
51#endif
hendrikw885bf092015-08-27 10:38:39 -070052#ifdef SK_COMMAND_BUFFER
53 case kCommandBuffer_GLContextType:
54 glCtx.reset(SkCommandBufferGLContext::Create(forcedGpuAPI));
55 break;
56#endif
djsollene4545212014-11-13 11:12:41 -080057#ifdef SK_MESA
58 case kMESA_GLContextType:
59 glCtx.reset(SkMesaGLContext::Create(forcedGpuAPI));
60 break;
61#endif
62 case kNull_GLContextType:
63 glCtx.reset(SkNullGLContext::Create(forcedGpuAPI));
64 break;
65 case kDebug_GLContextType:
66 glCtx.reset(SkDebugGLContext::Create(forcedGpuAPI));
67 break;
68 }
halcanary96fcdcc2015-08-27 07:41:13 -070069 if (nullptr == glCtx.get()) {
70 return nullptr;
djsollene4545212014-11-13 11:12:41 -080071 }
72
73 SkASSERT(glCtx->isValid());
74
kkinnunencfe62e32015-07-01 02:58:50 -070075 // Block NVPR from non-NVPR types.
djsollene4545212014-11-13 11:12:41 -080076 SkAutoTUnref<const GrGLInterface> glInterface(SkRef(glCtx->gl()));
kkinnunencfe62e32015-07-01 02:58:50 -070077 if (kNVPR_GLContextType != type) {
djsollene4545212014-11-13 11:12:41 -080078 glInterface.reset(GrGLInterfaceRemoveNVPR(glInterface));
79 if (!glInterface) {
halcanary96fcdcc2015-08-27 07:41:13 -070080 return nullptr;
djsollene4545212014-11-13 11:12:41 -080081 }
kkinnunen8b2b3802015-07-01 04:31:29 -070082 } else {
83 if (!glInterface->hasExtension("GL_NV_path_rendering")) {
halcanary96fcdcc2015-08-27 07:41:13 -070084 return nullptr;
kkinnunen8b2b3802015-07-01 04:31:29 -070085 }
djsollene4545212014-11-13 11:12:41 -080086 }
87
88 glCtx->makeCurrent();
89 GrBackendContext p3dctx = reinterpret_cast<GrBackendContext>(glInterface.get());
jvanvertha50e17a2015-08-12 12:19:36 -070090#ifdef SK_VULKAN
91 grCtx.reset(GrContext::Create(kVulkan_GrBackend, p3dctx, fGlobalOptions));
92#else
bsalomon682c2692015-05-22 14:01:46 -070093 grCtx.reset(GrContext::Create(kOpenGL_GrBackend, p3dctx, fGlobalOptions));
jvanvertha50e17a2015-08-12 12:19:36 -070094#endif
djsollene4545212014-11-13 11:12:41 -080095 if (!grCtx.get()) {
halcanary96fcdcc2015-08-27 07:41:13 -070096 return nullptr;
djsollene4545212014-11-13 11:12:41 -080097 }
kkinnunencfe62e32015-07-01 02:58:50 -070098 // Warn if path rendering support is not available for the NVPR type.
99 if (kNVPR_GLContextType == type) {
100 if (!grCtx->caps()->shaderCaps()->pathRenderingSupport()) {
jvanverth3e5f5552015-07-16 07:46:07 -0700101 GrGpu* gpu = grCtx->getGpu();
102 const GrGLContext* ctx = gpu->glContextForTesting();
103 if (ctx) {
104 const GrGLubyte* verUByte;
105 GR_GL_CALL_RET(ctx->interface(), verUByte, GetString(GR_GL_VERSION));
106 const char* ver = reinterpret_cast<const char*>(verUByte);
107 SkDebugf("\nWARNING: nvprmsaa config requested, but driver path rendering "
108 "support not available. Maybe update the driver? Your driver version "
109 "string: \"%s\"\n", ver);
110 } else {
111 SkDebugf("\nWARNING: nvprmsaa config requested, but driver path rendering "
112 "support not available.\n");
113 }
kkinnunencfe62e32015-07-01 02:58:50 -0700114 }
115 }
116
djsollene4545212014-11-13 11:12:41 -0800117 GPUContext& ctx = fContexts.push_back();
118 ctx.fGLContext = glCtx.get();
119 ctx.fGLContext->ref();
120 ctx.fGrContext = grCtx.get();
121 ctx.fGrContext->ref();
122 ctx.fType = type;
123 return ctx.fGrContext;
124}