2 * Copyright 2020 Google LLC
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #include "src/gpu/ganesh/GrBackendUtils.h"
10 #include "src/gpu/ganesh/GrDataUtils.h"
13 #include "src/gpu/ganesh/gl/GrGLUtil.h"
17 #include "src/gpu/ganesh/vk/GrVkUtil.h"
21 #include "src/gpu/ganesh/d3d/GrD3DUtil.h"
25 #include "src/gpu/ganesh/mtl/GrMtlCppUtil.h"
29 #include "src/gpu/ganesh/dawn/GrDawnUtil.h"
32 SkImage::CompressionType GrBackendFormatToCompressionType(const GrBackendFormat& format) {
33 switch (format.backend()) {
34 case GrBackendApi::kOpenGL: {
36 GrGLFormat glFormat = format.asGLFormat();
38 case GrGLFormat::kCOMPRESSED_ETC1_RGB8:
39 case GrGLFormat::kCOMPRESSED_RGB8_ETC2:
40 return SkImage::CompressionType::kETC2_RGB8_UNORM;
41 case GrGLFormat::kCOMPRESSED_RGB8_BC1:
42 return SkImage::CompressionType::kBC1_RGB8_UNORM;
43 case GrGLFormat::kCOMPRESSED_RGBA8_BC1:
44 return SkImage::CompressionType::kBC1_RGBA8_UNORM;
46 return SkImage::CompressionType::kNone;
51 case GrBackendApi::kVulkan: {
54 SkAssertResult(format.asVkFormat(&vkFormat));
56 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
57 return SkImage::CompressionType::kETC2_RGB8_UNORM;
58 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
59 return SkImage::CompressionType::kBC1_RGB8_UNORM;
60 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
61 return SkImage::CompressionType::kBC1_RGBA8_UNORM;
63 return SkImage::CompressionType::kNone;
68 case GrBackendApi::kMetal: {
70 return GrMtlBackendFormatToCompressionType(format);
74 case GrBackendApi::kDirect3D: {
76 DXGI_FORMAT dxgiFormat;
77 SkAssertResult(format.asDxgiFormat(&dxgiFormat));
79 case DXGI_FORMAT_BC1_UNORM:
80 return SkImage::CompressionType::kBC1_RGBA8_UNORM;
82 return SkImage::CompressionType::kNone;
87 case GrBackendApi::kDawn: {
88 return SkImage::CompressionType::kNone;
90 case GrBackendApi::kMock: {
91 return format.asMockCompressionType();
94 return SkImage::CompressionType::kNone;
97 size_t GrBackendFormatBytesPerBlock(const GrBackendFormat& format) {
98 switch (format.backend()) {
99 case GrBackendApi::kOpenGL: {
101 GrGLFormat glFormat = format.asGLFormat();
102 return GrGLFormatBytesPerBlock(glFormat);
106 case GrBackendApi::kVulkan: {
109 SkAssertResult(format.asVkFormat(&vkFormat));
110 return GrVkFormatBytesPerBlock(vkFormat);
114 case GrBackendApi::kMetal: {
116 return GrMtlBackendFormatBytesPerBlock(format);
120 case GrBackendApi::kDirect3D: {
122 DXGI_FORMAT dxgiFormat;
123 SkAssertResult(format.asDxgiFormat(&dxgiFormat));
124 return GrDxgiFormatBytesPerBlock(dxgiFormat);
128 case GrBackendApi::kDawn: {
130 wgpu::TextureFormat dawnFormat;
131 SkAssertResult(format.asDawnFormat(&dawnFormat));
132 return GrDawnBytesPerBlock(dawnFormat);
136 case GrBackendApi::kMock: {
137 SkImage::CompressionType compression = format.asMockCompressionType();
138 if (compression != SkImage::CompressionType::kNone) {
139 return GrCompressedRowBytes(compression, 1);
140 } else if (format.isMockStencilFormat()) {
141 static constexpr int kMockStencilSize = 4;
142 return kMockStencilSize;
144 return GrColorTypeBytesPerPixel(format.asMockColorType());
150 size_t GrBackendFormatBytesPerPixel(const GrBackendFormat& format) {
151 if (GrBackendFormatToCompressionType(format) != SkImage::CompressionType::kNone) {
154 return GrBackendFormatBytesPerBlock(format);
157 int GrBackendFormatStencilBits(const GrBackendFormat& format) {
158 switch (format.backend()) {
159 case GrBackendApi::kOpenGL: {
161 GrGLFormat glFormat = format.asGLFormat();
162 return GrGLFormatStencilBits(glFormat);
166 case GrBackendApi::kVulkan: {
169 SkAssertResult(format.asVkFormat(&vkFormat));
170 return GrVkFormatStencilBits(vkFormat);
174 case GrBackendApi::kMetal: {
176 return GrMtlBackendFormatStencilBits(format);
180 case GrBackendApi::kDirect3D: {
182 DXGI_FORMAT dxgiFormat;
183 SkAssertResult(format.asDxgiFormat(&dxgiFormat));
184 return GrDxgiFormatStencilBits(dxgiFormat);
188 case GrBackendApi::kDawn: {
190 wgpu::TextureFormat dawnFormat;
191 SkAssertResult(format.asDawnFormat(&dawnFormat));
192 return GrDawnFormatStencilBits(dawnFormat);
196 case GrBackendApi::kMock: {
197 if (format.isMockStencilFormat()) {
198 static constexpr int kMockStencilBits = 8;
199 return kMockStencilBits;