From 1867ab94c4aab81effb27680cd34c79cd33dd977 Mon Sep 17 00:00:00 2001 From: magicianA Date: Fri, 22 Jul 2022 02:37:04 +0800 Subject: [PATCH] [Impeller] Generate descriptor set layout bindings in generated C++ headers. (flutter/engine#34779) --- .../impeller/compiler/code_gen_template.h | 28 +++++++++++++++++++ .../flutter/impeller/compiler/reflector.cc | 26 +++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/engine/src/flutter/impeller/compiler/code_gen_template.h b/engine/src/flutter/impeller/compiler/code_gen_template.h index c408dc737a3..4a061fcadb5 100644 --- a/engine/src/flutter/impeller/compiler/code_gen_template.h +++ b/engine/src/flutter/impeller/compiler/code_gen_template.h @@ -147,6 +147,34 @@ std::move({{ arg.argument_name }}){% if not loop.is_last %}, {% endif %} {% endfor %} + // =========================================================================== + // Metadata for Vulkan ======================================================= + // =========================================================================== +#ifdef IMPELLER_ENABLE_VULKAN_REFLECTION +{% if length(buffers)+length(sampled_images) > 0 %} + static constexpr std::array kDescriptorSetLayouts{ +{% for buffer in buffers %} + VkDescriptorSetLayoutBinding{ + {{buffer.binding}}, // binding = {{buffer.binding}} + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, // descriptorType = Uniform Buffer + 1, // descriptorCount = 1 + {{to_vk_shader_stage_flag_bits(shader_stage)}}, // stageFlags = {{to_shader_stage(shader_stage)}} + nullptr, // pImmutableSamplers = NULL + }, +{% endfor %} +{% for sampled_image in sampled_images %} + VkDescriptorSetLayoutBinding{ + {{sampled_image.binding}}, // binding = {{sampled_image.binding}} + VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, // descriptorType = Sampled Image + 1, // descriptorCount = 1 + {{to_vk_shader_stage_flag_bits(shader_stage)}},// stageFlags = {{to_shader_stage(shader_stage)}} + nullptr, // pImmutableSamplers = NULL + }, +{% endfor %} + }; +{% endif %} +#endif + }; // struct {{camel_case(shader_name)}}{{camel_case(shader_stage)}}Shader } // namespace impeller diff --git a/engine/src/flutter/impeller/compiler/reflector.cc b/engine/src/flutter/impeller/compiler/reflector.cc index ae0f294bb3e..69d61719e08 100644 --- a/engine/src/flutter/impeller/compiler/reflector.cc +++ b/engine/src/flutter/impeller/compiler/reflector.cc @@ -108,6 +108,28 @@ static std::string StringToShaderStage(std::string str) { return "ShaderStage::kUnknown"; } +static std::string StringToVkShaderStage(std::string str) { + if (str == "vertex") { + return "VK_SHADER_STAGE_VERTEX_BIT"; + } + if (str == "fragment") { + return "VK_SHADER_STAGE_FRAGMENT_BIT"; + } + + if (str == "tessellation_control") { + return "VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT"; + } + + if (str == "tessellation_evaluation") { + return "VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT"; + } + + if (str == "compute") { + return "VK_SHADER_STAGE_COMPUTE_BIT"; + } + return "VK_SHADER_STAGE_ALL_GRAPHICS"; +} + Reflector::Reflector(Options options, std::shared_ptr ir, std::shared_ptr shader_data, @@ -367,6 +389,10 @@ std::shared_ptr Reflector::InflateTemplate( [type = compiler_.GetType()](inja::Arguments& args) { return ToString(type); }); + env.add_callback( + "to_vk_shader_stage_flag_bits", 1u, [](inja::Arguments& args) { + return StringToVkShaderStage(args.at(0u)->get()); + }); auto inflated_template = std::make_shared(env.render(tmpl, *template_arguments_));