1e5c31af7Sopenharmony_ci// Copyright 2019 The Amber Authors. 2e5c31af7Sopenharmony_ci// 3e5c31af7Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 4e5c31af7Sopenharmony_ci// you may not use this file except in compliance with the License. 5e5c31af7Sopenharmony_ci// You may obtain a copy of the License at 6e5c31af7Sopenharmony_ci// 7e5c31af7Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 8e5c31af7Sopenharmony_ci// 9e5c31af7Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 10e5c31af7Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 11e5c31af7Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e5c31af7Sopenharmony_ci// See the License for the specific language governing permissions and 13e5c31af7Sopenharmony_ci// limitations under the License. 14e5c31af7Sopenharmony_ci 15e5c31af7Sopenharmony_ci#ifndef SAMPLES_CONFIG_HELPER_VULKAN_H_ 16e5c31af7Sopenharmony_ci#define SAMPLES_CONFIG_HELPER_VULKAN_H_ 17e5c31af7Sopenharmony_ci 18e5c31af7Sopenharmony_ci#include <vulkan/vulkan.h> 19e5c31af7Sopenharmony_ci 20e5c31af7Sopenharmony_ci#include <limits> 21e5c31af7Sopenharmony_ci#include <memory> 22e5c31af7Sopenharmony_ci#include <string> 23e5c31af7Sopenharmony_ci#include <vector> 24e5c31af7Sopenharmony_ci 25e5c31af7Sopenharmony_ci#include "amber/amber.h" 26e5c31af7Sopenharmony_ci#include "amber/amber_vulkan.h" 27e5c31af7Sopenharmony_ci#include "samples/config_helper.h" 28e5c31af7Sopenharmony_ci 29e5c31af7Sopenharmony_ci#pragma clang diagnostic push 30e5c31af7Sopenharmony_ci#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" 31e5c31af7Sopenharmony_ci 32e5c31af7Sopenharmony_cinamespace sample { 33e5c31af7Sopenharmony_ci 34e5c31af7Sopenharmony_ci/// Child class of ConfigHelperImpl for Vulkan. 35e5c31af7Sopenharmony_ciclass ConfigHelperVulkan : public ConfigHelperImpl { 36e5c31af7Sopenharmony_ci public: 37e5c31af7Sopenharmony_ci ConfigHelperVulkan(); 38e5c31af7Sopenharmony_ci ~ConfigHelperVulkan() override; 39e5c31af7Sopenharmony_ci 40e5c31af7Sopenharmony_ci /// Create Vulkan instance and device and return them as 41e5c31af7Sopenharmony_ci /// amber::VulkanEngineConfig. Required Vulkan device features and 42e5c31af7Sopenharmony_ci /// extensions are given in |required_features| and 43e5c31af7Sopenharmony_ci /// |required_extensions|, respectively. 44e5c31af7Sopenharmony_ci amber::Result CreateConfig( 45e5c31af7Sopenharmony_ci uint32_t engine_major, 46e5c31af7Sopenharmony_ci uint32_t engine_minor, 47e5c31af7Sopenharmony_ci int32_t selected_device, 48e5c31af7Sopenharmony_ci const std::vector<std::string>& required_features, 49e5c31af7Sopenharmony_ci const std::vector<std::string>& required_instance_extensions, 50e5c31af7Sopenharmony_ci const std::vector<std::string>& required_device_extensions, 51e5c31af7Sopenharmony_ci bool disable_validation_layer, 52e5c31af7Sopenharmony_ci bool show_version_info, 53e5c31af7Sopenharmony_ci std::unique_ptr<amber::EngineConfig>* config) override; 54e5c31af7Sopenharmony_ci 55e5c31af7Sopenharmony_ci private: 56e5c31af7Sopenharmony_ci /// Create Vulkan instance. 57e5c31af7Sopenharmony_ci amber::Result CreateVulkanInstance( 58e5c31af7Sopenharmony_ci uint32_t engine_major, 59e5c31af7Sopenharmony_ci uint32_t engine_minor, 60e5c31af7Sopenharmony_ci std::vector<std::string> required_instance_extensions, 61e5c31af7Sopenharmony_ci bool disable_validation_layer); 62e5c31af7Sopenharmony_ci 63e5c31af7Sopenharmony_ci /// Create |vulkan_callback_| that reports validation layer errors 64e5c31af7Sopenharmony_ci /// via debugCallback() function in config_helper_vulkan.cc. 65e5c31af7Sopenharmony_ci amber::Result CreateDebugReportCallback(); 66e5c31af7Sopenharmony_ci 67e5c31af7Sopenharmony_ci /// Check if |physical_device| supports both 68e5c31af7Sopenharmony_ci /// |required_features| and |required_extensions|. 69e5c31af7Sopenharmony_ci amber::Result CheckVulkanPhysicalDeviceRequirements( 70e5c31af7Sopenharmony_ci const VkPhysicalDevice physical_device, 71e5c31af7Sopenharmony_ci const std::vector<std::string>& required_features, 72e5c31af7Sopenharmony_ci const std::vector<std::string>& required_extensions); 73e5c31af7Sopenharmony_ci 74e5c31af7Sopenharmony_ci /// Choose Vulkan physical device that supports both 75e5c31af7Sopenharmony_ci /// |required_features| and |required_extensions|. 76e5c31af7Sopenharmony_ci amber::Result ChooseVulkanPhysicalDevice( 77e5c31af7Sopenharmony_ci const std::vector<std::string>& required_features, 78e5c31af7Sopenharmony_ci const std::vector<std::string>& required_extensions, 79e5c31af7Sopenharmony_ci const int32_t selected_device); 80e5c31af7Sopenharmony_ci 81e5c31af7Sopenharmony_ci /// Create Vulkan logical device that enables both 82e5c31af7Sopenharmony_ci /// |required_features| and |required_extensions|. 83e5c31af7Sopenharmony_ci amber::Result CreateVulkanDevice( 84e5c31af7Sopenharmony_ci const std::vector<std::string>& required_features, 85e5c31af7Sopenharmony_ci const std::vector<std::string>& required_extensions); 86e5c31af7Sopenharmony_ci 87e5c31af7Sopenharmony_ci /// Sets up the device creation to use VkPhysicalDeviceFeatures. 88e5c31af7Sopenharmony_ci amber::Result CreateDeviceWithFeatures1( 89e5c31af7Sopenharmony_ci const std::vector<std::string>& required_features, 90e5c31af7Sopenharmony_ci VkDeviceCreateInfo* info); 91e5c31af7Sopenharmony_ci /// Sets up the device creation to use VkPhysicalDeviceFeatures2KHR. 92e5c31af7Sopenharmony_ci amber::Result CreateDeviceWithFeatures2( 93e5c31af7Sopenharmony_ci const std::vector<std::string>& required_features, 94e5c31af7Sopenharmony_ci VkDeviceCreateInfo* info); 95e5c31af7Sopenharmony_ci 96e5c31af7Sopenharmony_ci /// Creates the physical device given the device |info|. 97e5c31af7Sopenharmony_ci amber::Result DoCreateDevice(VkDeviceCreateInfo* info); 98e5c31af7Sopenharmony_ci 99e5c31af7Sopenharmony_ci /// Writes information related to the vulkan instance to stdout. 100e5c31af7Sopenharmony_ci void DumpPhysicalDeviceInfo(); 101e5c31af7Sopenharmony_ci 102e5c31af7Sopenharmony_ci VkInstance vulkan_instance_ = VK_NULL_HANDLE; 103e5c31af7Sopenharmony_ci VkDebugReportCallbackEXT vulkan_callback_ = VK_NULL_HANDLE; 104e5c31af7Sopenharmony_ci VkPhysicalDevice vulkan_physical_device_ = VK_NULL_HANDLE; 105e5c31af7Sopenharmony_ci std::vector<std::string> available_instance_extensions_; 106e5c31af7Sopenharmony_ci std::vector<std::string> available_device_extensions_; 107e5c31af7Sopenharmony_ci uint32_t vulkan_queue_family_index_ = std::numeric_limits<uint32_t>::max(); 108e5c31af7Sopenharmony_ci VkQueue vulkan_queue_ = VK_NULL_HANDLE; 109e5c31af7Sopenharmony_ci VkDevice vulkan_device_ = VK_NULL_HANDLE; 110e5c31af7Sopenharmony_ci 111e5c31af7Sopenharmony_ci bool supports_get_physical_device_properties2_ = false; 112e5c31af7Sopenharmony_ci bool supports_shader_float16_int8_ = false; 113e5c31af7Sopenharmony_ci bool supports_shader_8bit_storage_ = false; 114e5c31af7Sopenharmony_ci bool supports_shader_16bit_storage_ = false; 115e5c31af7Sopenharmony_ci bool supports_subgroup_size_control_ = false; 116e5c31af7Sopenharmony_ci bool supports_shader_subgroup_extended_types_ = false; 117e5c31af7Sopenharmony_ci VkPhysicalDeviceFeatures available_features_; 118e5c31af7Sopenharmony_ci VkPhysicalDeviceFeatures2KHR available_features2_; 119e5c31af7Sopenharmony_ci VkPhysicalDeviceVariablePointerFeaturesKHR variable_pointers_feature_; 120e5c31af7Sopenharmony_ci VkPhysicalDeviceFloat16Int8FeaturesKHR float16_int8_feature_; 121e5c31af7Sopenharmony_ci VkPhysicalDevice8BitStorageFeaturesKHR storage_8bit_feature_; 122e5c31af7Sopenharmony_ci VkPhysicalDevice16BitStorageFeaturesKHR storage_16bit_feature_; 123e5c31af7Sopenharmony_ci VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroup_size_control_feature_; 124e5c31af7Sopenharmony_ci VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures 125e5c31af7Sopenharmony_ci shader_subgroup_extended_types_feature_; 126e5c31af7Sopenharmony_ci}; 127e5c31af7Sopenharmony_ci 128e5c31af7Sopenharmony_ci} // namespace sample 129e5c31af7Sopenharmony_ci 130e5c31af7Sopenharmony_ci#pragma clang diagnostic pop 131e5c31af7Sopenharmony_ci 132e5c31af7Sopenharmony_ci#endif // SAMPLES_CONFIG_HELPER_VULKAN_H_ 133