• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2021 Valve Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  *
23  * Authors:
24  *    Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
25  */
26 
27 #ifndef ZINK_KOPPER_H
28 #define ZINK_KOPPER_H
29 
30 #include "kopper_interface.h"
31 #include "util/u_queue.h"
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 struct zink_batch_usage;
38 
39 /* number of times a swapchain can be read without forcing readback mode */
40 #define ZINK_READBACK_THRESHOLD 3
41 
42 struct kopper_swapchain_image {
43    bool init;
44    bool readback_needs_update;
45    bool dt_has_data;
46    int age;
47    VkImage image;
48    struct zink_resource *acquired;
49    struct pipe_resource *readback;
50    VkSemaphore acquire;
51    VkImageLayout layout;
52 };
53 
54 struct kopper_swapchain {
55    struct kopper_swapchain *next;
56    VkSwapchainKHR swapchain;
57 
58    unsigned last_present;
59    unsigned num_images;
60    uint32_t last_present_prune;
61    struct hash_table *presents;
62    VkSwapchainCreateInfoKHR scci;
63    unsigned num_acquires;
64    unsigned max_acquires;
65    unsigned async_presents;
66    struct util_queue_fence present_fence;
67    struct zink_batch_usage *batch_uses;
68    struct kopper_swapchain_image *images;
69 };
70 
71 enum kopper_type {
72    KOPPER_X11,
73    KOPPER_WAYLAND,
74    KOPPER_WIN32,
75    KOPPER_OHOS,
76 };
77 
78 struct kopper_displaytarget
79 {
80    unsigned refcount;
81    VkFormat formats[2];
82    unsigned width;
83    unsigned height;
84    unsigned stride;
85    void *loader_private;
86 
87    VkSurfaceKHR surface;
88    uint32_t present_modes; //VkPresentModeKHR bitmask
89    struct kopper_swapchain *swapchain;
90    struct kopper_swapchain *old_swapchain;
91 
92    struct kopper_loader_info info;
93 
94    bool async; // True if submits should go through zink_screen::flush_queue
95 
96    VkSurfaceCapabilitiesKHR caps;
97    VkImageFormatListCreateInfo format_list;
98    enum kopper_type type;
99    bool is_kill;
100    VkPresentModeKHR present_mode;
101    unsigned readback_counter;
102 
103    bool age_locked; //disables buffer age during readback
104 };
105 
106 struct zink_kopper_present_info {
107    VkPresentInfoKHR info;
108    VkPresentRegionsKHR rinfo;
109    VkPresentRegionKHR region;
110    VkRectLayerKHR regions[64];
111    uint32_t image;
112    struct kopper_swapchain *swapchain;
113    struct zink_resource *res;
114    VkSemaphore sem;
115    bool indefinite_acquire;
116 };
117 
118 struct zink_context;
119 struct zink_screen;
120 struct zink_resource;
121 
122 static inline bool
zink_kopper_has_srgb(const struct kopper_displaytarget * cdt)123 zink_kopper_has_srgb(const struct kopper_displaytarget *cdt)
124 {
125    return cdt->formats[1] != VK_FORMAT_UNDEFINED;
126 }
127 
128 static inline bool
zink_kopper_last_present_eq(const struct kopper_displaytarget * cdt,uint32_t idx)129 zink_kopper_last_present_eq(const struct kopper_displaytarget *cdt, uint32_t idx)
130 {
131    return cdt->swapchain->last_present == idx;
132 }
133 
134 static inline bool
zink_kopper_acquired(const struct kopper_displaytarget * cdt,uint32_t idx)135 zink_kopper_acquired(const struct kopper_displaytarget *cdt, uint32_t idx)
136 {
137    return idx != UINT32_MAX && cdt->swapchain->images[idx].acquired;
138 }
139 
kopper_get_zink_screen(struct pipe_screen * screen)140 static inline struct pipe_screen * kopper_get_zink_screen(struct pipe_screen *screen)
141 {
142    struct pipe_screen *pscreen = screen->get_driver_pipe_screen ?
143       screen->get_driver_pipe_screen(screen) : screen;
144    return pscreen;
145 }
146 
147 void
148 zink_kopper_update_last_written(struct zink_resource *res);
149 
150 struct kopper_displaytarget *
151 zink_kopper_displaytarget_create(struct zink_screen *screen, unsigned tex_usage,
152                                  enum pipe_format format, unsigned width,
153                                  unsigned height, unsigned alignment,
154                                  const void *loader_private, unsigned *stride);
155 void
156 zink_kopper_displaytarget_destroy(struct zink_screen *screen, struct kopper_displaytarget *cdt);
157 
158 
159 bool
160 zink_kopper_acquire(struct zink_context *ctx, struct zink_resource *res, uint64_t timeout);
161 VkSemaphore
162 zink_kopper_acquire_submit(struct zink_screen *screen, struct zink_resource *res);
163 VkSemaphore
164 zink_kopper_present(struct zink_screen *screen, struct zink_resource *res);
165 void
166 zink_kopper_present_queue(struct zink_screen *screen, struct zink_resource *res, unsigned nrects, struct pipe_box *boxes);
167 bool
168 zink_kopper_acquire_readback(struct zink_context *ctx, struct zink_resource *res, struct zink_resource **readback);
169 bool
170 zink_kopper_present_readback(struct zink_context *ctx, struct zink_resource *res);
171 void
172 zink_kopper_readback_update(struct zink_context *ctx, struct zink_resource *res);
173 void
174 zink_kopper_deinit_displaytarget(struct zink_screen *screen, struct kopper_displaytarget *cdt);
175 bool
176 zink_kopper_update(struct pipe_screen *pscreen, struct pipe_resource *pres, int *w, int *h);
177 bool
178 zink_kopper_is_cpu(const struct pipe_screen *pscreen);
179 void
180 zink_kopper_fixup_depth_buffer(struct zink_context *ctx);
181 bool
182 zink_kopper_check(struct pipe_resource *pres);
183 void
184 zink_kopper_set_swap_interval(struct pipe_screen *pscreen, struct pipe_resource *pres, int interval);
185 int
186 zink_kopper_query_buffer_age(struct pipe_context *pctx, struct pipe_resource *pres);
187 void
188 zink_kopper_prune_batch_usage(struct kopper_displaytarget *cdt, const struct zink_batch_usage *u);
189 void
190 zink_kopper_set_readback_needs_update(struct zink_resource *res);
191 
192 #ifdef __cplusplus
193 }
194 #endif
195 
196 #endif
197