Home | History | Annotate | Download | only in vulkan
      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