SPB Git

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%
11.0 KB · 346 lines cpp
Raw Blame History
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