/* * Copyright 2020 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/gpu/ganesh/GrBackendUtils.h" #include "include/core/SkTextureCompressionType.h" #include "include/gpu/ganesh/GrBackendSurface.h" #include "include/gpu/ganesh/GrTypes.h" #include "include/private/base/SkAssert.h" // IWYU pragma: keep #include "include/private/gpu/ganesh/GrTypesPriv.h" #include "src/gpu/DataUtils.h" #include "src/gpu/ganesh/GrBackendSurfacePriv.h" #ifdef SK_DIRECT3D #include "src/gpu/ganesh/d3d/GrD3DUtil.h" #endif SkTextureCompressionType GrBackendFormatToCompressionType(const GrBackendFormat& format) { switch (format.backend()) { case GrBackendApi::kOpenGL: case GrBackendApi::kVulkan: case GrBackendApi::kMetal: return GrBackendSurfacePriv::GetBackendData(format)->compressionType(); case GrBackendApi::kDirect3D: { #ifdef SK_DIRECT3D DXGI_FORMAT dxgiFormat; SkAssertResult(format.asDxgiFormat(&dxgiFormat)); switch (dxgiFormat) { case DXGI_FORMAT_BC1_UNORM: return SkTextureCompressionType::kBC1_RGBA8_UNORM; default: return SkTextureCompressionType::kNone; } #else break; #endif } case GrBackendApi::kMock: { return format.asMockCompressionType(); } case GrBackendApi::kUnsupported: { break; } } return SkTextureCompressionType::kNone; } size_t GrBackendFormatBytesPerBlock(const GrBackendFormat& format) { switch (format.backend()) { case GrBackendApi::kOpenGL: case GrBackendApi::kVulkan: case GrBackendApi::kMetal: return GrBackendSurfacePriv::GetBackendData(format)->bytesPerBlock(); case GrBackendApi::kDirect3D: { #ifdef SK_DIRECT3D DXGI_FORMAT dxgiFormat; SkAssertResult(format.asDxgiFormat(&dxgiFormat)); return GrDxgiFormatBytesPerBlock(dxgiFormat); #else break; #endif } case GrBackendApi::kMock: { SkTextureCompressionType compression = format.asMockCompressionType(); if (compression != SkTextureCompressionType::kNone) { return skgpu::CompressedRowBytes(compression, 1); } else if (format.isMockStencilFormat()) { static constexpr int kMockStencilSize = 4; return kMockStencilSize; } return GrColorTypeBytesPerPixel(format.asMockColorType()); } case GrBackendApi::kUnsupported: { break; } } return 0; } size_t GrBackendFormatBytesPerPixel(const GrBackendFormat& format) { if (GrBackendFormatToCompressionType(format) != SkTextureCompressionType::kNone) { return 0; } return GrBackendFormatBytesPerBlock(format); } int GrBackendFormatStencilBits(const GrBackendFormat& format) { switch (format.backend()) { case GrBackendApi::kOpenGL: case GrBackendApi::kVulkan: case GrBackendApi::kMetal: return GrBackendSurfacePriv::GetBackendData(format)->stencilBits(); case GrBackendApi::kDirect3D: { #ifdef SK_DIRECT3D DXGI_FORMAT dxgiFormat; SkAssertResult(format.asDxgiFormat(&dxgiFormat)); return GrDxgiFormatStencilBits(dxgiFormat); #else break; #endif } case GrBackendApi::kMock: { if (format.isMockStencilFormat()) { static constexpr int kMockStencilBits = 8; return kMockStencilBits; } break; } case GrBackendApi::kUnsupported: { break; } } return 0; }