1*8975f5c5SAndroid Build Coastguard Worker// 2*8975f5c5SAndroid Build Coastguard Worker// Copyright 2020 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker// found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker// 6*8975f5c5SAndroid Build Coastguard Worker// SamplerMtl.mm: 7*8975f5c5SAndroid Build Coastguard Worker// Defines the class interface for SamplerMtl, implementing SamplerImpl. 8*8975f5c5SAndroid Build Coastguard Worker// 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker#include "libANGLE/renderer/metal/SamplerMtl.h" 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Worker#include "common/debug.h" 13*8975f5c5SAndroid Build Coastguard Worker#include "libANGLE/Context.h" 14*8975f5c5SAndroid Build Coastguard Worker#include "libANGLE/renderer/metal/ContextMtl.h" 15*8975f5c5SAndroid Build Coastguard Worker#include "libANGLE/renderer/metal/DisplayMtl.h" 16*8975f5c5SAndroid Build Coastguard Worker#include "libANGLE/renderer/metal/mtl_state_cache.h" 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Workernamespace rx 19*8975f5c5SAndroid Build Coastguard Worker{ 20*8975f5c5SAndroid Build Coastguard Worker 21*8975f5c5SAndroid Build Coastguard WorkerSamplerMtl::SamplerMtl(const gl::SamplerState &state) : SamplerImpl(state) {} 22*8975f5c5SAndroid Build Coastguard Worker 23*8975f5c5SAndroid Build Coastguard WorkerSamplerMtl::~SamplerMtl() = default; 24*8975f5c5SAndroid Build Coastguard Worker 25*8975f5c5SAndroid Build Coastguard Workervoid SamplerMtl::onDestroy(const gl::Context *context) 26*8975f5c5SAndroid Build Coastguard Worker{ 27*8975f5c5SAndroid Build Coastguard Worker mSamplerState = nil; 28*8975f5c5SAndroid Build Coastguard Worker} 29*8975f5c5SAndroid Build Coastguard Worker 30*8975f5c5SAndroid Build Coastguard Workerconst mtl::AutoObjCPtr<id<MTLSamplerState>> &SamplerMtl::getSampler(ContextMtl *contextMtl) 31*8975f5c5SAndroid Build Coastguard Worker{ 32*8975f5c5SAndroid Build Coastguard Worker if (!mSamplerState) 33*8975f5c5SAndroid Build Coastguard Worker { 34*8975f5c5SAndroid Build Coastguard Worker mtl::SamplerDesc samplerDesc(mState); 35*8975f5c5SAndroid Build Coastguard Worker 36*8975f5c5SAndroid Build Coastguard Worker mSamplerState = contextMtl->getDisplay()->getStateCache().getSamplerState( 37*8975f5c5SAndroid Build Coastguard Worker contextMtl->getMetalDevice(), samplerDesc); 38*8975f5c5SAndroid Build Coastguard Worker } 39*8975f5c5SAndroid Build Coastguard Worker 40*8975f5c5SAndroid Build Coastguard Worker return mSamplerState; 41*8975f5c5SAndroid Build Coastguard Worker} 42*8975f5c5SAndroid Build Coastguard Worker 43*8975f5c5SAndroid Build Coastguard Workerangle::Result SamplerMtl::syncState(const gl::Context *context, const bool dirty) 44*8975f5c5SAndroid Build Coastguard Worker{ 45*8975f5c5SAndroid Build Coastguard Worker if (dirty) 46*8975f5c5SAndroid Build Coastguard Worker { 47*8975f5c5SAndroid Build Coastguard Worker // Recreate sampler 48*8975f5c5SAndroid Build Coastguard Worker mSamplerState = nil; 49*8975f5c5SAndroid Build Coastguard Worker 50*8975f5c5SAndroid Build Coastguard Worker if (mCompareMode != mState.getCompareMode() || mCompareFunc != mState.getCompareFunc()) 51*8975f5c5SAndroid Build Coastguard Worker { 52*8975f5c5SAndroid Build Coastguard Worker ContextMtl *contextMtl = mtl::GetImpl(context); 53*8975f5c5SAndroid Build Coastguard Worker 54*8975f5c5SAndroid Build Coastguard Worker mCompareMode = mState.getCompareMode(); 55*8975f5c5SAndroid Build Coastguard Worker mCompareFunc = mState.getCompareFunc(); 56*8975f5c5SAndroid Build Coastguard Worker 57*8975f5c5SAndroid Build Coastguard Worker // Tell context to rebind textures so that ProgramMtl has a chance to verify 58*8975f5c5SAndroid Build Coastguard Worker // depth texture compare mode. 59*8975f5c5SAndroid Build Coastguard Worker contextMtl->invalidateCurrentTextures(); 60*8975f5c5SAndroid Build Coastguard Worker } 61*8975f5c5SAndroid Build Coastguard Worker } 62*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue; 63*8975f5c5SAndroid Build Coastguard Worker} 64*8975f5c5SAndroid Build Coastguard Worker 65*8975f5c5SAndroid Build Coastguard Worker} // namespace rx 66