Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 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 | |
Edward O'Callaghan | ba43768 | 2016-10-07 22:19:19 +1100 | [diff] [blame] | 26 | #ifndef RADV_META_H |
| 27 | #define RADV_META_H |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 28 | |
| 29 | #include "radv_private.h" |
Samuel Pitoiset | d4d7773 | 2017-09-01 11:41:18 +0200 | [diff] [blame] | 30 | #include "radv_shader.h" |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 31 | |
| 32 | #ifdef __cplusplus |
| 33 | extern "C" { |
| 34 | #endif |
| 35 | |
Samuel Pitoiset | 807f2d4 | 2017-10-03 14:12:05 +0200 | [diff] [blame] | 36 | enum radv_meta_save_flags { |
| 37 | RADV_META_SAVE_PASS = (1 << 0), |
| 38 | RADV_META_SAVE_CONSTANTS = (1 << 1), |
| 39 | RADV_META_SAVE_DESCRIPTORS = (1 << 2), |
| 40 | RADV_META_SAVE_GRAPHICS_PIPELINE = (1 << 3), |
Samuel Pitoiset | 213f86e | 2017-10-03 14:47:32 +0200 | [diff] [blame] | 41 | RADV_META_SAVE_COMPUTE_PIPELINE = (1 << 4), |
Samuel Pitoiset | 807f2d4 | 2017-10-03 14:12:05 +0200 | [diff] [blame] | 42 | }; |
| 43 | |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 44 | struct radv_meta_saved_state { |
Samuel Pitoiset | 807f2d4 | 2017-10-03 14:12:05 +0200 | [diff] [blame] | 45 | uint32_t flags; |
| 46 | |
Dave Airlie | f45e768 | 2017-09-06 13:37:42 +1000 | [diff] [blame] | 47 | struct radv_descriptor_set *old_descriptor_set0; |
| 48 | struct radv_pipeline *old_pipeline; |
Samuel Pitoiset | 1cf508b | 2017-09-25 14:02:49 +0200 | [diff] [blame] | 49 | struct radv_viewport_state viewport; |
| 50 | struct radv_scissor_state scissor; |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 51 | |
| 52 | char push_constants[128]; |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 53 | |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 54 | struct radv_render_pass *pass; |
| 55 | const struct radv_subpass *subpass; |
| 56 | struct radv_attachment_state *attachments; |
| 57 | struct radv_framebuffer *framebuffer; |
| 58 | VkRect2D render_area; |
| 59 | }; |
| 60 | |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 61 | VkResult radv_device_init_meta_clear_state(struct radv_device *device); |
| 62 | void radv_device_finish_meta_clear_state(struct radv_device *device); |
| 63 | |
| 64 | VkResult radv_device_init_meta_resolve_state(struct radv_device *device); |
| 65 | void radv_device_finish_meta_resolve_state(struct radv_device *device); |
| 66 | |
| 67 | VkResult radv_device_init_meta_depth_decomp_state(struct radv_device *device); |
| 68 | void radv_device_finish_meta_depth_decomp_state(struct radv_device *device); |
| 69 | |
| 70 | VkResult radv_device_init_meta_fast_clear_flush_state(struct radv_device *device); |
| 71 | void radv_device_finish_meta_fast_clear_flush_state(struct radv_device *device); |
| 72 | |
| 73 | VkResult radv_device_init_meta_blit_state(struct radv_device *device); |
| 74 | void radv_device_finish_meta_blit_state(struct radv_device *device); |
| 75 | |
| 76 | VkResult radv_device_init_meta_blit2d_state(struct radv_device *device); |
| 77 | void radv_device_finish_meta_blit2d_state(struct radv_device *device); |
| 78 | |
| 79 | VkResult radv_device_init_meta_buffer_state(struct radv_device *device); |
| 80 | void radv_device_finish_meta_buffer_state(struct radv_device *device); |
| 81 | |
Bas Nieuwenhuizen | ce0c8cf | 2017-02-26 18:21:01 +0100 | [diff] [blame] | 82 | VkResult radv_device_init_meta_query_state(struct radv_device *device); |
| 83 | void radv_device_finish_meta_query_state(struct radv_device *device); |
| 84 | |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 85 | VkResult radv_device_init_meta_resolve_compute_state(struct radv_device *device); |
| 86 | void radv_device_finish_meta_resolve_compute_state(struct radv_device *device); |
Dave Airlie | 69136f4 | 2017-04-27 01:47:22 +0100 | [diff] [blame] | 87 | |
| 88 | VkResult radv_device_init_meta_resolve_fragment_state(struct radv_device *device); |
| 89 | void radv_device_finish_meta_resolve_fragment_state(struct radv_device *device); |
| 90 | |
Samuel Pitoiset | ba3dc35 | 2017-10-03 14:37:56 +0200 | [diff] [blame] | 91 | void radv_meta_save(struct radv_meta_saved_state *saved_state, |
| 92 | struct radv_cmd_buffer *cmd_buffer, uint32_t flags); |
| 93 | |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 94 | void radv_meta_restore(const struct radv_meta_saved_state *state, |
| 95 | struct radv_cmd_buffer *cmd_buffer); |
| 96 | |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 97 | VkImageViewType radv_meta_get_view_type(const struct radv_image *image); |
| 98 | |
| 99 | uint32_t radv_meta_get_iview_layer(const struct radv_image *dest_image, |
| 100 | const VkImageSubresourceLayers *dest_subresource, |
| 101 | const VkOffset3D *dest_offset); |
| 102 | |
| 103 | struct radv_meta_blit2d_surf { |
| 104 | /** The size of an element in bytes. */ |
| 105 | uint8_t bs; |
| 106 | VkFormat format; |
| 107 | |
| 108 | struct radv_image *image; |
| 109 | unsigned level; |
| 110 | unsigned layer; |
| 111 | VkImageAspectFlags aspect_mask; |
Dave Airlie | 821b537 | 2017-12-21 16:23:30 +1000 | [diff] [blame^] | 112 | VkImageLayout current_layout; |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 113 | }; |
| 114 | |
| 115 | struct radv_meta_blit2d_buffer { |
| 116 | struct radv_buffer *buffer; |
| 117 | uint32_t offset; |
| 118 | uint32_t pitch; |
| 119 | uint8_t bs; |
| 120 | VkFormat format; |
| 121 | }; |
| 122 | |
| 123 | struct radv_meta_blit2d_rect { |
| 124 | uint32_t src_x, src_y; |
| 125 | uint32_t dst_x, dst_y; |
| 126 | uint32_t width, height; |
| 127 | }; |
| 128 | |
| 129 | void radv_meta_begin_blit2d(struct radv_cmd_buffer *cmd_buffer, |
| 130 | struct radv_meta_saved_state *save); |
| 131 | |
| 132 | void radv_meta_blit2d(struct radv_cmd_buffer *cmd_buffer, |
| 133 | struct radv_meta_blit2d_surf *src_img, |
| 134 | struct radv_meta_blit2d_buffer *src_buf, |
| 135 | struct radv_meta_blit2d_surf *dst, |
| 136 | unsigned num_rects, |
| 137 | struct radv_meta_blit2d_rect *rects); |
| 138 | |
| 139 | void radv_meta_end_blit2d(struct radv_cmd_buffer *cmd_buffer, |
| 140 | struct radv_meta_saved_state *save); |
| 141 | |
| 142 | |
| 143 | VkResult radv_device_init_meta_bufimage_state(struct radv_device *device); |
| 144 | void radv_device_finish_meta_bufimage_state(struct radv_device *device); |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 145 | void radv_meta_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, |
| 146 | struct radv_meta_blit2d_surf *src, |
| 147 | struct radv_meta_blit2d_buffer *dst, |
| 148 | unsigned num_rects, |
| 149 | struct radv_meta_blit2d_rect *rects); |
| 150 | |
Dave Airlie | 983af3a | 2016-11-29 23:52:55 +0000 | [diff] [blame] | 151 | void radv_meta_buffer_to_image_cs(struct radv_cmd_buffer *cmd_buffer, |
| 152 | struct radv_meta_blit2d_buffer *src, |
| 153 | struct radv_meta_blit2d_surf *dst, |
| 154 | unsigned num_rects, |
| 155 | struct radv_meta_blit2d_rect *rects); |
Dave Airlie | ef5f59c | 2016-11-30 00:26:47 +0000 | [diff] [blame] | 156 | void radv_meta_image_to_image_cs(struct radv_cmd_buffer *cmd_buffer, |
| 157 | struct radv_meta_blit2d_surf *src, |
| 158 | struct radv_meta_blit2d_surf *dst, |
| 159 | unsigned num_rects, |
| 160 | struct radv_meta_blit2d_rect *rects); |
Dave Airlie | f11ea87 | 2016-11-30 01:45:24 +0000 | [diff] [blame] | 161 | void radv_meta_clear_image_cs(struct radv_cmd_buffer *cmd_buffer, |
| 162 | struct radv_meta_blit2d_surf *dst, |
| 163 | const VkClearColorValue *clear_color); |
Dave Airlie | 983af3a | 2016-11-29 23:52:55 +0000 | [diff] [blame] | 164 | |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 165 | void radv_decompress_depth_image_inplace(struct radv_cmd_buffer *cmd_buffer, |
| 166 | struct radv_image *image, |
| 167 | VkImageSubresourceRange *subresourceRange); |
| 168 | void radv_resummarize_depth_image_inplace(struct radv_cmd_buffer *cmd_buffer, |
| 169 | struct radv_image *image, |
| 170 | VkImageSubresourceRange *subresourceRange); |
| 171 | void radv_fast_clear_flush_image_inplace(struct radv_cmd_buffer *cmd_buffer, |
Dave Airlie | 9aec76a | 2017-02-19 16:33:14 +1000 | [diff] [blame] | 172 | struct radv_image *image, |
| 173 | const VkImageSubresourceRange *subresourceRange); |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 174 | |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 175 | void radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, |
| 176 | struct radv_image *src_image, |
| 177 | VkImageLayout src_image_layout, |
| 178 | struct radv_image *dest_image, |
| 179 | VkImageLayout dest_image_layout, |
| 180 | uint32_t region_count, |
| 181 | const VkImageResolve *regions); |
| 182 | |
Dave Airlie | 69136f4 | 2017-04-27 01:47:22 +0100 | [diff] [blame] | 183 | void radv_meta_resolve_fragment_image(struct radv_cmd_buffer *cmd_buffer, |
| 184 | struct radv_image *src_image, |
| 185 | VkImageLayout src_image_layout, |
| 186 | struct radv_image *dest_image, |
| 187 | VkImageLayout dest_image_layout, |
| 188 | uint32_t region_count, |
| 189 | const VkImageResolve *regions); |
| 190 | |
Dave Airlie | f695735 | 2016-11-23 12:59:55 +1000 | [diff] [blame] | 191 | void radv_blit_to_prime_linear(struct radv_cmd_buffer *cmd_buffer, |
| 192 | struct radv_image *image, |
| 193 | struct radv_image *linear_image); |
Dave Airlie | 399ebd2 | 2017-04-19 06:18:23 +1000 | [diff] [blame] | 194 | |
| 195 | /* common nir builder helpers */ |
Mike Lothian | 2284d6b | 2017-04-19 03:09:05 +0100 | [diff] [blame] | 196 | #include "nir/nir_builder.h" |
Dave Airlie | 399ebd2 | 2017-04-19 06:18:23 +1000 | [diff] [blame] | 197 | |
| 198 | nir_ssa_def *radv_meta_gen_rect_vertices(nir_builder *vs_b); |
Dave Airlie | dd17e4c | 2017-04-18 15:50:10 +1000 | [diff] [blame] | 199 | nir_ssa_def *radv_meta_gen_rect_vertices_comp2(nir_builder *vs_b, nir_ssa_def *comp2); |
Dave Airlie | 03a2ca6 | 2017-04-19 09:13:06 +1000 | [diff] [blame] | 200 | nir_shader *radv_meta_build_nir_vs_generate_vertices(void); |
| 201 | nir_shader *radv_meta_build_nir_fs_noop(void); |
Dave Airlie | ff47866 | 2017-05-03 04:23:04 +0100 | [diff] [blame] | 202 | |
| 203 | void radv_meta_build_resolve_shader_core(nir_builder *b, |
| 204 | bool is_integer, |
Dave Airlie | ff47866 | 2017-05-03 04:23:04 +0100 | [diff] [blame] | 205 | int samples, |
| 206 | nir_variable *input_img, |
| 207 | nir_variable *color, |
| 208 | nir_ssa_def *img_coord); |
Dave Airlie | f4e499e | 2016-10-07 09:16:09 +1000 | [diff] [blame] | 209 | #ifdef __cplusplus |
| 210 | } |
| 211 | #endif |
Edward O'Callaghan | ba43768 | 2016-10-07 22:19:19 +1100 | [diff] [blame] | 212 | |
| 213 | #endif /* RADV_META_H */ |