Files
2025-01-29 10:55:49 +01:00

68 lines
2.3 KiB
C

#include <kinc/graphics5/sampler.h>
static MTLSamplerAddressMode convert_addressing(kinc_g5_texture_addressing_t mode) {
switch (mode) {
case KINC_G5_TEXTURE_ADDRESSING_REPEAT:
return MTLSamplerAddressModeRepeat;
case KINC_G5_TEXTURE_ADDRESSING_BORDER:
return MTLSamplerAddressModeClampToBorderColor;
case KINC_G5_TEXTURE_ADDRESSING_CLAMP:
return MTLSamplerAddressModeClampToEdge;
case KINC_G5_TEXTURE_ADDRESSING_MIRROR:
return MTLSamplerAddressModeMirrorRepeat;
default:
assert(false);
return MTLSamplerAddressModeRepeat;
}
}
static MTLSamplerMipFilter convert_mipmap_mode(kinc_g5_mipmap_filter_t filter) {
switch (filter) {
case KINC_G5_MIPMAP_FILTER_NONE:
return MTLSamplerMipFilterNotMipmapped;
case KINC_G5_MIPMAP_FILTER_POINT:
return MTLSamplerMipFilterNearest;
case KINC_G5_MIPMAP_FILTER_LINEAR:
return MTLSamplerMipFilterLinear;
default:
assert(false);
return MTLSamplerMipFilterNearest;
}
}
static MTLSamplerMinMagFilter convert_texture_filter(kinc_g5_texture_filter_t filter) {
switch (filter) {
case KINC_G5_TEXTURE_FILTER_POINT:
return MTLSamplerMinMagFilterNearest;
case KINC_G5_TEXTURE_FILTER_LINEAR:
return MTLSamplerMinMagFilterLinear;
case KINC_G5_TEXTURE_FILTER_ANISOTROPIC:
return MTLSamplerMinMagFilterLinear; // ?
default:
assert(false);
return MTLSamplerMinMagFilterNearest;
}
}
void kinc_g5_sampler_init(kinc_g5_sampler_t *sampler, const kinc_g5_sampler_options_t *options) {
id<MTLDevice> device = getMetalDevice();
MTLSamplerDescriptor *desc = (MTLSamplerDescriptor *)[[MTLSamplerDescriptor alloc] init];
desc.minFilter = convert_texture_filter(options->minification_filter);
desc.magFilter = convert_texture_filter(options->magnification_filter);
desc.sAddressMode = convert_addressing(options->u_addressing);
desc.tAddressMode = convert_addressing(options->v_addressing);
desc.mipFilter = convert_mipmap_mode(options->mipmap_filter);
desc.maxAnisotropy = options->max_anisotropy;
desc.normalizedCoordinates = YES;
desc.lodMinClamp = options->lod_min_clamp;
desc.lodMaxClamp = options->lod_max_clamp;
sampler->impl.sampler = (__bridge_retained void *)[device newSamplerStateWithDescriptor:desc];
}
void kinc_g5_sampler_destroy(kinc_g5_sampler_t *sampler) {
id<MTLSamplerState> mtl_sampler = (__bridge_transfer id<MTLSamplerState>)sampler->impl.sampler;
mtl_sampler = nil;
}