Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
multi_arch_shader_archive_writer.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
8#include "impeller/shader_archive/multi_arch_shader_archive_flatbuffers.h"
9
10namespace impeller {
11
13
15
18 std::shared_ptr<const fml::Mapping> mapping) {
19 if (!mapping || mapping->GetMapping() == nullptr) {
20 return false;
21 }
22 if (archives_.find(backend) != archives_.end()) {
23 VALIDATION_LOG << "Multi-archive already has a shader library registered "
24 "for that backend.";
25 return false;
26 }
27 archives_[backend] = std::move(mapping);
28 return true;
29}
30
31constexpr fb::RenderingBackend ToRenderingBackend(
33 switch (backend) {
35 return fb::RenderingBackend::kMetal;
37 return fb::RenderingBackend::kVulkan;
39 return fb::RenderingBackend::kOpenGLES;
40 }
42}
43
44std::shared_ptr<fml::Mapping> MultiArchShaderArchiveWriter::CreateMapping()
45 const {
46 fb::MultiArchShaderArchiveT multi_archive;
47 for (const auto& archive : archives_) {
48 auto archive_blob = std::make_unique<fb::ShaderArchiveBlobT>();
49 archive_blob->rendering_backend = ToRenderingBackend(archive.first);
50 archive_blob->mapping = {
51 archive.second->GetMapping(),
52 archive.second->GetMapping() + archive.second->GetSize()};
53 multi_archive.items.emplace_back(std::move(archive_blob));
54 }
55 auto builder = std::make_shared<flatbuffers::FlatBufferBuilder>();
56 builder->Finish(
57 fb::MultiArchShaderArchive::Pack(*builder.get(), &multi_archive),
58 fb::MultiArchShaderArchiveIdentifier());
59 return std::make_shared<fml::NonOwnedMapping>(builder->GetBufferPointer(),
60 builder->GetSize(),
61 [builder](auto, auto) {});
62}
63
64} // namespace impeller
const char * backend
bool RegisterShaderArchive(ArchiveRenderingBackend backend, std::shared_ptr< const fml::Mapping > mapping)
std::shared_ptr< fml::Mapping > CreateMapping() const
#define FML_UNREACHABLE()
Definition logging.h:109
constexpr fb::RenderingBackend ToRenderingBackend(ArchiveRenderingBackend backend)
#define VALIDATION_LOG
Definition validation.h:73