Changeset 291758 in webkit
- Timestamp:
- Mar 23, 2022, 11:58:22 AM (5 years ago)
- Location:
- trunk/Source/WebGPU
- Files:
-
- 2 edited
-
ChangeLog (modified) (1 diff)
-
WebGPU/Sampler.mm (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebGPU/ChangeLog
r291701 r291758 1 2022-03-23 Myles C. Maxfield <mmaxfield@apple.com> 2 3 [WebGPU] Clean up implementation of Device::createSampler() 4 https://bugs.webkit.org/show_bug.cgi?id=238250 5 6 Reviewed by Darin Adler. 7 8 Refactor repeated code into reusable functions. 9 10 * WebGPU/Sampler.mm: 11 (WebGPU::addressMode): 12 (WebGPU::minMagFilter): 13 (WebGPU::mipFilter): 14 (WebGPU::compareFunction): 15 (WebGPU::Device::createSampler): 16 1 17 2022-03-22 Myles C. Maxfield <mmaxfield@apple.com> 2 18 -
trunk/Source/WebGPU/WebGPU/Sampler.mm
r291687 r291758 63 63 } 64 64 65 static std::optional<MTLSamplerAddressMode> addressMode(WGPUAddressMode addressMode) 66 { 67 switch (addressMode) { 68 case WGPUAddressMode_Repeat: 69 return MTLSamplerAddressModeRepeat; 70 case WGPUAddressMode_MirrorRepeat: 71 return MTLSamplerAddressModeMirrorRepeat; 72 case WGPUAddressMode_ClampToEdge: 73 return MTLSamplerAddressModeClampToEdge; 74 case WGPUAddressMode_Force32: 75 return std::nullopt; 76 } 77 } 78 79 static std::optional<MTLSamplerMinMagFilter> minMagFilter(WGPUFilterMode filterMode) 80 { 81 switch (filterMode) { 82 case WGPUFilterMode_Nearest: 83 return MTLSamplerMinMagFilterNearest; 84 case WGPUFilterMode_Linear: 85 return MTLSamplerMinMagFilterLinear; 86 case WGPUFilterMode_Force32: 87 return std::nullopt; 88 } 89 } 90 91 static std::optional<MTLSamplerMipFilter> mipFilter(WGPUFilterMode filterMode) 92 { 93 switch (filterMode) { 94 case WGPUFilterMode_Nearest: 95 return MTLSamplerMipFilterNearest; 96 case WGPUFilterMode_Linear: 97 return MTLSamplerMipFilterLinear; 98 case WGPUFilterMode_Force32: 99 return std::nullopt; 100 } 101 } 102 103 static std::optional<MTLCompareFunction> compareFunction(WGPUCompareFunction compareFunction) 104 { 105 switch (compareFunction) { 106 case WGPUCompareFunction_Undefined: 107 return std::nullopt; 108 case WGPUCompareFunction_Never: 109 return MTLCompareFunctionNever; 110 case WGPUCompareFunction_Less: 111 return MTLCompareFunctionLess; 112 case WGPUCompareFunction_LessEqual: 113 return MTLCompareFunctionLessEqual; 114 case WGPUCompareFunction_Greater: 115 return MTLCompareFunctionGreater; 116 case WGPUCompareFunction_GreaterEqual: 117 return MTLCompareFunctionGreaterEqual; 118 case WGPUCompareFunction_Equal: 119 return MTLCompareFunctionEqual; 120 case WGPUCompareFunction_NotEqual: 121 return MTLCompareFunctionNotEqual; 122 case WGPUCompareFunction_Always: 123 return MTLCompareFunctionAlways; 124 case WGPUCompareFunction_Force32: 125 return std::nullopt; 126 } 127 } 128 65 129 RefPtr<Sampler> Device::createSampler(const WGPUSamplerDescriptor& descriptor) 66 130 { … … 81 145 MTLSamplerDescriptor *samplerDescriptor = [MTLSamplerDescriptor new]; 82 146 83 switch (descriptor.addressModeU) { 84 case WGPUAddressMode_Repeat: 85 samplerDescriptor.rAddressMode = MTLSamplerAddressModeRepeat; 86 break; 87 case WGPUAddressMode_MirrorRepeat: 88 samplerDescriptor.rAddressMode = MTLSamplerAddressModeMirrorRepeat; 89 break; 90 case WGPUAddressMode_ClampToEdge: 91 samplerDescriptor.rAddressMode = MTLSamplerAddressModeClampToEdge; 92 break; 93 default: 94 return nullptr; 95 } 96 97 switch (descriptor.addressModeV) { 98 case WGPUAddressMode_Repeat: 99 samplerDescriptor.sAddressMode = MTLSamplerAddressModeRepeat; 100 break; 101 case WGPUAddressMode_MirrorRepeat: 102 samplerDescriptor.sAddressMode = MTLSamplerAddressModeMirrorRepeat; 103 break; 104 case WGPUAddressMode_ClampToEdge: 105 samplerDescriptor.sAddressMode = MTLSamplerAddressModeClampToEdge; 106 break; 107 default: 108 return nullptr; 109 } 110 111 switch (descriptor.addressModeW) { 112 case WGPUAddressMode_Repeat: 113 samplerDescriptor.tAddressMode = MTLSamplerAddressModeRepeat; 114 break; 115 case WGPUAddressMode_MirrorRepeat: 116 samplerDescriptor.tAddressMode = MTLSamplerAddressModeMirrorRepeat; 117 break; 118 case WGPUAddressMode_ClampToEdge: 119 samplerDescriptor.tAddressMode = MTLSamplerAddressModeClampToEdge; 120 break; 121 default: 122 return nullptr; 123 } 124 125 switch (descriptor.magFilter) { 126 case WGPUFilterMode_Nearest: 127 samplerDescriptor.magFilter = MTLSamplerMinMagFilterNearest; 128 break; 129 case WGPUFilterMode_Linear: 130 samplerDescriptor.magFilter = MTLSamplerMinMagFilterLinear; 131 break; 132 default: 133 return nullptr; 134 } 135 136 switch (descriptor.minFilter) { 137 case WGPUFilterMode_Nearest: 138 samplerDescriptor.minFilter = MTLSamplerMinMagFilterNearest; 139 break; 140 case WGPUFilterMode_Linear: 141 samplerDescriptor.minFilter = MTLSamplerMinMagFilterLinear; 142 break; 143 default: 144 return nullptr; 145 } 146 147 switch (descriptor.mipmapFilter) { 148 case WGPUFilterMode_Nearest: 149 samplerDescriptor.mipFilter = MTLSamplerMipFilterNearest; 150 break; 151 case WGPUFilterMode_Linear: 152 samplerDescriptor.mipFilter = MTLSamplerMipFilterLinear; 153 break; 154 default: 155 return nullptr; 156 } 147 if (auto addressMode = WebGPU::addressMode(descriptor.addressModeU)) 148 samplerDescriptor.rAddressMode = addressMode.value(); 149 else 150 return nullptr; 151 152 if (auto addressMode = WebGPU::addressMode(descriptor.addressModeV)) 153 samplerDescriptor.sAddressMode = addressMode.value(); 154 else 155 return nullptr; 156 157 if (auto addressMode = WebGPU::addressMode(descriptor.addressModeW)) 158 samplerDescriptor.tAddressMode = addressMode.value(); 159 else 160 return nullptr; 161 162 if (auto minMagFilter = WebGPU::minMagFilter(descriptor.magFilter)) 163 samplerDescriptor.magFilter = minMagFilter.value(); 164 else 165 return nullptr; 166 167 if (auto minMagFilter = WebGPU::minMagFilter(descriptor.minFilter)) 168 samplerDescriptor.minFilter = minMagFilter.value(); 169 else 170 return nullptr; 171 172 if (auto mipFilter = WebGPU::mipFilter(descriptor.mipmapFilter)) 173 samplerDescriptor.mipFilter = mipFilter.value(); 174 else 175 return nullptr; 157 176 158 177 samplerDescriptor.lodMinClamp = descriptor.lodMinClamp; … … 160 179 samplerDescriptor.lodMaxClamp = descriptor.lodMaxClamp; 161 180 162 switch (descriptor.compare) { 163 case WGPUCompareFunction_Undefined: 164 break; 165 case WGPUCompareFunction_Never: 166 samplerDescriptor.compareFunction = MTLCompareFunctionNever; 167 break; 168 case WGPUCompareFunction_Less: 169 samplerDescriptor.compareFunction = MTLCompareFunctionLess; 170 break; 171 case WGPUCompareFunction_LessEqual: 172 samplerDescriptor.compareFunction = MTLCompareFunctionLessEqual; 173 break; 174 case WGPUCompareFunction_Greater: 175 samplerDescriptor.compareFunction = MTLCompareFunctionGreater; 176 break; 177 case WGPUCompareFunction_GreaterEqual: 178 samplerDescriptor.compareFunction = MTLCompareFunctionGreaterEqual; 179 break; 180 case WGPUCompareFunction_Equal: 181 samplerDescriptor.compareFunction = MTLCompareFunctionEqual; 182 break; 183 case WGPUCompareFunction_NotEqual: 184 samplerDescriptor.compareFunction = MTLCompareFunctionNotEqual; 185 break; 186 case WGPUCompareFunction_Always: 187 samplerDescriptor.compareFunction = MTLCompareFunctionAlways; 188 break; 189 default: 190 return nullptr; 191 } 181 if (auto compareFunction = WebGPU::compareFunction(descriptor.compare)) 182 samplerDescriptor.compareFunction = compareFunction.value(); 183 else 184 return nullptr; 192 185 193 186 // "The used value of maxAnisotropy will be clamped to the maximum value that the platform supports." … … 196 189 samplerDescriptor.maxAnisotropy = std::min<uint16_t>(descriptor.maxAnisotropy, 16); 197 190 198 samplerDescriptor.label = descriptor.label ? [NSString stringWithCString:descriptor.label encoding:NSUTF8StringEncoding] : nil;191 samplerDescriptor.label = fromAPI(descriptor.label); 199 192 200 193 id<MTLSamplerState> samplerState = [m_device newSamplerStateWithDescriptor:samplerDescriptor]; 201 194 if (!samplerState) 202 195 return nullptr; 196 197 // "Let s be a new GPUSampler object." 198 // "Set s.[[descriptor]] to descriptor." 199 // "Set s.[[isComparison]] to false if the compare attribute of s.[[descriptor]] is null or undefined. Otherwise, set it to true." 200 // "Set s.[[isFiltering]] to false if none of minFilter, magFilter, or mipmapFilter has the value of "linear". Otherwise, set it to true." 201 // "Return s." 203 202 204 203 return Sampler::create(samplerState, descriptor, *this);
Note:
See TracChangeset
for help on using the changeset viewer.