• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2016 Red Hat
3  * based on intel anv code:
4  * Copyright © 2015 Intel Corporation
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the next
14  * paragraph) shall be included in all copies or substantial portions of the
15  * Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
23  * IN THE SOFTWARE.
24  */
25 
26 #ifndef RADV_META_H
27 #define RADV_META_H
28 
29 #include "radv_private.h"
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 #define RADV_META_VERTEX_BINDING_COUNT 2
36 
37 struct radv_meta_saved_state {
38 	struct radv_vertex_binding old_vertex_bindings[RADV_META_VERTEX_BINDING_COUNT];
39 	struct radv_descriptor_set *old_descriptor_set0;
40 	struct radv_pipeline *old_pipeline;
41 
42 	/**
43 	 * Bitmask of (1 << VK_DYNAMIC_STATE_*). Defines the set of saved dynamic
44 	 * state.
45 	 */
46 	uint32_t dynamic_mask;
47 	struct radv_dynamic_state dynamic;
48 
49 	char push_constants[128];
50 };
51 
52 struct radv_meta_saved_pass_state {
53 	struct radv_render_pass *pass;
54 	const struct radv_subpass *subpass;
55 	struct radv_attachment_state *attachments;
56 	struct radv_framebuffer *framebuffer;
57 	VkRect2D render_area;
58 };
59 
60 struct radv_meta_saved_compute_state {
61 	struct radv_descriptor_set *old_descriptor_set0;
62 	struct radv_pipeline *old_pipeline;
63 
64 	char push_constants[128];
65 };
66 
67 VkResult radv_device_init_meta_clear_state(struct radv_device *device);
68 void radv_device_finish_meta_clear_state(struct radv_device *device);
69 
70 VkResult radv_device_init_meta_resolve_state(struct radv_device *device);
71 void radv_device_finish_meta_resolve_state(struct radv_device *device);
72 
73 VkResult radv_device_init_meta_depth_decomp_state(struct radv_device *device);
74 void radv_device_finish_meta_depth_decomp_state(struct radv_device *device);
75 
76 VkResult radv_device_init_meta_fast_clear_flush_state(struct radv_device *device);
77 void radv_device_finish_meta_fast_clear_flush_state(struct radv_device *device);
78 
79 VkResult radv_device_init_meta_blit_state(struct radv_device *device);
80 void radv_device_finish_meta_blit_state(struct radv_device *device);
81 
82 VkResult radv_device_init_meta_blit2d_state(struct radv_device *device);
83 void radv_device_finish_meta_blit2d_state(struct radv_device *device);
84 
85 VkResult radv_device_init_meta_buffer_state(struct radv_device *device);
86 void radv_device_finish_meta_buffer_state(struct radv_device *device);
87 
88 VkResult radv_device_init_meta_resolve_compute_state(struct radv_device *device);
89 void radv_device_finish_meta_resolve_compute_state(struct radv_device *device);
90 void radv_meta_save(struct radv_meta_saved_state *state,
91 		    const struct radv_cmd_buffer *cmd_buffer,
92 		    uint32_t dynamic_mask);
93 
94 void radv_meta_restore(const struct radv_meta_saved_state *state,
95 		       struct radv_cmd_buffer *cmd_buffer);
96 
97 void radv_meta_save_pass(struct radv_meta_saved_pass_state *state,
98 			 const struct radv_cmd_buffer *cmd_buffer);
99 
100 void radv_meta_restore_pass(const struct radv_meta_saved_pass_state *state,
101 			    struct radv_cmd_buffer *cmd_buffer);
102 
103 void radv_meta_save_compute(struct radv_meta_saved_compute_state *state,
104 			    const struct radv_cmd_buffer *cmd_buffer,
105 			    unsigned push_constant_size);
106 
107 void radv_meta_restore_compute(const struct radv_meta_saved_compute_state *state,
108 			       struct radv_cmd_buffer *cmd_buffer,
109 			       unsigned push_constant_size);
110 
111 VkImageViewType radv_meta_get_view_type(const struct radv_image *image);
112 
113 uint32_t radv_meta_get_iview_layer(const struct radv_image *dest_image,
114 				   const VkImageSubresourceLayers *dest_subresource,
115 				   const VkOffset3D *dest_offset);
116 
117 struct radv_meta_blit2d_surf {
118 	/** The size of an element in bytes. */
119 	uint8_t bs;
120 	VkFormat format;
121 
122 	struct radv_image *image;
123 	unsigned level;
124 	unsigned layer;
125 	VkImageAspectFlags aspect_mask;
126 };
127 
128 struct radv_meta_blit2d_buffer {
129 	struct radv_buffer *buffer;
130 	uint32_t offset;
131 	uint32_t pitch;
132 	uint8_t bs;
133 	VkFormat format;
134 };
135 
136 struct radv_meta_blit2d_rect {
137 	uint32_t src_x, src_y;
138 	uint32_t dst_x, dst_y;
139 	uint32_t width, height;
140 };
141 
142 void radv_meta_begin_blit2d(struct radv_cmd_buffer *cmd_buffer,
143 			    struct radv_meta_saved_state *save);
144 
145 void radv_meta_blit2d(struct radv_cmd_buffer *cmd_buffer,
146 		      struct radv_meta_blit2d_surf *src_img,
147 		      struct radv_meta_blit2d_buffer *src_buf,
148 		      struct radv_meta_blit2d_surf *dst,
149 		      unsigned num_rects,
150 		      struct radv_meta_blit2d_rect *rects);
151 
152 void radv_meta_end_blit2d(struct radv_cmd_buffer *cmd_buffer,
153 			  struct radv_meta_saved_state *save);
154 
155 
156 VkResult radv_device_init_meta_bufimage_state(struct radv_device *device);
157 void radv_device_finish_meta_bufimage_state(struct radv_device *device);
158 void radv_meta_begin_bufimage(struct radv_cmd_buffer *cmd_buffer,
159 			      struct radv_meta_saved_compute_state *save);
160 void radv_meta_end_bufimage(struct radv_cmd_buffer *cmd_buffer,
161 			    struct radv_meta_saved_compute_state *save);
162 void radv_meta_begin_itoi(struct radv_cmd_buffer *cmd_buffer,
163 			  struct radv_meta_saved_compute_state *save);
164 void radv_meta_end_itoi(struct radv_cmd_buffer *cmd_buffer,
165 			struct radv_meta_saved_compute_state *save);
166 void radv_meta_begin_cleari(struct radv_cmd_buffer *cmd_buffer,
167 			    struct radv_meta_saved_compute_state *save);
168 void radv_meta_end_cleari(struct radv_cmd_buffer *cmd_buffer,
169 			  struct radv_meta_saved_compute_state *save);
170 void radv_meta_image_to_buffer(struct radv_cmd_buffer *cmd_buffer,
171 			       struct radv_meta_blit2d_surf *src,
172 			       struct radv_meta_blit2d_buffer *dst,
173 			       unsigned num_rects,
174 			       struct radv_meta_blit2d_rect *rects);
175 
176 void radv_meta_buffer_to_image_cs(struct radv_cmd_buffer *cmd_buffer,
177 				  struct radv_meta_blit2d_buffer *src,
178 				  struct radv_meta_blit2d_surf *dst,
179 				  unsigned num_rects,
180 				  struct radv_meta_blit2d_rect *rects);
181 void radv_meta_image_to_image_cs(struct radv_cmd_buffer *cmd_buffer,
182 				 struct radv_meta_blit2d_surf *src,
183 				 struct radv_meta_blit2d_surf *dst,
184 				 unsigned num_rects,
185 				 struct radv_meta_blit2d_rect *rects);
186 void radv_meta_clear_image_cs(struct radv_cmd_buffer *cmd_buffer,
187 			      struct radv_meta_blit2d_surf *dst,
188 			      const VkClearColorValue *clear_color);
189 
190 void radv_decompress_depth_image_inplace(struct radv_cmd_buffer *cmd_buffer,
191 					 struct radv_image *image,
192 					 VkImageSubresourceRange *subresourceRange);
193 void radv_resummarize_depth_image_inplace(struct radv_cmd_buffer *cmd_buffer,
194 					  struct radv_image *image,
195 					  VkImageSubresourceRange *subresourceRange);
196 void radv_fast_clear_flush_image_inplace(struct radv_cmd_buffer *cmd_buffer,
197 					 struct radv_image *image);
198 
199 void radv_meta_save_graphics_reset_vport_scissor(struct radv_meta_saved_state *saved_state,
200 						 struct radv_cmd_buffer *cmd_buffer);
201 
202 void radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer,
203 				     struct radv_image *src_image,
204 				     VkImageLayout src_image_layout,
205 				     struct radv_image *dest_image,
206 				     VkImageLayout dest_image_layout,
207 				     uint32_t region_count,
208 				     const VkImageResolve *regions);
209 
210 #ifdef __cplusplus
211 }
212 #endif
213 
214 #endif /* RADV_META_H */
215