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 #ifndef GrD3DUtil_DEFINED 9 #define GrD3DUtil_DEFINED 10 11 #include "include/core/SkImage.h" 12 #include "include/gpu/GrTypes.h" 13 #include "include/gpu/d3d/GrD3DTypes.h" 14 #include "include/private/GrTypesPriv.h" 15 16 #define GR_D3D_CALL_ERRCHECK(X) \ 17 do { \ 18 HRESULT result = X; \ 19 SkASSERT(SUCCEEDED(result)); \ 20 if (!SUCCEEDED(result)) { \ 21 SkDebugf("Failed Direct3D call. Error: 0x%08x\n", result); \ 22 } \ 23 } while(false) 24 25 static constexpr bool operator==(const D3D12_CPU_DESCRIPTOR_HANDLE & first, 26 const D3D12_CPU_DESCRIPTOR_HANDLE & second) { 27 return first.ptr == second.ptr; 28 } 29 30 /** 31 * Returns true if the format is compressed. 32 */ 33 bool GrDxgiFormatIsCompressed(DXGI_FORMAT); 34 GrDxgiFormatChannels(DXGI_FORMAT format)35static constexpr uint32_t GrDxgiFormatChannels(DXGI_FORMAT format) { 36 switch (format) { 37 case DXGI_FORMAT_R8G8B8A8_UNORM: return kRGBA_SkColorChannelFlags; 38 case DXGI_FORMAT_R8_UNORM: return kRed_SkColorChannelFlag; 39 case DXGI_FORMAT_B8G8R8A8_UNORM: return kRGBA_SkColorChannelFlags; 40 case DXGI_FORMAT_B5G6R5_UNORM: return kRGB_SkColorChannelFlags; 41 case DXGI_FORMAT_R16G16B16A16_FLOAT: return kRGBA_SkColorChannelFlags; 42 case DXGI_FORMAT_R16_FLOAT: return kRed_SkColorChannelFlag; 43 case DXGI_FORMAT_R8G8_UNORM: return kRG_SkColorChannelFlags; 44 case DXGI_FORMAT_R10G10B10A2_UNORM: return kRGBA_SkColorChannelFlags; 45 case DXGI_FORMAT_B4G4R4A4_UNORM: return kRGBA_SkColorChannelFlags; 46 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: return kRGBA_SkColorChannelFlags; 47 case DXGI_FORMAT_BC1_UNORM: return kRGBA_SkColorChannelFlags; 48 case DXGI_FORMAT_R16_UNORM: return kRed_SkColorChannelFlag; 49 case DXGI_FORMAT_R16G16_UNORM: return kRG_SkColorChannelFlags; 50 case DXGI_FORMAT_R16G16B16A16_UNORM: return kRGBA_SkColorChannelFlags; 51 case DXGI_FORMAT_R16G16_FLOAT: return kRG_SkColorChannelFlags; 52 case DXGI_FORMAT_D24_UNORM_S8_UINT: return 0; 53 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return 0; 54 55 default: return 0; 56 } 57 } 58 GrDxgiFormatBytesPerBlock(DXGI_FORMAT format)59static constexpr size_t GrDxgiFormatBytesPerBlock(DXGI_FORMAT format) { 60 switch (format) { 61 case DXGI_FORMAT_R8G8B8A8_UNORM: return 4; 62 case DXGI_FORMAT_R8_UNORM: return 1; 63 case DXGI_FORMAT_B8G8R8A8_UNORM: return 4; 64 case DXGI_FORMAT_B5G6R5_UNORM: return 2; 65 case DXGI_FORMAT_R16G16B16A16_FLOAT: return 8; 66 case DXGI_FORMAT_R16_FLOAT: return 2; 67 case DXGI_FORMAT_R8G8_UNORM: return 2; 68 case DXGI_FORMAT_R10G10B10A2_UNORM: return 4; 69 case DXGI_FORMAT_B4G4R4A4_UNORM: return 2; 70 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: return 4; 71 case DXGI_FORMAT_BC1_UNORM: return 8; 72 case DXGI_FORMAT_R16_UNORM: return 2; 73 case DXGI_FORMAT_R16G16_UNORM: return 4; 74 case DXGI_FORMAT_R16G16B16A16_UNORM: return 8; 75 case DXGI_FORMAT_R16G16_FLOAT: return 4; 76 case DXGI_FORMAT_D24_UNORM_S8_UINT: return 4; 77 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return 8; 78 79 default: return 0; 80 } 81 } 82 GrDxgiFormatStencilBits(DXGI_FORMAT format)83static constexpr int GrDxgiFormatStencilBits(DXGI_FORMAT format) { 84 switch (format) { 85 case DXGI_FORMAT_D24_UNORM_S8_UINT: 86 return 8; 87 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: 88 return 8; 89 default: 90 return 0; 91 } 92 } 93 94 #if defined(SK_DEBUG) || GR_TEST_UTILS GrDxgiFormatToStr(DXGI_FORMAT dxgiFormat)95static constexpr const char* GrDxgiFormatToStr(DXGI_FORMAT dxgiFormat) { 96 switch (dxgiFormat) { 97 case DXGI_FORMAT_R8G8B8A8_UNORM: return "R8G8B8A8_UNORM"; 98 case DXGI_FORMAT_R8_UNORM: return "R8_UNORM"; 99 case DXGI_FORMAT_B8G8R8A8_UNORM: return "B8G8R8A8_UNORM"; 100 case DXGI_FORMAT_B5G6R5_UNORM: return "R5G6B5_UNORM"; 101 case DXGI_FORMAT_R16G16B16A16_FLOAT: return "R16G16B16A16_FLOAT"; 102 case DXGI_FORMAT_R16_FLOAT: return "R16_FLOAT"; 103 case DXGI_FORMAT_R8G8_UNORM: return "R8G8_UNORM"; 104 case DXGI_FORMAT_R10G10B10A2_UNORM: return "R10G10B10A2_UNORM"; 105 case DXGI_FORMAT_B4G4R4A4_UNORM: return "B4G4R4A4_UNORM"; 106 case DXGI_FORMAT_R32G32B32A32_FLOAT: return "R32G32B32A32_FLOAT"; 107 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: return "R8G8B8A8_UNORM_SRGB"; 108 case DXGI_FORMAT_BC1_UNORM: return "BC1_UNORM"; 109 case DXGI_FORMAT_R16_UNORM: return "R16_UNORM"; 110 case DXGI_FORMAT_R16G16_UNORM: return "R16G16_UNORM"; 111 case DXGI_FORMAT_R16G16B16A16_UNORM: return "R16G16B16A16_UNORM"; 112 case DXGI_FORMAT_R16G16_FLOAT: return "R16G16_FLOAT"; 113 case DXGI_FORMAT_D24_UNORM_S8_UINT: return "D24_UNORM_S8_UINT"; 114 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return "D32_FLOAT_S8X24_UINT"; 115 116 default: return "Unknown"; 117 } 118 } 119 #endif 120 121 #endif 122