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