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