xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrBackendUtils.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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 #include "src/gpu/ganesh/GrBackendUtils.h"
9 
10 #include "include/core/SkTextureCompressionType.h"
11 #include "include/gpu/ganesh/GrBackendSurface.h"
12 #include "include/gpu/ganesh/GrTypes.h"
13 #include "include/private/base/SkAssert.h" // IWYU pragma: keep
14 #include "include/private/gpu/ganesh/GrTypesPriv.h"
15 #include "src/gpu/DataUtils.h"
16 #include "src/gpu/ganesh/GrBackendSurfacePriv.h"
17 
18 #ifdef SK_DIRECT3D
19 #include "src/gpu/ganesh/d3d/GrD3DUtil.h"
20 #endif
21 
GrBackendFormatToCompressionType(const GrBackendFormat & format)22 SkTextureCompressionType GrBackendFormatToCompressionType(const GrBackendFormat& format) {
23     switch (format.backend()) {
24         case GrBackendApi::kOpenGL:
25         case GrBackendApi::kVulkan:
26         case GrBackendApi::kMetal:
27             return GrBackendSurfacePriv::GetBackendData(format)->compressionType();
28         case GrBackendApi::kDirect3D: {
29 #ifdef SK_DIRECT3D
30             DXGI_FORMAT dxgiFormat;
31             SkAssertResult(format.asDxgiFormat(&dxgiFormat));
32             switch (dxgiFormat) {
33                 case DXGI_FORMAT_BC1_UNORM:
34                     return SkTextureCompressionType::kBC1_RGBA8_UNORM;
35                 default:
36                     return SkTextureCompressionType::kNone;
37             }
38 #else
39             break;
40 #endif
41         }
42         case GrBackendApi::kMock: {
43             return format.asMockCompressionType();
44         }
45         case GrBackendApi::kUnsupported: {
46             break;
47         }
48     }
49     return SkTextureCompressionType::kNone;
50 }
51 
GrBackendFormatBytesPerBlock(const GrBackendFormat & format)52 size_t GrBackendFormatBytesPerBlock(const GrBackendFormat& format) {
53     switch (format.backend()) {
54         case GrBackendApi::kOpenGL:
55         case GrBackendApi::kVulkan:
56         case GrBackendApi::kMetal:
57             return GrBackendSurfacePriv::GetBackendData(format)->bytesPerBlock();
58         case GrBackendApi::kDirect3D: {
59 #ifdef SK_DIRECT3D
60             DXGI_FORMAT dxgiFormat;
61             SkAssertResult(format.asDxgiFormat(&dxgiFormat));
62             return GrDxgiFormatBytesPerBlock(dxgiFormat);
63 #else
64             break;
65 #endif
66         }
67         case GrBackendApi::kMock: {
68             SkTextureCompressionType compression = format.asMockCompressionType();
69             if (compression != SkTextureCompressionType::kNone) {
70                 return skgpu::CompressedRowBytes(compression, 1);
71             } else if (format.isMockStencilFormat()) {
72                 static constexpr int kMockStencilSize = 4;
73                 return kMockStencilSize;
74             }
75             return GrColorTypeBytesPerPixel(format.asMockColorType());
76         }
77         case GrBackendApi::kUnsupported: {
78             break;
79         }
80     }
81     return 0;
82 }
83 
GrBackendFormatBytesPerPixel(const GrBackendFormat & format)84 size_t GrBackendFormatBytesPerPixel(const GrBackendFormat& format) {
85     if (GrBackendFormatToCompressionType(format) != SkTextureCompressionType::kNone) {
86         return 0;
87     }
88     return GrBackendFormatBytesPerBlock(format);
89 }
90 
GrBackendFormatStencilBits(const GrBackendFormat & format)91 int GrBackendFormatStencilBits(const GrBackendFormat& format) {
92     switch (format.backend()) {
93         case GrBackendApi::kOpenGL:
94         case GrBackendApi::kVulkan:
95         case GrBackendApi::kMetal:
96             return GrBackendSurfacePriv::GetBackendData(format)->stencilBits();
97         case GrBackendApi::kDirect3D: {
98 #ifdef SK_DIRECT3D
99             DXGI_FORMAT dxgiFormat;
100             SkAssertResult(format.asDxgiFormat(&dxgiFormat));
101             return GrDxgiFormatStencilBits(dxgiFormat);
102 #else
103             break;
104 #endif
105         }
106         case GrBackendApi::kMock: {
107             if (format.isMockStencilFormat()) {
108                 static constexpr int kMockStencilBits = 8;
109                 return kMockStencilBits;
110             }
111             break;
112         }
113         case GrBackendApi::kUnsupported: {
114             break;
115         }
116     }
117     return 0;
118 }
119