1 /*
2 * Copyright 2022 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 #include "src/gpu/graphite/dawn/DawnSampler.h"
9
10 #include "include/core/SkSamplingOptions.h"
11 #include "src/gpu/graphite/dawn/DawnCaps.h"
12 #include "src/gpu/graphite/dawn/DawnSharedContext.h"
13
14 namespace skgpu::graphite {
15
16 namespace {
17
filter_mode_to_dawn_filter_mode(SkFilterMode mode)18 wgpu::FilterMode filter_mode_to_dawn_filter_mode(SkFilterMode mode) {
19 switch (mode) {
20 case SkFilterMode::kNearest:
21 return wgpu::FilterMode::Nearest;
22 case SkFilterMode::kLinear:
23 return wgpu::FilterMode::Linear;
24 }
25 SkUNREACHABLE;
26 }
27
mipmap_mode_to_dawn_filter_mode(SkMipmapMode mode)28 wgpu::FilterMode mipmap_mode_to_dawn_filter_mode(SkMipmapMode mode) {
29 switch (mode) {
30 case SkMipmapMode::kNone:
31 // Dawn doesn't have none filter mode.
32 return wgpu::FilterMode::Nearest;
33 case SkMipmapMode::kNearest:
34 return wgpu::FilterMode::Nearest;
35 case SkMipmapMode::kLinear:
36 return wgpu::FilterMode::Linear;
37 }
38 SkUNREACHABLE;
39 }
40
41 }
42
DawnSampler(const DawnSharedContext * sharedContext,wgpu::Sampler sampler)43 DawnSampler::DawnSampler(const DawnSharedContext* sharedContext,
44 wgpu::Sampler sampler)
45 : Sampler(sharedContext)
46 , fSampler(std::move(sampler)) {}
47
tile_mode_to_dawn_address_mode(SkTileMode tileMode)48 static inline wgpu::AddressMode tile_mode_to_dawn_address_mode(SkTileMode tileMode) {
49 switch (tileMode) {
50 case SkTileMode::kClamp:
51 return wgpu::AddressMode::ClampToEdge;
52 case SkTileMode::kRepeat:
53 return wgpu::AddressMode::Repeat;
54 case SkTileMode::kMirror:
55 return wgpu::AddressMode::MirrorRepeat;
56 case SkTileMode::kDecal:
57 // Dawn doesn't support this mode.
58 return wgpu::AddressMode::ClampToEdge;
59 }
60 SkUNREACHABLE;
61 }
62
Make(const DawnSharedContext * sharedContext,const SkSamplingOptions & samplingOptions,SkTileMode xTileMode,SkTileMode yTileMode)63 sk_sp<DawnSampler> DawnSampler::Make(const DawnSharedContext* sharedContext,
64 const SkSamplingOptions& samplingOptions,
65 SkTileMode xTileMode,
66 SkTileMode yTileMode) {
67 wgpu::SamplerDescriptor desc;
68 desc.addressModeU = tile_mode_to_dawn_address_mode(xTileMode);
69 desc.addressModeV = tile_mode_to_dawn_address_mode(yTileMode);
70 desc.magFilter = filter_mode_to_dawn_filter_mode(samplingOptions.filter);
71 desc.minFilter = desc.magFilter;
72 desc.mipmapFilter = mipmap_mode_to_dawn_filter_mode(samplingOptions.mipmap);
73 desc.lodMinClamp = 0.0f;
74 desc.lodMaxClamp = FLT_MAX;
75 desc.maxAnisotropy = 1;
76 desc.compare = wgpu::CompareFunction::Undefined;
77
78 #ifdef SK_DEBUG
79 static const char* tileModeLabels[] = {
80 "Clamp",
81 "Repeat",
82 "Mirror",
83 "Decal"
84 };
85 static const char* minMagFilterLabels[] = {
86 "Nearest",
87 "Linear"
88 };
89 static const char* mipFilterLabels[] = {
90 "MipNone",
91 "MipNearest",
92 "MipLinear"
93 };
94 std::string label;
95 label.append("X").append(tileModeLabels[static_cast<int>(xTileMode)]);
96 label.append("Y").append(tileModeLabels[static_cast<int>(yTileMode)]);
97 label.append(minMagFilterLabels[static_cast<int>(samplingOptions.filter)]);
98 label.append(mipFilterLabels[static_cast<int>(samplingOptions.mipmap)]);
99 desc.label = label.c_str();
100 #endif
101
102 auto sampler = sharedContext->device().CreateSampler(&desc);
103 if (!sampler) {
104 return {};
105 }
106 return sk_sp<DawnSampler>(new DawnSampler(sharedContext, std::move(sampler)));
107 }
108
freeGpuData()109 void DawnSampler::freeGpuData() {
110 fSampler = nullptr;
111 }
112
113 } // namespace skgpu::graphite
114
115