diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 659ee197fee08..6d6fab596ba64 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -808,6 +808,7 @@ FILE: ../../../flutter/impeller/renderer/command_buffer.cc FILE: ../../../flutter/impeller/renderer/command_buffer.h FILE: ../../../flutter/impeller/renderer/context.cc FILE: ../../../flutter/impeller/renderer/context.h +FILE: ../../../flutter/impeller/renderer/descriptor_set_layout.h FILE: ../../../flutter/impeller/renderer/device_buffer.cc FILE: ../../../flutter/impeller/renderer/device_buffer.h FILE: ../../../flutter/impeller/renderer/device_buffer_unittests.cc diff --git a/impeller/compiler/code_gen_template.h b/impeller/compiler/code_gen_template.h index 4a061fcadb5ad..7769f02779524 100644 --- a/impeller/compiler/code_gen_template.h +++ b/impeller/compiler/code_gen_template.h @@ -16,15 +16,17 @@ constexpr std::string_view kReflectionHeaderTemplate = {# Note: The nogncheck decorations are only to make GN not mad at the template#} {# this file is generated from. There are no GN rule violations in the generated#} {# file itself and the no-check declarations will be stripped in generated files.#} -#include "impeller/renderer/buffer_view.h" {# // nogncheck #} +#include "impeller/renderer/buffer_view.h" {# // nogncheck #} -#include "impeller/renderer/command.h" {# // nogncheck #} +#include "impeller/renderer/command.h" {# // nogncheck #} -#include "impeller/renderer/sampler.h" {# // nogncheck #} +#include "impeller/renderer/descriptor_set_layout.h" {# // nogncheck #} -#include "impeller/renderer/shader_types.h" {# // nogncheck #} +#include "impeller/renderer/sampler.h" {# // nogncheck #} -#include "impeller/renderer/texture.h" {# // nogncheck #} +#include "impeller/renderer/shader_types.h" {# // nogncheck #} + +#include "impeller/renderer/texture.h" {# // nogncheck #} namespace impeller { @@ -150,30 +152,26 @@ std::move({{ arg.argument_name }}){% if not loop.is_last %}, {% endif %} // =========================================================================== // Metadata for Vulkan ======================================================= // =========================================================================== -#ifdef IMPELLER_ENABLE_VULKAN_REFLECTION {% if length(buffers)+length(sampled_images) > 0 %} - static constexpr std::array kDescriptorSetLayouts{ + static constexpr std::array kDescriptorSetLayouts{ {% for buffer in buffers %} - VkDescriptorSetLayoutBinding{ + DescriptorSetLayout{ {{buffer.binding}}, // binding = {{buffer.binding}} - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, // descriptorType = Uniform Buffer + DescriptorType::kUniformBuffer, // descriptorType = Uniform Buffer 1, // descriptorCount = 1 - {{to_vk_shader_stage_flag_bits(shader_stage)}}, // stageFlags = {{to_shader_stage(shader_stage)}} - nullptr, // pImmutableSamplers = NULL + {{to_shader_stage(shader_stage)}}, // stageFlags = {{to_shader_stage(shader_stage)}} }, {% endfor %} {% for sampled_image in sampled_images %} - VkDescriptorSetLayoutBinding{ + DescriptorSetLayout{ {{sampled_image.binding}}, // binding = {{sampled_image.binding}} - VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, // descriptorType = Sampled Image + DescriptorType::kSampledImage, // descriptorType = Sampled Image 1, // descriptorCount = 1 - {{to_vk_shader_stage_flag_bits(shader_stage)}},// stageFlags = {{to_shader_stage(shader_stage)}} - nullptr, // pImmutableSamplers = NULL + {{to_shader_stage(shader_stage)}}, // stageFlags = {{to_shader_stage(shader_stage)}} }, {% endfor %} }; {% endif %} -#endif }; // struct {{camel_case(shader_name)}}{{camel_case(shader_stage)}}Shader diff --git a/impeller/renderer/BUILD.gn b/impeller/renderer/BUILD.gn index 9223f4646fb5f..460502c838a61 100644 --- a/impeller/renderer/BUILD.gn +++ b/impeller/renderer/BUILD.gn @@ -22,6 +22,7 @@ impeller_component("renderer") { "command_buffer.h", "context.cc", "context.h", + "descriptor_set_layout.h", "device_buffer.cc", "device_buffer.h", "formats.cc", diff --git a/impeller/renderer/descriptor_set_layout.h b/impeller/renderer/descriptor_set_layout.h new file mode 100644 index 0000000000000..d853f0a663086 --- /dev/null +++ b/impeller/renderer/descriptor_set_layout.h @@ -0,0 +1,27 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#pragma once + +#include +#include + +#include "flutter/fml/macros.h" +#include "impeller/renderer/shader_types.h" + +namespace impeller { + +enum class DescriptorType { + kSampledImage, + kUniformBuffer, +}; + +struct DescriptorSetLayout { + uint32_t binding; + DescriptorType descriptor_type; + uint32_t descriptor_count; + ShaderStage shader_stage; +}; + +} // namespace impeller diff --git a/impeller/renderer/pipeline_builder.h b/impeller/renderer/pipeline_builder.h index 44cd202997cd9..92def4e50b7ea 100644 --- a/impeller/renderer/pipeline_builder.h +++ b/impeller/renderer/pipeline_builder.h @@ -93,6 +93,13 @@ struct PipelineBuilder { << VertexShader::kLabel << "'."; return false; } + if (!vertex_descriptor->SetDescriptorSetLayouts( + VertexShader::kDescriptorSetLayouts)) { + VALIDATION_LOG << "Cound not configure vertex descriptor set layout for" + " pipeline named '" + << VertexShader::kLabel << "'."; + return false; + } desc.SetVertexDescriptor(std::move(vertex_descriptor)); } diff --git a/impeller/renderer/vertex_descriptor.cc b/impeller/renderer/vertex_descriptor.cc index a40efb31c5eb3..963a7478a1696 100644 --- a/impeller/renderer/vertex_descriptor.cc +++ b/impeller/renderer/vertex_descriptor.cc @@ -20,6 +20,16 @@ bool VertexDescriptor::SetStageInputs( return true; } +bool VertexDescriptor::SetDescriptorSetLayouts( + const DescriptorSetLayout desc_set_layout[], + size_t count) { + desc_set_layouts_.reserve(desc_set_layouts_.size() + count); + for (size_t i = 0; i < count; i++) { + desc_set_layouts_.emplace_back(desc_set_layout[i]); + } + return true; +} + // |Comparable| size_t VertexDescriptor::GetHash() const { auto seed = fml::HashCombine(); @@ -38,4 +48,9 @@ const std::vector& VertexDescriptor::GetStageInputs() const { return inputs_; } +const std::vector& +VertexDescriptor::GetDescriptorSetLayouts() const { + return desc_set_layouts_; +} + } // namespace impeller diff --git a/impeller/renderer/vertex_descriptor.h b/impeller/renderer/vertex_descriptor.h index 4bef9b86d3644..dffe6694f7caf 100644 --- a/impeller/renderer/vertex_descriptor.h +++ b/impeller/renderer/vertex_descriptor.h @@ -8,6 +8,7 @@ #include "flutter/fml/macros.h" #include "impeller/base/comparable.h" +#include "impeller/renderer/descriptor_set_layout.h" #include "impeller/renderer/shader_types.h" namespace impeller { @@ -36,11 +37,22 @@ class VertexDescriptor final : public Comparable { return SetStageInputs(inputs.data(), inputs.size()); } + template + bool SetDescriptorSetLayouts( + const std::array& inputs) { + return SetDescriptorSetLayouts(inputs.data(), inputs.size()); + } + bool SetStageInputs(const ShaderStageIOSlot* const stage_inputs[], size_t count); + bool SetDescriptorSetLayouts(const DescriptorSetLayout desc_set_layout[], + size_t count); + const std::vector& GetStageInputs() const; + const std::vector& GetDescriptorSetLayouts() const; + // |Comparable| std::size_t GetHash() const override; @@ -49,6 +61,7 @@ class VertexDescriptor final : public Comparable { private: std::vector inputs_; + std::vector desc_set_layouts_; FML_DISALLOW_COPY_AND_ASSIGN(VertexDescriptor); };