• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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