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