1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/dawn/DawnUtilsPriv.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/dawn/DawnSharedContext.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #if defined(__EMSCRIPTEN__) 15*c8dee2aaSAndroid Build Coastguard Worker #include <emscripten.h> 16*c8dee2aaSAndroid Build Coastguard Worker #endif // __EMSCRIPTEN__ 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker // TODO: A lot of these values are not correct DawnFormatBytesPerBlock(wgpu::TextureFormat format)21*c8dee2aaSAndroid Build Coastguard Workersize_t DawnFormatBytesPerBlock(wgpu::TextureFormat format) { 22*c8dee2aaSAndroid Build Coastguard Worker switch (format) { 23*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::RGBA8Unorm: return 4; 24*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::BGRA8Unorm: return 4; 25*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::R8Unorm: return 1; 26*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::RGBA16Float: return 8; 27*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::R16Float: return 2; 28*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::RG8Unorm: return 2; 29*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::RGB10A2Unorm: return 4; 30*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::RG16Float: return 4; 31*c8dee2aaSAndroid Build Coastguard Worker // The depth stencil values are not neccessarily correct in Dawn since Dawn is allowed to 32*c8dee2aaSAndroid Build Coastguard Worker // implement Stencil8 as a real stencil8 or depth24stencil8 format. Similarly the depth in 33*c8dee2aaSAndroid Build Coastguard Worker // Depth24PlusStencil8 can either be a 24 bit value or Depth32Float value. There is also 34*c8dee2aaSAndroid Build Coastguard Worker // currently no way to query this in WebGPU so we just use the highest values here. 35*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::Stencil8: return 4; // could be backed by d24s8 36*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::Depth16Unorm: return 2; 37*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::Depth32Float: return 4; 38*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::Depth32FloatStencil8: return 5; 39*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::Depth24PlusStencil8: return 5; // could be backed by d32s8 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker #if !defined(__EMSCRIPTEN__) 42*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::R16Unorm: return 2; 43*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::RG16Unorm: return 4; 44*c8dee2aaSAndroid Build Coastguard Worker // Note: We don't actually know the size of external formats, so this 45*c8dee2aaSAndroid Build Coastguard Worker // is an arbitrary value. We will see external formats only in wrapped 46*c8dee2aaSAndroid Build Coastguard Worker // SkImages, so this won't impact Skia's internal budgeting. 47*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::External: 48*c8dee2aaSAndroid Build Coastguard Worker return 4; 49*c8dee2aaSAndroid Build Coastguard Worker #endif 50*c8dee2aaSAndroid Build Coastguard Worker default: 51*c8dee2aaSAndroid Build Coastguard Worker SkUNREACHABLE; 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker } 54*c8dee2aaSAndroid Build Coastguard Worker DawnFormatToCompressionType(wgpu::TextureFormat format)55*c8dee2aaSAndroid Build Coastguard WorkerSkTextureCompressionType DawnFormatToCompressionType(wgpu::TextureFormat format) { 56*c8dee2aaSAndroid Build Coastguard Worker switch (format) { 57*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::ETC2RGB8Unorm: return SkTextureCompressionType::kETC2_RGB8_UNORM; 58*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::BC1RGBAUnorm: return SkTextureCompressionType::kBC1_RGBA8_UNORM; 59*c8dee2aaSAndroid Build Coastguard Worker default: return SkTextureCompressionType::kNone; 60*c8dee2aaSAndroid Build Coastguard Worker } 61*c8dee2aaSAndroid Build Coastguard Worker } 62*c8dee2aaSAndroid Build Coastguard Worker DawnFormatChannels(wgpu::TextureFormat format)63*c8dee2aaSAndroid Build Coastguard Workeruint32_t DawnFormatChannels(wgpu::TextureFormat format) { 64*c8dee2aaSAndroid Build Coastguard Worker switch (format) { 65*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::RGBA8Unorm: return kRGBA_SkColorChannelFlags; 66*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::BGRA8Unorm: return kRGBA_SkColorChannelFlags; 67*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::R8Unorm: return kRed_SkColorChannelFlag; 68*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::RGBA16Float: return kRGBA_SkColorChannelFlags; 69*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::R16Float: return kRed_SkColorChannelFlag; 70*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::RG8Unorm: return kRG_SkColorChannelFlags; 71*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::RGB10A2Unorm: return kRGBA_SkColorChannelFlags; 72*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::RG16Float: return kRG_SkColorChannelFlags; 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker #if !defined(__EMSCRIPTEN__) 75*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::R16Unorm: return kRed_SkColorChannelFlag; 76*c8dee2aaSAndroid Build Coastguard Worker case wgpu::TextureFormat::RG16Unorm: return kRG_SkColorChannelFlags; 77*c8dee2aaSAndroid Build Coastguard Worker #endif 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker default: return 0; 80*c8dee2aaSAndroid Build Coastguard Worker } 81*c8dee2aaSAndroid Build Coastguard Worker SkUNREACHABLE; 82*c8dee2aaSAndroid Build Coastguard Worker } 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 85