1cb93a386Sopenharmony_ci 2cb93a386Sopenharmony_ci/* 3cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 4cb93a386Sopenharmony_ci * 5cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 6cb93a386Sopenharmony_ci * found in the LICENSE file. 7cb93a386Sopenharmony_ci */ 8cb93a386Sopenharmony_ci 9cb93a386Sopenharmony_ci#include "include/gpu/gl/GrGLInterface.h" 10cb93a386Sopenharmony_ci#include "src/utils/win/SkWGL.h" 11cb93a386Sopenharmony_ci#include "tools/sk_app/GLWindowContext.h" 12cb93a386Sopenharmony_ci#include "tools/sk_app/win/WindowContextFactory_win.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ci#include <Windows.h> 15cb93a386Sopenharmony_ci#include <GL/gl.h> 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ciusing sk_app::GLWindowContext; 18cb93a386Sopenharmony_ciusing sk_app::DisplayParams; 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci#if defined(_M_ARM64) 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_cinamespace sk_app { 23cb93a386Sopenharmony_cinamespace window_context_factory { 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_cistd::unique_ptr<WindowContext> MakeGLForWin(HWND, const DisplayParams&) { return nullptr; } 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci} // namespace window_context_factory 28cb93a386Sopenharmony_ci} // namespace sk_app 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci#else 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_cinamespace { 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ciclass GLWindowContext_win : public GLWindowContext { 35cb93a386Sopenharmony_cipublic: 36cb93a386Sopenharmony_ci GLWindowContext_win(HWND, const DisplayParams&); 37cb93a386Sopenharmony_ci ~GLWindowContext_win() override; 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ciprotected: 40cb93a386Sopenharmony_ci void onSwapBuffers() override; 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci sk_sp<const GrGLInterface> onInitializeContext() override; 43cb93a386Sopenharmony_ci void onDestroyContext() override; 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ciprivate: 46cb93a386Sopenharmony_ci HWND fHWND; 47cb93a386Sopenharmony_ci HGLRC fHGLRC; 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci using INHERITED = GLWindowContext; 50cb93a386Sopenharmony_ci}; 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ciGLWindowContext_win::GLWindowContext_win(HWND wnd, const DisplayParams& params) 53cb93a386Sopenharmony_ci : INHERITED(params) 54cb93a386Sopenharmony_ci , fHWND(wnd) 55cb93a386Sopenharmony_ci , fHGLRC(NULL) { 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci // any config code here (particularly for msaa)? 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci this->initializeContext(); 60cb93a386Sopenharmony_ci} 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ciGLWindowContext_win::~GLWindowContext_win() { 63cb93a386Sopenharmony_ci this->destroyContext(); 64cb93a386Sopenharmony_ci} 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_cisk_sp<const GrGLInterface> GLWindowContext_win::onInitializeContext() { 67cb93a386Sopenharmony_ci HDC dc = GetDC(fHWND); 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci fHGLRC = SkCreateWGLContext(dc, fDisplayParams.fMSAASampleCount, false /* deepColor */, 70cb93a386Sopenharmony_ci kGLPreferCompatibilityProfile_SkWGLContextRequest); 71cb93a386Sopenharmony_ci if (NULL == fHGLRC) { 72cb93a386Sopenharmony_ci return nullptr; 73cb93a386Sopenharmony_ci } 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci SkWGLExtensions extensions; 76cb93a386Sopenharmony_ci if (extensions.hasExtension(dc, "WGL_EXT_swap_control")) { 77cb93a386Sopenharmony_ci extensions.swapInterval(fDisplayParams.fDisableVsync ? 0 : 1); 78cb93a386Sopenharmony_ci } 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci // Look to see if RenderDoc is attached. If so, re-create the context with a core profile 81cb93a386Sopenharmony_ci if (wglMakeCurrent(dc, fHGLRC)) { 82cb93a386Sopenharmony_ci auto interface = GrGLMakeNativeInterface(); 83cb93a386Sopenharmony_ci bool renderDocAttached = interface->hasExtension("GL_EXT_debug_tool"); 84cb93a386Sopenharmony_ci interface.reset(nullptr); 85cb93a386Sopenharmony_ci if (renderDocAttached) { 86cb93a386Sopenharmony_ci wglDeleteContext(fHGLRC); 87cb93a386Sopenharmony_ci fHGLRC = SkCreateWGLContext(dc, fDisplayParams.fMSAASampleCount, false /* deepColor */, 88cb93a386Sopenharmony_ci kGLPreferCoreProfile_SkWGLContextRequest); 89cb93a386Sopenharmony_ci if (NULL == fHGLRC) { 90cb93a386Sopenharmony_ci return nullptr; 91cb93a386Sopenharmony_ci } 92cb93a386Sopenharmony_ci } 93cb93a386Sopenharmony_ci } 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ci if (wglMakeCurrent(dc, fHGLRC)) { 96cb93a386Sopenharmony_ci glClearStencil(0); 97cb93a386Sopenharmony_ci glClearColor(0, 0, 0, 0); 98cb93a386Sopenharmony_ci glStencilMask(0xffffffff); 99cb93a386Sopenharmony_ci glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ci // use DescribePixelFormat to get the stencil and color bit depth. 102cb93a386Sopenharmony_ci int pixelFormat = GetPixelFormat(dc); 103cb93a386Sopenharmony_ci PIXELFORMATDESCRIPTOR pfd; 104cb93a386Sopenharmony_ci DescribePixelFormat(dc, pixelFormat, sizeof(pfd), &pfd); 105cb93a386Sopenharmony_ci fStencilBits = pfd.cStencilBits; 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_ci // Get sample count if the MSAA WGL extension is present 108cb93a386Sopenharmony_ci if (extensions.hasExtension(dc, "WGL_ARB_multisample")) { 109cb93a386Sopenharmony_ci static const int kSampleCountAttr = SK_WGL_SAMPLES; 110cb93a386Sopenharmony_ci extensions.getPixelFormatAttribiv(dc, 111cb93a386Sopenharmony_ci pixelFormat, 112cb93a386Sopenharmony_ci 0, 113cb93a386Sopenharmony_ci 1, 114cb93a386Sopenharmony_ci &kSampleCountAttr, 115cb93a386Sopenharmony_ci &fSampleCount); 116cb93a386Sopenharmony_ci fSampleCount = std::max(fSampleCount, 1); 117cb93a386Sopenharmony_ci } else { 118cb93a386Sopenharmony_ci fSampleCount = 1; 119cb93a386Sopenharmony_ci } 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ci RECT rect; 122cb93a386Sopenharmony_ci GetClientRect(fHWND, &rect); 123cb93a386Sopenharmony_ci fWidth = rect.right - rect.left; 124cb93a386Sopenharmony_ci fHeight = rect.bottom - rect.top; 125cb93a386Sopenharmony_ci glViewport(0, 0, fWidth, fHeight); 126cb93a386Sopenharmony_ci } 127cb93a386Sopenharmony_ci return GrGLMakeNativeInterface(); 128cb93a386Sopenharmony_ci} 129cb93a386Sopenharmony_ci 130cb93a386Sopenharmony_ci 131cb93a386Sopenharmony_civoid GLWindowContext_win::onDestroyContext() { 132cb93a386Sopenharmony_ci wglDeleteContext(fHGLRC); 133cb93a386Sopenharmony_ci fHGLRC = NULL; 134cb93a386Sopenharmony_ci} 135cb93a386Sopenharmony_ci 136cb93a386Sopenharmony_ci 137cb93a386Sopenharmony_civoid GLWindowContext_win::onSwapBuffers() { 138cb93a386Sopenharmony_ci HDC dc = GetDC((HWND)fHWND); 139cb93a386Sopenharmony_ci SwapBuffers(dc); 140cb93a386Sopenharmony_ci ReleaseDC((HWND)fHWND, dc); 141cb93a386Sopenharmony_ci} 142cb93a386Sopenharmony_ci 143cb93a386Sopenharmony_ci 144cb93a386Sopenharmony_ci} // anonymous namespace 145cb93a386Sopenharmony_ci 146cb93a386Sopenharmony_cinamespace sk_app { 147cb93a386Sopenharmony_cinamespace window_context_factory { 148cb93a386Sopenharmony_ci 149cb93a386Sopenharmony_cistd::unique_ptr<WindowContext> MakeGLForWin(HWND wnd, const DisplayParams& params) { 150cb93a386Sopenharmony_ci std::unique_ptr<WindowContext> ctx(new GLWindowContext_win(wnd, params)); 151cb93a386Sopenharmony_ci if (!ctx->isValid()) { 152cb93a386Sopenharmony_ci return nullptr; 153cb93a386Sopenharmony_ci } 154cb93a386Sopenharmony_ci return ctx; 155cb93a386Sopenharmony_ci} 156cb93a386Sopenharmony_ci 157cb93a386Sopenharmony_ci} // namespace window_context_factory 158cb93a386Sopenharmony_ci} // namespace sk_app 159cb93a386Sopenharmony_ci 160cb93a386Sopenharmony_ci#endif 161