1 /*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "tools/window/ANGLEWindowContext.h"
9 #include "tools/window/win/WindowContextFactory_win.h"
10
11 using skwindow::DisplayParams;
12 using skwindow::internal::ANGLEWindowContext;
13
14 namespace {
15
16 class ANGLEWindowContext_win : public ANGLEWindowContext {
17 public:
18 ANGLEWindowContext_win(HWND, const DisplayParams&);
19
20 protected:
21 EGLDisplay onGetEGLDisplay(
22 PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT) const override;
23 NativeWindowType onGetNativeWindow() const override;
24 SkISize onGetSize() const override;
25 int onGetStencilBits() const override;
26
27 private:
28 HWND fHWND;
29 HDC fHDC;
30 };
31
ANGLEWindowContext_win(HWND wnd,const DisplayParams & params)32 ANGLEWindowContext_win::ANGLEWindowContext_win(HWND wnd, const DisplayParams& params)
33 : ANGLEWindowContext(params), fHWND(wnd), fHDC(GetDC(fHWND)) {
34 this->initializeContext();
35 }
36
onGetEGLDisplay(PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT) const37 EGLDisplay ANGLEWindowContext_win::onGetEGLDisplay(
38 PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT) const {
39 // We currently only support D3D11 ANGLE.
40 static constexpr EGLint kType = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE;
41 static constexpr EGLint attribs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, kType, EGL_NONE};
42 return eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, fHDC, attribs);
43 }
44
onGetNativeWindow() const45 NativeWindowType ANGLEWindowContext_win::onGetNativeWindow() const { return fHWND; }
46
onGetStencilBits() const47 int ANGLEWindowContext_win::onGetStencilBits() const {
48 // use DescribePixelFormat to get the stencil depth.
49 int pixelFormat = GetPixelFormat(fHDC);
50 PIXELFORMATDESCRIPTOR pfd;
51 DescribePixelFormat(fHDC, pixelFormat, sizeof(pfd), &pfd);
52 return pfd.cStencilBits;
53 }
54
onGetSize() const55 SkISize ANGLEWindowContext_win::onGetSize() const {
56 RECT rect;
57 GetClientRect(fHWND, &rect);
58 return SkISize::Make(rect.right - rect.left, rect.bottom - rect.top);
59 }
60
61 } // anonymous namespace
62
63 namespace skwindow {
64
MakeANGLEForWin(HWND wnd,const DisplayParams & params)65 std::unique_ptr<WindowContext> MakeANGLEForWin(HWND wnd, const DisplayParams& params) {
66 std::unique_ptr<WindowContext> ctx(new ANGLEWindowContext_win(wnd, params));
67 if (!ctx->isValid()) {
68 return nullptr;
69 }
70 return ctx;
71 }
72
73 } // namespace skwindow
74