spb/forge Public MIT
Forge — LLM training from scratch in pure C++20 + Metal on Apple Silicon.
C++ 61.2%
C 23%
Python 7.6%
TeX 7.2%
CMake 1.1%
1//-------------------------------------------------------------------------------------------------------------------------------------------------------------2//3// Metal/MTLSampler.hpp4//5// Copyright 2020-2025 Apple Inc.6//7// Licensed under the Apache License, Version 2.0 (the "License");8// you may not use this file except in compliance with the License.9// You may obtain a copy of the License at10//11// http://www.apache.org/licenses/LICENSE-2.012//13// Unless required by applicable law or agreed to in writing, software14// distributed under the License is distributed on an "AS IS" BASIS,15// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.16// See the License for the specific language governing permissions and17// limitations under the License.18//19//-------------------------------------------------------------------------------------------------------------------------------------------------------------2021#pragma once2223#include "../Foundation/Foundation.hpp"24#include "MTLDefines.hpp"25#include "MTLDepthStencil.hpp"26#include "MTLHeaderBridge.hpp"27#include "MTLPrivate.hpp"28#include "MTLTypes.hpp"2930namespace MTL31{32class Device;33class SamplerDescriptor;34_MTL_ENUM(NS::UInteger, SamplerMinMagFilter) {35 SamplerMinMagFilterNearest = 0,36 SamplerMinMagFilterLinear = 1,37};3839_MTL_ENUM(NS::UInteger, SamplerMipFilter) {40 SamplerMipFilterNotMipmapped = 0,41 SamplerMipFilterNearest = 1,42 SamplerMipFilterLinear = 2,43};4445_MTL_ENUM(NS::UInteger, SamplerAddressMode) {46 SamplerAddressModeClampToEdge = 0,47 SamplerAddressModeMirrorClampToEdge = 1,48 SamplerAddressModeRepeat = 2,49 SamplerAddressModeMirrorRepeat = 3,50 SamplerAddressModeClampToZero = 4,51 SamplerAddressModeClampToBorderColor = 5,52};5354_MTL_ENUM(NS::UInteger, SamplerBorderColor) {55 SamplerBorderColorTransparentBlack = 0,56 SamplerBorderColorOpaqueBlack = 1,57 SamplerBorderColorOpaqueWhite = 2,58};5960_MTL_ENUM(NS::Integer, SamplerReductionMode) {61 SamplerReductionModeWeightedAverage = 0,62 SamplerReductionModeMinimum = 1,63 SamplerReductionModeMaximum = 2,64};6566class SamplerDescriptor : public NS::Copying<SamplerDescriptor>67{68public:69 static SamplerDescriptor* alloc();7071 SamplerBorderColor borderColor() const;7273 CompareFunction compareFunction() const;7475 SamplerDescriptor* init();7677 NS::String* label() const;7879 bool lodAverage() const;8081 float lodBias() const;8283 float lodMaxClamp() const;8485 float lodMinClamp() const;8687 SamplerMinMagFilter magFilter() const;8889 NS::UInteger maxAnisotropy() const;9091 SamplerMinMagFilter minFilter() const;9293 SamplerMipFilter mipFilter() const;9495 bool normalizedCoordinates() const;9697 SamplerAddressMode rAddressMode() const;9899 SamplerReductionMode reductionMode() const;100101 SamplerAddressMode sAddressMode() const;102103 void setBorderColor(MTL::SamplerBorderColor borderColor);104105 void setCompareFunction(MTL::CompareFunction compareFunction);106107 void setLabel(const NS::String* label);108109 void setLodAverage(bool lodAverage);110111 void setLodBias(float lodBias);112113 void setLodMaxClamp(float lodMaxClamp);114115 void setLodMinClamp(float lodMinClamp);116117 void setMagFilter(MTL::SamplerMinMagFilter magFilter);118119 void setMaxAnisotropy(NS::UInteger maxAnisotropy);120121 void setMinFilter(MTL::SamplerMinMagFilter minFilter);122123 void setMipFilter(MTL::SamplerMipFilter mipFilter);124125 void setNormalizedCoordinates(bool normalizedCoordinates);126127 void setRAddressMode(MTL::SamplerAddressMode rAddressMode);128129 void setReductionMode(MTL::SamplerReductionMode reductionMode);130131 void setSAddressMode(MTL::SamplerAddressMode sAddressMode);132133 void setSupportArgumentBuffers(bool supportArgumentBuffers);134135 void setTAddressMode(MTL::SamplerAddressMode tAddressMode);136137 bool supportArgumentBuffers() const;138139 SamplerAddressMode tAddressMode() const;140};141class SamplerState : public NS::Referencing<SamplerState>142{143public:144 Device* device() const;145146 ResourceID gpuResourceID() const;147148 NS::String* label() const;149};150151}152_MTL_INLINE MTL::SamplerDescriptor* MTL::SamplerDescriptor::alloc()153{154 return NS::Object::alloc<MTL::SamplerDescriptor>(_MTL_PRIVATE_CLS(MTLSamplerDescriptor));155}156157_MTL_INLINE MTL::SamplerBorderColor MTL::SamplerDescriptor::borderColor() const158{159 return Object::sendMessage<MTL::SamplerBorderColor>(this, _MTL_PRIVATE_SEL(borderColor));160}161162_MTL_INLINE MTL::CompareFunction MTL::SamplerDescriptor::compareFunction() const163{164 return Object::sendMessage<MTL::CompareFunction>(this, _MTL_PRIVATE_SEL(compareFunction));165}166167_MTL_INLINE MTL::SamplerDescriptor* MTL::SamplerDescriptor::init()168{169 return NS::Object::init<MTL::SamplerDescriptor>();170}171172_MTL_INLINE NS::String* MTL::SamplerDescriptor::label() const173{174 return Object::sendMessage<NS::String*>(this, _MTL_PRIVATE_SEL(label));175}176177_MTL_INLINE bool MTL::SamplerDescriptor::lodAverage() const178{179 return Object::sendMessage<bool>(this, _MTL_PRIVATE_SEL(lodAverage));180}181182_MTL_INLINE float MTL::SamplerDescriptor::lodBias() const183{184 return Object::sendMessage<float>(this, _MTL_PRIVATE_SEL(lodBias));185}186187_MTL_INLINE float MTL::SamplerDescriptor::lodMaxClamp() const188{189 return Object::sendMessage<float>(this, _MTL_PRIVATE_SEL(lodMaxClamp));190}191192_MTL_INLINE float MTL::SamplerDescriptor::lodMinClamp() const193{194 return Object::sendMessage<float>(this, _MTL_PRIVATE_SEL(lodMinClamp));195}196197_MTL_INLINE MTL::SamplerMinMagFilter MTL::SamplerDescriptor::magFilter() const198{199 return Object::sendMessage<MTL::SamplerMinMagFilter>(this, _MTL_PRIVATE_SEL(magFilter));200}201202_MTL_INLINE NS::UInteger MTL::SamplerDescriptor::maxAnisotropy() const203{204 return Object::sendMessage<NS::UInteger>(this, _MTL_PRIVATE_SEL(maxAnisotropy));205}206207_MTL_INLINE MTL::SamplerMinMagFilter MTL::SamplerDescriptor::minFilter() const208{209 return Object::sendMessage<MTL::SamplerMinMagFilter>(this, _MTL_PRIVATE_SEL(minFilter));210}211212_MTL_INLINE MTL::SamplerMipFilter MTL::SamplerDescriptor::mipFilter() const213{214 return Object::sendMessage<MTL::SamplerMipFilter>(this, _MTL_PRIVATE_SEL(mipFilter));215}216217_MTL_INLINE bool MTL::SamplerDescriptor::normalizedCoordinates() const218{219 return Object::sendMessage<bool>(this, _MTL_PRIVATE_SEL(normalizedCoordinates));220}221222_MTL_INLINE MTL::SamplerAddressMode MTL::SamplerDescriptor::rAddressMode() const223{224 return Object::sendMessage<MTL::SamplerAddressMode>(this, _MTL_PRIVATE_SEL(rAddressMode));225}226227_MTL_INLINE MTL::SamplerReductionMode MTL::SamplerDescriptor::reductionMode() const228{229 return Object::sendMessage<MTL::SamplerReductionMode>(this, _MTL_PRIVATE_SEL(reductionMode));230}231232_MTL_INLINE MTL::SamplerAddressMode MTL::SamplerDescriptor::sAddressMode() const233{234 return Object::sendMessage<MTL::SamplerAddressMode>(this, _MTL_PRIVATE_SEL(sAddressMode));235}236237_MTL_INLINE void MTL::SamplerDescriptor::setBorderColor(MTL::SamplerBorderColor borderColor)238{239 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setBorderColor_), borderColor);240}241242_MTL_INLINE void MTL::SamplerDescriptor::setCompareFunction(MTL::CompareFunction compareFunction)243{244 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setCompareFunction_), compareFunction);245}246247_MTL_INLINE void MTL::SamplerDescriptor::setLabel(const NS::String* label)248{249 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setLabel_), label);250}251252_MTL_INLINE void MTL::SamplerDescriptor::setLodAverage(bool lodAverage)253{254 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setLodAverage_), lodAverage);255}256257_MTL_INLINE void MTL::SamplerDescriptor::setLodBias(float lodBias)258{259 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setLodBias_), lodBias);260}261262_MTL_INLINE void MTL::SamplerDescriptor::setLodMaxClamp(float lodMaxClamp)263{264 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setLodMaxClamp_), lodMaxClamp);265}266267_MTL_INLINE void MTL::SamplerDescriptor::setLodMinClamp(float lodMinClamp)268{269 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setLodMinClamp_), lodMinClamp);270}271272_MTL_INLINE void MTL::SamplerDescriptor::setMagFilter(MTL::SamplerMinMagFilter magFilter)273{274 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setMagFilter_), magFilter);275}276277_MTL_INLINE void MTL::SamplerDescriptor::setMaxAnisotropy(NS::UInteger maxAnisotropy)278{279 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setMaxAnisotropy_), maxAnisotropy);280}281282_MTL_INLINE void MTL::SamplerDescriptor::setMinFilter(MTL::SamplerMinMagFilter minFilter)283{284 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setMinFilter_), minFilter);285}286287_MTL_INLINE void MTL::SamplerDescriptor::setMipFilter(MTL::SamplerMipFilter mipFilter)288{289 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setMipFilter_), mipFilter);290}291292_MTL_INLINE void MTL::SamplerDescriptor::setNormalizedCoordinates(bool normalizedCoordinates)293{294 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setNormalizedCoordinates_), normalizedCoordinates);295}296297_MTL_INLINE void MTL::SamplerDescriptor::setRAddressMode(MTL::SamplerAddressMode rAddressMode)298{299 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setRAddressMode_), rAddressMode);300}301302_MTL_INLINE void MTL::SamplerDescriptor::setReductionMode(MTL::SamplerReductionMode reductionMode)303{304 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setReductionMode_), reductionMode);305}306307_MTL_INLINE void MTL::SamplerDescriptor::setSAddressMode(MTL::SamplerAddressMode sAddressMode)308{309 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setSAddressMode_), sAddressMode);310}311312_MTL_INLINE void MTL::SamplerDescriptor::setSupportArgumentBuffers(bool supportArgumentBuffers)313{314 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setSupportArgumentBuffers_), supportArgumentBuffers);315}316317_MTL_INLINE void MTL::SamplerDescriptor::setTAddressMode(MTL::SamplerAddressMode tAddressMode)318{319 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setTAddressMode_), tAddressMode);320}321322_MTL_INLINE bool MTL::SamplerDescriptor::supportArgumentBuffers() const323{324 return Object::sendMessageSafe<bool>(this, _MTL_PRIVATE_SEL(supportArgumentBuffers));325}326327_MTL_INLINE MTL::SamplerAddressMode MTL::SamplerDescriptor::tAddressMode() const328{329 return Object::sendMessage<MTL::SamplerAddressMode>(this, _MTL_PRIVATE_SEL(tAddressMode));330}331332_MTL_INLINE MTL::Device* MTL::SamplerState::device() const333{334 return Object::sendMessage<MTL::Device*>(this, _MTL_PRIVATE_SEL(device));335}336337_MTL_INLINE MTL::ResourceID MTL::SamplerState::gpuResourceID() const338{339 return Object::sendMessage<MTL::ResourceID>(this, _MTL_PRIVATE_SEL(gpuResourceID));340}341342_MTL_INLINE NS::String* MTL::SamplerState::label() const343{344 return Object::sendMessage<NS::String*>(this, _MTL_PRIVATE_SEL(label));345}346