2 * Copyright © 2016 Red Hat.
3 * Copyright © 2016 Bas Nieuwenhuizen
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:
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
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
24 #include "radv_meta.h"
25 #include "nir/nir_builder.h"
28 * GFX queue: Compute shader implementation of image->buffer copy
29 * Compute queue: implementation also of buffer->image, image->image, and image clear.
32 /* GFX9 needs to use a 3D sampler to access 3D resources, so the shader has the options
36 build_nir_itob_compute_shader(struct radv_device
*dev
, bool is_3d
)
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
,
44 const struct glsl_type
*img_type
= glsl_sampler_type(GLSL_SAMPLER_DIM_BUF
,
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;
58 nir_variable
*output_img
= nir_variable_create(b
.shader
, nir_var_uniform
,
60 output_img
->data
.descriptor_set
= 0;
61 output_img
->data
.binding
= 1;
63 nir_ssa_def
*invoc_id
= nir_load_local_invocation_id(&b
);
64 nir_ssa_def
*wg_id
= nir_load_work_group_id(&b
);
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);
70 nir_ssa_def
*global_id
= nir_iadd(&b
, nir_imul(&b
, wg_id
, block_size
), invoc_id
);
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
);
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
);
90 nir_ssa_def
*img_coord
= nir_iadd(&b
, global_id
, &offset
->dest
.ssa
);
91 nir_ssa_def
*input_img_deref
= &nir_build_deref_var(&b
, input_img
)->dest
.ssa
;
93 nir_tex_instr
*tex
= nir_tex_instr_create(b
.shader
, 3);
94 tex
->sampler_dim
= dim
;
95 tex
->op
= nir_texop_txf
;
96 tex
->src
[0].src_type
= nir_tex_src_coord
;
97 tex
->src
[0].src
= nir_src_for_ssa(nir_channels(&b
, img_coord
, is_3d
? 0x7 : 0x3));
98 tex
->src
[1].src_type
= nir_tex_src_lod
;
99 tex
->src
[1].src
= nir_src_for_ssa(nir_imm_int(&b
, 0));
100 tex
->src
[2].src_type
= nir_tex_src_texture_deref
;
101 tex
->src
[2].src
= nir_src_for_ssa(input_img_deref
);
102 tex
->dest_type
= nir_type_float
;
103 tex
->is_array
= false;
104 tex
->coord_components
= is_3d
? 3 : 2;
106 nir_ssa_dest_init(&tex
->instr
, &tex
->dest
, 4, 32, "tex");
107 nir_builder_instr_insert(&b
, &tex
->instr
);
109 nir_ssa_def
*pos_x
= nir_channel(&b
, global_id
, 0);
110 nir_ssa_def
*pos_y
= nir_channel(&b
, global_id
, 1);
112 nir_ssa_def
*tmp
= nir_imul(&b
, pos_y
, &stride
->dest
.ssa
);
113 tmp
= nir_iadd(&b
, tmp
, pos_x
);
115 nir_ssa_def
*coord
= nir_vec4(&b
, tmp
, tmp
, tmp
, tmp
);
117 nir_ssa_def
*outval
= &tex
->dest
.ssa
;
118 nir_intrinsic_instr
*store
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_image_deref_store
);
119 store
->num_components
= 4;
120 store
->src
[0] = nir_src_for_ssa(&nir_build_deref_var(&b
, output_img
)->dest
.ssa
);
121 store
->src
[1] = nir_src_for_ssa(coord
);
122 store
->src
[2] = nir_src_for_ssa(nir_ssa_undef(&b
, 1, 32));
123 store
->src
[3] = nir_src_for_ssa(outval
);
124 store
->src
[4] = nir_src_for_ssa(nir_imm_int(&b
, 0));
126 nir_builder_instr_insert(&b
, &store
->instr
);
130 /* Image to buffer - don't write use image accessors */
132 radv_device_init_meta_itob_state(struct radv_device
*device
)
135 struct radv_shader_module cs
= { .nir
= NULL
};
136 struct radv_shader_module cs_3d
= { .nir
= NULL
};
138 cs
.nir
= build_nir_itob_compute_shader(device
, false);
139 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
)
140 cs_3d
.nir
= build_nir_itob_compute_shader(device
, true);
143 * two descriptors one for the image being sampled
144 * one for the buffer being written.
146 VkDescriptorSetLayoutCreateInfo ds_create_info
= {
147 .sType
= VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
,
148 .flags
= VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
,
150 .pBindings
= (VkDescriptorSetLayoutBinding
[]) {
153 .descriptorType
= VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,
154 .descriptorCount
= 1,
155 .stageFlags
= VK_SHADER_STAGE_COMPUTE_BIT
,
156 .pImmutableSamplers
= NULL
160 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
,
161 .descriptorCount
= 1,
162 .stageFlags
= VK_SHADER_STAGE_COMPUTE_BIT
,
163 .pImmutableSamplers
= NULL
168 result
= radv_CreateDescriptorSetLayout(radv_device_to_handle(device
),
170 &device
->meta_state
.alloc
,
171 &device
->meta_state
.itob
.img_ds_layout
);
172 if (result
!= VK_SUCCESS
)
176 VkPipelineLayoutCreateInfo pl_create_info
= {
177 .sType
= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
,
179 .pSetLayouts
= &device
->meta_state
.itob
.img_ds_layout
,
180 .pushConstantRangeCount
= 1,
181 .pPushConstantRanges
= &(VkPushConstantRange
){VK_SHADER_STAGE_COMPUTE_BIT
, 0, 16},
184 result
= radv_CreatePipelineLayout(radv_device_to_handle(device
),
186 &device
->meta_state
.alloc
,
187 &device
->meta_state
.itob
.img_p_layout
);
188 if (result
!= VK_SUCCESS
)
193 VkPipelineShaderStageCreateInfo pipeline_shader_stage
= {
194 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
195 .stage
= VK_SHADER_STAGE_COMPUTE_BIT
,
196 .module
= radv_shader_module_to_handle(&cs
),
198 .pSpecializationInfo
= NULL
,
201 VkComputePipelineCreateInfo vk_pipeline_info
= {
202 .sType
= VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
,
203 .stage
= pipeline_shader_stage
,
205 .layout
= device
->meta_state
.itob
.img_p_layout
,
208 result
= radv_CreateComputePipelines(radv_device_to_handle(device
),
209 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
210 1, &vk_pipeline_info
, NULL
,
211 &device
->meta_state
.itob
.pipeline
);
212 if (result
!= VK_SUCCESS
)
215 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
) {
216 VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d
= {
217 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
218 .stage
= VK_SHADER_STAGE_COMPUTE_BIT
,
219 .module
= radv_shader_module_to_handle(&cs_3d
),
221 .pSpecializationInfo
= NULL
,
224 VkComputePipelineCreateInfo vk_pipeline_info_3d
= {
225 .sType
= VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
,
226 .stage
= pipeline_shader_stage_3d
,
228 .layout
= device
->meta_state
.itob
.img_p_layout
,
231 result
= radv_CreateComputePipelines(radv_device_to_handle(device
),
232 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
233 1, &vk_pipeline_info_3d
, NULL
,
234 &device
->meta_state
.itob
.pipeline_3d
);
235 if (result
!= VK_SUCCESS
)
237 ralloc_free(cs_3d
.nir
);
244 ralloc_free(cs_3d
.nir
);
249 radv_device_finish_meta_itob_state(struct radv_device
*device
)
251 struct radv_meta_state
*state
= &device
->meta_state
;
253 radv_DestroyPipelineLayout(radv_device_to_handle(device
),
254 state
->itob
.img_p_layout
, &state
->alloc
);
255 radv_DestroyDescriptorSetLayout(radv_device_to_handle(device
),
256 state
->itob
.img_ds_layout
,
258 radv_DestroyPipeline(radv_device_to_handle(device
),
259 state
->itob
.pipeline
, &state
->alloc
);
260 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
)
261 radv_DestroyPipeline(radv_device_to_handle(device
),
262 state
->itob
.pipeline_3d
, &state
->alloc
);
266 build_nir_btoi_compute_shader(struct radv_device
*dev
, bool is_3d
)
269 enum glsl_sampler_dim dim
= is_3d
? GLSL_SAMPLER_DIM_3D
: GLSL_SAMPLER_DIM_2D
;
270 const struct glsl_type
*buf_type
= glsl_sampler_type(GLSL_SAMPLER_DIM_BUF
,
274 const struct glsl_type
*img_type
= glsl_sampler_type(dim
,
278 nir_builder_init_simple_shader(&b
, NULL
, MESA_SHADER_COMPUTE
, NULL
);
279 b
.shader
->info
.name
= ralloc_strdup(b
.shader
, is_3d
? "meta_btoi_cs_3d" : "meta_btoi_cs");
280 b
.shader
->info
.cs
.local_size
[0] = 16;
281 b
.shader
->info
.cs
.local_size
[1] = 16;
282 b
.shader
->info
.cs
.local_size
[2] = 1;
283 nir_variable
*input_img
= nir_variable_create(b
.shader
, nir_var_uniform
,
285 input_img
->data
.descriptor_set
= 0;
286 input_img
->data
.binding
= 0;
288 nir_variable
*output_img
= nir_variable_create(b
.shader
, nir_var_uniform
,
289 img_type
, "out_img");
290 output_img
->data
.descriptor_set
= 0;
291 output_img
->data
.binding
= 1;
293 nir_ssa_def
*invoc_id
= nir_load_local_invocation_id(&b
);
294 nir_ssa_def
*wg_id
= nir_load_work_group_id(&b
);
295 nir_ssa_def
*block_size
= nir_imm_ivec4(&b
,
296 b
.shader
->info
.cs
.local_size
[0],
297 b
.shader
->info
.cs
.local_size
[1],
298 b
.shader
->info
.cs
.local_size
[2], 0);
300 nir_ssa_def
*global_id
= nir_iadd(&b
, nir_imul(&b
, wg_id
, block_size
), invoc_id
);
302 nir_intrinsic_instr
*offset
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
303 nir_intrinsic_set_base(offset
, 0);
304 nir_intrinsic_set_range(offset
, 16);
305 offset
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 0));
306 offset
->num_components
= is_3d
? 3 : 2;
307 nir_ssa_dest_init(&offset
->instr
, &offset
->dest
, is_3d
? 3 : 2, 32, "offset");
308 nir_builder_instr_insert(&b
, &offset
->instr
);
310 nir_intrinsic_instr
*stride
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
311 nir_intrinsic_set_base(stride
, 0);
312 nir_intrinsic_set_range(stride
, 16);
313 stride
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 12));
314 stride
->num_components
= 1;
315 nir_ssa_dest_init(&stride
->instr
, &stride
->dest
, 1, 32, "stride");
316 nir_builder_instr_insert(&b
, &stride
->instr
);
318 nir_ssa_def
*pos_x
= nir_channel(&b
, global_id
, 0);
319 nir_ssa_def
*pos_y
= nir_channel(&b
, global_id
, 1);
321 nir_ssa_def
*tmp
= nir_imul(&b
, pos_y
, &stride
->dest
.ssa
);
322 tmp
= nir_iadd(&b
, tmp
, pos_x
);
324 nir_ssa_def
*buf_coord
= nir_vec4(&b
, tmp
, tmp
, tmp
, tmp
);
326 nir_ssa_def
*img_coord
= nir_iadd(&b
, global_id
, &offset
->dest
.ssa
);
327 nir_ssa_def
*input_img_deref
= &nir_build_deref_var(&b
, input_img
)->dest
.ssa
;
329 nir_tex_instr
*tex
= nir_tex_instr_create(b
.shader
, 3);
330 tex
->sampler_dim
= GLSL_SAMPLER_DIM_BUF
;
331 tex
->op
= nir_texop_txf
;
332 tex
->src
[0].src_type
= nir_tex_src_coord
;
333 tex
->src
[0].src
= nir_src_for_ssa(nir_channels(&b
, buf_coord
, 1));
334 tex
->src
[1].src_type
= nir_tex_src_lod
;
335 tex
->src
[1].src
= nir_src_for_ssa(nir_imm_int(&b
, 0));
336 tex
->src
[2].src_type
= nir_tex_src_texture_deref
;
337 tex
->src
[2].src
= nir_src_for_ssa(input_img_deref
);
338 tex
->dest_type
= nir_type_float
;
339 tex
->is_array
= false;
340 tex
->coord_components
= 1;
342 nir_ssa_dest_init(&tex
->instr
, &tex
->dest
, 4, 32, "tex");
343 nir_builder_instr_insert(&b
, &tex
->instr
);
345 nir_ssa_def
*outval
= &tex
->dest
.ssa
;
346 nir_intrinsic_instr
*store
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_image_deref_store
);
347 store
->num_components
= 4;
348 store
->src
[0] = nir_src_for_ssa(&nir_build_deref_var(&b
, output_img
)->dest
.ssa
);
349 store
->src
[1] = nir_src_for_ssa(img_coord
);
350 store
->src
[2] = nir_src_for_ssa(nir_ssa_undef(&b
, 1, 32));
351 store
->src
[3] = nir_src_for_ssa(outval
);
352 store
->src
[4] = nir_src_for_ssa(nir_imm_int(&b
, 0));
354 nir_builder_instr_insert(&b
, &store
->instr
);
358 /* Buffer to image - don't write use image accessors */
360 radv_device_init_meta_btoi_state(struct radv_device
*device
)
363 struct radv_shader_module cs
= { .nir
= NULL
};
364 struct radv_shader_module cs_3d
= { .nir
= NULL
};
365 cs
.nir
= build_nir_btoi_compute_shader(device
, false);
366 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
)
367 cs_3d
.nir
= build_nir_btoi_compute_shader(device
, true);
369 * two descriptors one for the image being sampled
370 * one for the buffer being written.
372 VkDescriptorSetLayoutCreateInfo ds_create_info
= {
373 .sType
= VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
,
374 .flags
= VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
,
376 .pBindings
= (VkDescriptorSetLayoutBinding
[]) {
379 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
,
380 .descriptorCount
= 1,
381 .stageFlags
= VK_SHADER_STAGE_COMPUTE_BIT
,
382 .pImmutableSamplers
= NULL
386 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
,
387 .descriptorCount
= 1,
388 .stageFlags
= VK_SHADER_STAGE_COMPUTE_BIT
,
389 .pImmutableSamplers
= NULL
394 result
= radv_CreateDescriptorSetLayout(radv_device_to_handle(device
),
396 &device
->meta_state
.alloc
,
397 &device
->meta_state
.btoi
.img_ds_layout
);
398 if (result
!= VK_SUCCESS
)
402 VkPipelineLayoutCreateInfo pl_create_info
= {
403 .sType
= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
,
405 .pSetLayouts
= &device
->meta_state
.btoi
.img_ds_layout
,
406 .pushConstantRangeCount
= 1,
407 .pPushConstantRanges
= &(VkPushConstantRange
){VK_SHADER_STAGE_COMPUTE_BIT
, 0, 16},
410 result
= radv_CreatePipelineLayout(radv_device_to_handle(device
),
412 &device
->meta_state
.alloc
,
413 &device
->meta_state
.btoi
.img_p_layout
);
414 if (result
!= VK_SUCCESS
)
419 VkPipelineShaderStageCreateInfo pipeline_shader_stage
= {
420 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
421 .stage
= VK_SHADER_STAGE_COMPUTE_BIT
,
422 .module
= radv_shader_module_to_handle(&cs
),
424 .pSpecializationInfo
= NULL
,
427 VkComputePipelineCreateInfo vk_pipeline_info
= {
428 .sType
= VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
,
429 .stage
= pipeline_shader_stage
,
431 .layout
= device
->meta_state
.btoi
.img_p_layout
,
434 result
= radv_CreateComputePipelines(radv_device_to_handle(device
),
435 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
436 1, &vk_pipeline_info
, NULL
,
437 &device
->meta_state
.btoi
.pipeline
);
438 if (result
!= VK_SUCCESS
)
441 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
) {
442 VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d
= {
443 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
444 .stage
= VK_SHADER_STAGE_COMPUTE_BIT
,
445 .module
= radv_shader_module_to_handle(&cs_3d
),
447 .pSpecializationInfo
= NULL
,
450 VkComputePipelineCreateInfo vk_pipeline_info_3d
= {
451 .sType
= VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
,
452 .stage
= pipeline_shader_stage_3d
,
454 .layout
= device
->meta_state
.btoi
.img_p_layout
,
457 result
= radv_CreateComputePipelines(radv_device_to_handle(device
),
458 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
459 1, &vk_pipeline_info_3d
, NULL
,
460 &device
->meta_state
.btoi
.pipeline_3d
);
461 ralloc_free(cs_3d
.nir
);
467 ralloc_free(cs_3d
.nir
);
473 radv_device_finish_meta_btoi_state(struct radv_device
*device
)
475 struct radv_meta_state
*state
= &device
->meta_state
;
477 radv_DestroyPipelineLayout(radv_device_to_handle(device
),
478 state
->btoi
.img_p_layout
, &state
->alloc
);
479 radv_DestroyDescriptorSetLayout(radv_device_to_handle(device
),
480 state
->btoi
.img_ds_layout
,
482 radv_DestroyPipeline(radv_device_to_handle(device
),
483 state
->btoi
.pipeline
, &state
->alloc
);
484 radv_DestroyPipeline(radv_device_to_handle(device
),
485 state
->btoi
.pipeline_3d
, &state
->alloc
);
488 /* Buffer to image - special path for R32G32B32 */
490 build_nir_btoi_r32g32b32_compute_shader(struct radv_device
*dev
)
493 const struct glsl_type
*buf_type
= glsl_sampler_type(GLSL_SAMPLER_DIM_BUF
,
497 const struct glsl_type
*img_type
= glsl_sampler_type(GLSL_SAMPLER_DIM_BUF
,
501 nir_builder_init_simple_shader(&b
, NULL
, MESA_SHADER_COMPUTE
, NULL
);
502 b
.shader
->info
.name
= ralloc_strdup(b
.shader
, "meta_btoi_r32g32b32_cs");
503 b
.shader
->info
.cs
.local_size
[0] = 16;
504 b
.shader
->info
.cs
.local_size
[1] = 16;
505 b
.shader
->info
.cs
.local_size
[2] = 1;
506 nir_variable
*input_img
= nir_variable_create(b
.shader
, nir_var_uniform
,
508 input_img
->data
.descriptor_set
= 0;
509 input_img
->data
.binding
= 0;
511 nir_variable
*output_img
= nir_variable_create(b
.shader
, nir_var_uniform
,
512 img_type
, "out_img");
513 output_img
->data
.descriptor_set
= 0;
514 output_img
->data
.binding
= 1;
516 nir_ssa_def
*invoc_id
= nir_load_local_invocation_id(&b
);
517 nir_ssa_def
*wg_id
= nir_load_work_group_id(&b
);
518 nir_ssa_def
*block_size
= nir_imm_ivec4(&b
,
519 b
.shader
->info
.cs
.local_size
[0],
520 b
.shader
->info
.cs
.local_size
[1],
521 b
.shader
->info
.cs
.local_size
[2], 0);
523 nir_ssa_def
*global_id
= nir_iadd(&b
, nir_imul(&b
, wg_id
, block_size
), invoc_id
);
525 nir_intrinsic_instr
*offset
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
526 nir_intrinsic_set_base(offset
, 0);
527 nir_intrinsic_set_range(offset
, 16);
528 offset
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 0));
529 offset
->num_components
= 2;
530 nir_ssa_dest_init(&offset
->instr
, &offset
->dest
, 2, 32, "offset");
531 nir_builder_instr_insert(&b
, &offset
->instr
);
533 nir_intrinsic_instr
*pitch
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
534 nir_intrinsic_set_base(pitch
, 0);
535 nir_intrinsic_set_range(pitch
, 16);
536 pitch
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 8));
537 pitch
->num_components
= 1;
538 nir_ssa_dest_init(&pitch
->instr
, &pitch
->dest
, 1, 32, "pitch");
539 nir_builder_instr_insert(&b
, &pitch
->instr
);
541 nir_intrinsic_instr
*stride
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
542 nir_intrinsic_set_base(stride
, 0);
543 nir_intrinsic_set_range(stride
, 16);
544 stride
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 12));
545 stride
->num_components
= 1;
546 nir_ssa_dest_init(&stride
->instr
, &stride
->dest
, 1, 32, "stride");
547 nir_builder_instr_insert(&b
, &stride
->instr
);
549 nir_ssa_def
*pos_x
= nir_channel(&b
, global_id
, 0);
550 nir_ssa_def
*pos_y
= nir_channel(&b
, global_id
, 1);
552 nir_ssa_def
*tmp
= nir_imul(&b
, pos_y
, &stride
->dest
.ssa
);
553 tmp
= nir_iadd(&b
, tmp
, pos_x
);
555 nir_ssa_def
*buf_coord
= nir_vec4(&b
, tmp
, tmp
, tmp
, tmp
);
557 nir_ssa_def
*img_coord
= nir_iadd(&b
, global_id
, &offset
->dest
.ssa
);
559 nir_ssa_def
*global_pos
=
561 nir_imul(&b
, nir_channel(&b
, img_coord
, 1), &pitch
->dest
.ssa
),
562 nir_imul(&b
, nir_channel(&b
, img_coord
, 0), nir_imm_int(&b
, 3)));
564 nir_ssa_def
*input_img_deref
= &nir_build_deref_var(&b
, input_img
)->dest
.ssa
;
566 nir_tex_instr
*tex
= nir_tex_instr_create(b
.shader
, 3);
567 tex
->sampler_dim
= GLSL_SAMPLER_DIM_BUF
;
568 tex
->op
= nir_texop_txf
;
569 tex
->src
[0].src_type
= nir_tex_src_coord
;
570 tex
->src
[0].src
= nir_src_for_ssa(nir_channels(&b
, buf_coord
, 1));
571 tex
->src
[1].src_type
= nir_tex_src_lod
;
572 tex
->src
[1].src
= nir_src_for_ssa(nir_imm_int(&b
, 0));
573 tex
->src
[2].src_type
= nir_tex_src_texture_deref
;
574 tex
->src
[2].src
= nir_src_for_ssa(input_img_deref
);
575 tex
->dest_type
= nir_type_float
;
576 tex
->is_array
= false;
577 tex
->coord_components
= 1;
578 nir_ssa_dest_init(&tex
->instr
, &tex
->dest
, 4, 32, "tex");
579 nir_builder_instr_insert(&b
, &tex
->instr
);
581 nir_ssa_def
*outval
= &tex
->dest
.ssa
;
583 for (int chan
= 0; chan
< 3; chan
++) {
584 nir_ssa_def
*local_pos
=
585 nir_iadd(&b
, global_pos
, nir_imm_int(&b
, chan
));
588 nir_vec4(&b
, local_pos
, local_pos
, local_pos
, local_pos
);
590 nir_intrinsic_instr
*store
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_image_deref_store
);
591 store
->num_components
= 1;
592 store
->src
[0] = nir_src_for_ssa(&nir_build_deref_var(&b
, output_img
)->dest
.ssa
);
593 store
->src
[1] = nir_src_for_ssa(coord
);
594 store
->src
[2] = nir_src_for_ssa(nir_ssa_undef(&b
, 1, 32));
595 store
->src
[3] = nir_src_for_ssa(nir_channel(&b
, outval
, chan
));
596 store
->src
[4] = nir_src_for_ssa(nir_imm_int(&b
, 0));
597 nir_builder_instr_insert(&b
, &store
->instr
);
604 radv_device_init_meta_btoi_r32g32b32_state(struct radv_device
*device
)
607 struct radv_shader_module cs
= { .nir
= NULL
};
609 cs
.nir
= build_nir_btoi_r32g32b32_compute_shader(device
);
611 VkDescriptorSetLayoutCreateInfo ds_create_info
= {
612 .sType
= VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
,
613 .flags
= VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
,
615 .pBindings
= (VkDescriptorSetLayoutBinding
[]) {
618 .descriptorType
= VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
,
619 .descriptorCount
= 1,
620 .stageFlags
= VK_SHADER_STAGE_COMPUTE_BIT
,
621 .pImmutableSamplers
= NULL
625 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
,
626 .descriptorCount
= 1,
627 .stageFlags
= VK_SHADER_STAGE_COMPUTE_BIT
,
628 .pImmutableSamplers
= NULL
633 result
= radv_CreateDescriptorSetLayout(radv_device_to_handle(device
),
635 &device
->meta_state
.alloc
,
636 &device
->meta_state
.btoi_r32g32b32
.img_ds_layout
);
637 if (result
!= VK_SUCCESS
)
641 VkPipelineLayoutCreateInfo pl_create_info
= {
642 .sType
= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
,
644 .pSetLayouts
= &device
->meta_state
.btoi_r32g32b32
.img_ds_layout
,
645 .pushConstantRangeCount
= 1,
646 .pPushConstantRanges
= &(VkPushConstantRange
){VK_SHADER_STAGE_COMPUTE_BIT
, 0, 16},
649 result
= radv_CreatePipelineLayout(radv_device_to_handle(device
),
651 &device
->meta_state
.alloc
,
652 &device
->meta_state
.btoi_r32g32b32
.img_p_layout
);
653 if (result
!= VK_SUCCESS
)
658 VkPipelineShaderStageCreateInfo pipeline_shader_stage
= {
659 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
660 .stage
= VK_SHADER_STAGE_COMPUTE_BIT
,
661 .module
= radv_shader_module_to_handle(&cs
),
663 .pSpecializationInfo
= NULL
,
666 VkComputePipelineCreateInfo vk_pipeline_info
= {
667 .sType
= VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
,
668 .stage
= pipeline_shader_stage
,
670 .layout
= device
->meta_state
.btoi_r32g32b32
.img_p_layout
,
673 result
= radv_CreateComputePipelines(radv_device_to_handle(device
),
674 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
675 1, &vk_pipeline_info
, NULL
,
676 &device
->meta_state
.btoi_r32g32b32
.pipeline
);
684 radv_device_finish_meta_btoi_r32g32b32_state(struct radv_device
*device
)
686 struct radv_meta_state
*state
= &device
->meta_state
;
688 radv_DestroyPipelineLayout(radv_device_to_handle(device
),
689 state
->btoi_r32g32b32
.img_p_layout
, &state
->alloc
);
690 radv_DestroyDescriptorSetLayout(radv_device_to_handle(device
),
691 state
->btoi_r32g32b32
.img_ds_layout
,
693 radv_DestroyPipeline(radv_device_to_handle(device
),
694 state
->btoi_r32g32b32
.pipeline
, &state
->alloc
);
698 build_nir_itoi_compute_shader(struct radv_device
*dev
, bool is_3d
)
701 enum glsl_sampler_dim dim
= is_3d
? GLSL_SAMPLER_DIM_3D
: GLSL_SAMPLER_DIM_2D
;
702 const struct glsl_type
*buf_type
= glsl_sampler_type(dim
,
706 const struct glsl_type
*img_type
= glsl_sampler_type(dim
,
710 nir_builder_init_simple_shader(&b
, NULL
, MESA_SHADER_COMPUTE
, NULL
);
711 b
.shader
->info
.name
= ralloc_strdup(b
.shader
, is_3d
? "meta_itoi_cs_3d" : "meta_itoi_cs");
712 b
.shader
->info
.cs
.local_size
[0] = 16;
713 b
.shader
->info
.cs
.local_size
[1] = 16;
714 b
.shader
->info
.cs
.local_size
[2] = 1;
715 nir_variable
*input_img
= nir_variable_create(b
.shader
, nir_var_uniform
,
717 input_img
->data
.descriptor_set
= 0;
718 input_img
->data
.binding
= 0;
720 nir_variable
*output_img
= nir_variable_create(b
.shader
, nir_var_uniform
,
721 img_type
, "out_img");
722 output_img
->data
.descriptor_set
= 0;
723 output_img
->data
.binding
= 1;
725 nir_ssa_def
*invoc_id
= nir_load_local_invocation_id(&b
);
726 nir_ssa_def
*wg_id
= nir_load_work_group_id(&b
);
727 nir_ssa_def
*block_size
= nir_imm_ivec4(&b
,
728 b
.shader
->info
.cs
.local_size
[0],
729 b
.shader
->info
.cs
.local_size
[1],
730 b
.shader
->info
.cs
.local_size
[2], 0);
732 nir_ssa_def
*global_id
= nir_iadd(&b
, nir_imul(&b
, wg_id
, block_size
), invoc_id
);
734 nir_intrinsic_instr
*src_offset
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
735 nir_intrinsic_set_base(src_offset
, 0);
736 nir_intrinsic_set_range(src_offset
, 24);
737 src_offset
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 0));
738 src_offset
->num_components
= is_3d
? 3 : 2;
739 nir_ssa_dest_init(&src_offset
->instr
, &src_offset
->dest
, is_3d
? 3 : 2, 32, "src_offset");
740 nir_builder_instr_insert(&b
, &src_offset
->instr
);
742 nir_intrinsic_instr
*dst_offset
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
743 nir_intrinsic_set_base(dst_offset
, 0);
744 nir_intrinsic_set_range(dst_offset
, 24);
745 dst_offset
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 12));
746 dst_offset
->num_components
= is_3d
? 3 : 2;
747 nir_ssa_dest_init(&dst_offset
->instr
, &dst_offset
->dest
, is_3d
? 3 : 2, 32, "dst_offset");
748 nir_builder_instr_insert(&b
, &dst_offset
->instr
);
750 nir_ssa_def
*src_coord
= nir_iadd(&b
, global_id
, &src_offset
->dest
.ssa
);
751 nir_ssa_def
*input_img_deref
= &nir_build_deref_var(&b
, input_img
)->dest
.ssa
;
753 nir_ssa_def
*dst_coord
= nir_iadd(&b
, global_id
, &dst_offset
->dest
.ssa
);
755 nir_tex_instr
*tex
= nir_tex_instr_create(b
.shader
, 3);
756 tex
->sampler_dim
= dim
;
757 tex
->op
= nir_texop_txf
;
758 tex
->src
[0].src_type
= nir_tex_src_coord
;
759 tex
->src
[0].src
= nir_src_for_ssa(nir_channels(&b
, src_coord
, is_3d
? 0x7 : 0x3));
760 tex
->src
[1].src_type
= nir_tex_src_lod
;
761 tex
->src
[1].src
= nir_src_for_ssa(nir_imm_int(&b
, 0));
762 tex
->src
[2].src_type
= nir_tex_src_texture_deref
;
763 tex
->src
[2].src
= nir_src_for_ssa(input_img_deref
);
764 tex
->dest_type
= nir_type_float
;
765 tex
->is_array
= false;
766 tex
->coord_components
= is_3d
? 3 : 2;
768 nir_ssa_dest_init(&tex
->instr
, &tex
->dest
, 4, 32, "tex");
769 nir_builder_instr_insert(&b
, &tex
->instr
);
771 nir_ssa_def
*outval
= &tex
->dest
.ssa
;
772 nir_intrinsic_instr
*store
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_image_deref_store
);
773 store
->num_components
= 4;
774 store
->src
[0] = nir_src_for_ssa(&nir_build_deref_var(&b
, output_img
)->dest
.ssa
);
775 store
->src
[1] = nir_src_for_ssa(dst_coord
);
776 store
->src
[2] = nir_src_for_ssa(nir_ssa_undef(&b
, 1, 32));
777 store
->src
[3] = nir_src_for_ssa(outval
);
778 store
->src
[4] = nir_src_for_ssa(nir_imm_int(&b
, 0));
780 nir_builder_instr_insert(&b
, &store
->instr
);
784 /* image to image - don't write use image accessors */
786 radv_device_init_meta_itoi_state(struct radv_device
*device
)
789 struct radv_shader_module cs
= { .nir
= NULL
};
790 struct radv_shader_module cs_3d
= { .nir
= NULL
};
791 cs
.nir
= build_nir_itoi_compute_shader(device
, false);
792 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
)
793 cs_3d
.nir
= build_nir_itoi_compute_shader(device
, true);
795 * two descriptors one for the image being sampled
796 * one for the buffer being written.
798 VkDescriptorSetLayoutCreateInfo ds_create_info
= {
799 .sType
= VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
,
800 .flags
= VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
,
802 .pBindings
= (VkDescriptorSetLayoutBinding
[]) {
805 .descriptorType
= VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,
806 .descriptorCount
= 1,
807 .stageFlags
= VK_SHADER_STAGE_COMPUTE_BIT
,
808 .pImmutableSamplers
= NULL
812 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
,
813 .descriptorCount
= 1,
814 .stageFlags
= VK_SHADER_STAGE_COMPUTE_BIT
,
815 .pImmutableSamplers
= NULL
820 result
= radv_CreateDescriptorSetLayout(radv_device_to_handle(device
),
822 &device
->meta_state
.alloc
,
823 &device
->meta_state
.itoi
.img_ds_layout
);
824 if (result
!= VK_SUCCESS
)
828 VkPipelineLayoutCreateInfo pl_create_info
= {
829 .sType
= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
,
831 .pSetLayouts
= &device
->meta_state
.itoi
.img_ds_layout
,
832 .pushConstantRangeCount
= 1,
833 .pPushConstantRanges
= &(VkPushConstantRange
){VK_SHADER_STAGE_COMPUTE_BIT
, 0, 24},
836 result
= radv_CreatePipelineLayout(radv_device_to_handle(device
),
838 &device
->meta_state
.alloc
,
839 &device
->meta_state
.itoi
.img_p_layout
);
840 if (result
!= VK_SUCCESS
)
845 VkPipelineShaderStageCreateInfo pipeline_shader_stage
= {
846 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
847 .stage
= VK_SHADER_STAGE_COMPUTE_BIT
,
848 .module
= radv_shader_module_to_handle(&cs
),
850 .pSpecializationInfo
= NULL
,
853 VkComputePipelineCreateInfo vk_pipeline_info
= {
854 .sType
= VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
,
855 .stage
= pipeline_shader_stage
,
857 .layout
= device
->meta_state
.itoi
.img_p_layout
,
860 result
= radv_CreateComputePipelines(radv_device_to_handle(device
),
861 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
862 1, &vk_pipeline_info
, NULL
,
863 &device
->meta_state
.itoi
.pipeline
);
864 if (result
!= VK_SUCCESS
)
867 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
) {
868 VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d
= {
869 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
870 .stage
= VK_SHADER_STAGE_COMPUTE_BIT
,
871 .module
= radv_shader_module_to_handle(&cs_3d
),
873 .pSpecializationInfo
= NULL
,
876 VkComputePipelineCreateInfo vk_pipeline_info_3d
= {
877 .sType
= VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
,
878 .stage
= pipeline_shader_stage_3d
,
880 .layout
= device
->meta_state
.itoi
.img_p_layout
,
883 result
= radv_CreateComputePipelines(radv_device_to_handle(device
),
884 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
885 1, &vk_pipeline_info_3d
, NULL
,
886 &device
->meta_state
.itoi
.pipeline_3d
);
888 ralloc_free(cs_3d
.nir
);
895 ralloc_free(cs_3d
.nir
);
900 radv_device_finish_meta_itoi_state(struct radv_device
*device
)
902 struct radv_meta_state
*state
= &device
->meta_state
;
904 radv_DestroyPipelineLayout(radv_device_to_handle(device
),
905 state
->itoi
.img_p_layout
, &state
->alloc
);
906 radv_DestroyDescriptorSetLayout(radv_device_to_handle(device
),
907 state
->itoi
.img_ds_layout
,
909 radv_DestroyPipeline(radv_device_to_handle(device
),
910 state
->itoi
.pipeline
, &state
->alloc
);
911 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
)
912 radv_DestroyPipeline(radv_device_to_handle(device
),
913 state
->itoi
.pipeline_3d
, &state
->alloc
);
917 build_nir_itoi_r32g32b32_compute_shader(struct radv_device
*dev
)
920 const struct glsl_type
*type
= glsl_sampler_type(GLSL_SAMPLER_DIM_BUF
,
924 nir_builder_init_simple_shader(&b
, NULL
, MESA_SHADER_COMPUTE
, NULL
);
925 b
.shader
->info
.name
= ralloc_strdup(b
.shader
, "meta_itoi_r32g32b32_cs");
926 b
.shader
->info
.cs
.local_size
[0] = 16;
927 b
.shader
->info
.cs
.local_size
[1] = 16;
928 b
.shader
->info
.cs
.local_size
[2] = 1;
929 nir_variable
*input_img
= nir_variable_create(b
.shader
, nir_var_uniform
,
931 input_img
->data
.descriptor_set
= 0;
932 input_img
->data
.binding
= 0;
934 nir_variable
*output_img
= nir_variable_create(b
.shader
, nir_var_uniform
,
936 output_img
->data
.descriptor_set
= 0;
937 output_img
->data
.binding
= 1;
939 nir_ssa_def
*invoc_id
= nir_load_local_invocation_id(&b
);
940 nir_ssa_def
*wg_id
= nir_load_work_group_id(&b
);
941 nir_ssa_def
*block_size
= nir_imm_ivec4(&b
,
942 b
.shader
->info
.cs
.local_size
[0],
943 b
.shader
->info
.cs
.local_size
[1],
944 b
.shader
->info
.cs
.local_size
[2], 0);
946 nir_ssa_def
*global_id
= nir_iadd(&b
, nir_imul(&b
, wg_id
, block_size
), invoc_id
);
948 nir_intrinsic_instr
*src_offset
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
949 nir_intrinsic_set_base(src_offset
, 0);
950 nir_intrinsic_set_range(src_offset
, 24);
951 src_offset
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 0));
952 src_offset
->num_components
= 3;
953 nir_ssa_dest_init(&src_offset
->instr
, &src_offset
->dest
, 3, 32, "src_offset");
954 nir_builder_instr_insert(&b
, &src_offset
->instr
);
956 nir_ssa_def
*src_stride
= nir_channel(&b
, &src_offset
->dest
.ssa
, 2);
958 nir_intrinsic_instr
*dst_offset
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
959 nir_intrinsic_set_base(dst_offset
, 0);
960 nir_intrinsic_set_range(dst_offset
, 24);
961 dst_offset
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 12));
962 dst_offset
->num_components
= 3;
963 nir_ssa_dest_init(&dst_offset
->instr
, &dst_offset
->dest
, 3, 32, "dst_offset");
964 nir_builder_instr_insert(&b
, &dst_offset
->instr
);
966 nir_ssa_def
*dst_stride
= nir_channel(&b
, &dst_offset
->dest
.ssa
, 2);
968 nir_ssa_def
*src_img_coord
= nir_iadd(&b
, global_id
, &src_offset
->dest
.ssa
);
969 nir_ssa_def
*dst_img_coord
= nir_iadd(&b
, global_id
, &dst_offset
->dest
.ssa
);
971 nir_ssa_def
*src_global_pos
=
973 nir_imul(&b
, nir_channel(&b
, src_img_coord
, 1), src_stride
),
974 nir_imul(&b
, nir_channel(&b
, src_img_coord
, 0), nir_imm_int(&b
, 3)));
976 nir_ssa_def
*dst_global_pos
=
978 nir_imul(&b
, nir_channel(&b
, dst_img_coord
, 1), dst_stride
),
979 nir_imul(&b
, nir_channel(&b
, dst_img_coord
, 0), nir_imm_int(&b
, 3)));
981 for (int chan
= 0; chan
< 3; chan
++) {
983 nir_ssa_def
*src_local_pos
=
984 nir_iadd(&b
, src_global_pos
, nir_imm_int(&b
, chan
));
986 nir_ssa_def
*src_coord
=
987 nir_vec4(&b
, src_local_pos
, src_local_pos
,
988 src_local_pos
, src_local_pos
);
990 nir_ssa_def
*input_img_deref
= &nir_build_deref_var(&b
, input_img
)->dest
.ssa
;
992 nir_tex_instr
*tex
= nir_tex_instr_create(b
.shader
, 3);
993 tex
->sampler_dim
= GLSL_SAMPLER_DIM_BUF
;
994 tex
->op
= nir_texop_txf
;
995 tex
->src
[0].src_type
= nir_tex_src_coord
;
996 tex
->src
[0].src
= nir_src_for_ssa(nir_channels(&b
, src_coord
, 1));
997 tex
->src
[1].src_type
= nir_tex_src_lod
;
998 tex
->src
[1].src
= nir_src_for_ssa(nir_imm_int(&b
, 0));
999 tex
->src
[2].src_type
= nir_tex_src_texture_deref
;
1000 tex
->src
[2].src
= nir_src_for_ssa(input_img_deref
);
1001 tex
->dest_type
= nir_type_float
;
1002 tex
->is_array
= false;
1003 tex
->coord_components
= 1;
1004 nir_ssa_dest_init(&tex
->instr
, &tex
->dest
, 4, 32, "tex");
1005 nir_builder_instr_insert(&b
, &tex
->instr
);
1007 nir_ssa_def
*outval
= &tex
->dest
.ssa
;
1010 nir_ssa_def
*dst_local_pos
=
1011 nir_iadd(&b
, dst_global_pos
, nir_imm_int(&b
, chan
));
1013 nir_ssa_def
*dst_coord
=
1014 nir_vec4(&b
, dst_local_pos
, dst_local_pos
,
1015 dst_local_pos
, dst_local_pos
);
1017 nir_intrinsic_instr
*store
=
1018 nir_intrinsic_instr_create(b
.shader
,
1019 nir_intrinsic_image_deref_store
);
1020 store
->num_components
= 1;
1021 store
->src
[0] = nir_src_for_ssa(&nir_build_deref_var(&b
, output_img
)->dest
.ssa
);
1022 store
->src
[1] = nir_src_for_ssa(dst_coord
);
1023 store
->src
[2] = nir_src_for_ssa(nir_ssa_undef(&b
, 1, 32));
1024 store
->src
[3] = nir_src_for_ssa(nir_channel(&b
, outval
, 0));
1025 store
->src
[4] = nir_src_for_ssa(nir_imm_int(&b
, 0));
1026 nir_builder_instr_insert(&b
, &store
->instr
);
1032 /* Image to image - special path for R32G32B32 */
1034 radv_device_init_meta_itoi_r32g32b32_state(struct radv_device
*device
)
1037 struct radv_shader_module cs
= { .nir
= NULL
};
1039 cs
.nir
= build_nir_itoi_r32g32b32_compute_shader(device
);
1041 VkDescriptorSetLayoutCreateInfo ds_create_info
= {
1042 .sType
= VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
,
1043 .flags
= VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
,
1045 .pBindings
= (VkDescriptorSetLayoutBinding
[]) {
1048 .descriptorType
= VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
,
1049 .descriptorCount
= 1,
1050 .stageFlags
= VK_SHADER_STAGE_COMPUTE_BIT
,
1051 .pImmutableSamplers
= NULL
1055 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
,
1056 .descriptorCount
= 1,
1057 .stageFlags
= VK_SHADER_STAGE_COMPUTE_BIT
,
1058 .pImmutableSamplers
= NULL
1063 result
= radv_CreateDescriptorSetLayout(radv_device_to_handle(device
),
1065 &device
->meta_state
.alloc
,
1066 &device
->meta_state
.itoi_r32g32b32
.img_ds_layout
);
1067 if (result
!= VK_SUCCESS
)
1071 VkPipelineLayoutCreateInfo pl_create_info
= {
1072 .sType
= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
,
1073 .setLayoutCount
= 1,
1074 .pSetLayouts
= &device
->meta_state
.itoi_r32g32b32
.img_ds_layout
,
1075 .pushConstantRangeCount
= 1,
1076 .pPushConstantRanges
= &(VkPushConstantRange
){VK_SHADER_STAGE_COMPUTE_BIT
, 0, 24},
1079 result
= radv_CreatePipelineLayout(radv_device_to_handle(device
),
1081 &device
->meta_state
.alloc
,
1082 &device
->meta_state
.itoi_r32g32b32
.img_p_layout
);
1083 if (result
!= VK_SUCCESS
)
1086 /* compute shader */
1088 VkPipelineShaderStageCreateInfo pipeline_shader_stage
= {
1089 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
1090 .stage
= VK_SHADER_STAGE_COMPUTE_BIT
,
1091 .module
= radv_shader_module_to_handle(&cs
),
1093 .pSpecializationInfo
= NULL
,
1096 VkComputePipelineCreateInfo vk_pipeline_info
= {
1097 .sType
= VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
,
1098 .stage
= pipeline_shader_stage
,
1100 .layout
= device
->meta_state
.itoi_r32g32b32
.img_p_layout
,
1103 result
= radv_CreateComputePipelines(radv_device_to_handle(device
),
1104 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
1105 1, &vk_pipeline_info
, NULL
,
1106 &device
->meta_state
.itoi_r32g32b32
.pipeline
);
1109 ralloc_free(cs
.nir
);
1114 radv_device_finish_meta_itoi_r32g32b32_state(struct radv_device
*device
)
1116 struct radv_meta_state
*state
= &device
->meta_state
;
1118 radv_DestroyPipelineLayout(radv_device_to_handle(device
),
1119 state
->itoi_r32g32b32
.img_p_layout
, &state
->alloc
);
1120 radv_DestroyDescriptorSetLayout(radv_device_to_handle(device
),
1121 state
->itoi_r32g32b32
.img_ds_layout
,
1123 radv_DestroyPipeline(radv_device_to_handle(device
),
1124 state
->itoi_r32g32b32
.pipeline
, &state
->alloc
);
1128 build_nir_cleari_compute_shader(struct radv_device
*dev
, bool is_3d
)
1131 enum glsl_sampler_dim dim
= is_3d
? GLSL_SAMPLER_DIM_3D
: GLSL_SAMPLER_DIM_2D
;
1132 const struct glsl_type
*img_type
= glsl_sampler_type(dim
,
1136 nir_builder_init_simple_shader(&b
, NULL
, MESA_SHADER_COMPUTE
, NULL
);
1137 b
.shader
->info
.name
= ralloc_strdup(b
.shader
, is_3d
? "meta_cleari_cs_3d" : "meta_cleari_cs");
1138 b
.shader
->info
.cs
.local_size
[0] = 16;
1139 b
.shader
->info
.cs
.local_size
[1] = 16;
1140 b
.shader
->info
.cs
.local_size
[2] = 1;
1142 nir_variable
*output_img
= nir_variable_create(b
.shader
, nir_var_uniform
,
1143 img_type
, "out_img");
1144 output_img
->data
.descriptor_set
= 0;
1145 output_img
->data
.binding
= 0;
1147 nir_ssa_def
*invoc_id
= nir_load_local_invocation_id(&b
);
1148 nir_ssa_def
*wg_id
= nir_load_work_group_id(&b
);
1149 nir_ssa_def
*block_size
= nir_imm_ivec4(&b
,
1150 b
.shader
->info
.cs
.local_size
[0],
1151 b
.shader
->info
.cs
.local_size
[1],
1152 b
.shader
->info
.cs
.local_size
[2], 0);
1154 nir_ssa_def
*global_id
= nir_iadd(&b
, nir_imul(&b
, wg_id
, block_size
), invoc_id
);
1156 nir_intrinsic_instr
*clear_val
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
1157 nir_intrinsic_set_base(clear_val
, 0);
1158 nir_intrinsic_set_range(clear_val
, 20);
1159 clear_val
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 0));
1160 clear_val
->num_components
= 4;
1161 nir_ssa_dest_init(&clear_val
->instr
, &clear_val
->dest
, 4, 32, "clear_value");
1162 nir_builder_instr_insert(&b
, &clear_val
->instr
);
1164 nir_intrinsic_instr
*layer
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
1165 nir_intrinsic_set_base(layer
, 0);
1166 nir_intrinsic_set_range(layer
, 20);
1167 layer
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 16));
1168 layer
->num_components
= 1;
1169 nir_ssa_dest_init(&layer
->instr
, &layer
->dest
, 1, 32, "layer");
1170 nir_builder_instr_insert(&b
, &layer
->instr
);
1172 nir_ssa_def
*global_z
= nir_iadd(&b
, nir_channel(&b
, global_id
, 2), &layer
->dest
.ssa
);
1174 nir_ssa_def
*comps
[4];
1175 comps
[0] = nir_channel(&b
, global_id
, 0);
1176 comps
[1] = nir_channel(&b
, global_id
, 1);
1177 comps
[2] = global_z
;
1178 comps
[3] = nir_imm_int(&b
, 0);
1179 global_id
= nir_vec(&b
, comps
, 4);
1181 nir_intrinsic_instr
*store
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_image_deref_store
);
1182 store
->num_components
= 4;
1183 store
->src
[0] = nir_src_for_ssa(&nir_build_deref_var(&b
, output_img
)->dest
.ssa
);
1184 store
->src
[1] = nir_src_for_ssa(global_id
);
1185 store
->src
[2] = nir_src_for_ssa(nir_ssa_undef(&b
, 1, 32));
1186 store
->src
[3] = nir_src_for_ssa(&clear_val
->dest
.ssa
);
1187 store
->src
[4] = nir_src_for_ssa(nir_imm_int(&b
, 0));
1189 nir_builder_instr_insert(&b
, &store
->instr
);
1194 radv_device_init_meta_cleari_state(struct radv_device
*device
)
1197 struct radv_shader_module cs
= { .nir
= NULL
};
1198 struct radv_shader_module cs_3d
= { .nir
= NULL
};
1199 cs
.nir
= build_nir_cleari_compute_shader(device
, false);
1200 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
)
1201 cs_3d
.nir
= build_nir_cleari_compute_shader(device
, true);
1204 * two descriptors one for the image being sampled
1205 * one for the buffer being written.
1207 VkDescriptorSetLayoutCreateInfo ds_create_info
= {
1208 .sType
= VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
,
1209 .flags
= VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
,
1211 .pBindings
= (VkDescriptorSetLayoutBinding
[]) {
1214 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
,
1215 .descriptorCount
= 1,
1216 .stageFlags
= VK_SHADER_STAGE_COMPUTE_BIT
,
1217 .pImmutableSamplers
= NULL
1222 result
= radv_CreateDescriptorSetLayout(radv_device_to_handle(device
),
1224 &device
->meta_state
.alloc
,
1225 &device
->meta_state
.cleari
.img_ds_layout
);
1226 if (result
!= VK_SUCCESS
)
1230 VkPipelineLayoutCreateInfo pl_create_info
= {
1231 .sType
= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
,
1232 .setLayoutCount
= 1,
1233 .pSetLayouts
= &device
->meta_state
.cleari
.img_ds_layout
,
1234 .pushConstantRangeCount
= 1,
1235 .pPushConstantRanges
= &(VkPushConstantRange
){VK_SHADER_STAGE_COMPUTE_BIT
, 0, 20},
1238 result
= radv_CreatePipelineLayout(radv_device_to_handle(device
),
1240 &device
->meta_state
.alloc
,
1241 &device
->meta_state
.cleari
.img_p_layout
);
1242 if (result
!= VK_SUCCESS
)
1245 /* compute shader */
1247 VkPipelineShaderStageCreateInfo pipeline_shader_stage
= {
1248 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
1249 .stage
= VK_SHADER_STAGE_COMPUTE_BIT
,
1250 .module
= radv_shader_module_to_handle(&cs
),
1252 .pSpecializationInfo
= NULL
,
1255 VkComputePipelineCreateInfo vk_pipeline_info
= {
1256 .sType
= VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
,
1257 .stage
= pipeline_shader_stage
,
1259 .layout
= device
->meta_state
.cleari
.img_p_layout
,
1262 result
= radv_CreateComputePipelines(radv_device_to_handle(device
),
1263 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
1264 1, &vk_pipeline_info
, NULL
,
1265 &device
->meta_state
.cleari
.pipeline
);
1266 if (result
!= VK_SUCCESS
)
1270 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
) {
1271 /* compute shader */
1272 VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d
= {
1273 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
1274 .stage
= VK_SHADER_STAGE_COMPUTE_BIT
,
1275 .module
= radv_shader_module_to_handle(&cs_3d
),
1277 .pSpecializationInfo
= NULL
,
1280 VkComputePipelineCreateInfo vk_pipeline_info_3d
= {
1281 .sType
= VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
,
1282 .stage
= pipeline_shader_stage_3d
,
1284 .layout
= device
->meta_state
.cleari
.img_p_layout
,
1287 result
= radv_CreateComputePipelines(radv_device_to_handle(device
),
1288 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
1289 1, &vk_pipeline_info_3d
, NULL
,
1290 &device
->meta_state
.cleari
.pipeline_3d
);
1291 if (result
!= VK_SUCCESS
)
1294 ralloc_free(cs_3d
.nir
);
1296 ralloc_free(cs
.nir
);
1299 ralloc_free(cs
.nir
);
1300 ralloc_free(cs_3d
.nir
);
1305 radv_device_finish_meta_cleari_state(struct radv_device
*device
)
1307 struct radv_meta_state
*state
= &device
->meta_state
;
1309 radv_DestroyPipelineLayout(radv_device_to_handle(device
),
1310 state
->cleari
.img_p_layout
, &state
->alloc
);
1311 radv_DestroyDescriptorSetLayout(radv_device_to_handle(device
),
1312 state
->cleari
.img_ds_layout
,
1314 radv_DestroyPipeline(radv_device_to_handle(device
),
1315 state
->cleari
.pipeline
, &state
->alloc
);
1316 radv_DestroyPipeline(radv_device_to_handle(device
),
1317 state
->cleari
.pipeline_3d
, &state
->alloc
);
1320 /* Special path for clearing R32G32B32 images using a compute shader. */
1322 build_nir_cleari_r32g32b32_compute_shader(struct radv_device
*dev
)
1325 const struct glsl_type
*img_type
= glsl_sampler_type(GLSL_SAMPLER_DIM_BUF
,
1329 nir_builder_init_simple_shader(&b
, NULL
, MESA_SHADER_COMPUTE
, NULL
);
1330 b
.shader
->info
.name
= ralloc_strdup(b
.shader
, "meta_cleari_r32g32b32_cs");
1331 b
.shader
->info
.cs
.local_size
[0] = 16;
1332 b
.shader
->info
.cs
.local_size
[1] = 16;
1333 b
.shader
->info
.cs
.local_size
[2] = 1;
1335 nir_variable
*output_img
= nir_variable_create(b
.shader
, nir_var_uniform
,
1336 img_type
, "out_img");
1337 output_img
->data
.descriptor_set
= 0;
1338 output_img
->data
.binding
= 0;
1340 nir_ssa_def
*invoc_id
= nir_load_local_invocation_id(&b
);
1341 nir_ssa_def
*wg_id
= nir_load_work_group_id(&b
);
1342 nir_ssa_def
*block_size
= nir_imm_ivec4(&b
,
1343 b
.shader
->info
.cs
.local_size
[0],
1344 b
.shader
->info
.cs
.local_size
[1],
1345 b
.shader
->info
.cs
.local_size
[2], 0);
1347 nir_ssa_def
*global_id
= nir_iadd(&b
, nir_imul(&b
, wg_id
, block_size
), invoc_id
);
1349 nir_intrinsic_instr
*clear_val
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
1350 nir_intrinsic_set_base(clear_val
, 0);
1351 nir_intrinsic_set_range(clear_val
, 16);
1352 clear_val
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 0));
1353 clear_val
->num_components
= 3;
1354 nir_ssa_dest_init(&clear_val
->instr
, &clear_val
->dest
, 3, 32, "clear_value");
1355 nir_builder_instr_insert(&b
, &clear_val
->instr
);
1357 nir_intrinsic_instr
*stride
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
1358 nir_intrinsic_set_base(stride
, 0);
1359 nir_intrinsic_set_range(stride
, 16);
1360 stride
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 12));
1361 stride
->num_components
= 1;
1362 nir_ssa_dest_init(&stride
->instr
, &stride
->dest
, 1, 32, "stride");
1363 nir_builder_instr_insert(&b
, &stride
->instr
);
1365 nir_ssa_def
*global_x
= nir_channel(&b
, global_id
, 0);
1366 nir_ssa_def
*global_y
= nir_channel(&b
, global_id
, 1);
1368 nir_ssa_def
*global_pos
=
1370 nir_imul(&b
, global_y
, &stride
->dest
.ssa
),
1371 nir_imul(&b
, global_x
, nir_imm_int(&b
, 3)));
1373 for (unsigned chan
= 0; chan
< 3; chan
++) {
1374 nir_ssa_def
*local_pos
=
1375 nir_iadd(&b
, global_pos
, nir_imm_int(&b
, chan
));
1377 nir_ssa_def
*coord
=
1378 nir_vec4(&b
, local_pos
, local_pos
, local_pos
, local_pos
);
1380 nir_intrinsic_instr
*store
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_image_deref_store
);
1381 store
->num_components
= 1;
1382 store
->src
[0] = nir_src_for_ssa(&nir_build_deref_var(&b
, output_img
)->dest
.ssa
);
1383 store
->src
[1] = nir_src_for_ssa(coord
);
1384 store
->src
[2] = nir_src_for_ssa(nir_ssa_undef(&b
, 1, 32));
1385 store
->src
[3] = nir_src_for_ssa(nir_channel(&b
, &clear_val
->dest
.ssa
, chan
));
1386 store
->src
[4] = nir_src_for_ssa(nir_imm_int(&b
, 0));
1387 nir_builder_instr_insert(&b
, &store
->instr
);
1394 radv_device_init_meta_cleari_r32g32b32_state(struct radv_device
*device
)
1397 struct radv_shader_module cs
= { .nir
= NULL
};
1399 cs
.nir
= build_nir_cleari_r32g32b32_compute_shader(device
);
1401 VkDescriptorSetLayoutCreateInfo ds_create_info
= {
1402 .sType
= VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
,
1403 .flags
= VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
,
1405 .pBindings
= (VkDescriptorSetLayoutBinding
[]) {
1408 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
,
1409 .descriptorCount
= 1,
1410 .stageFlags
= VK_SHADER_STAGE_COMPUTE_BIT
,
1411 .pImmutableSamplers
= NULL
1416 result
= radv_CreateDescriptorSetLayout(radv_device_to_handle(device
),
1418 &device
->meta_state
.alloc
,
1419 &device
->meta_state
.cleari_r32g32b32
.img_ds_layout
);
1420 if (result
!= VK_SUCCESS
)
1423 VkPipelineLayoutCreateInfo pl_create_info
= {
1424 .sType
= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
,
1425 .setLayoutCount
= 1,
1426 .pSetLayouts
= &device
->meta_state
.cleari_r32g32b32
.img_ds_layout
,
1427 .pushConstantRangeCount
= 1,
1428 .pPushConstantRanges
= &(VkPushConstantRange
){VK_SHADER_STAGE_COMPUTE_BIT
, 0, 16},
1431 result
= radv_CreatePipelineLayout(radv_device_to_handle(device
),
1433 &device
->meta_state
.alloc
,
1434 &device
->meta_state
.cleari_r32g32b32
.img_p_layout
);
1435 if (result
!= VK_SUCCESS
)
1438 /* compute shader */
1439 VkPipelineShaderStageCreateInfo pipeline_shader_stage
= {
1440 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
1441 .stage
= VK_SHADER_STAGE_COMPUTE_BIT
,
1442 .module
= radv_shader_module_to_handle(&cs
),
1444 .pSpecializationInfo
= NULL
,
1447 VkComputePipelineCreateInfo vk_pipeline_info
= {
1448 .sType
= VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
,
1449 .stage
= pipeline_shader_stage
,
1451 .layout
= device
->meta_state
.cleari_r32g32b32
.img_p_layout
,
1454 result
= radv_CreateComputePipelines(radv_device_to_handle(device
),
1455 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
1456 1, &vk_pipeline_info
, NULL
,
1457 &device
->meta_state
.cleari_r32g32b32
.pipeline
);
1460 ralloc_free(cs
.nir
);
1465 radv_device_finish_meta_cleari_r32g32b32_state(struct radv_device
*device
)
1467 struct radv_meta_state
*state
= &device
->meta_state
;
1469 radv_DestroyPipelineLayout(radv_device_to_handle(device
),
1470 state
->cleari_r32g32b32
.img_p_layout
,
1472 radv_DestroyDescriptorSetLayout(radv_device_to_handle(device
),
1473 state
->cleari_r32g32b32
.img_ds_layout
,
1475 radv_DestroyPipeline(radv_device_to_handle(device
),
1476 state
->cleari_r32g32b32
.pipeline
, &state
->alloc
);
1480 radv_device_finish_meta_bufimage_state(struct radv_device
*device
)
1482 radv_device_finish_meta_itob_state(device
);
1483 radv_device_finish_meta_btoi_state(device
);
1484 radv_device_finish_meta_btoi_r32g32b32_state(device
);
1485 radv_device_finish_meta_itoi_state(device
);
1486 radv_device_finish_meta_itoi_r32g32b32_state(device
);
1487 radv_device_finish_meta_cleari_state(device
);
1488 radv_device_finish_meta_cleari_r32g32b32_state(device
);
1492 radv_device_init_meta_bufimage_state(struct radv_device
*device
)
1496 result
= radv_device_init_meta_itob_state(device
);
1497 if (result
!= VK_SUCCESS
)
1500 result
= radv_device_init_meta_btoi_state(device
);
1501 if (result
!= VK_SUCCESS
)
1504 result
= radv_device_init_meta_btoi_r32g32b32_state(device
);
1505 if (result
!= VK_SUCCESS
)
1506 goto fail_btoi_r32g32b32
;
1508 result
= radv_device_init_meta_itoi_state(device
);
1509 if (result
!= VK_SUCCESS
)
1512 result
= radv_device_init_meta_itoi_r32g32b32_state(device
);
1513 if (result
!= VK_SUCCESS
)
1514 goto fail_itoi_r32g32b32
;
1516 result
= radv_device_init_meta_cleari_state(device
);
1517 if (result
!= VK_SUCCESS
)
1520 result
= radv_device_init_meta_cleari_r32g32b32_state(device
);
1521 if (result
!= VK_SUCCESS
)
1522 goto fail_cleari_r32g32b32
;
1525 fail_cleari_r32g32b32
:
1526 radv_device_finish_meta_cleari_r32g32b32_state(device
);
1528 radv_device_finish_meta_cleari_state(device
);
1529 fail_itoi_r32g32b32
:
1530 radv_device_finish_meta_itoi_r32g32b32_state(device
);
1532 radv_device_finish_meta_itoi_state(device
);
1533 fail_btoi_r32g32b32
:
1534 radv_device_finish_meta_btoi_r32g32b32_state(device
);
1536 radv_device_finish_meta_btoi_state(device
);
1538 radv_device_finish_meta_itob_state(device
);
1543 create_iview(struct radv_cmd_buffer
*cmd_buffer
,
1544 struct radv_meta_blit2d_surf
*surf
,
1545 struct radv_image_view
*iview
)
1547 VkImageViewType view_type
= cmd_buffer
->device
->physical_device
->rad_info
.chip_class
< GFX9
? VK_IMAGE_VIEW_TYPE_2D
:
1548 radv_meta_get_view_type(surf
->image
);
1549 radv_image_view_init(iview
, cmd_buffer
->device
,
1550 &(VkImageViewCreateInfo
) {
1551 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
1552 .image
= radv_image_to_handle(surf
->image
),
1553 .viewType
= view_type
,
1554 .format
= surf
->format
,
1555 .subresourceRange
= {
1556 .aspectMask
= surf
->aspect_mask
,
1557 .baseMipLevel
= surf
->level
,
1559 .baseArrayLayer
= surf
->layer
,
1566 create_bview(struct radv_cmd_buffer
*cmd_buffer
,
1567 struct radv_buffer
*buffer
,
1570 struct radv_buffer_view
*bview
)
1572 radv_buffer_view_init(bview
, cmd_buffer
->device
,
1573 &(VkBufferViewCreateInfo
) {
1574 .sType
= VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO
,
1576 .buffer
= radv_buffer_to_handle(buffer
),
1579 .range
= VK_WHOLE_SIZE
,
1585 create_buffer_from_image(struct radv_cmd_buffer
*cmd_buffer
,
1586 struct radv_meta_blit2d_surf
*surf
,
1587 VkBufferUsageFlagBits usage
,
1590 struct radv_device
*device
= cmd_buffer
->device
;
1591 struct radv_device_memory mem
= { .bo
= surf
->image
->bo
};
1593 radv_CreateBuffer(radv_device_to_handle(device
),
1594 &(VkBufferCreateInfo
) {
1595 .sType
= VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO
,
1597 .size
= surf
->image
->size
,
1599 .sharingMode
= VK_SHARING_MODE_EXCLUSIVE
,
1602 radv_BindBufferMemory2(radv_device_to_handle(device
), 1,
1603 (VkBindBufferMemoryInfo
[]) {
1605 .sType
= VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO
,
1607 .memory
= radv_device_memory_to_handle(&mem
),
1608 .memoryOffset
= surf
->image
->offset
,
1614 create_bview_for_r32g32b32(struct radv_cmd_buffer
*cmd_buffer
,
1615 struct radv_buffer
*buffer
,
1617 VkFormat src_format
,
1618 struct radv_buffer_view
*bview
)
1622 switch (src_format
) {
1623 case VK_FORMAT_R32G32B32_UINT
:
1624 format
= VK_FORMAT_R32_UINT
;
1626 case VK_FORMAT_R32G32B32_SINT
:
1627 format
= VK_FORMAT_R32_SINT
;
1629 case VK_FORMAT_R32G32B32_SFLOAT
:
1630 format
= VK_FORMAT_R32_SFLOAT
;
1633 unreachable("invalid R32G32B32 format");
1636 radv_buffer_view_init(bview
, cmd_buffer
->device
,
1637 &(VkBufferViewCreateInfo
) {
1638 .sType
= VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO
,
1640 .buffer
= radv_buffer_to_handle(buffer
),
1643 .range
= VK_WHOLE_SIZE
,
1648 get_image_stride_for_r32g32b32(struct radv_cmd_buffer
*cmd_buffer
,
1649 struct radv_meta_blit2d_surf
*surf
)
1653 if (cmd_buffer
->device
->physical_device
->rad_info
.chip_class
>= GFX9
) {
1654 stride
= surf
->image
->planes
[0].surface
.u
.gfx9
.surf_pitch
;
1656 stride
= surf
->image
->planes
[0].surface
.u
.legacy
.level
[0].nblk_x
* 3;
1663 itob_bind_descriptors(struct radv_cmd_buffer
*cmd_buffer
,
1664 struct radv_image_view
*src
,
1665 struct radv_buffer_view
*dst
)
1667 struct radv_device
*device
= cmd_buffer
->device
;
1669 radv_meta_push_descriptor_set(cmd_buffer
,
1670 VK_PIPELINE_BIND_POINT_COMPUTE
,
1671 device
->meta_state
.itob
.img_p_layout
,
1673 2, /* descriptorWriteCount */
1674 (VkWriteDescriptorSet
[]) {
1676 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
1678 .dstArrayElement
= 0,
1679 .descriptorCount
= 1,
1680 .descriptorType
= VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,
1681 .pImageInfo
= (VkDescriptorImageInfo
[]) {
1683 .sampler
= VK_NULL_HANDLE
,
1684 .imageView
= radv_image_view_to_handle(src
),
1685 .imageLayout
= VK_IMAGE_LAYOUT_GENERAL
,
1690 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
1692 .dstArrayElement
= 0,
1693 .descriptorCount
= 1,
1694 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
,
1695 .pTexelBufferView
= (VkBufferView
[]) { radv_buffer_view_to_handle(dst
) },
1701 radv_meta_image_to_buffer(struct radv_cmd_buffer
*cmd_buffer
,
1702 struct radv_meta_blit2d_surf
*src
,
1703 struct radv_meta_blit2d_buffer
*dst
,
1705 struct radv_meta_blit2d_rect
*rects
)
1707 VkPipeline pipeline
= cmd_buffer
->device
->meta_state
.itob
.pipeline
;
1708 struct radv_device
*device
= cmd_buffer
->device
;
1709 struct radv_image_view src_view
;
1710 struct radv_buffer_view dst_view
;
1712 create_iview(cmd_buffer
, src
, &src_view
);
1713 create_bview(cmd_buffer
, dst
->buffer
, dst
->offset
, dst
->format
, &dst_view
);
1714 itob_bind_descriptors(cmd_buffer
, &src_view
, &dst_view
);
1716 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
&&
1717 src
->image
->type
== VK_IMAGE_TYPE_3D
)
1718 pipeline
= cmd_buffer
->device
->meta_state
.itob
.pipeline_3d
;
1720 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer
),
1721 VK_PIPELINE_BIND_POINT_COMPUTE
, pipeline
);
1723 for (unsigned r
= 0; r
< num_rects
; ++r
) {
1724 unsigned push_constants
[4] = {
1730 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer
),
1731 device
->meta_state
.itob
.img_p_layout
,
1732 VK_SHADER_STAGE_COMPUTE_BIT
, 0, 16,
1735 radv_unaligned_dispatch(cmd_buffer
, rects
[r
].width
, rects
[r
].height
, 1);
1740 btoi_r32g32b32_bind_descriptors(struct radv_cmd_buffer
*cmd_buffer
,
1741 struct radv_buffer_view
*src
,
1742 struct radv_buffer_view
*dst
)
1744 struct radv_device
*device
= cmd_buffer
->device
;
1746 radv_meta_push_descriptor_set(cmd_buffer
,
1747 VK_PIPELINE_BIND_POINT_COMPUTE
,
1748 device
->meta_state
.btoi_r32g32b32
.img_p_layout
,
1750 2, /* descriptorWriteCount */
1751 (VkWriteDescriptorSet
[]) {
1753 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
1755 .dstArrayElement
= 0,
1756 .descriptorCount
= 1,
1757 .descriptorType
= VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
,
1758 .pTexelBufferView
= (VkBufferView
[]) { radv_buffer_view_to_handle(src
) },
1761 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
1763 .dstArrayElement
= 0,
1764 .descriptorCount
= 1,
1765 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
,
1766 .pTexelBufferView
= (VkBufferView
[]) { radv_buffer_view_to_handle(dst
) },
1772 radv_meta_buffer_to_image_cs_r32g32b32(struct radv_cmd_buffer
*cmd_buffer
,
1773 struct radv_meta_blit2d_buffer
*src
,
1774 struct radv_meta_blit2d_surf
*dst
,
1776 struct radv_meta_blit2d_rect
*rects
)
1778 VkPipeline pipeline
= cmd_buffer
->device
->meta_state
.btoi_r32g32b32
.pipeline
;
1779 struct radv_device
*device
= cmd_buffer
->device
;
1780 struct radv_buffer_view src_view
, dst_view
;
1781 unsigned dst_offset
= 0;
1785 /* This special btoi path for R32G32B32 formats will write the linear
1786 * image as a buffer with the same underlying memory. The compute
1787 * shader will copy all components separately using a R32 format.
1789 create_buffer_from_image(cmd_buffer
, dst
,
1790 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT
,
1793 create_bview(cmd_buffer
, src
->buffer
, src
->offset
,
1794 src
->format
, &src_view
);
1795 create_bview_for_r32g32b32(cmd_buffer
, radv_buffer_from_handle(buffer
),
1796 dst_offset
, dst
->format
, &dst_view
);
1797 btoi_r32g32b32_bind_descriptors(cmd_buffer
, &src_view
, &dst_view
);
1799 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer
),
1800 VK_PIPELINE_BIND_POINT_COMPUTE
, pipeline
);
1802 stride
= get_image_stride_for_r32g32b32(cmd_buffer
, dst
);
1804 for (unsigned r
= 0; r
< num_rects
; ++r
) {
1805 unsigned push_constants
[4] = {
1812 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer
),
1813 device
->meta_state
.btoi_r32g32b32
.img_p_layout
,
1814 VK_SHADER_STAGE_COMPUTE_BIT
, 0, 16,
1817 radv_unaligned_dispatch(cmd_buffer
, rects
[r
].width
, rects
[r
].height
, 1);
1820 radv_DestroyBuffer(radv_device_to_handle(device
), buffer
, NULL
);
1824 btoi_bind_descriptors(struct radv_cmd_buffer
*cmd_buffer
,
1825 struct radv_buffer_view
*src
,
1826 struct radv_image_view
*dst
)
1828 struct radv_device
*device
= cmd_buffer
->device
;
1830 radv_meta_push_descriptor_set(cmd_buffer
,
1831 VK_PIPELINE_BIND_POINT_COMPUTE
,
1832 device
->meta_state
.btoi
.img_p_layout
,
1834 2, /* descriptorWriteCount */
1835 (VkWriteDescriptorSet
[]) {
1837 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
1839 .dstArrayElement
= 0,
1840 .descriptorCount
= 1,
1841 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
,
1842 .pTexelBufferView
= (VkBufferView
[]) { radv_buffer_view_to_handle(src
) },
1845 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
1847 .dstArrayElement
= 0,
1848 .descriptorCount
= 1,
1849 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
,
1850 .pImageInfo
= (VkDescriptorImageInfo
[]) {
1852 .sampler
= VK_NULL_HANDLE
,
1853 .imageView
= radv_image_view_to_handle(dst
),
1854 .imageLayout
= VK_IMAGE_LAYOUT_GENERAL
,
1862 radv_meta_buffer_to_image_cs(struct radv_cmd_buffer
*cmd_buffer
,
1863 struct radv_meta_blit2d_buffer
*src
,
1864 struct radv_meta_blit2d_surf
*dst
,
1866 struct radv_meta_blit2d_rect
*rects
)
1868 VkPipeline pipeline
= cmd_buffer
->device
->meta_state
.btoi
.pipeline
;
1869 struct radv_device
*device
= cmd_buffer
->device
;
1870 struct radv_buffer_view src_view
;
1871 struct radv_image_view dst_view
;
1873 if (dst
->image
->vk_format
== VK_FORMAT_R32G32B32_UINT
||
1874 dst
->image
->vk_format
== VK_FORMAT_R32G32B32_SINT
||
1875 dst
->image
->vk_format
== VK_FORMAT_R32G32B32_SFLOAT
) {
1876 radv_meta_buffer_to_image_cs_r32g32b32(cmd_buffer
, src
, dst
,
1881 create_bview(cmd_buffer
, src
->buffer
, src
->offset
, src
->format
, &src_view
);
1882 create_iview(cmd_buffer
, dst
, &dst_view
);
1883 btoi_bind_descriptors(cmd_buffer
, &src_view
, &dst_view
);
1885 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
&&
1886 dst
->image
->type
== VK_IMAGE_TYPE_3D
)
1887 pipeline
= cmd_buffer
->device
->meta_state
.btoi
.pipeline_3d
;
1888 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer
),
1889 VK_PIPELINE_BIND_POINT_COMPUTE
, pipeline
);
1891 for (unsigned r
= 0; r
< num_rects
; ++r
) {
1892 unsigned push_constants
[4] = {
1898 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer
),
1899 device
->meta_state
.btoi
.img_p_layout
,
1900 VK_SHADER_STAGE_COMPUTE_BIT
, 0, 16,
1903 radv_unaligned_dispatch(cmd_buffer
, rects
[r
].width
, rects
[r
].height
, 1);
1908 itoi_r32g32b32_bind_descriptors(struct radv_cmd_buffer
*cmd_buffer
,
1909 struct radv_buffer_view
*src
,
1910 struct radv_buffer_view
*dst
)
1912 struct radv_device
*device
= cmd_buffer
->device
;
1914 radv_meta_push_descriptor_set(cmd_buffer
,
1915 VK_PIPELINE_BIND_POINT_COMPUTE
,
1916 device
->meta_state
.itoi_r32g32b32
.img_p_layout
,
1918 2, /* descriptorWriteCount */
1919 (VkWriteDescriptorSet
[]) {
1921 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
1923 .dstArrayElement
= 0,
1924 .descriptorCount
= 1,
1925 .descriptorType
= VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
,
1926 .pTexelBufferView
= (VkBufferView
[]) { radv_buffer_view_to_handle(src
) },
1929 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
1931 .dstArrayElement
= 0,
1932 .descriptorCount
= 1,
1933 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
,
1934 .pTexelBufferView
= (VkBufferView
[]) { radv_buffer_view_to_handle(dst
) },
1940 radv_meta_image_to_image_cs_r32g32b32(struct radv_cmd_buffer
*cmd_buffer
,
1941 struct radv_meta_blit2d_surf
*src
,
1942 struct radv_meta_blit2d_surf
*dst
,
1944 struct radv_meta_blit2d_rect
*rects
)
1946 VkPipeline pipeline
= cmd_buffer
->device
->meta_state
.itoi_r32g32b32
.pipeline
;
1947 struct radv_device
*device
= cmd_buffer
->device
;
1948 struct radv_buffer_view src_view
, dst_view
;
1949 unsigned src_offset
= 0, dst_offset
= 0;
1950 unsigned src_stride
, dst_stride
;
1951 VkBuffer src_buffer
, dst_buffer
;
1953 /* 96-bit formats are only compatible to themselves. */
1954 assert(dst
->format
== VK_FORMAT_R32G32B32_UINT
||
1955 dst
->format
== VK_FORMAT_R32G32B32_SINT
||
1956 dst
->format
== VK_FORMAT_R32G32B32_SFLOAT
);
1958 /* This special itoi path for R32G32B32 formats will write the linear
1959 * image as a buffer with the same underlying memory. The compute
1960 * shader will copy all components separately using a R32 format.
1962 create_buffer_from_image(cmd_buffer
, src
,
1963 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT
,
1965 create_buffer_from_image(cmd_buffer
, dst
,
1966 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT
,
1969 create_bview_for_r32g32b32(cmd_buffer
, radv_buffer_from_handle(src_buffer
),
1970 src_offset
, src
->format
, &src_view
);
1971 create_bview_for_r32g32b32(cmd_buffer
, radv_buffer_from_handle(dst_buffer
),
1972 dst_offset
, dst
->format
, &dst_view
);
1973 itoi_r32g32b32_bind_descriptors(cmd_buffer
, &src_view
, &dst_view
);
1975 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer
),
1976 VK_PIPELINE_BIND_POINT_COMPUTE
, pipeline
);
1978 src_stride
= get_image_stride_for_r32g32b32(cmd_buffer
, src
);
1979 dst_stride
= get_image_stride_for_r32g32b32(cmd_buffer
, dst
);
1981 for (unsigned r
= 0; r
< num_rects
; ++r
) {
1982 unsigned push_constants
[6] = {
1990 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer
),
1991 device
->meta_state
.itoi_r32g32b32
.img_p_layout
,
1992 VK_SHADER_STAGE_COMPUTE_BIT
, 0, 24,
1995 radv_unaligned_dispatch(cmd_buffer
, rects
[r
].width
, rects
[r
].height
, 1);
1998 radv_DestroyBuffer(radv_device_to_handle(device
), src_buffer
, NULL
);
1999 radv_DestroyBuffer(radv_device_to_handle(device
), dst_buffer
, NULL
);
2003 itoi_bind_descriptors(struct radv_cmd_buffer
*cmd_buffer
,
2004 struct radv_image_view
*src
,
2005 struct radv_image_view
*dst
)
2007 struct radv_device
*device
= cmd_buffer
->device
;
2009 radv_meta_push_descriptor_set(cmd_buffer
,
2010 VK_PIPELINE_BIND_POINT_COMPUTE
,
2011 device
->meta_state
.itoi
.img_p_layout
,
2013 2, /* descriptorWriteCount */
2014 (VkWriteDescriptorSet
[]) {
2016 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
2018 .dstArrayElement
= 0,
2019 .descriptorCount
= 1,
2020 .descriptorType
= VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,
2021 .pImageInfo
= (VkDescriptorImageInfo
[]) {
2023 .sampler
= VK_NULL_HANDLE
,
2024 .imageView
= radv_image_view_to_handle(src
),
2025 .imageLayout
= VK_IMAGE_LAYOUT_GENERAL
,
2030 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
2032 .dstArrayElement
= 0,
2033 .descriptorCount
= 1,
2034 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
,
2035 .pImageInfo
= (VkDescriptorImageInfo
[]) {
2037 .sampler
= VK_NULL_HANDLE
,
2038 .imageView
= radv_image_view_to_handle(dst
),
2039 .imageLayout
= VK_IMAGE_LAYOUT_GENERAL
,
2047 radv_meta_image_to_image_cs(struct radv_cmd_buffer
*cmd_buffer
,
2048 struct radv_meta_blit2d_surf
*src
,
2049 struct radv_meta_blit2d_surf
*dst
,
2051 struct radv_meta_blit2d_rect
*rects
)
2053 VkPipeline pipeline
= cmd_buffer
->device
->meta_state
.itoi
.pipeline
;
2054 struct radv_device
*device
= cmd_buffer
->device
;
2055 struct radv_image_view src_view
, dst_view
;
2057 if (src
->format
== VK_FORMAT_R32G32B32_UINT
||
2058 src
->format
== VK_FORMAT_R32G32B32_SINT
||
2059 src
->format
== VK_FORMAT_R32G32B32_SFLOAT
) {
2060 radv_meta_image_to_image_cs_r32g32b32(cmd_buffer
, src
, dst
,
2065 create_iview(cmd_buffer
, src
, &src_view
);
2066 create_iview(cmd_buffer
, dst
, &dst_view
);
2068 itoi_bind_descriptors(cmd_buffer
, &src_view
, &dst_view
);
2070 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
&&
2071 (src
->image
->type
== VK_IMAGE_TYPE_3D
|| dst
->image
->type
== VK_IMAGE_TYPE_3D
))
2072 pipeline
= cmd_buffer
->device
->meta_state
.itoi
.pipeline_3d
;
2073 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer
),
2074 VK_PIPELINE_BIND_POINT_COMPUTE
, pipeline
);
2076 for (unsigned r
= 0; r
< num_rects
; ++r
) {
2077 unsigned push_constants
[6] = {
2085 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer
),
2086 device
->meta_state
.itoi
.img_p_layout
,
2087 VK_SHADER_STAGE_COMPUTE_BIT
, 0, 24,
2090 radv_unaligned_dispatch(cmd_buffer
, rects
[r
].width
, rects
[r
].height
, 1);
2095 cleari_r32g32b32_bind_descriptors(struct radv_cmd_buffer
*cmd_buffer
,
2096 struct radv_buffer_view
*view
)
2098 struct radv_device
*device
= cmd_buffer
->device
;
2100 radv_meta_push_descriptor_set(cmd_buffer
,
2101 VK_PIPELINE_BIND_POINT_COMPUTE
,
2102 device
->meta_state
.cleari_r32g32b32
.img_p_layout
,
2104 1, /* descriptorWriteCount */
2105 (VkWriteDescriptorSet
[]) {
2107 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
2109 .dstArrayElement
= 0,
2110 .descriptorCount
= 1,
2111 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
,
2112 .pTexelBufferView
= (VkBufferView
[]) { radv_buffer_view_to_handle(view
) },
2118 radv_meta_clear_image_cs_r32g32b32(struct radv_cmd_buffer
*cmd_buffer
,
2119 struct radv_meta_blit2d_surf
*dst
,
2120 const VkClearColorValue
*clear_color
)
2122 VkPipeline pipeline
= cmd_buffer
->device
->meta_state
.cleari_r32g32b32
.pipeline
;
2123 struct radv_device
*device
= cmd_buffer
->device
;
2124 struct radv_buffer_view dst_view
;
2128 /* This special clear path for R32G32B32 formats will write the linear
2129 * image as a buffer with the same underlying memory. The compute
2130 * shader will clear all components separately using a R32 format.
2132 create_buffer_from_image(cmd_buffer
, dst
,
2133 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT
,
2136 create_bview_for_r32g32b32(cmd_buffer
, radv_buffer_from_handle(buffer
),
2137 0, dst
->format
, &dst_view
);
2138 cleari_r32g32b32_bind_descriptors(cmd_buffer
, &dst_view
);
2140 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer
),
2141 VK_PIPELINE_BIND_POINT_COMPUTE
, pipeline
);
2143 stride
= get_image_stride_for_r32g32b32(cmd_buffer
, dst
);
2145 unsigned push_constants
[4] = {
2146 clear_color
->uint32
[0],
2147 clear_color
->uint32
[1],
2148 clear_color
->uint32
[2],
2152 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer
),
2153 device
->meta_state
.cleari_r32g32b32
.img_p_layout
,
2154 VK_SHADER_STAGE_COMPUTE_BIT
, 0, 16,
2157 radv_unaligned_dispatch(cmd_buffer
, dst
->image
->info
.width
,
2158 dst
->image
->info
.height
, 1);
2160 radv_DestroyBuffer(radv_device_to_handle(device
), buffer
, NULL
);
2164 cleari_bind_descriptors(struct radv_cmd_buffer
*cmd_buffer
,
2165 struct radv_image_view
*dst_iview
)
2167 struct radv_device
*device
= cmd_buffer
->device
;
2169 radv_meta_push_descriptor_set(cmd_buffer
,
2170 VK_PIPELINE_BIND_POINT_COMPUTE
,
2171 device
->meta_state
.cleari
.img_p_layout
,
2173 1, /* descriptorWriteCount */
2174 (VkWriteDescriptorSet
[]) {
2176 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
2178 .dstArrayElement
= 0,
2179 .descriptorCount
= 1,
2180 .descriptorType
= VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
,
2181 .pImageInfo
= (VkDescriptorImageInfo
[]) {
2183 .sampler
= VK_NULL_HANDLE
,
2184 .imageView
= radv_image_view_to_handle(dst_iview
),
2185 .imageLayout
= VK_IMAGE_LAYOUT_GENERAL
,
2193 radv_meta_clear_image_cs(struct radv_cmd_buffer
*cmd_buffer
,
2194 struct radv_meta_blit2d_surf
*dst
,
2195 const VkClearColorValue
*clear_color
)
2197 VkPipeline pipeline
= cmd_buffer
->device
->meta_state
.cleari
.pipeline
;
2198 struct radv_device
*device
= cmd_buffer
->device
;
2199 struct radv_image_view dst_iview
;
2201 if (dst
->format
== VK_FORMAT_R32G32B32_UINT
||
2202 dst
->format
== VK_FORMAT_R32G32B32_SINT
||
2203 dst
->format
== VK_FORMAT_R32G32B32_SFLOAT
) {
2204 radv_meta_clear_image_cs_r32g32b32(cmd_buffer
, dst
, clear_color
);
2208 create_iview(cmd_buffer
, dst
, &dst_iview
);
2209 cleari_bind_descriptors(cmd_buffer
, &dst_iview
);
2211 if (device
->physical_device
->rad_info
.chip_class
>= GFX9
&&
2212 dst
->image
->type
== VK_IMAGE_TYPE_3D
)
2213 pipeline
= cmd_buffer
->device
->meta_state
.cleari
.pipeline_3d
;
2215 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer
),
2216 VK_PIPELINE_BIND_POINT_COMPUTE
, pipeline
);
2218 unsigned push_constants
[5] = {
2219 clear_color
->uint32
[0],
2220 clear_color
->uint32
[1],
2221 clear_color
->uint32
[2],
2222 clear_color
->uint32
[3],
2226 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer
),
2227 device
->meta_state
.cleari
.img_p_layout
,
2228 VK_SHADER_STAGE_COMPUTE_BIT
, 0, 20,
2231 radv_unaligned_dispatch(cmd_buffer
, dst
->image
->info
.width
, dst
->image
->info
.height
, 1);