85 lines
2.5 KiB
C++
85 lines
2.5 KiB
C++
// Copyright (c) Wojciech Figat. All rights reserved.
|
|
|
|
#if GRAPHICS_API_WEBGPU
|
|
|
|
#include "GPUSamplerWebGPU.h"
|
|
|
|
WGPUAddressMode ToAddressMode(GPUSamplerAddressMode value)
|
|
{
|
|
switch (value)
|
|
{
|
|
case GPUSamplerAddressMode::Wrap:
|
|
return WGPUAddressMode_Repeat;
|
|
case GPUSamplerAddressMode::Clamp:
|
|
return WGPUAddressMode_ClampToEdge;
|
|
case GPUSamplerAddressMode::Mirror:
|
|
return WGPUAddressMode_MirrorRepeat;
|
|
default:
|
|
return WGPUAddressMode_Undefined;
|
|
}
|
|
}
|
|
|
|
WGPUCompareFunction ToCompareFunction(GPUSamplerCompareFunction value)
|
|
{
|
|
switch (value)
|
|
{
|
|
case GPUSamplerCompareFunction::Never:
|
|
return WGPUCompareFunction_Never;
|
|
case GPUSamplerCompareFunction::Less:
|
|
return WGPUCompareFunction_Less;
|
|
default:
|
|
return WGPUCompareFunction_Undefined;
|
|
}
|
|
}
|
|
|
|
bool GPUSamplerWebGPU::OnInit()
|
|
{
|
|
WGPUSamplerDescriptor samplerDesc = WGPU_SAMPLER_DESCRIPTOR_INIT;
|
|
samplerDesc.addressModeU = ToAddressMode(_desc.AddressU);
|
|
samplerDesc.addressModeV = ToAddressMode(_desc.AddressV);
|
|
samplerDesc.addressModeW = ToAddressMode(_desc.AddressW);
|
|
switch (_desc.Filter)
|
|
{
|
|
case GPUSamplerFilter::Point:
|
|
samplerDesc.magFilter = samplerDesc.magFilter = WGPUFilterMode_Nearest;
|
|
samplerDesc.mipmapFilter = WGPUMipmapFilterMode_Nearest;
|
|
break;
|
|
case GPUSamplerFilter::Bilinear:
|
|
samplerDesc.magFilter = samplerDesc.magFilter = WGPUFilterMode_Linear;
|
|
samplerDesc.mipmapFilter = WGPUMipmapFilterMode_Nearest;
|
|
break;
|
|
case GPUSamplerFilter::Trilinear:
|
|
samplerDesc.magFilter = samplerDesc.magFilter = WGPUFilterMode_Linear;
|
|
samplerDesc.mipmapFilter = WGPUMipmapFilterMode_Linear;
|
|
break;
|
|
case GPUSamplerFilter::Anisotropic:
|
|
samplerDesc.magFilter = samplerDesc.magFilter = WGPUFilterMode_Linear;
|
|
samplerDesc.mipmapFilter = WGPUMipmapFilterMode_Linear;
|
|
break;
|
|
}
|
|
samplerDesc.lodMinClamp = _desc.MinMipLevel;
|
|
samplerDesc.lodMaxClamp = _desc.MaxMipLevel;
|
|
samplerDesc.compare = ToCompareFunction(_desc.ComparisonFunction);
|
|
samplerDesc.maxAnisotropy = _desc.MaxAnisotropy;
|
|
Sampler = wgpuDeviceCreateSampler(_device->Device, &samplerDesc);
|
|
if (Sampler == nullptr)
|
|
return true;
|
|
_memoryUsage = 100;
|
|
|
|
return false;
|
|
}
|
|
|
|
void GPUSamplerWebGPU::OnReleaseGPU()
|
|
{
|
|
if (Sampler)
|
|
{
|
|
wgpuSamplerRelease(Sampler);
|
|
Sampler = nullptr;
|
|
}
|
|
|
|
// Base
|
|
GPUSampler::OnReleaseGPU();
|
|
}
|
|
|
|
#endif
|