|
24 | 24 |
|
25 | 25 | namespace impeller { |
26 | 26 |
|
| 27 | +namespace { |
| 28 | +constexpr char kPaddingType = 0; |
| 29 | +constexpr char kFloatType = 1; |
| 30 | +} // namespace |
| 31 | + |
| 32 | +// static |
| 33 | +BufferView RuntimeEffectContents::EmplaceVulkanUniform( |
| 34 | + const std::shared_ptr<const std::vector<uint8_t>>& input_data, |
| 35 | + HostBuffer& host_buffer, |
| 36 | + const RuntimeUniformDescription& uniform) { |
| 37 | + // TODO(jonahwilliams): rewrite this to emplace directly into |
| 38 | + // HostBuffer. |
| 39 | + std::vector<float> uniform_buffer; |
| 40 | + uniform_buffer.reserve(uniform.struct_layout.size()); |
| 41 | + size_t uniform_byte_index = 0u; |
| 42 | + for (char byte_type : uniform.struct_layout) { |
| 43 | + if (byte_type == kPaddingType) { |
| 44 | + uniform_buffer.push_back(0.f); |
| 45 | + } else { |
| 46 | + FML_DCHECK(byte_type == kFloatType); |
| 47 | + uniform_buffer.push_back(reinterpret_cast<const float*>( |
| 48 | + input_data->data())[uniform_byte_index++]); |
| 49 | + } |
| 50 | + } |
| 51 | + size_t alignment = std::max(sizeof(float) * uniform_buffer.size(), |
| 52 | + DefaultUniformAlignment()); |
| 53 | + |
| 54 | + return host_buffer.Emplace( |
| 55 | + reinterpret_cast<const void*>(uniform_buffer.data()), |
| 56 | + sizeof(float) * uniform_buffer.size(), alignment); |
| 57 | +} |
| 58 | + |
27 | 59 | void RuntimeEffectContents::SetRuntimeStage( |
28 | 60 | std::shared_ptr<RuntimeStage> runtime_stage) { |
29 | 61 | runtime_stage_ = std::move(runtime_stage); |
@@ -251,30 +283,11 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer, |
251 | 283 | uniform_slot.binding = uniform.location; |
252 | 284 | uniform_slot.name = uniform.name.c_str(); |
253 | 285 |
|
254 | | - // TODO(jonahwilliams): rewrite this to emplace directly into |
255 | | - // HostBuffer. |
256 | | - std::vector<float> uniform_buffer; |
257 | | - uniform_buffer.reserve(uniform.struct_layout.size()); |
258 | | - size_t uniform_byte_index = 0u; |
259 | | - for (const auto& byte_type : uniform.struct_layout) { |
260 | | - if (byte_type == 0) { |
261 | | - uniform_buffer.push_back(0.f); |
262 | | - } else if (byte_type == 1) { |
263 | | - uniform_buffer.push_back(reinterpret_cast<float*>( |
264 | | - uniform_data_->data())[uniform_byte_index++]); |
265 | | - } else { |
266 | | - FML_UNREACHABLE(); |
267 | | - } |
268 | | - } |
269 | | - size_t alignment = std::max(sizeof(float) * uniform_buffer.size(), |
270 | | - DefaultUniformAlignment()); |
271 | | - |
272 | | - BufferView buffer_view = renderer.GetTransientsBuffer().Emplace( |
273 | | - reinterpret_cast<const void*>(uniform_buffer.data()), |
274 | | - sizeof(float) * uniform_buffer.size(), alignment); |
275 | | - pass.BindResource(ShaderStage::kFragment, |
276 | | - DescriptorType::kUniformBuffer, uniform_slot, |
277 | | - nullptr, std::move(buffer_view)); |
| 286 | + pass.BindResource( |
| 287 | + ShaderStage::kFragment, DescriptorType::kUniformBuffer, |
| 288 | + uniform_slot, nullptr, |
| 289 | + EmplaceVulkanUniform(uniform_data_, |
| 290 | + renderer.GetTransientsBuffer(), uniform)); |
278 | 291 | } |
279 | 292 | } |
280 | 293 | } |
|
0 commit comments