Flutter Impeller
impeller::PassBindingsCacheMTL Struct Reference

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. More...

#include <pass_bindings_cache_mtl.h>

Public Member Functions

 PassBindingsCacheMTL ()
 
 ~PassBindingsCacheMTL ()=default
 
 PassBindingsCacheMTL (const PassBindingsCacheMTL &)=delete
 
 PassBindingsCacheMTL (PassBindingsCacheMTL &&)=delete
 
void SetEncoder (id< MTLRenderCommandEncoder > encoder)
 
void SetRenderPipelineState (id< MTLRenderPipelineState > pipeline)
 
void SetDepthStencilState (id< MTLDepthStencilState > depth_stencil)
 
bool SetBuffer (ShaderStage stage, uint64_t index, uint64_t offset, id< MTLBuffer > buffer)
 
bool SetTexture (ShaderStage stage, uint64_t index, id< MTLTexture > texture)
 
bool SetSampler (ShaderStage stage, uint64_t index, id< MTLSamplerState > sampler)
 
void SetViewport (const Viewport &viewport)
 
void SetScissor (const IRect &scissor)
 

Detailed Description

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.

Definition at line 24 of file pass_bindings_cache_mtl.h.

Constructor & Destructor Documentation

◆ PassBindingsCacheMTL() [1/3]

impeller::PassBindingsCacheMTL::PassBindingsCacheMTL ( )
inlineexplicit

Definition at line 25 of file pass_bindings_cache_mtl.h.

25 {}

◆ ~PassBindingsCacheMTL()

impeller::PassBindingsCacheMTL::~PassBindingsCacheMTL ( )
default

◆ PassBindingsCacheMTL() [2/3]

impeller::PassBindingsCacheMTL::PassBindingsCacheMTL ( const PassBindingsCacheMTL )
delete

◆ PassBindingsCacheMTL() [3/3]

impeller::PassBindingsCacheMTL::PassBindingsCacheMTL ( PassBindingsCacheMTL &&  )
delete

Member Function Documentation

◆ SetBuffer()

bool impeller::PassBindingsCacheMTL::SetBuffer ( ShaderStage  stage,
uint64_t  index,
uint64_t  offset,
id< MTLBuffer >  buffer 
)

Definition at line 31 of file pass_bindings_cache_mtl.mm.

34  {
35  auto& buffers_map = buffers_[stage];
36  auto found = buffers_map.find(index);
37  if (found != buffers_map.end() && found->second.buffer == buffer) {
38  // The right buffer is bound. Check if its offset needs to be updated.
39  if (found->second.offset == offset) {
40  // Buffer and its offset is identical. Nothing to do.
41  return true;
42  }
43 
44  // Only the offset needs to be updated.
45  found->second.offset = offset;
46 
47  switch (stage) {
49  [encoder_ setVertexBufferOffset:offset atIndex:index];
50  return true;
52  [encoder_ setFragmentBufferOffset:offset atIndex:index];
53  return true;
54  default:
55  VALIDATION_LOG << "Cannot update buffer offset of an unknown stage.";
56  return false;
57  }
58  return true;
59  }
60  buffers_map[index] = {buffer, static_cast<size_t>(offset)};
61  switch (stage) {
63  [encoder_ setVertexBuffer:buffer offset:offset atIndex:index];
64  return true;
66  [encoder_ setFragmentBuffer:buffer offset:offset atIndex:index];
67  return true;
68  default:
69  VALIDATION_LOG << "Cannot bind buffer to unknown shader stage.";
70  return false;
71  }
72  return false;
73 }

References impeller::kFragment, impeller::kVertex, offset, and VALIDATION_LOG.

Referenced by impeller::Bind().

◆ SetDepthStencilState()

void impeller::PassBindingsCacheMTL::SetDepthStencilState ( id< MTLDepthStencilState >  depth_stencil)

Definition at line 22 of file pass_bindings_cache_mtl.mm.

23  {
24  if (depth_stencil_ == depth_stencil) {
25  return;
26  }
27  depth_stencil_ = depth_stencil;
28  [encoder_ setDepthStencilState:depth_stencil_];
29 }

◆ SetEncoder()

void impeller::PassBindingsCacheMTL::SetEncoder ( id< MTLRenderCommandEncoder >  encoder)

Definition at line 9 of file pass_bindings_cache_mtl.mm.

9  {
10  encoder_ = encoder;
11 }

◆ SetRenderPipelineState()

