blob: 50e91e7ce95a114095ec3be934262d4e4b25f77e [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "impeller/renderer/backend/metal/compute_pass_bindings_cache_mtl.h"
namespace impeller {
void ComputePassBindingsCacheMTL::SetComputePipelineState(
id<MTLComputePipelineState> pipeline) {
if (pipeline == pipeline_) {
return;
}
pipeline_ = pipeline;
[encoder_ setComputePipelineState:pipeline_];
}
id<MTLComputePipelineState> ComputePassBindingsCacheMTL::GetPipeline() const {
return pipeline_;
}
void ComputePassBindingsCacheMTL::SetEncoder(
id<MTLComputeCommandEncoder> encoder) {
encoder_ = encoder;
}
void ComputePassBindingsCacheMTL::SetBuffer(uint64_t index,
uint64_t offset,
id<MTLBuffer> buffer) {
auto found = buffers_.find(index);
if (found != buffers_.end() && found->second.buffer == buffer) {
// The right buffer is bound. Check if its offset needs to be updated.
if (found->second.offset == offset) {
// Buffer and its offset is identical. Nothing to do.
return;
}
// Only the offset needs to be updated.
found->second.offset = offset;
[encoder_ setBufferOffset:offset atIndex:index];
return;
}
buffers_[index] = {buffer, static_cast<size_t>(offset)};
[encoder_ setBuffer:buffer offset:offset atIndex:index];
}
void ComputePassBindingsCacheMTL::SetTexture(uint64_t index,
id<MTLTexture> texture) {
auto found = textures_.find(index);
if (found != textures_.end() && found->second == texture) {
// Already bound.
return;
}
textures_[index] = texture;
[encoder_ setTexture:texture atIndex:index];
return;
}
void ComputePassBindingsCacheMTL::SetSampler(uint64_t index,
id<MTLSamplerState> sampler) {
auto found = samplers_.find(index);
if (found != samplers_.end() && found->second == sampler) {
// Already bound.
return;
}
samplers_[index] = sampler;
[encoder_ setSamplerState:sampler atIndex:index];
return;
}
} // namespace impeller