1 /*
2 * Copyright 2020 Google LLC
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 #ifndef GrD3DUtil_DEFINED
9 #define GrD3DUtil_DEFINED
10
11 #include "include/core/SkImage.h"
12 #include "include/gpu/ganesh/GrTypes.h"
13 #include "include/gpu/ganesh/d3d/GrD3DTypes.h"
14 #include "include/private/gpu/ganesh/GrTypesPriv.h"
15
16 #include <string>
17
18 #define GR_D3D_CALL_ERRCHECK(X) \
19 do { \
20 HRESULT result = X; \
21 SkASSERT(SUCCEEDED(result)); \
22 if (!SUCCEEDED(result)) { \
23 SkDebugf("Failed Direct3D call. Error: 0x%08lx\n", result); \
24 } \
25 } while (false)
26
27 static constexpr bool operator==(const D3D12_CPU_DESCRIPTOR_HANDLE & first,
28 const D3D12_CPU_DESCRIPTOR_HANDLE & second) {
29 return first.ptr == second.ptr;
30 }
31
32 /**
33 * Returns true if the format is compressed.
34 */
35 bool GrDxgiFormatIsCompressed(DXGI_FORMAT);
36
GrDxgiFormatChannels(DXGI_FORMAT format)37 static constexpr uint32_t GrDxgiFormatChannels(DXGI_FORMAT format) {
38 switch (format) {
39 case DXGI_FORMAT_R8G8B8A8_UNORM: return kRGBA_SkColorChannelFlags;
40 case DXGI_FORMAT_R8_UNORM: return kRed_SkColorChannelFlag;
41 case DXGI_FORMAT_B8G8R8A8_UNORM: return kRGBA_SkColorChannelFlags;
42 case DXGI_FORMAT_B5G6R5_UNORM: return kRGB_SkColorChannelFlags;
43 case DXGI_FORMAT_R16G16B16A16_FLOAT: return kRGBA_SkColorChannelFlags;
44 case DXGI_FORMAT_R16_FLOAT: return kRed_SkColorChannelFlag;
45 case DXGI_FORMAT_R8G8_UNORM: return kRG_SkColorChannelFlags;
46 case DXGI_FORMAT_R10G10B10A2_UNORM: return kRGBA_SkColorChannelFlags;
47 case DXGI_FORMAT_B4G4R4A4_UNORM: return kRGBA_SkColorChannelFlags;
48 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: return kRGBA_SkColorChannelFlags;
49 case DXGI_FORMAT_BC1_UNORM: return kRGBA_SkColorChannelFlags;
50 case DXGI_FORMAT_R16_UNORM: return kRed_SkColorChannelFlag;
51 case DXGI_FORMAT_R16G16_UNORM: return kRG_SkColorChannelFlags;
52 case DXGI_FORMAT_R16G16B16A16_UNORM: return kRGBA_SkColorChannelFlags;
53 case DXGI_FORMAT_R16G16_FLOAT: return kRG_SkColorChannelFlags;
54 case DXGI_FORMAT_D24_UNORM_S8_UINT: return 0;
55 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return 0;
56
57 default: return 0;
58 }
59 }
60
GrDxgiFormatDesc(DXGI_FORMAT format)61 static constexpr GrColorFormatDesc GrDxgiFormatDesc(DXGI_FORMAT format) {
62 switch (format) {
63 case DXGI_FORMAT_R8G8B8A8_UNORM:
64 return GrColorFormatDesc::MakeRGBA(8, GrColorTypeEncoding::kUnorm);
65 case DXGI_FORMAT_R8_UNORM:
66 return GrColorFormatDesc::MakeR(8, GrColorTypeEncoding::kUnorm);
67 case DXGI_FORMAT_B8G8R8A8_UNORM:
68 return GrColorFormatDesc::MakeRGBA(8, GrColorTypeEncoding::kUnorm);
69 case DXGI_FORMAT_B5G6R5_UNORM:
70 return GrColorFormatDesc::MakeRGB(5, 6, 5, GrColorTypeEncoding::kUnorm);
71 case DXGI_FORMAT_R16G16B16A16_FLOAT:
72 return GrColorFormatDesc::MakeRGBA(16, GrColorTypeEncoding::kFloat);
73 case DXGI_FORMAT_R16_FLOAT:
74 return GrColorFormatDesc::MakeR(16, GrColorTypeEncoding::kFloat);
75 case DXGI_FORMAT_R8G8_UNORM:
76 return GrColorFormatDesc::MakeRG(8, GrColorTypeEncoding::kUnorm);
77 case DXGI_FORMAT_R10G10B10A2_UNORM:
78 return GrColorFormatDesc::MakeRGBA(10, 2, GrColorTypeEncoding::kUnorm);
79 case DXGI_FORMAT_B4G4R4A4_UNORM:
80 return GrColorFormatDesc::MakeRGBA(4, GrColorTypeEncoding::kUnorm);
81 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
82 return GrColorFormatDesc::MakeRGBA(8, GrColorTypeEncoding::kSRGBUnorm);
83 case DXGI_FORMAT_R16_UNORM:
84 return GrColorFormatDesc::MakeR(16, GrColorTypeEncoding::kUnorm);
85 case DXGI_FORMAT_R16G16_UNORM:
86 return GrColorFormatDesc::MakeRG(16, GrColorTypeEncoding::kUnorm);
87 case DXGI_FORMAT_R16G16B16A16_UNORM:
88 return GrColorFormatDesc::MakeRGBA(16, GrColorTypeEncoding::kUnorm);
89 case DXGI_FORMAT_R16G16_FLOAT:
90 return GrColorFormatDesc::MakeRG(16, GrColorTypeEncoding::kFloat);
91
92 // Compressed texture formats are not expected to have a description.
93 case DXGI_FORMAT_BC1_UNORM: return GrColorFormatDesc::MakeInvalid();
94
95 // This type only describes color channels.
96 case DXGI_FORMAT_D24_UNORM_S8_UINT: return GrColorFormatDesc::MakeInvalid();
97 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return GrColorFormatDesc::MakeInvalid();
98
99 default: return GrColorFormatDesc::MakeInvalid();
100 }
101 }
102
GrDxgiFormatBytesPerBlock(DXGI_FORMAT format)103 static constexpr size_t GrDxgiFormatBytesPerBlock(DXGI_FORMAT format) {
104 switch (format) {
105 case DXGI_FORMAT_R8G8B8A8_UNORM: return 4;
106 case DXGI_FORMAT_R8_UNORM: return 1;
107 case DXGI_FORMAT_B8G8R8A8_UNORM: return 4;
108 case DXGI_FORMAT_B5G6R5_UNORM: return 2;
109 case DXGI_FORMAT_R16G16B16A16_FLOAT: return 8;
110 case DXGI_FORMAT_R16_FLOAT: return 2;
111 case DXGI_FORMAT_R8G8_UNORM: return 2;
112 case DXGI_FORMAT_R10G10B10A2_UNORM: return 4;
113 case DXGI_FORMAT_B4G4R4A4_UNORM: return 2;
114 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: return 4;
115 case DXGI_FORMAT_BC1_UNORM: return 8;
116 case DXGI_FORMAT_R16_UNORM: return 2;
117 case DXGI_FORMAT_R16G16_UNORM: return 4;
118 case DXGI_FORMAT_R16G16B16A16_UNORM: return 8;
119 case DXGI_FORMAT_R16G16_FLOAT: return 4;
120 case DXGI_FORMAT_D24_UNORM_S8_UINT: return 4;
121 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return 8;
122
123 default: return 0;
124 }
125 }
126
GrDxgiFormatStencilBits(DXGI_FORMAT format)127 static constexpr int GrDxgiFormatStencilBits(DXGI_FORMAT format) {
128 switch (format) {
129 case DXGI_FORMAT_D24_UNORM_S8_UINT:
130 return 8;
131 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
132 return 8;
133 default:
134 return 0;
135 }
136 }
137
138 #if defined(SK_DEBUG) || defined(GPU_TEST_UTILS)
GrDxgiFormatToStr(DXGI_FORMAT dxgiFormat)139 static constexpr const char* GrDxgiFormatToStr(DXGI_FORMAT dxgiFormat) {
140 switch (dxgiFormat) {
141 case DXGI_FORMAT_R8G8B8A8_UNORM: return "R8G8B8A8_UNORM";
142 case DXGI_FORMAT_R8_UNORM: return "R8_UNORM";
143 case DXGI_FORMAT_B8G8R8A8_UNORM: return "B8G8R8A8_UNORM";
144 case DXGI_FORMAT_B5G6R5_UNORM: return "R5G6B5_UNORM";
145 case DXGI_FORMAT_R16G16B16A16_FLOAT: return "R16G16B16A16_FLOAT";
146 case DXGI_FORMAT_R16_FLOAT: return "R16_FLOAT";
147 case DXGI_FORMAT_R8G8_UNORM: return "R8G8_UNORM";
148 case DXGI_FORMAT_R10G10B10A2_UNORM: return "R10G10B10A2_UNORM";
149 case DXGI_FORMAT_B4G4R4A4_UNORM: return "B4G4R4A4_UNORM";
150 case DXGI_FORMAT_R32G32B32A32_FLOAT: return "R32G32B32A32_FLOAT";
151 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: return "R8G8B8A8_UNORM_SRGB";
152 case DXGI_FORMAT_BC1_UNORM: return "BC1_UNORM";
153 case DXGI_FORMAT_R16_UNORM: return "R16_UNORM";
154 case DXGI_FORMAT_R16G16_UNORM: return "R16G16_UNORM";
155 case DXGI_FORMAT_R16G16B16A16_UNORM: return "R16G16B16A16_UNORM";
156 case DXGI_FORMAT_R16G16_FLOAT: return "R16G16_FLOAT";
157 case DXGI_FORMAT_D24_UNORM_S8_UINT: return "D24_UNORM_S8_UINT";
158 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return "D32_FLOAT_S8X24_UINT";
159
160 default: return "Unknown";
161 }
162 }
163 #endif
164
165 std::wstring GrD3DMultiByteToWide(const std::string& str);
166
167 #endif
168