1 /* 2 * Copyright 2016 Red Hat. 3 * Copyright 2016 Bas Nieuwenhuizen 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22 * IN THE SOFTWARE. 23 */ 24 #include "radv_meta.h" 25 #include "nir/nir_builder.h" 26 27 /* 28 * GFX queue: Compute shader implementation of image->buffer copy 29 * Compute queue: implementation also of buffer->image, image->image, and image clear. 30 */ 31 32 /* GFX9 needs to use a 3D sampler to access 3D resources, so the shader has the options 33 * for that. 34 */ 35 static nir_shader * 36 build_nir_itob_compute_shader(struct radv_device *dev, bool is_3d) 37 { 38 nir_builder b; 39 enum glsl_sampler_dim dim = is_3d ? GLSL_SAMPLER_DIM_3D : GLSL_SAMPLER_DIM_2D; 40 const struct glsl_type *sampler_type = glsl_sampler_type(dim, 41 false, 42 false, 43 GLSL_TYPE_FLOAT); 44 const struct glsl_type *img_type = glsl_sampler_type(GLSL_SAMPLER_DIM_BUF, 45 false, 46 false, 47 GLSL_TYPE_FLOAT); 48 nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_COMPUTE, NULL); 49 b.shader->info.name = ralloc_strdup(b.shader, is_3d ? "meta_itob_cs_3d" : "meta_itob_cs"); 50 b.shader->info.cs.local_size[0] = 16; 51 b.shader->info.cs.local_size[1] = 16; 52 b.shader->info.cs.local_size[2] = 1; 53 nir_variable *input_img = nir_variable_create(b.shader, nir_var_uniform, 54 sampler_type, "s_tex"); 55 input_img->data.descriptor_set = 0; 56 input_img->data.binding = 0; 57 58 nir_variable *output_img = nir_variable_create(b.shader, nir_var_uniform, 59 img_type, "out_img"); 60 output_img->data.descriptor_set = 0; 61 output_img->data.binding = 1; 62 63 nir_ssa_def *invoc_id = nir_load_system_value(&b, nir_intrinsic_load_local_invocation_id, 0); 64 nir_ssa_def *wg_id = nir_load_system_value(&b, nir_intrinsic_load_work_group_id, 0); 65 nir_ssa_def *block_size = nir_imm_ivec4(&b, 66 b.shader->info.cs.local_size[0], 67 b.shader->info.cs.local_size[1], 68 b.shader->info.cs.local_size[2], 0); 69 70 nir_ssa_def *global_id = nir_iadd(&b, nir_imul(&b, wg_id, block_size), invoc_id); 71 72 73 74 nir_intrinsic_instr *offset = nir_intrinsic_instr_create(b.shader, nir_intrinsic_load_push_constant); 75 nir_intrinsic_set_base(offset, 0); 76 nir_intrinsic_set_range(offset, 16); 77 offset->src[0] = nir_src_for_ssa(nir_imm_int(&b, 0)); 78 offset->num_components = is_3d ? 3 : 2; 79 nir_ssa_dest_init(&offset->instr, &offset->dest, is_3d ? 3 : 2, 32, "offset"); 80 nir_builder_instr_insert(&b, &offset->instr); 81 82 nir_intrinsic_instr *stride = nir_intrinsic_instr_create(b.shader, nir_intrinsic_load_push_constant); 83 nir_intrinsic_set_base(stride, 0); 84 nir_intrinsic_set_range(stride, 16); 85 stride->src[0] = nir_src_for_ssa(nir_imm_int(&b, 12)); 86 stride->num_components = 1; 87 nir_ssa_dest_init(&stride->instr, &stride->dest, 1, 32, "stride"); 88 nir_builder_instr_insert(&b, &stride->instr); 89 90 nir_ssa_def *img_coord = nir_iadd(&b, global_id, &offset->dest.ssa); 91 nir_tex_instr *tex = nir_tex_instr_create(b.shader, 2); 92 tex->sampler_dim = dim; 93 tex->op = nir_texop_txf; 94 tex->src[0].src_type = nir_tex_src_coord; 95 tex->src[0].src = nir_src_for_ssa(nir_channels(&b, img_coord, is_3d ? 0x7 : 0x3)); 96 tex->src[1].src_type = nir_tex_src_lod; 97 tex->src[1].src = nir_src_for_ssa(nir_imm_int(&b, 0)); 98 tex->dest_type = nir_type_float; 99 tex->is_array = false; 100 tex->coord_components = is_3d ? 3 : 2; 101 tex->texture = nir_deref_var_create(tex, input_img); 102 tex->sampler = NULL; 103 104 nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex"); 105 nir_builder_instr_insert(&b, &tex->instr); 106 107 nir_ssa_def *pos_x = nir_channel(&b, global_id, 0); 108 nir_ssa_def *pos_y = nir_channel(&b, global_id, 1); 109 110 nir_ssa_def *tmp = nir_imul(&b, pos_y, &stride->dest.ssa); 111 tmp = nir_iadd(&b, tmp, pos_x); 112 113 nir_ssa_def *coord = nir_vec4(&b, tmp, tmp, tmp, tmp); 114 115 nir_ssa_def *outval = &tex->dest.ssa; 116 nir_intrinsic_instr *store = nir_intrinsic_instr_create(b.shader, nir_intrinsic_image_store); 117 store->src[0] = nir_src_for_ssa(coord); 118 store->src[1] = nir_src_for_ssa(nir_ssa_undef(&b, 1, 32)); 119 store->src[2] = nir_src_for_ssa(outval); 120 store->variables[0] = nir_deref_var_create(store, output_img); 121 122 nir_builder_instr_insert(&b, &store->instr); 123 return b.shader; 124 } 125 126 /* Image to buffer - don't write use image accessors */ 127 static VkResult 128 radv_device_init_meta_itob_state(struct radv_device *device) 129 { 130 VkResult result; 131 struct radv_shader_module cs = { .nir = NULL }; 132 struct radv_shader_module cs_3d = { .nir = NULL }; 133 134 cs.nir = build_nir_itob_compute_shader(device, false); 135 if (device->physical_device->rad_info.chip_class >= GFX9) 136 cs_3d.nir = build_nir_itob_compute_shader(device, true); 137 138 /* 139 * two descriptors one for the image being sampled 140 * one for the buffer being written. 141 */ 142 VkDescriptorSetLayoutCreateInfo ds_create_info = { 143 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 144 .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, 145 .bindingCount = 2, 146 .pBindings = (VkDescriptorSetLayoutBinding[]) { 147 { 148 .binding = 0, 149 .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 150 .descriptorCount = 1, 151 .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, 152 .pImmutableSamplers = NULL 153 }, 154 { 155 .binding = 1, 156 .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 157 .descriptorCount = 1, 158 .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, 159 .pImmutableSamplers = NULL 160 }, 161 } 162 }; 163 164 result = radv_CreateDescriptorSetLayout(radv_device_to_handle(device), 165 &ds_create_info, 166 &device->meta_state.alloc, 167 &device->meta_state.itob.img_ds_layout); 168 if (result != VK_SUCCESS) 169 goto fail; 170 171 172 VkPipelineLayoutCreateInfo pl_create_info = { 173 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 174 .setLayoutCount = 1, 175 .pSetLayouts = &device->meta_state.itob.img_ds_layout, 176 .pushConstantRangeCount = 1, 177 .pPushConstantRanges = &(VkPushConstantRange){VK_SHADER_STAGE_COMPUTE_BIT, 0, 16}, 178 }; 179 180 result = radv_CreatePipelineLayout(radv_device_to_handle(device), 181 &pl_create_info, 182 &device->meta_state.alloc, 183 &device->meta_state.itob.img_p_layout); 184 if (result != VK_SUCCESS) 185 goto fail; 186 187 /* compute shader */ 188 189 VkPipelineShaderStageCreateInfo pipeline_shader_stage = { 190 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 191 .stage = VK_SHADER_STAGE_COMPUTE_BIT, 192 .module = radv_shader_module_to_handle(&cs), 193 .pName = "main", 194 .pSpecializationInfo = NULL, 195 }; 196 197 VkComputePipelineCreateInfo vk_pipeline_info = { 198 .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 199 .stage = pipeline_shader_stage, 200 .flags = 0, 201 .layout = device->meta_state.itob.img_p_layout, 202 }; 203 204 result = radv_CreateComputePipelines(radv_device_to_handle(device), 205 radv_pipeline_cache_to_handle(&device->meta_state.cache), 206 1, &vk_pipeline_info, NULL, 207 &device->meta_state.itob.pipeline); 208 if (result != VK_SUCCESS) 209 goto fail; 210 211 if (device->physical_device->rad_info.chip_class >= GFX9) { 212 VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d = { 213 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 214 .stage = VK_SHADER_STAGE_COMPUTE_BIT, 215 .module = radv_shader_module_to_handle(&cs_3d), 216 .pName = "main", 217 .pSpecializationInfo = NULL, 218 }; 219 220 VkComputePipelineCreateInfo vk_pipeline_info_3d = { 221 .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 222 .stage = pipeline_shader_stage_3d, 223 .flags = 0, 224 .layout = device->meta_state.itob.img_p_layout, 225 }; 226 227 result = radv_CreateComputePipelines(radv_device_to_handle(device), 228 radv_pipeline_cache_to_handle(&device->meta_state.cache), 229 1, &vk_pipeline_info_3d, NULL, 230 &device->meta_state.itob.pipeline_3d); 231 if (result != VK_SUCCESS) 232 goto fail; 233 ralloc_free(cs_3d.nir); 234 } 235 ralloc_free(cs.nir); 236 237 return VK_SUCCESS; 238 fail: 239 ralloc_free(cs.nir); 240 ralloc_free(cs_3d.nir); 241 return result; 242 } 243 244 static void 245 radv_device_finish_meta_itob_state(struct radv_device *device) 246 { 247 struct radv_meta_state *state = &device->meta_state; 248 249 radv_DestroyPipelineLayout(radv_device_to_handle(device), 250 state->itob.img_p_layout, &state->alloc); 251 radv_DestroyDescriptorSetLayout(radv_device_to_handle(device), 252 state->itob.img_ds_layout, 253 &state->alloc); 254 radv_DestroyPipeline(radv_device_to_handle(device), 255 state->itob.pipeline, &state->alloc); 256 if (device->physical_device->rad_info.chip_class >= GFX9) 257 radv_DestroyPipeline(radv_device_to_handle(device), 258 state->itob.pipeline_3d, &state->alloc); 259 } 260 261 static nir_shader * 262 build_nir_btoi_compute_shader(struct radv_device *dev, bool is_3d) 263 { 264 nir_builder b; 265 enum glsl_sampler_dim dim = is_3d ? GLSL_SAMPLER_DIM_3D : GLSL_SAMPLER_DIM_2D; 266 const struct glsl_type *buf_type = glsl_sampler_type(GLSL_SAMPLER_DIM_BUF, 267 false, 268 false, 269 GLSL_TYPE_FLOAT); 270 const struct glsl_type *img_type = glsl_sampler_type(dim, 271 false, 272 false, 273 GLSL_TYPE_FLOAT); 274 nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_COMPUTE, NULL); 275 b.shader->info.name = ralloc_strdup(b.shader, is_3d ? "meta_btoi_cs_3d" : "meta_btoi_cs"); 276 b.shader->info.cs.local_size[0] = 16; 277 b.shader->info.cs.local_size[1] = 16; 278 b.shader->info.cs.local_size[2] = 1; 279 nir_variable *input_img = nir_variable_create(b.shader, nir_var_uniform, 280 buf_type, "s_tex"); 281 input_img->data.descriptor_set = 0; 282 input_img->data.binding = 0; 283 284 nir_variable *output_img = nir_variable_create(b.shader, nir_var_uniform, 285 img_type, "out_img"); 286 output_img->data.descriptor_set = 0; 287 output_img->data.binding = 1; 288 289 nir_ssa_def *invoc_id = nir_load_system_value(&b, nir_intrinsic_load_local_invocation_id, 0); 290 nir_ssa_def *wg_id = nir_load_system_value(&b, nir_intrinsic_load_work_group_id, 0); 291 nir_ssa_def *block_size = nir_imm_ivec4(&b, 292 b.shader->info.cs.local_size[0], 293 b.shader->info.cs.local_size[1], 294 b.shader->info.cs.local_size[2], 0); 295 296 nir_ssa_def *global_id = nir_iadd(&b, nir_imul(&b, wg_id, block_size), invoc_id); 297 298 nir_intrinsic_instr *offset = nir_intrinsic_instr_create(b.shader, nir_intrinsic_load_push_constant); 299 nir_intrinsic_set_base(offset, 0); 300 nir_intrinsic_set_range(offset, 16); 301 offset->src[0] = nir_src_for_ssa(nir_imm_int(&b, 0)); 302 offset->num_components = is_3d ? 3 : 2; 303 nir_ssa_dest_init(&offset->instr, &offset->dest, is_3d ? 3 : 2, 32, "offset"); 304 nir_builder_instr_insert(&b, &offset->instr); 305 306 nir_intrinsic_instr *stride = nir_intrinsic_instr_create(b.shader, nir_intrinsic_load_push_constant); 307 nir_intrinsic_set_base(stride, 0); 308 nir_intrinsic_set_range(stride, 16); 309 stride->src[0] = nir_src_for_ssa(nir_imm_int(&b, 12)); 310 stride->num_components = 1; 311 nir_ssa_dest_init(&stride->instr, &stride->dest, 1, 32, "stride"); 312 nir_builder_instr_insert(&b, &stride->instr); 313 314 nir_ssa_def *pos_x = nir_channel(&b, global_id, 0); 315 nir_ssa_def *pos_y = nir_channel(&b, global_id, 1); 316 317 nir_ssa_def *tmp = nir_imul(&b, pos_y, &stride->dest.ssa); 318 tmp = nir_iadd(&b, tmp, pos_x); 319 320 nir_ssa_def *buf_coord = nir_vec4(&b, tmp, tmp, tmp, tmp); 321 322 nir_ssa_def *img_coord = nir_iadd(&b, global_id, &offset->dest.ssa); 323 324 nir_tex_instr *tex = nir_tex_instr_create(b.shader, 2); 325 tex->sampler_dim = GLSL_SAMPLER_DIM_BUF; 326 tex->op = nir_texop_txf; 327 tex->src[0].src_type = nir_tex_src_coord; 328 tex->src[0].src = nir_src_for_ssa(nir_channels(&b, buf_coord, 1)); 329 tex->src[1].src_type = nir_tex_src_lod; 330 tex->src[1].src = nir_src_for_ssa(nir_imm_int(&b, 0)); 331 tex->dest_type = nir_type_float; 332 tex->is_array = false; 333 tex->coord_components = 1; 334 tex->texture = nir_deref_var_create(tex, input_img); 335 tex->sampler = NULL; 336 337 nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex"); 338 nir_builder_instr_insert(&b, &tex->instr); 339 340 nir_ssa_def *outval = &tex->dest.ssa; 341 nir_intrinsic_instr *store = nir_intrinsic_instr_create(b.shader, nir_intrinsic_image_store); 342 store->src[0] = nir_src_for_ssa(img_coord); 343 store->src[1] = nir_src_for_ssa(nir_ssa_undef(&b, 1, 32)); 344 store->src[2] = nir_src_for_ssa(outval); 345 store->variables[0] = nir_deref_var_create(store, output_img); 346 347 nir_builder_instr_insert(&b, &store->instr); 348 return b.shader; 349 } 350 351 /* Buffer to image - don't write use image accessors */ 352 static VkResult 353 radv_device_init_meta_btoi_state(struct radv_device *device) 354 { 355 VkResult result; 356 struct radv_shader_module cs = { .nir = NULL }; 357 struct radv_shader_module cs_3d = { .nir = NULL }; 358 cs.nir = build_nir_btoi_compute_shader(device, false); 359 if (device->physical_device->rad_info.chip_class >= GFX9) 360 cs_3d.nir = build_nir_btoi_compute_shader(device, true); 361 /* 362 * two descriptors one for the image being sampled 363 * one for the buffer being written. 364 */ 365 VkDescriptorSetLayoutCreateInfo ds_create_info = { 366 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 367 .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, 368 .bindingCount = 2, 369 .pBindings = (VkDescriptorSetLayoutBinding[]) { 370 { 371 .binding = 0, 372 .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 373 .descriptorCount = 1, 374 .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, 375 .pImmutableSamplers = NULL 376 }, 377 { 378 .binding = 1, 379 .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 380 .descriptorCount = 1, 381 .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, 382 .pImmutableSamplers = NULL 383 }, 384 } 385 }; 386 387 result = radv_CreateDescriptorSetLayout(radv_device_to_handle(device), 388 &ds_create_info, 389 &device->meta_state.alloc, 390 &device->meta_state.btoi.img_ds_layout); 391 if (result != VK_SUCCESS) 392 goto fail; 393 394 395 VkPipelineLayoutCreateInfo pl_create_info = { 396 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 397 .setLayoutCount = 1, 398 .pSetLayouts = &device->meta_state.btoi.img_ds_layout, 399 .pushConstantRangeCount = 1, 400 .pPushConstantRanges = &(VkPushConstantRange){VK_SHADER_STAGE_COMPUTE_BIT, 0, 16}, 401 }; 402 403 result = radv_CreatePipelineLayout(radv_device_to_handle(device), 404 &pl_create_info, 405 &device->meta_state.alloc, 406 &device->meta_state.btoi.img_p_layout); 407 if (result != VK_SUCCESS) 408 goto fail; 409 410 /* compute shader */ 411 412 VkPipelineShaderStageCreateInfo pipeline_shader_stage = { 413 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 414 .stage = VK_SHADER_STAGE_COMPUTE_BIT, 415 .module = radv_shader_module_to_handle(&cs), 416 .pName = "main", 417 .pSpecializationInfo = NULL, 418 }; 419 420 VkComputePipelineCreateInfo vk_pipeline_info = { 421 .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 422 .stage = pipeline_shader_stage, 423 .flags = 0, 424 .layout = device->meta_state.btoi.img_p_layout, 425 }; 426 427 result = radv_CreateComputePipelines(radv_device_to_handle(device), 428 radv_pipeline_cache_to_handle(&device->meta_state.cache), 429 1, &vk_pipeline_info, NULL, 430 &device->meta_state.btoi.pipeline); 431 if (result != VK_SUCCESS) 432 goto fail; 433 434 if (device->physical_device->rad_info.chip_class >= GFX9) { 435 VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d = { 436 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 437 .stage = VK_SHADER_STAGE_COMPUTE_BIT, 438 .module = radv_shader_module_to_handle(&cs_3d), 439 .pName = "main", 440 .pSpecializationInfo = NULL, 441 }; 442 443 VkComputePipelineCreateInfo vk_pipeline_info_3d = { 444 .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 445 .stage = pipeline_shader_stage_3d, 446 .flags = 0, 447 .layout = device->meta_state.btoi.img_p_layout, 448 }; 449 450 result = radv_CreateComputePipelines(radv_device_to_handle(device), 451 radv_pipeline_cache_to_handle(&device->meta_state.cache), 452 1, &vk_pipeline_info_3d, NULL, 453 &device->meta_state.btoi.pipeline_3d); 454 ralloc_free(cs_3d.nir); 455 } 456 ralloc_free(cs.nir); 457 458 return VK_SUCCESS; 459 fail: 460 ralloc_free(cs_3d.nir); 461 ralloc_free(cs.nir); 462 return result; 463 } 464 465 static void 466 radv_device_finish_meta_btoi_state(struct radv_device *device) 467 { 468 struct radv_meta_state *state = &device->meta_state; 469 470 radv_DestroyPipelineLayout(radv_device_to_handle(device), 471 state->btoi.img_p_layout, &state->alloc); 472 radv_DestroyDescriptorSetLayout(radv_device_to_handle(device), 473 state->btoi.img_ds_layout, 474 &state->alloc); 475 radv_DestroyPipeline(radv_device_to_handle(device), 476 state->btoi.pipeline, &state->alloc); 477 radv_DestroyPipeline(radv_device_to_handle(device), 478 state->btoi.pipeline_3d, &state->alloc); 479 } 480 481 static nir_shader * 482 build_nir_itoi_compute_shader(struct radv_device *dev, bool is_3d) 483 { 484 nir_builder b; 485 enum glsl_sampler_dim dim = is_3d ? GLSL_SAMPLER_DIM_3D : GLSL_SAMPLER_DIM_2D; 486 const struct glsl_type *buf_type = glsl_sampler_type(dim, 487 false, 488 false, 489 GLSL_TYPE_FLOAT); 490 const struct glsl_type *img_type = glsl_sampler_type(dim, 491 false, 492 false, 493 GLSL_TYPE_FLOAT); 494 nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_COMPUTE, NULL); 495 b.shader->info.name = ralloc_strdup(b.shader, is_3d ? "meta_itoi_cs_3d" : "meta_itoi_cs"); 496 b.shader->info.cs.local_size[0] = 16; 497 b.shader->info.cs.local_size[1] = 16; 498 b.shader->info.cs.local_size[2] = 1; 499 nir_variable *input_img = nir_variable_create(b.shader, nir_var_uniform, 500 buf_type, "s_tex"); 501 input_img->data.descriptor_set = 0; 502 input_img->data.binding = 0; 503 504 nir_variable *output_img = nir_variable_create(b.shader, nir_var_uniform, 505 img_type, "out_img"); 506 output_img->data.descriptor_set = 0; 507 output_img->data.binding = 1; 508 509 nir_ssa_def *invoc_id = nir_load_system_value(&b, nir_intrinsic_load_local_invocation_id, 0); 510 nir_ssa_def *wg_id = nir_load_system_value(&b, nir_intrinsic_load_work_group_id, 0); 511 nir_ssa_def *block_size = nir_imm_ivec4(&b, 512 b.shader->info.cs.local_size[0], 513 b.shader->info.cs.local_size[1], 514 b.shader->info.cs.local_size[2], 0); 515 516 nir_ssa_def *global_id = nir_iadd(&b, nir_imul(&b, wg_id, block_size), invoc_id); 517 518 nir_intrinsic_instr *src_offset = nir_intrinsic_instr_create(b.shader, nir_intrinsic_load_push_constant); 519 nir_intrinsic_set_base(src_offset, 0); 520 nir_intrinsic_set_range(src_offset, 24); 521 src_offset->src[0] = nir_src_for_ssa(nir_imm_int(&b, 0)); 522 src_offset->num_components = is_3d ? 3 : 2; 523 nir_ssa_dest_init(&src_offset->instr, &src_offset->dest, is_3d ? 3 : 2, 32, "src_offset"); 524 nir_builder_instr_insert(&b, &src_offset->instr); 525 526 nir_intrinsic_instr *dst_offset = nir_intrinsic_instr_create(b.shader, nir_intrinsic_load_push_constant); 527 nir_intrinsic_set_base(dst_offset, 0); 528 nir_intrinsic_set_range(dst_offset, 24); 529 dst_offset->src[0] = nir_src_for_ssa(nir_imm_int(&b, 12)); 530 dst_offset->num_components = is_3d ? 3 : 2; 531 nir_ssa_dest_init(&dst_offset->instr, &dst_offset->dest, is_3d ? 3 : 2, 32, "dst_offset"); 532 nir_builder_instr_insert(&b, &dst_offset->instr); 533 534 nir_ssa_def *src_coord = nir_iadd(&b, global_id, &src_offset->dest.ssa); 535 536 nir_ssa_def *dst_coord = nir_iadd(&b, global_id, &dst_offset->dest.ssa); 537 538 nir_tex_instr *tex = nir_tex_instr_create(b.shader, 2); 539 tex->sampler_dim = dim; 540 tex->op = nir_texop_txf; 541 tex->src[0].src_type = nir_tex_src_coord; 542 tex->src[0].src = nir_src_for_ssa(nir_channels(&b, src_coord, is_3d ? 0x7 : 0x3)); 543 tex->src[1].src_type = nir_tex_src_lod; 544 tex->src[1].src = nir_src_for_ssa(nir_imm_int(&b, 0)); 545 tex->dest_type = nir_type_float; 546 tex->is_array = false; 547 tex->coord_components = is_3d ? 3 : 2; 548 tex->texture = nir_deref_var_create(tex, input_img); 549 tex->sampler = NULL; 550 551 nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex"); 552 nir_builder_instr_insert(&b, &tex->instr); 553 554 nir_ssa_def *outval = &tex->dest.ssa; 555 nir_intrinsic_instr *store = nir_intrinsic_instr_create(b.shader, nir_intrinsic_image_store); 556 store->src[0] = nir_src_for_ssa(dst_coord); 557 store->src[1] = nir_src_for_ssa(nir_ssa_undef(&b, 1, 32)); 558 store->src[2] = nir_src_for_ssa(outval); 559 store->variables[0] = nir_deref_var_create(store, output_img); 560 561 nir_builder_instr_insert(&b, &store->instr); 562 return b.shader; 563 } 564 565 /* image to image - don't write use image accessors */ 566 static VkResult 567 radv_device_init_meta_itoi_state(struct radv_device *device) 568 { 569 VkResult result; 570 struct radv_shader_module cs = { .nir = NULL }; 571 struct radv_shader_module cs_3d = { .nir = NULL }; 572 cs.nir = build_nir_itoi_compute_shader(device, false); 573 if (device->physical_device->rad_info.chip_class >= GFX9) 574 cs_3d.nir = build_nir_itoi_compute_shader(device, true); 575 /* 576 * two descriptors one for the image being sampled 577 * one for the buffer being written. 578 */ 579 VkDescriptorSetLayoutCreateInfo ds_create_info = { 580 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 581 .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, 582 .bindingCount = 2, 583 .pBindings = (VkDescriptorSetLayoutBinding[]) { 584 { 585 .binding = 0, 586 .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 587 .descriptorCount = 1, 588 .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, 589 .pImmutableSamplers = NULL 590 }, 591 { 592 .binding = 1, 593 .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 594 .descriptorCount = 1, 595 .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, 596 .pImmutableSamplers = NULL 597 }, 598 } 599 }; 600 601 result = radv_CreateDescriptorSetLayout(radv_device_to_handle(device), 602 &ds_create_info, 603 &device->meta_state.alloc, 604 &device->meta_state.itoi.img_ds_layout); 605 if (result != VK_SUCCESS) 606 goto fail; 607 608 609 VkPipelineLayoutCreateInfo pl_create_info = { 610 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 611 .setLayoutCount = 1, 612 .pSetLayouts = &device->meta_state.itoi.img_ds_layout, 613 .pushConstantRangeCount = 1, 614 .pPushConstantRanges = &(VkPushConstantRange){VK_SHADER_STAGE_COMPUTE_BIT, 0, 24}, 615 }; 616 617 result = radv_CreatePipelineLayout(radv_device_to_handle(device), 618 &pl_create_info, 619 &device->meta_state.alloc, 620 &device->meta_state.itoi.img_p_layout); 621 if (result != VK_SUCCESS) 622 goto fail; 623 624 /* compute shader */ 625 626 VkPipelineShaderStageCreateInfo pipeline_shader_stage = { 627 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 628 .stage = VK_SHADER_STAGE_COMPUTE_BIT, 629 .module = radv_shader_module_to_handle(&cs), 630 .pName = "main", 631 .pSpecializationInfo = NULL, 632 }; 633 634 VkComputePipelineCreateInfo vk_pipeline_info = { 635 .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 636 .stage = pipeline_shader_stage, 637 .flags = 0, 638 .layout = device->meta_state.itoi.img_p_layout, 639 }; 640 641 result = radv_CreateComputePipelines(radv_device_to_handle(device), 642 radv_pipeline_cache_to_handle(&device->meta_state.cache), 643 1, &vk_pipeline_info, NULL, 644 &device->meta_state.itoi.pipeline); 645 if (result != VK_SUCCESS) 646 goto fail; 647 648 if (device->physical_device->rad_info.chip_class >= GFX9) { 649 VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d = { 650 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 651 .stage = VK_SHADER_STAGE_COMPUTE_BIT, 652 .module = radv_shader_module_to_handle(&cs_3d), 653 .pName = "main", 654 .pSpecializationInfo = NULL, 655 }; 656 657 VkComputePipelineCreateInfo vk_pipeline_info_3d = { 658 .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 659 .stage = pipeline_shader_stage_3d, 660 .flags = 0, 661 .layout = device->meta_state.itoi.img_p_layout, 662 }; 663 664 result = radv_CreateComputePipelines(radv_device_to_handle(device), 665 radv_pipeline_cache_to_handle(&device->meta_state.cache), 666 1, &vk_pipeline_info_3d, NULL, 667 &device->meta_state.itoi.pipeline_3d); 668 669 ralloc_free(cs_3d.nir); 670 } 671 ralloc_free(cs.nir); 672 673 return VK_SUCCESS; 674 fail: 675 ralloc_free(cs.nir); 676 ralloc_free(cs_3d.nir); 677 return result; 678 } 679 680 static void 681 radv_device_finish_meta_itoi_state(struct radv_device *device) 682 { 683 struct radv_meta_state *state = &device->meta_state; 684 685 radv_DestroyPipelineLayout(radv_device_to_handle(device), 686 state->itoi.img_p_layout, &state->alloc); 687 radv_DestroyDescriptorSetLayout(radv_device_to_handle(device), 688 state->itoi.img_ds_layout, 689 &state->alloc); 690 radv_DestroyPipeline(radv_device_to_handle(device), 691 state->itoi.pipeline, &state->alloc); 692 if (device->physical_device->rad_info.chip_class >= GFX9) 693 radv_DestroyPipeline(radv_device_to_handle(device), 694 state->itoi.pipeline_3d, &state->alloc); 695 } 696 697 static nir_shader * 698 build_nir_cleari_compute_shader(struct radv_device *dev, bool is_3d) 699 { 700 nir_builder b; 701 enum glsl_sampler_dim dim = is_3d ? GLSL_SAMPLER_DIM_3D : GLSL_SAMPLER_DIM_2D; 702 const struct glsl_type *img_type = glsl_sampler_type(dim, 703 false, 704 false, 705 GLSL_TYPE_FLOAT); 706 nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_COMPUTE, NULL); 707 b.shader->info.name = ralloc_strdup(b.shader, is_3d ? "meta_cleari_cs_3d" : "meta_cleari_cs"); 708 b.shader->info.cs.local_size[0] = 16; 709 b.shader->info.cs.local_size[1] = 16; 710 b.shader->info.cs.local_size[2] = 1; 711 712 nir_variable *output_img = nir_variable_create(b.shader, nir_var_uniform, 713 img_type, "out_img"); 714 output_img->data.descriptor_set = 0; 715 output_img->data.binding = 0; 716 717 nir_ssa_def *invoc_id = nir_load_system_value(&b, nir_intrinsic_load_local_invocation_id, 0); 718 nir_ssa_def *wg_id = nir_load_system_value(&b, nir_intrinsic_load_work_group_id, 0); 719 nir_ssa_def *block_size = nir_imm_ivec4(&b, 720 b.shader->info.cs.local_size[0], 721 b.shader->info.cs.local_size[1], 722 b.shader->info.cs.local_size[2], 0); 723 724 nir_ssa_def *global_id = nir_iadd(&b, nir_imul(&b, wg_id, block_size), invoc_id); 725 726 nir_intrinsic_instr *clear_val = nir_intrinsic_instr_create(b.shader, nir_intrinsic_load_push_constant); 727 nir_intrinsic_set_base(clear_val, 0); 728 nir_intrinsic_set_range(clear_val, 20); 729 clear_val->src[0] = nir_src_for_ssa(nir_imm_int(&b, 0)); 730 clear_val->num_components = 4; 731 nir_ssa_dest_init(&clear_val->instr, &clear_val->dest, 4, 32, "clear_value"); 732 nir_builder_instr_insert(&b, &clear_val->instr); 733 734 nir_intrinsic_instr *layer = nir_intrinsic_instr_create(b.shader, nir_intrinsic_load_push_constant); 735 nir_intrinsic_set_base(layer, 0); 736 nir_intrinsic_set_range(layer, 20); 737 layer->src[0] = nir_src_for_ssa(nir_imm_int(&b, 16)); 738 layer->num_components = 1; 739 nir_ssa_dest_init(&layer->instr, &layer->dest, 1, 32, "layer"); 740 nir_builder_instr_insert(&b, &layer->instr); 741 742 nir_ssa_def *global_z = nir_iadd(&b, nir_channel(&b, global_id, 2), &layer->dest.ssa); 743 744 nir_ssa_def *comps[4]; 745 comps[0] = nir_channel(&b, global_id, 0); 746 comps[1] = nir_channel(&b, global_id, 1); 747 comps[2] = global_z; 748 comps[3] = nir_imm_int(&b, 0); 749 global_id = nir_vec(&b, comps, 4); 750 751 nir_intrinsic_instr *store = nir_intrinsic_instr_create(b.shader, nir_intrinsic_image_store); 752 store->src[0] = nir_src_for_ssa(global_id); 753 store->src[1] = nir_src_for_ssa(nir_ssa_undef(&b, 1, 32)); 754 store->src[2] = nir_src_for_ssa(&clear_val->dest.ssa); 755 store->variables[0] = nir_deref_var_create(store, output_img); 756 757 nir_builder_instr_insert(&b, &store->instr); 758 return b.shader; 759 } 760 761 static VkResult 762 radv_device_init_meta_cleari_state(struct radv_device *device) 763 { 764 VkResult result; 765 struct radv_shader_module cs = { .nir = NULL }; 766 struct radv_shader_module cs_3d = { .nir = NULL }; 767 cs.nir = build_nir_cleari_compute_shader(device, false); 768 if (device->physical_device->rad_info.chip_class >= GFX9) 769 cs_3d.nir = build_nir_cleari_compute_shader(device, true); 770 771 /* 772 * two descriptors one for the image being sampled 773 * one for the buffer being written. 774 */ 775 VkDescriptorSetLayoutCreateInfo ds_create_info = { 776 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 777 .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, 778 .bindingCount = 1, 779 .pBindings = (VkDescriptorSetLayoutBinding[]) { 780 { 781 .binding = 0, 782 .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 783 .descriptorCount = 1, 784 .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, 785 .pImmutableSamplers = NULL 786 }, 787 } 788 }; 789 790 result = radv_CreateDescriptorSetLayout(radv_device_to_handle(device), 791 &ds_create_info, 792 &device->meta_state.alloc, 793 &device->meta_state.cleari.img_ds_layout); 794 if (result != VK_SUCCESS) 795 goto fail; 796 797 798 VkPipelineLayoutCreateInfo pl_create_info = { 799 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 800 .setLayoutCount = 1, 801 .pSetLayouts = &device->meta_state.cleari.img_ds_layout, 802 .pushConstantRangeCount = 1, 803 .pPushConstantRanges = &(VkPushConstantRange){VK_SHADER_STAGE_COMPUTE_BIT, 0, 20}, 804 }; 805 806 result = radv_CreatePipelineLayout(radv_device_to_handle(device), 807 &pl_create_info, 808 &device->meta_state.alloc, 809 &device->meta_state.cleari.img_p_layout); 810 if (result != VK_SUCCESS) 811 goto fail; 812 813 /* compute shader */ 814 815 VkPipelineShaderStageCreateInfo pipeline_shader_stage = { 816 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 817 .stage = VK_SHADER_STAGE_COMPUTE_BIT, 818 .module = radv_shader_module_to_handle(&cs), 819 .pName = "main", 820 .pSpecializationInfo = NULL, 821 }; 822 823 VkComputePipelineCreateInfo vk_pipeline_info = { 824 .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 825 .stage = pipeline_shader_stage, 826 .flags = 0, 827 .layout = device->meta_state.cleari.img_p_layout, 828 }; 829 830 result = radv_CreateComputePipelines(radv_device_to_handle(device), 831 radv_pipeline_cache_to_handle(&device->meta_state.cache), 832 1, &vk_pipeline_info, NULL, 833 &device->meta_state.cleari.pipeline); 834 if (result != VK_SUCCESS) 835 goto fail; 836 837 838 if (device->physical_device->rad_info.chip_class >= GFX9) { 839 /* compute shader */ 840 VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d = { 841 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 842 .stage = VK_SHADER_STAGE_COMPUTE_BIT, 843 .module = radv_shader_module_to_handle(&cs_3d), 844 .pName = "main", 845 .pSpecializationInfo = NULL, 846 }; 847 848 VkComputePipelineCreateInfo vk_pipeline_info_3d = { 849 .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 850 .stage = pipeline_shader_stage_3d, 851 .flags = 0, 852 .layout = device->meta_state.cleari.img_p_layout, 853 }; 854 855 result = radv_CreateComputePipelines(radv_device_to_handle(device), 856 radv_pipeline_cache_to_handle(&device->meta_state.cache), 857 1, &vk_pipeline_info_3d, NULL, 858 &device->meta_state.cleari.pipeline_3d); 859 if (result != VK_SUCCESS) 860 goto fail; 861 862 ralloc_free(cs_3d.nir); 863 } 864 ralloc_free(cs.nir); 865 return VK_SUCCESS; 866 fail: 867 ralloc_free(cs.nir); 868 ralloc_free(cs_3d.nir); 869 return result; 870 } 871 872 static void 873 radv_device_finish_meta_cleari_state(struct radv_device *device) 874 { 875 struct radv_meta_state *state = &device->meta_state; 876 877 radv_DestroyPipelineLayout(radv_device_to_handle(device), 878 state->cleari.img_p_layout, &state->alloc); 879 radv_DestroyDescriptorSetLayout(radv_device_to_handle(device), 880 state->cleari.img_ds_layout, 881 &state->alloc); 882 radv_DestroyPipeline(radv_device_to_handle(device), 883 state->cleari.pipeline, &state->alloc); 884 radv_DestroyPipeline(radv_device_to_handle(device), 885 state->cleari.pipeline_3d, &state->alloc); 886 } 887 888 void 889 radv_device_finish_meta_bufimage_state(struct radv_device *device) 890 { 891 radv_device_finish_meta_itob_state(device); 892 radv_device_finish_meta_btoi_state(device); 893 radv_device_finish_meta_itoi_state(device); 894 radv_device_finish_meta_cleari_state(device); 895 } 896 897 VkResult 898 radv_device_init_meta_bufimage_state(struct radv_device *device) 899 { 900 VkResult result; 901 902 result = radv_device_init_meta_itob_state(device); 903 if (result != VK_SUCCESS) 904 goto fail_itob; 905 906 result = radv_device_init_meta_btoi_state(device); 907 if (result != VK_SUCCESS) 908 goto fail_btoi; 909 910 result = radv_device_init_meta_itoi_state(device); 911 if (result != VK_SUCCESS) 912 goto fail_itoi; 913 914 result = radv_device_init_meta_cleari_state(device); 915 if (result != VK_SUCCESS) 916 goto fail_cleari; 917 918 return VK_SUCCESS; 919 fail_cleari: 920 radv_device_finish_meta_cleari_state(device); 921 fail_itoi: 922 radv_device_finish_meta_itoi_state(device); 923 fail_btoi: 924 radv_device_finish_meta_btoi_state(device); 925 fail_itob: 926 radv_device_finish_meta_itob_state(device); 927 return result; 928 } 929 930 static void 931 create_iview(struct radv_cmd_buffer *cmd_buffer, 932 struct radv_meta_blit2d_surf *surf, 933 struct radv_image_view *iview) 934 { 935 VkImageViewType view_type = cmd_buffer->device->physical_device->rad_info.chip_class < GFX9 ? VK_IMAGE_VIEW_TYPE_2D : 936 radv_meta_get_view_type(surf->image); 937 radv_image_view_init(iview, cmd_buffer->device, 938 &(VkImageViewCreateInfo) { 939 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, 940 .image = radv_image_to_handle(surf->image), 941 .viewType = view_type, 942 .format = surf->format, 943 .subresourceRange = { 944 .aspectMask = surf->aspect_mask, 945 .baseMipLevel = surf->level, 946 .levelCount = 1, 947 .baseArrayLayer = surf->layer, 948 .layerCount = 1 949 }, 950 }); 951 } 952 953 static void 954 create_bview(struct radv_cmd_buffer *cmd_buffer, 955 struct radv_buffer *buffer, 956 unsigned offset, 957 VkFormat format, 958 struct radv_buffer_view *bview) 959 { 960 radv_buffer_view_init(bview, cmd_buffer->device, 961 &(VkBufferViewCreateInfo) { 962 .sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO, 963 .flags = 0, 964 .buffer = radv_buffer_to_handle(buffer), 965 .format = format, 966 .offset = offset, 967 .range = VK_WHOLE_SIZE, 968 }); 969 970 } 971 972 static void 973 itob_bind_descriptors(struct radv_cmd_buffer *cmd_buffer, 974 struct radv_image_view *src, 975 struct radv_buffer_view *dst) 976 { 977 struct radv_device *device = cmd_buffer->device; 978 979 radv_meta_push_descriptor_set(cmd_buffer, 980 VK_PIPELINE_BIND_POINT_COMPUTE, 981 device->meta_state.itob.img_p_layout, 982 0, /* set */ 983 2, /* descriptorWriteCount */ 984 (VkWriteDescriptorSet[]) { 985 { 986 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 987 .dstBinding = 0, 988 .dstArrayElement = 0, 989 .descriptorCount = 1, 990 .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 991 .pImageInfo = (VkDescriptorImageInfo[]) { 992 { 993 .sampler = VK_NULL_HANDLE, 994 .imageView = radv_image_view_to_handle(src), 995 .imageLayout = VK_IMAGE_LAYOUT_GENERAL, 996 }, 997 } 998 }, 999 { 1000 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 1001 .dstBinding = 1, 1002 .dstArrayElement = 0, 1003 .descriptorCount = 1, 1004 .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1005 .pTexelBufferView = (VkBufferView[]) { radv_buffer_view_to_handle(dst) }, 1006 } 1007 }); 1008 } 1009 1010 void 1011 radv_meta_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, 1012 struct radv_meta_blit2d_surf *src, 1013 struct radv_meta_blit2d_buffer *dst, 1014 unsigned num_rects, 1015 struct radv_meta_blit2d_rect *rects) 1016 { 1017 VkPipeline pipeline = cmd_buffer->device->meta_state.itob.pipeline; 1018 struct radv_device *device = cmd_buffer->device; 1019 struct radv_image_view src_view; 1020 struct radv_buffer_view dst_view; 1021 1022 create_iview(cmd_buffer, src, &src_view); 1023 create_bview(cmd_buffer, dst->buffer, dst->offset, dst->format, &dst_view); 1024 itob_bind_descriptors(cmd_buffer, &src_view, &dst_view); 1025 1026 if (device->physical_device->rad_info.chip_class >= GFX9 && 1027 src->image->type == VK_IMAGE_TYPE_3D) 1028 pipeline = cmd_buffer->device->meta_state.itob.pipeline_3d; 1029 1030 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), 1031 VK_PIPELINE_BIND_POINT_COMPUTE, pipeline); 1032 1033 for (unsigned r = 0; r < num_rects; ++r) { 1034 unsigned push_constants[4] = { 1035 rects[r].src_x, 1036 rects[r].src_y, 1037 src->layer, 1038 dst->pitch 1039 }; 1040 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer), 1041 device->meta_state.itob.img_p_layout, 1042 VK_SHADER_STAGE_COMPUTE_BIT, 0, 16, 1043 push_constants); 1044 1045 radv_unaligned_dispatch(cmd_buffer, rects[r].width, rects[r].height, 1); 1046 } 1047 } 1048 1049 static void 1050 btoi_bind_descriptors(struct radv_cmd_buffer *cmd_buffer, 1051 struct radv_buffer_view *src, 1052 struct radv_image_view *dst) 1053 { 1054 struct radv_device *device = cmd_buffer->device; 1055 1056 radv_meta_push_descriptor_set(cmd_buffer, 1057 VK_PIPELINE_BIND_POINT_COMPUTE, 1058 device->meta_state.btoi.img_p_layout, 1059 0, /* set */ 1060 2, /* descriptorWriteCount */ 1061 (VkWriteDescriptorSet[]) { 1062 { 1063 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 1064 .dstBinding = 0, 1065 .dstArrayElement = 0, 1066 .descriptorCount = 1, 1067 .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1068 .pTexelBufferView = (VkBufferView[]) { radv_buffer_view_to_handle(src) }, 1069 }, 1070 { 1071 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 1072 .dstBinding = 1, 1073 .dstArrayElement = 0, 1074 .descriptorCount = 1, 1075 .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1076 .pImageInfo = (VkDescriptorImageInfo[]) { 1077 { 1078 .sampler = VK_NULL_HANDLE, 1079 .imageView = radv_image_view_to_handle(dst), 1080 .imageLayout = VK_IMAGE_LAYOUT_GENERAL, 1081 }, 1082 } 1083 } 1084 }); 1085 } 1086 1087 void 1088 radv_meta_buffer_to_image_cs(struct radv_cmd_buffer *cmd_buffer, 1089 struct radv_meta_blit2d_buffer *src, 1090 struct radv_meta_blit2d_surf *dst, 1091 unsigned num_rects, 1092 struct radv_meta_blit2d_rect *rects) 1093 { 1094 VkPipeline pipeline = cmd_buffer->device->meta_state.btoi.pipeline; 1095 struct radv_device *device = cmd_buffer->device; 1096 struct radv_buffer_view src_view; 1097 struct radv_image_view dst_view; 1098 1099 create_bview(cmd_buffer, src->buffer, src->offset, src->format, &src_view); 1100 create_iview(cmd_buffer, dst, &dst_view); 1101 btoi_bind_descriptors(cmd_buffer, &src_view, &dst_view); 1102 1103 if (device->physical_device->rad_info.chip_class >= GFX9 && 1104 dst->image->type == VK_IMAGE_TYPE_3D) 1105 pipeline = cmd_buffer->device->meta_state.btoi.pipeline_3d; 1106 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), 1107 VK_PIPELINE_BIND_POINT_COMPUTE, pipeline); 1108 1109 for (unsigned r = 0; r < num_rects; ++r) { 1110 unsigned push_constants[4] = { 1111 rects[r].dst_x, 1112 rects[r].dst_y, 1113 dst->layer, 1114 src->pitch, 1115 }; 1116 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer), 1117 device->meta_state.btoi.img_p_layout, 1118 VK_SHADER_STAGE_COMPUTE_BIT, 0, 16, 1119 push_constants); 1120 1121 radv_unaligned_dispatch(cmd_buffer, rects[r].width, rects[r].height, 1); 1122 } 1123 } 1124 1125 static void 1126 itoi_bind_descriptors(struct radv_cmd_buffer *cmd_buffer, 1127 struct radv_image_view *src, 1128 struct radv_image_view *dst) 1129 { 1130 struct radv_device *device = cmd_buffer->device; 1131 1132 radv_meta_push_descriptor_set(cmd_buffer, 1133 VK_PIPELINE_BIND_POINT_COMPUTE, 1134 device->meta_state.itoi.img_p_layout, 1135 0, /* set */ 1136 2, /* descriptorWriteCount */ 1137 (VkWriteDescriptorSet[]) { 1138 { 1139 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 1140 .dstBinding = 0, 1141 .dstArrayElement = 0, 1142 .descriptorCount = 1, 1143 .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1144 .pImageInfo = (VkDescriptorImageInfo[]) { 1145 { 1146 .sampler = VK_NULL_HANDLE, 1147 .imageView = radv_image_view_to_handle(src), 1148 .imageLayout = VK_IMAGE_LAYOUT_GENERAL, 1149 }, 1150 } 1151 }, 1152 { 1153 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 1154 .dstBinding = 1, 1155 .dstArrayElement = 0, 1156 .descriptorCount = 1, 1157 .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1158 .pImageInfo = (VkDescriptorImageInfo[]) { 1159 { 1160 .sampler = VK_NULL_HANDLE, 1161 .imageView = radv_image_view_to_handle(dst), 1162 .imageLayout = VK_IMAGE_LAYOUT_GENERAL, 1163 }, 1164 } 1165 } 1166 }); 1167 } 1168 1169 void 1170 radv_meta_image_to_image_cs(struct radv_cmd_buffer *cmd_buffer, 1171 struct radv_meta_blit2d_surf *src, 1172 struct radv_meta_blit2d_surf *dst, 1173 unsigned num_rects, 1174 struct radv_meta_blit2d_rect *rects) 1175 { 1176 VkPipeline pipeline = cmd_buffer->device->meta_state.itoi.pipeline; 1177 struct radv_device *device = cmd_buffer->device; 1178 struct radv_image_view src_view, dst_view; 1179 1180 create_iview(cmd_buffer, src, &src_view); 1181 create_iview(cmd_buffer, dst, &dst_view); 1182 1183 itoi_bind_descriptors(cmd_buffer, &src_view, &dst_view); 1184 1185 if (device->physical_device->rad_info.chip_class >= GFX9 && 1186 src->image->type == VK_IMAGE_TYPE_3D) 1187 pipeline = cmd_buffer->device->meta_state.itoi.pipeline_3d; 1188 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), 1189 VK_PIPELINE_BIND_POINT_COMPUTE, pipeline); 1190 1191 for (unsigned r = 0; r < num_rects; ++r) { 1192 unsigned push_constants[6] = { 1193 rects[r].src_x, 1194 rects[r].src_y, 1195 src->layer, 1196 rects[r].dst_x, 1197 rects[r].dst_y, 1198 dst->layer, 1199 }; 1200 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer), 1201 device->meta_state.itoi.img_p_layout, 1202 VK_SHADER_STAGE_COMPUTE_BIT, 0, 24, 1203 push_constants); 1204 1205 radv_unaligned_dispatch(cmd_buffer, rects[r].width, rects[r].height, 1); 1206 } 1207 } 1208 1209 static void 1210 cleari_bind_descriptors(struct radv_cmd_buffer *cmd_buffer, 1211 struct radv_image_view *dst_iview) 1212 { 1213 struct radv_device *device = cmd_buffer->device; 1214 1215 radv_meta_push_descriptor_set(cmd_buffer, 1216 VK_PIPELINE_BIND_POINT_COMPUTE, 1217 device->meta_state.cleari.img_p_layout, 1218 0, /* set */ 1219 1, /* descriptorWriteCount */ 1220 (VkWriteDescriptorSet[]) { 1221 { 1222 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 1223 .dstBinding = 0, 1224 .dstArrayElement = 0, 1225 .descriptorCount = 1, 1226 .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1227 .pImageInfo = (VkDescriptorImageInfo[]) { 1228 { 1229 .sampler = VK_NULL_HANDLE, 1230 .imageView = radv_image_view_to_handle(dst_iview), 1231 .imageLayout = VK_IMAGE_LAYOUT_GENERAL, 1232 }, 1233 } 1234 }, 1235 }); 1236 } 1237 1238 void 1239 radv_meta_clear_image_cs(struct radv_cmd_buffer *cmd_buffer, 1240 struct radv_meta_blit2d_surf *dst, 1241 const VkClearColorValue *clear_color) 1242 { 1243 VkPipeline pipeline = cmd_buffer->device->meta_state.cleari.pipeline; 1244 struct radv_device *device = cmd_buffer->device; 1245 struct radv_image_view dst_iview; 1246 1247 create_iview(cmd_buffer, dst, &dst_iview); 1248 cleari_bind_descriptors(cmd_buffer, &dst_iview); 1249 1250 if (device->physical_device->rad_info.chip_class >= GFX9 && 1251 dst->image->type == VK_IMAGE_TYPE_3D) 1252 pipeline = cmd_buffer->device->meta_state.cleari.pipeline_3d; 1253 1254 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), 1255 VK_PIPELINE_BIND_POINT_COMPUTE, pipeline); 1256 1257 unsigned push_constants[5] = { 1258 clear_color->uint32[0], 1259 clear_color->uint32[1], 1260 clear_color->uint32[2], 1261 clear_color->uint32[3], 1262 dst->layer, 1263 }; 1264 1265 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer), 1266 device->meta_state.cleari.img_p_layout, 1267 VK_SHADER_STAGE_COMPUTE_BIT, 0, 20, 1268 push_constants); 1269 1270 radv_unaligned_dispatch(cmd_buffer, dst->image->info.width, dst->image->info.height, 1); 1271 } 1272