xref: /aosp_15_r20/external/skia/tools/window/win/GraphiteDawnD3D12WindowContext_win.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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