void impeller::PassBindingsCacheMTL::SetRenderPipelineState ( id< MTLRenderPipelineState >  pipeline)

Definition at line 13 of file pass_bindings_cache_mtl.mm.

14  {
15  if (pipeline == pipeline_) {
16  return;
17  }
18  pipeline_ = pipeline;
19  [encoder_ setRenderPipelineState:pipeline_];
20 }

◆ SetSampler()

bool impeller::PassBindingsCacheMTL::SetSampler ( ShaderStage  stage,
uint64_t  index,
id< MTLSamplerState >  sampler 
)

Definition at line 99 of file pass_bindings_cache_mtl.mm.

101  {
102  auto& sampler_map = samplers_[stage];
103  auto found = sampler_map.find(index);
104  if (found != sampler_map.end() && found->second == sampler) {
105  // Already bound.
106  return true;
107  }
108  sampler_map[index] = sampler;
109  switch (stage) {
111  [encoder_ setVertexSamplerState:sampler atIndex:index];
112  return true;
114  [encoder_ setFragmentSamplerState:sampler atIndex:index];
115  return true;
116  default:
117  VALIDATION_LOG << "Cannot bind buffer to unknown shader stage.";
118  return false;
119  }
120  return false;
121 }

References impeller::kFragment, impeller::kVertex, and VALIDATION_LOG.

Referenced by impeller::Bind().

◆ SetScissor()

void impeller::PassBindingsCacheMTL::SetScissor ( const IRect scissor)

Definition at line 138 of file pass_bindings_cache_mtl.mm.

138  {
139  if (scissor_.has_value() && scissor_.value() == scissor) {
140  return;
141  }
142  [encoder_
143  setScissorRect:MTLScissorRect{
144  .x = static_cast<NSUInteger>(scissor.GetX()),
145  .y = static_cast<NSUInteger>(scissor.GetY()),
146  .width = static_cast<NSUInteger>(scissor.GetWidth()),
147  .height = static_cast<NSUInteger>(scissor.GetHeight()),
148  }];
149  scissor_ = scissor;
150 }

References impeller::TRect< T >::GetHeight(), impeller::TRect< T >::GetWidth(), impeller::TRect< T >::GetX(), and impeller::TRect< T >::GetY().

◆ SetTexture()

bool impeller::PassBindingsCacheMTL::SetTexture ( ShaderStage  stage,
uint64_t  index,
id< MTLTexture >  texture 
)

Definition at line 75 of file pass_bindings_cache_mtl.mm.

77  {
78  auto& texture_map = textures_[stage];
79  auto found = texture_map.find(index);
80  if (found != texture_map.end() && found->second == texture) {
81  // Already bound.
82  return true;
83  }
84  texture_map[index] = texture;
85  switch (stage) {
87  [encoder_ setVertexTexture:texture atIndex:index];
88  return true;
90  [encoder_ setFragmentTexture:texture atIndex:index];
91  return true;
92  default:
93  VALIDATION_LOG << "Cannot bind buffer to unknown shader stage.";
94  return false;
95  }
96  return false;
97 }

References impeller::kFragment, impeller::kVertex, and VALIDATION_LOG.

Referenced by impeller::Bind().

◆ SetViewport()

void impeller::PassBindingsCacheMTL::SetViewport ( const Viewport viewport)

Definition at line 123 of file pass_bindings_cache_mtl.mm.

123  {
124  if (viewport_.has_value() && viewport_.value() == viewport) {
125  return;
126  }
127  [encoder_ setViewport:MTLViewport{
128  .originX = viewport.rect.GetX(),
129  .originY = viewport.rect.GetY(),
130  .width = viewport.rect.GetWidth(),
131  .height = viewport.rect.GetHeight(),
132  .znear = viewport.depth_range.z_near,
133  .zfar = viewport.depth_range.z_far,
134  }];
135  viewport_ = viewport;
136 }

References impeller::Viewport::depth_range, impeller::TRect< T >::GetHeight(), impeller::TRect< T >::GetWidth(), impeller::TRect< T >::GetX(), impeller::TRect< T >::GetY(), impeller::Viewport::rect, impeller::DepthRange::z_far, and impeller::DepthRange::z_near.


The documentation for this struct was generated from the following files:
impeller::ShaderStage::kFragment
@ kFragment
VALIDATION_LOG
#define VALIDATION_LOG
Definition: validation.h:73
impeller::ShaderStage::kVertex
@ kVertex
offset
Point offset
Definition: stroke_path_geometry.cc:300