57
57
nir_ssa_def *coord = get_global_ids(&b, 2);
58
58
nir_ssa_def *zero = nir_imm_int(&b, 0);
61
nir_imm_ivec2(&b, surf->u.gfx9.color.dcc_block_width, surf->u.gfx9.color.dcc_block_height));
60
nir_imul(&b, coord, nir_imm_ivec2(&b, surf->u.gfx9.color.dcc_block_width, surf->u.gfx9.color.dcc_block_height));
63
nir_ssa_def *src = ac_nir_dcc_addr_from_coord(&b, &dev->physical_device->rad_info, surf->bpe,
64
&surf->u.gfx9.color.dcc_equation, src_dcc_pitch,
65
src_dcc_height, zero, nir_channel(&b, coord, 0),
66
nir_channel(&b, coord, 1), zero, zero, zero);
62
nir_ssa_def *src = ac_nir_dcc_addr_from_coord(
63
&b, &dev->physical_device->rad_info, surf->bpe, &surf->u.gfx9.color.dcc_equation, src_dcc_pitch, src_dcc_height,
64
zero, nir_channel(&b, coord, 0), nir_channel(&b, coord, 1), zero, zero, zero);
67
65
nir_ssa_def *dst = ac_nir_dcc_addr_from_coord(
68
&b, &dev->physical_device->rad_info, surf->bpe, &surf->u.gfx9.color.display_dcc_equation,
69
dst_dcc_pitch, dst_dcc_height, zero, nir_channel(&b, coord, 0), nir_channel(&b, coord, 1),
72
nir_ssa_def *dcc_val = nir_image_deref_load(&b, 1, 32, input_dcc_ref,
73
nir_vec4(&b, src, src, src, src),
74
nir_ssa_undef(&b, 1, 32), nir_imm_int(&b, 0),
77
nir_image_deref_store(&b, output_dcc_ref, nir_vec4(&b, dst, dst, dst, dst),
78
nir_ssa_undef(&b, 1, 32), dcc_val, nir_imm_int(&b, 0), .image_dim = dim);
66
&b, &dev->physical_device->rad_info, surf->bpe, &surf->u.gfx9.color.display_dcc_equation, dst_dcc_pitch,
67
dst_dcc_height, zero, nir_channel(&b, coord, 0), nir_channel(&b, coord, 1), zero, zero, zero);
69
nir_ssa_def *dcc_val = nir_image_deref_load(&b, 1, 32, input_dcc_ref, nir_vec4(&b, src, src, src, src),
70
nir_ssa_undef(&b, 1, 32), nir_imm_int(&b, 0), .image_dim = dim);
72
nir_image_deref_store(&b, output_dcc_ref, nir_vec4(&b, dst, dst, dst, dst), nir_ssa_undef(&b, 1, 32), dcc_val,
73
nir_imm_int(&b, 0), .image_dim = dim);
86
81
struct radv_meta_state *state = &device->meta_state;
88
83
for (unsigned i = 0; i < ARRAY_SIZE(state->dcc_retile.pipeline); i++) {
89
radv_DestroyPipeline(radv_device_to_handle(device), state->dcc_retile.pipeline[i],
84
radv_DestroyPipeline(radv_device_to_handle(device), state->dcc_retile.pipeline[i], &state->alloc);
92
radv_DestroyPipelineLayout(radv_device_to_handle(device), state->dcc_retile.p_layout,
94
device->vk.dispatch_table.DestroyDescriptorSetLayout(radv_device_to_handle(device),
95
state->dcc_retile.ds_layout, &state->alloc);
86
radv_DestroyPipelineLayout(radv_device_to_handle(device), state->dcc_retile.p_layout, &state->alloc);
87
device->vk.dispatch_table.DestroyDescriptorSetLayout(radv_device_to_handle(device), state->dcc_retile.ds_layout,
97
90
/* Reset for next finish. */
98
91
memset(&state->dcc_retile, 0, sizeof(state->dcc_retile));
112
105
VkResult result = VK_SUCCESS;
113
106
nir_shader *cs = build_dcc_retile_compute_shader(device, surf);
115
VkDescriptorSetLayoutCreateInfo ds_create_info = {
116
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
117
.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR,
119
.pBindings = (VkDescriptorSetLayoutBinding[]){
121
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
122
.descriptorCount = 1,
123
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
124
.pImmutableSamplers = NULL},
126
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
127
.descriptorCount = 1,
128
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
129
.pImmutableSamplers = NULL},
108
VkDescriptorSetLayoutCreateInfo ds_create_info = {.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
109
.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR,
111
.pBindings = (VkDescriptorSetLayoutBinding[]){
113
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
114
.descriptorCount = 1,
115
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
116
.pImmutableSamplers = NULL},
118
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
119
.descriptorCount = 1,
120
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
121
.pImmutableSamplers = NULL},
132
result = radv_CreateDescriptorSetLayout(radv_device_to_handle(device), &ds_create_info,
133
&device->meta_state.alloc,
124
result = radv_CreateDescriptorSetLayout(radv_device_to_handle(device), &ds_create_info, &device->meta_state.alloc,
134
125
&device->meta_state.dcc_retile.ds_layout);
135
126
if (result != VK_SUCCESS)
197
186
/* Compile pipelines if not already done so. */
198
187
if (!cmd_buffer->device->meta_state.dcc_retile.pipeline[swizzle_mode]) {
200
radv_device_init_meta_dcc_retile_state(cmd_buffer->device, &image->planes[0].surface);
188
VkResult ret = radv_device_init_meta_dcc_retile_state(cmd_buffer->device, &image->planes[0].surface);
201
189
if (ret != VK_SUCCESS) {
202
190
vk_command_buffer_set_error(&cmd_buffer->vk, ret);
208
&saved_state, cmd_buffer,
209
RADV_META_SAVE_DESCRIPTORS | RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS);
195
radv_meta_save(&saved_state, cmd_buffer,
196
RADV_META_SAVE_DESCRIPTORS | RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS);
211
198
radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE,
212
199
device->meta_state.dcc_retile.pipeline[swizzle_mode]);
259
unsigned width = DIV_ROUND_UP(image->info.width, vk_format_get_blockwidth(image->vk.format));
260
unsigned height = DIV_ROUND_UP(image->info.height, vk_format_get_blockheight(image->vk.format));
246
unsigned width = DIV_ROUND_UP(image->vk.extent.width, vk_format_get_blockwidth(image->vk.format));
247
unsigned height = DIV_ROUND_UP(image->vk.extent.height, vk_format_get_blockheight(image->vk.format));
262
249
unsigned dcc_width = DIV_ROUND_UP(width, image->planes[0].surface.u.gfx9.color.dcc_block_width);
263
unsigned dcc_height =
264
DIV_ROUND_UP(height, image->planes[0].surface.u.gfx9.color.dcc_block_height);
250
unsigned dcc_height = DIV_ROUND_UP(height, image->planes[0].surface.u.gfx9.color.dcc_block_height);
266
252
uint32_t constants[] = {
267
253
image->planes[0].surface.u.gfx9.color.dcc_pitch_max + 1,
269
255
image->planes[0].surface.u.gfx9.color.display_dcc_pitch_max + 1,
270
256
image->planes[0].surface.u.gfx9.color.display_dcc_height,
272
radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer),
273
device->meta_state.dcc_retile.p_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, 16,
258
radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer), device->meta_state.dcc_retile.p_layout,
259
VK_SHADER_STAGE_COMPUTE_BIT, 0, 16, constants);
276
261
radv_unaligned_dispatch(cmd_buffer, dcc_width, dcc_height, 1);