| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/ui/lib/escher/vk/shader_program_factory.h" |
| |
| #include "src/ui/lib/escher/vk/shader_program.h" |
| |
| namespace escher { |
| |
| ShaderProgramFactory::~ShaderProgramFactory() = default; |
| |
| ShaderProgramPtr ShaderProgramFactory::GetComputeProgram(std::string compute_shader_path, |
| ShaderVariantArgs args) { |
| // Array indices match the corresponding values of enum ShaderStage. In this |
| // case, only the path to the compute shader code is provided; all others are |
| // empty. |
| FX_DCHECK(!compute_shader_path.empty()); |
| std::string paths[EnumCount<ShaderStage>()] = {"", "", "", |
| "", "", std::move(compute_shader_path)}; |
| return GetProgramImpl(paths, std::move(args)); |
| } |
| |
| ShaderProgramPtr ShaderProgramFactory::GetGraphicsProgram(std::string vertex_shader_path, |
| std::string fragment_shader_path, |
| ShaderVariantArgs args) { |
| // Array indices match the corresponding values of enum ShaderStage. In this |
| // case, only the paths to the vertex and fragment shader code are provided; |
| // all others are empty. |
| FX_DCHECK(!vertex_shader_path.empty()); |
| std::string paths[EnumCount<ShaderStage>()] = {std::move(vertex_shader_path), "", "", "", |
| std::move(fragment_shader_path), ""}; |
| return GetProgramImpl(paths, std::move(args)); |
| } |
| |
| ShaderProgramPtr ShaderProgramFactory::GetProgram(ShaderProgramData program_data) { |
| std::string paths[EnumCount<ShaderStage>()]; |
| for (const auto& iter : program_data.source_files) { |
| paths[static_cast<uint8_t>(iter.first)] = std::move(iter.second); |
| } |
| |
| return GetProgramImpl(paths, program_data.args); |
| } |
| |
| ShaderProgramPtr ShaderProgramFactory::GetGraphicsProgram( |
| std::string vertex_shader_path, std::string tessellation_control_shader_path, |
| std::string tessellation_evaluation_shader_path, std::string geometry_shader_path, |
| std::string fragment_shader_path, ShaderVariantArgs args) { |
| // Array indices match the corresponding values of enum ShaderStage. In this |
| // case, paths are provided for all shader stages except the compute shader. |
| FX_DCHECK(!vertex_shader_path.empty()); |
| static const std::string kEmpty(""); |
| std::string paths[EnumCount<ShaderStage>()] = {std::move(vertex_shader_path), |
| std::move(tessellation_control_shader_path), |
| std::move(tessellation_evaluation_shader_path), |
| std::move(geometry_shader_path), |
| std::move(fragment_shader_path), |
| kEmpty}; |
| return GetProgramImpl(paths, std::move(args)); |
| } |
| |
| } // namespace escher |