| Flutter Impeller |

Classes | Public Member Functions | List of all members
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)
| Set the command encoder for this pass bindings cache. More...
void | SetRenderPipelineState (id< MTLRenderPipelineState > pipeline)
| Set the render pipeline state for the current encoder. More...
void | SetDepthStencilState (id< MTLDepthStencilState > depth_stencil)
| Set the depth and stencil state for the current encoder. More...
bool | SetBuffer (ShaderStage stage, uint64_t index, uint64_t offset, id< MTLBuffer > buffer)
| Set the buffer for the given shader stage, binding, and offset. More...
bool | SetTexture (ShaderStage stage, uint64_t index, id< MTLTexture > texture)
| Set the texture for the given stage and binding. More...
bool | SetSampler (ShaderStage stage, uint64_t index, id< MTLSamplerState > sampler)
| Set the sampler for the given stage and binding. More...
void | SetViewport (const Viewport &viewport)
| Set the viewport if the value is different from the current encoder state. More...
void | SetScissor (const IRect32 &scissor)
| Set the encoder scissor rect if the value is different from the current encoder state. More...
void | SetStencilRef (uint32_t stencil_ref)
| Set the encoder's stencil reference if the value is different from the current encoder state. More...

## 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 | ( |  | ) |
| inline explicit

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
| ) |  |

Set the buffer for the given shader stage, binding, and offset.

If the buffer is already bound, only the offset is updated.

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) {
48 case ShaderStage::kVertex:
49 [encoder_ setVertexBufferOffset:offset atIndex:index];
50 return true;
51 case ShaderStage::kFragment:
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) {
62 case ShaderStage::kVertex:
63 [encoder_ setVertexBuffer:buffer offset:offset atIndex:index];
64 return true;
65 case ShaderStage::kFragment:
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 }
impeller::ShaderStage::kFragment
@ kFragment
impeller::ShaderStage::kVertex
@ kVertex
VALIDATION_LOG
#define VALIDATION_LOG
Definition: validation.h:91

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

Referenced by impeller::Bind().

## ◆ SetDepthStencilState()

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

Set the depth and stencil state for the current encoder.

If this matches the previous depth and stencil state, no update is performed.

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 | ) |

Set the command encoder for this pass bindings cache.

The encoder must be set before any state adjusting commands can be called.

Definition at line 9 of file pass_bindings_cache_mtl.mm.

9 {
10 encoder_ = encoder;
11 }

## ◆ SetRenderPipelineState()

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

Set the render pipeline state for the current encoder.

If this matches the previous render pipeline state, no update is performed.

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
| ) |  |

Set the sampler for the given stage and binding.

If the same sampler is already bound at the index for this stage, no state updates are performed.

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) {
110 case ShaderStage::kVertex:
111 [encoder_ setVertexSamplerState:sampler atIndex:index];
112 return true;
113 case ShaderStage::kFragment:
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 IRect32 & | scissor | ) |

Set the encoder scissor rect if the value is different from the current encoder state.

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().

## ◆ SetStencilRef()

void impeller::PassBindingsCacheMTL::SetStencilRef | ( | uint32_t | stencil_ref | ) |

Set the encoder's stencil reference if the value is different from the current encoder state.

Definition at line 152 of file pass_bindings_cache_mtl.mm.

152 {
153 if (stencil_ref_.has_value() && stencil_ref_.value() == stencil_ref) {
154 return;
155 }
156 [encoder_ setStencilReferenceValue:stencil_ref];
157 stencil_ref_ = stencil_ref;
158 }

## ◆ SetTexture()

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

Set the texture for the given stage and binding.

If the same texture is already bound at the index for this stage, no state updates are performed.

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) {
86 case ShaderStage::kVertex:
87 [encoder_ setVertexTexture:texture atIndex:index];
88 return true;
89 case ShaderStage::kFragment:
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 | ) |

Set the viewport if the value is different from the current encoder state.

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/renderer/backend/metal/pass_bindings_cache_mtl.h
- impeller/renderer/backend/metal/pass_bindings_cache_mtl.mm