Flutter Impeller
multi_arch_shader_archive.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 
7 #include "impeller/shader_archive/multi_arch_shader_archive_flatbuffers.h"
8 
9 namespace impeller {
10 
12  fb::RenderingBackend backend) {
13  switch (backend) {
14  case fb::RenderingBackend::kOpenGLES:
16  case fb::RenderingBackend::kVulkan:
18  case fb::RenderingBackend::kMetal:
20  }
21  FML_UNREACHABLE();
22 }
23 
24 std::shared_ptr<ShaderArchive> MultiArchShaderArchive::CreateArchiveFromMapping(
25  const std::shared_ptr<const fml::Mapping>& mapping,
26  ArchiveRenderingBackend backend) {
27  {
28  auto multi_archive = std::make_shared<MultiArchShaderArchive>(mapping);
29  if (multi_archive->IsValid()) {
30  return multi_archive->GetShaderArchive(backend);
31  }
32  }
33  {
34  auto single_archive =
35  std::shared_ptr<ShaderArchive>(new ShaderArchive(mapping));
36  if (single_archive->IsValid()) {
37  return single_archive;
38  }
39  }
40  return nullptr;
41 }
42 
44  const std::shared_ptr<const fml::Mapping>& mapping) {
45  if (!mapping) {
46  return;
47  }
48 
49  if (!fb::MultiArchShaderArchiveBufferHasIdentifier(mapping->GetMapping())) {
50  return;
51  }
52 
53  const auto* multi_arch = fb::GetMultiArchShaderArchive(mapping->GetMapping());
54 
55  if (!multi_arch) {
56  return;
57  }
58 
59  if (auto archives = multi_arch->items()) {
60  for (auto i = archives->begin(), end = archives->end(); i != end; i++) {
61  // This implementation is unable to handle multiple archives for the same
62  // backend.
63  backend_mappings_[ToArchiveRenderingBackend(i->rendering_backend())] =
64  std::make_shared<fml::NonOwnedMapping>(i->mapping()->Data(),
65  i->mapping()->size(),
66  [mapping](auto, auto) {
67  // Just hold the mapping.
68  });
69  }
70  }
71 
72  is_valid_ = true;
73 }
74 
76 
78  return is_valid_;
79 }
80 
81 std::shared_ptr<const fml::Mapping> MultiArchShaderArchive::GetArchive(
82  ArchiveRenderingBackend backend) const {
83  auto found = backend_mappings_.find(backend);
84  if (found == backend_mappings_.end()) {
85  return nullptr;
86  }
87  return found->second;
88 }
89 
90 std::shared_ptr<ShaderArchive> MultiArchShaderArchive::GetShaderArchive(
91  ArchiveRenderingBackend backend) const {
92  auto archive = GetArchive(backend);
93  if (!archive) {
94  return nullptr;
95  }
96  auto shader_archive =
97  std::shared_ptr<ShaderArchive>(new ShaderArchive(std::move(archive)));
98  if (!shader_archive->IsValid()) {
99  return nullptr;
100  }
101  return shader_archive;
102 }
103 
104 } // namespace impeller
impeller::ShaderArchive
Definition: shader_archive.h:21
impeller::ArchiveRenderingBackend::kVulkan
@ kVulkan
impeller::MultiArchShaderArchive::MultiArchShaderArchive
MultiArchShaderArchive(const std::shared_ptr< const fml::Mapping > &mapping)
Definition: multi_arch_shader_archive.cc:43
impeller::ToArchiveRenderingBackend
constexpr ArchiveRenderingBackend ToArchiveRenderingBackend(fb::RenderingBackend backend)
Definition: multi_arch_shader_archive.cc:11
impeller::MultiArchShaderArchive::GetArchive
std::shared_ptr< const fml::Mapping > GetArchive(ArchiveRenderingBackend backend) const
Definition: multi_arch_shader_archive.cc:81
impeller::MultiArchShaderArchive::CreateArchiveFromMapping
static std::shared_ptr< ShaderArchive > CreateArchiveFromMapping(const std::shared_ptr< const fml::Mapping > &mapping, ArchiveRenderingBackend backend)
Definition: multi_arch_shader_archive.cc:24
multi_arch_shader_archive.h
impeller::ArchiveRenderingBackend::kOpenGLES
@ kOpenGLES
impeller::MultiArchShaderArchive::~MultiArchShaderArchive
~MultiArchShaderArchive()
impeller::MultiArchShaderArchive::IsValid
bool IsValid() const
Definition: multi_arch_shader_archive.cc:77
impeller::ArchiveRenderingBackend::kMetal
@ kMetal
impeller::ArchiveRenderingBackend
ArchiveRenderingBackend
Definition: shader_archive_types.h:16
impeller::MultiArchShaderArchive::GetShaderArchive
std::shared_ptr< ShaderArchive > GetShaderArchive(ArchiveRenderingBackend backend) const
Definition: multi_arch_shader_archive.cc:90
impeller
Definition: aiks_blur_unittests.cc:20