⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 291758 in webkit


Ignore:
Timestamp:
Mar 23, 2022, 11:58:22 AM (5 years ago)
Author:
mmaxfield@apple.com
Message:

[WebGPU] Clean up implementation of Device::createSampler()
​https://bugs.webkit.org/show_bug.cgi?id=238250

Reviewed by Darin Adler.

Refactor repeated code into reusable functions.

  • WebGPU/Sampler.mm:

(WebGPU::addressMode):
(WebGPU::minMagFilter):
(WebGPU::mipFilter):
(WebGPU::compareFunction):
(WebGPU::Device::createSampler):

Location:
trunk/Source/WebGPU
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebGPU/ChangeLog

    r291701 r291758  
     12022-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
    1172022-03-22  Myles C. Maxfield  <mmaxfield@apple.com>
    218
  • trunk/Source/WebGPU/WebGPU/Sampler.mm

    r291687 r291758  
    6363}
    6464
     65static 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
     79static 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
     91static 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
     103static 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
    65129RefPtr<Sampler> Device::createSampler(const WGPUSamplerDescriptor& descriptor)
    66130{
    … …  
    81145    MTLSamplerDescriptor *samplerDescriptor = [MTLSamplerDescriptor new];
    82146
    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;
    157176
    158177    samplerDescriptor.lodMinClamp = descriptor.lodMinClamp;
    … …  
    160179    samplerDescriptor.lodMaxClamp = descriptor.lodMaxClamp;
    161180
    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;
    192185
    193186    // "The used value of maxAnisotropy will be clamped to the maximum value that the platform supports."
    … …  
    196189    samplerDescriptor.maxAnisotropy = std::min<uint16_t>(descriptor.maxAnisotropy, 16);
    197190
    198     samplerDescriptor.label = descriptor.label ? [NSString stringWithCString:descriptor.label encoding:NSUTF8StringEncoding] : nil;
     191    samplerDescriptor.label = fromAPI(descriptor.label);
    199192
    200193    id<MTLSamplerState> samplerState = [m_device newSamplerStateWithDescriptor:samplerDescriptor];
    201194    if (!samplerState)
    202195        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."
    203202
    204203    return Sampler::create(samplerState, descriptor, *this);
Note: See TracChangeset for help on using the changeset viewer.