blob: 424b3fda3a86b6047ee45d4fbe94ca056b86a3ff [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,
27 GrGLStandard forcedGpuAPI) {
djsollene4545212014-11-13 11:12:41 -080028 for (int i = 0; i < fContexts.count(); ++i) {
29 if (forcedGpuAPI != kNone_GrGLStandard &&
kkinnunen179a8f52015-11-20 13:32:24 -080030 forcedGpuAPI != fContexts[i]->fGLContext->gl()->fStandard)
djsollene4545212014-11-13 11:12:41 -080031 continue;
32
kkinnunen179a8f52015-11-20 13:32:24 -080033 if (fContexts[i]->fType == type) {
34 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) {
41 case kNVPR_GLContextType: // fallthru
42 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()));
kkinnunencfe62e32015-07-01 02:58:50 -070078 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 }
kkinnunen8b2b3802015-07-01 04:31:29 -070083 } else {
84 if (!glInterface->hasExtension("GL_NV_path_rendering")) {
halcanary96fcdcc2015-08-27 07:41:13 -070085 return nullptr;
kkinnunen8b2b3802015-07-01 04:31:29 -070086 }
djsollene4545212014-11-13 11:12:41 -080087 }
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 }
kkinnunencfe62e32015-07-01 02:58:50 -070099 // Warn if path rendering support is not available for the NVPR type.
100 if (kNVPR_GLContextType == type) {
101 if (!grCtx->caps()->shaderCaps()->pathRenderingSupport()) {
jvanverth3e5f5552015-07-16 07:46:07 -0700102 GrGpu* gpu = grCtx->getGpu();
103 const GrGLContext* ctx = gpu->glContextForTesting();
104 if (ctx) {
105 const GrGLubyte* verUByte;
106 GR_GL_CALL_RET(ctx->interface(), verUByte, GetString(GR_GL_VERSION));
107 const char* ver = reinterpret_cast<const char*>(verUByte);
108 SkDebugf("\nWARNING: nvprmsaa config requested, but driver path rendering "
109 "support not available. Maybe update the driver? Your driver version "
110 "string: \"%s\"\n", ver);
111 } else {
112 SkDebugf("\nWARNING: nvprmsaa config requested, but driver path rendering "
113 "support not available.\n");
114 }
kkinnunencfe62e32015-07-01 02:58:50 -0700115 }
116 }
117
kkinnunen179a8f52015-11-20 13:32:24 -0800118 ContextInfo* ctx = fContexts.emplace_back(new ContextInfo);
119 ctx->fGLContext = SkRef(glCtx.get());
120 ctx->fGrContext = SkRef(grCtx.get());
121 ctx->fType = type;
122 return ctx;
djsollene4545212014-11-13 11:12:41 -0800123}