1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "tools/window/GraphiteDawnWindowContext.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "tools/window/win/WindowContextFactory_win.h"
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker using skwindow::DisplayParams;
12*c8dee2aaSAndroid Build Coastguard Worker using skwindow::internal::GraphiteDawnWindowContext;
13*c8dee2aaSAndroid Build Coastguard Worker
14*c8dee2aaSAndroid Build Coastguard Worker namespace {
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Worker class GraphiteDawnD3D12WindowContext_win : public GraphiteDawnWindowContext {
17*c8dee2aaSAndroid Build Coastguard Worker public:
18*c8dee2aaSAndroid Build Coastguard Worker GraphiteDawnD3D12WindowContext_win(HWND hwnd, std::unique_ptr<const DisplayParams> params);
19*c8dee2aaSAndroid Build Coastguard Worker
20*c8dee2aaSAndroid Build Coastguard Worker ~GraphiteDawnD3D12WindowContext_win() override;
21*c8dee2aaSAndroid Build Coastguard Worker
22*c8dee2aaSAndroid Build Coastguard Worker bool onInitializeContext() override;
23*c8dee2aaSAndroid Build Coastguard Worker void onDestroyContext() override;
24*c8dee2aaSAndroid Build Coastguard Worker void resize(int w, int h) override;
25*c8dee2aaSAndroid Build Coastguard Worker
26*c8dee2aaSAndroid Build Coastguard Worker private:
27*c8dee2aaSAndroid Build Coastguard Worker HWND fWindow;
28*c8dee2aaSAndroid Build Coastguard Worker };
29*c8dee2aaSAndroid Build Coastguard Worker
GraphiteDawnD3D12WindowContext_win(HWND hwnd,std::unique_ptr<const DisplayParams> params)30*c8dee2aaSAndroid Build Coastguard Worker GraphiteDawnD3D12WindowContext_win::GraphiteDawnD3D12WindowContext_win(
31*c8dee2aaSAndroid Build Coastguard Worker HWND hwnd, std::unique_ptr<const DisplayParams> params)
32*c8dee2aaSAndroid Build Coastguard Worker : GraphiteDawnWindowContext(std::move(params), wgpu::TextureFormat::BGRA8Unorm)
33*c8dee2aaSAndroid Build Coastguard Worker , fWindow(hwnd) {
34*c8dee2aaSAndroid Build Coastguard Worker RECT rect;
35*c8dee2aaSAndroid Build Coastguard Worker GetClientRect(hwnd, &rect);
36*c8dee2aaSAndroid Build Coastguard Worker this->initializeContext(rect.right - rect.left, rect.bottom - rect.top);
37*c8dee2aaSAndroid Build Coastguard Worker }
38*c8dee2aaSAndroid Build Coastguard Worker
~GraphiteDawnD3D12WindowContext_win()39*c8dee2aaSAndroid Build Coastguard Worker GraphiteDawnD3D12WindowContext_win::~GraphiteDawnD3D12WindowContext_win() {
40*c8dee2aaSAndroid Build Coastguard Worker this->destroyContext();
41*c8dee2aaSAndroid Build Coastguard Worker }
42*c8dee2aaSAndroid Build Coastguard Worker
onInitializeContext()43*c8dee2aaSAndroid Build Coastguard Worker bool GraphiteDawnD3D12WindowContext_win::onInitializeContext() {
44*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!!fWindow);
45*c8dee2aaSAndroid Build Coastguard Worker
46*c8dee2aaSAndroid Build Coastguard Worker auto device = this->createDevice(wgpu::BackendType::D3D12);
47*c8dee2aaSAndroid Build Coastguard Worker if (!device) {
48*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(device);
49*c8dee2aaSAndroid Build Coastguard Worker return false;
50*c8dee2aaSAndroid Build Coastguard Worker }
51*c8dee2aaSAndroid Build Coastguard Worker
52*c8dee2aaSAndroid Build Coastguard Worker wgpu::SurfaceDescriptorFromWindowsHWND surfaceChainedDesc;
53*c8dee2aaSAndroid Build Coastguard Worker surfaceChainedDesc.hwnd = fWindow;
54*c8dee2aaSAndroid Build Coastguard Worker surfaceChainedDesc.hinstance = GetModuleHandle(nullptr);
55*c8dee2aaSAndroid Build Coastguard Worker wgpu::SurfaceDescriptor surfaceDesc;
56*c8dee2aaSAndroid Build Coastguard Worker surfaceDesc.nextInChain = &surfaceChainedDesc;
57*c8dee2aaSAndroid Build Coastguard Worker
58*c8dee2aaSAndroid Build Coastguard Worker auto surface = wgpu::Instance(fInstance->Get()).CreateSurface(&surfaceDesc);
59*c8dee2aaSAndroid Build Coastguard Worker if (!surface) {
60*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(false);
61*c8dee2aaSAndroid Build Coastguard Worker return false;
62*c8dee2aaSAndroid Build Coastguard Worker }
63*c8dee2aaSAndroid Build Coastguard Worker
64*c8dee2aaSAndroid Build Coastguard Worker fDevice = std::move(device);
65*c8dee2aaSAndroid Build Coastguard Worker fSurface = std::move(surface);
66*c8dee2aaSAndroid Build Coastguard Worker configureSurface();
67*c8dee2aaSAndroid Build Coastguard Worker
68*c8dee2aaSAndroid Build Coastguard Worker return true;
69*c8dee2aaSAndroid Build Coastguard Worker }
70*c8dee2aaSAndroid Build Coastguard Worker
onDestroyContext()71*c8dee2aaSAndroid Build Coastguard Worker void GraphiteDawnD3D12WindowContext_win::onDestroyContext() {}
72*c8dee2aaSAndroid Build Coastguard Worker
resize(int w,int h)73*c8dee2aaSAndroid Build Coastguard Worker void GraphiteDawnD3D12WindowContext_win::resize(int w, int h) {
74*c8dee2aaSAndroid Build Coastguard Worker configureSurface();
75*c8dee2aaSAndroid Build Coastguard Worker }
76*c8dee2aaSAndroid Build Coastguard Worker
77*c8dee2aaSAndroid Build Coastguard Worker } // anonymous namespace
78*c8dee2aaSAndroid Build Coastguard Worker
79*c8dee2aaSAndroid Build Coastguard Worker namespace skwindow {
80*c8dee2aaSAndroid Build Coastguard Worker
MakeGraphiteDawnD3D12ForWin(HWND hwnd,std::unique_ptr<const DisplayParams> params)81*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<WindowContext> MakeGraphiteDawnD3D12ForWin(
82*c8dee2aaSAndroid Build Coastguard Worker HWND hwnd, std::unique_ptr<const DisplayParams> params) {
83*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<WindowContext> ctx(
84*c8dee2aaSAndroid Build Coastguard Worker new GraphiteDawnD3D12WindowContext_win(hwnd, std::move(params)));
85*c8dee2aaSAndroid Build Coastguard Worker if (!ctx->isValid()) {
86*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
87*c8dee2aaSAndroid Build Coastguard Worker }
88*c8dee2aaSAndroid Build Coastguard Worker return ctx;
89*c8dee2aaSAndroid Build Coastguard Worker }
90*c8dee2aaSAndroid Build Coastguard Worker
91*c8dee2aaSAndroid Build Coastguard Worker } // namespace skwindow
92