1 /* RetroArch - A frontend for libretro. 2 * Copyright (C) 2010-2016 - Hans-Kristian Arntzen 3 * Copyright (C) 2011-2017 - Daniel De Matteis 4 * 5 * RetroArch is free software: you can redistribute it and/or modify it under the terms 6 * of the GNU General Public License as published by the Free Software Found- 7 * ation, either version 3 of the License, or (at your option) any later version. 8 * 9 * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 10 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 11 * PURPOSE. See the GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License along with RetroArch. 14 * If not, see <http://www.gnu.org/licenses/>. 15 */ 16 17 #ifndef SHADER_VULKAN_H 18 #define SHADER_VULKAN_H 19 20 #include <stdint.h> 21 #include <stddef.h> 22 23 #include <boolean.h> 24 #include <retro_common_api.h> 25 26 #include "glslang_util.h" 27 28 #include "../common/vulkan_common.h" 29 30 RETRO_BEGIN_DECLS 31 32 typedef struct vulkan_filter_chain vulkan_filter_chain_t; 33 34 struct vulkan_filter_chain_texture 35 { 36 VkImage image; 37 VkImageView view; 38 VkImageLayout layout; 39 unsigned width; 40 unsigned height; 41 VkFormat format; 42 }; 43 44 struct vulkan_filter_chain_pass_info 45 { 46 /* Maximum number of mip-levels to use. */ 47 unsigned max_levels; 48 49 float scale_x; 50 float scale_y; 51 52 /* Ignored for the last pass, swapchain info 53 * will be used instead. */ 54 VkFormat rt_format; 55 /* For the last pass, make sure VIEWPORT scale 56 * with scale factors of 1 are used. */ 57 enum glslang_filter_chain_scale scale_type_x; 58 enum glslang_filter_chain_scale scale_type_y; 59 /* The filter to use for source in this pass. */ 60 enum glslang_filter_chain_filter source_filter; 61 enum glslang_filter_chain_filter mip_filter; 62 enum glslang_filter_chain_address address; 63 }; 64 65 struct vulkan_filter_chain_swapchain_info 66 { 67 VkViewport viewport; 68 VkFormat format; 69 VkRenderPass render_pass; 70 unsigned num_indices; 71 }; 72 73 struct vulkan_filter_chain_create_info 74 { 75 VkDevice device; 76 VkPhysicalDevice gpu; 77 const VkPhysicalDeviceMemoryProperties *memory_properties; 78 VkPipelineCache pipeline_cache; 79 VkQueue queue; 80 VkCommandPool command_pool; 81 unsigned num_passes; 82 83 VkFormat original_format; 84 struct 85 { 86 unsigned width, height; 87 } max_input_size; 88 struct vulkan_filter_chain_swapchain_info swapchain; 89 }; 90 91 vulkan_filter_chain_t *vulkan_filter_chain_new( 92 const struct vulkan_filter_chain_create_info *info); 93 void vulkan_filter_chain_free(vulkan_filter_chain_t *chain); 94 95 void vulkan_filter_chain_set_shader(vulkan_filter_chain_t *chain, 96 unsigned pass, 97 VkShaderStageFlags stage, 98 const uint32_t *spirv, 99 size_t spirv_words); 100 101 void vulkan_filter_chain_set_pass_info(vulkan_filter_chain_t *chain, 102 unsigned pass, 103 const struct vulkan_filter_chain_pass_info *info); 104 105 bool vulkan_filter_chain_update_swapchain_info(vulkan_filter_chain_t *chain, 106 const struct vulkan_filter_chain_swapchain_info *info); 107 108 void vulkan_filter_chain_notify_sync_index(vulkan_filter_chain_t *chain, 109 unsigned index); 110 111 bool vulkan_filter_chain_init(vulkan_filter_chain_t *chain); 112 113 void vulkan_filter_chain_set_input_texture(vulkan_filter_chain_t *chain, 114 const struct vulkan_filter_chain_texture *texture); 115 116 void vulkan_filter_chain_set_frame_count(vulkan_filter_chain_t *chain, 117 uint64_t count); 118 119 void vulkan_filter_chain_set_frame_count_period(vulkan_filter_chain_t *chain, 120 unsigned pass, 121 unsigned period); 122 123 void vulkan_filter_chain_set_frame_direction(vulkan_filter_chain_t *chain, 124 int32_t direction); 125 126 void vulkan_filter_chain_set_pass_name(vulkan_filter_chain_t *chain, 127 unsigned pass, 128 const char *name); 129 130 void vulkan_filter_chain_build_offscreen_passes(vulkan_filter_chain_t *chain, 131 VkCommandBuffer cmd, const VkViewport *vp); 132 void vulkan_filter_chain_build_viewport_pass(vulkan_filter_chain_t *chain, 133 VkCommandBuffer cmd, const VkViewport *vp, const float *mvp); 134 void vulkan_filter_chain_end_frame(vulkan_filter_chain_t *chain, 135 VkCommandBuffer cmd); 136 137 vulkan_filter_chain_t *vulkan_filter_chain_create_default( 138 const struct vulkan_filter_chain_create_info *info, 139 enum glslang_filter_chain_filter filter); 140 141 vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( 142 const struct vulkan_filter_chain_create_info *info, 143 const char *path, enum glslang_filter_chain_filter filter); 144 145 struct video_shader *vulkan_filter_chain_get_preset( 146 vulkan_filter_chain_t *chain); 147 148 RETRO_END_DECLS 149 150 #endif 151