blob: eff7557f88647d33ee19bc7c10b491c52fada03d [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.
#ifndef FLUTTER_IMPELLER_RENDERER_BACKEND_METAL_COMPUTE_PASS_BINDINGS_CACHE_MTL_H_
#define FLUTTER_IMPELLER_RENDERER_BACKEND_METAL_COMPUTE_PASS_BINDINGS_CACHE_MTL_H_
#include <Metal/Metal.h>
#include "flutter/fml/macros.h"
#include "impeller/renderer/compute_pass.h"
#include "impeller/renderer/pipeline_descriptor.h"
namespace impeller {
//-----------------------------------------------------------------------------
/// @brief Ensures that bindings on the pass are not redundantly set or
/// updated. Avoids making the driver do additional checks and makes
/// the frame insights during profiling and instrumentation not
/// complain about the same.
///
/// There should be no change to rendering if this caching was
/// absent.
///
struct ComputePassBindingsCacheMTL {
explicit ComputePassBindingsCacheMTL() {}
ComputePassBindingsCacheMTL(const ComputePassBindingsCacheMTL&) = delete;
ComputePassBindingsCacheMTL(ComputePassBindingsCacheMTL&&) = delete;
void SetComputePipelineState(id<MTLComputePipelineState> pipeline);
id<MTLComputePipelineState> GetPipeline() const;
void SetEncoder(id<MTLComputeCommandEncoder> encoder);
void SetBuffer(uint64_t index, uint64_t offset, id<MTLBuffer> buffer);
void SetTexture(uint64_t index, id<MTLTexture> texture);
void SetSampler(uint64_t index, id<MTLSamplerState> sampler);
private:
struct BufferOffsetPair {
id<MTLBuffer> buffer = nullptr;
size_t offset = 0u;
};
using BufferMap = std::map<uint64_t, BufferOffsetPair>;
using TextureMap = std::map<uint64_t, id<MTLTexture>>;
using SamplerMap = std::map<uint64_t, id<MTLSamplerState>>;
id<MTLComputeCommandEncoder> encoder_;
id<MTLComputePipelineState> pipeline_ = nullptr;
BufferMap buffers_;
TextureMap textures_;
SamplerMap samplers_;
};
} // namespace impeller
#endif // FLUTTER_IMPELLER_RENDERER_BACKEND_METAL_COMPUTE_PASS_BINDINGS_CACHE_MTL_H_