radv/meta: create blit2d layouts on-demand

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30640>
This commit is contained in:
Samuel Pitoiset
2024-08-13 10:04:27 +02:00
committed by Marge Bot
parent 2352cb2244
commit db94ee1e64
+55 -38
View File
@@ -165,9 +165,6 @@ radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer, struct radv_meta
else if (src_img)
src_aspect_mask = src_img->aspect_mask;
struct blit2d_src_temps src_temps;
blit2d_bind_src(cmd_buffer, src_img, src_buf, &src_temps, src_type, depth_format, src_aspect_mask, log2_samples);
struct radv_image_view dst_iview;
create_iview(cmd_buffer, dst, &dst_iview, depth_format, aspect_mask);
@@ -238,6 +235,9 @@ radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer, struct radv_meta
} else
unreachable("Processing blit2d with multiple aspects.");
struct blit2d_src_temps src_temps;
blit2d_bind_src(cmd_buffer, src_img, src_buf, &src_temps, src_type, depth_format, src_aspect_mask, log2_samples);
radv_CmdBeginRendering(radv_cmd_buffer_to_handle(cmd_buffer), &rendering_info);
radv_CmdDraw(radv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0);
@@ -470,6 +470,43 @@ radv_device_finish_meta_blit2d_state(struct radv_device *device)
}
}
static VkResult
meta_blit2d_create_pipe_layout(struct radv_device *device, int idx, uint32_t log2_samples)
{
VkResult result = VK_SUCCESS;
if (!device->meta_state.blit2d[log2_samples].ds_layouts[idx]) {
VkDescriptorType desc_type =
(idx == BLIT2D_SRC_TYPE_BUFFER) ? VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
const VkDescriptorSetLayoutBinding binding = {
.binding = 0,
.descriptorType = desc_type,
.descriptorCount = 1,
.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,
};
result = radv_meta_create_descriptor_set_layout(device, 1, &binding,
&device->meta_state.blit2d[log2_samples].ds_layouts[idx]);
if (result != VK_SUCCESS)
return result;
}
if (!device->meta_state.blit2d[log2_samples].p_layouts[idx]) {
const VkPushConstantRange push_constant_ranges[] = {
{VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
{VK_SHADER_STAGE_FRAGMENT_BIT, 16, 4},
};
int num_push_constant_range = (idx != BLIT2D_SRC_TYPE_IMAGE || log2_samples > 0) ? 2 : 1;
result = radv_meta_create_pipeline_layout(device, &device->meta_state.blit2d[log2_samples].ds_layouts[idx],
num_push_constant_range, push_constant_ranges,
&device->meta_state.blit2d[log2_samples].p_layouts[idx]);
}
return result;
}
static VkResult
create_color_pipeline(struct radv_device *device, enum blit2d_src_type src_type, VkFormat format, uint32_t log2_samples,
VkPipeline *pipeline)
@@ -477,6 +514,10 @@ create_color_pipeline(struct radv_device *device, enum blit2d_src_type src_type,
VkResult result;
const char *name;
result = meta_blit2d_create_pipe_layout(device, src_type, log2_samples);
if (result != VK_SUCCESS)
return result;
texel_fetch_build_func src_func;
switch (src_type) {
case BLIT2D_SRC_TYPE_IMAGE:
@@ -625,6 +666,10 @@ create_depth_only_pipeline(struct radv_device *device, enum blit2d_src_type src_
VkResult result;
const char *name;
result = meta_blit2d_create_pipe_layout(device, src_type, log2_samples);
if (result != VK_SUCCESS)
return result;
texel_fetch_build_func src_func;
switch (src_type) {
case BLIT2D_SRC_TYPE_IMAGE:
@@ -797,6 +842,10 @@ create_stencil_only_pipeline(struct radv_device *device, enum blit2d_src_type sr
VkResult result;
const char *name;
result = meta_blit2d_create_pipe_layout(device, src_type, log2_samples);
if (result != VK_SUCCESS)
return result;
texel_fetch_build_func src_func;
switch (src_type) {
case BLIT2D_SRC_TYPE_IMAGE:
@@ -958,39 +1007,14 @@ fail:
return result;
}
static VkResult
meta_blit2d_create_pipe_layout(struct radv_device *device, int idx, uint32_t log2_samples)
{
VkResult result;
VkDescriptorType desc_type =
(idx == BLIT2D_SRC_TYPE_BUFFER) ? VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
const VkPushConstantRange push_constant_ranges[] = {
{VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
{VK_SHADER_STAGE_FRAGMENT_BIT, 16, 4},
};
int num_push_constant_range = (idx != BLIT2D_SRC_TYPE_IMAGE || log2_samples > 0) ? 2 : 1;
const VkDescriptorSetLayoutBinding binding = {
.binding = 0,
.descriptorType = desc_type,
.descriptorCount = 1,
.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,
};
result = radv_meta_create_descriptor_set_layout(device, 1, &binding, &device->meta_state.blit2d[log2_samples].ds_layouts[idx]);
if (result != VK_SUCCESS)
return result;
return radv_meta_create_pipeline_layout(device, &device->meta_state.blit2d[log2_samples].ds_layouts[idx],
num_push_constant_range, push_constant_ranges,
&device->meta_state.blit2d[log2_samples].p_layouts[idx]);
}
VkResult
radv_device_init_meta_blit2d_state(struct radv_device *device, bool on_demand)
{
VkResult result;
if (on_demand)
return VK_SUCCESS;
for (unsigned log2_samples = 0; log2_samples < MAX_SAMPLES_LOG2; log2_samples++) {
for (unsigned src = 0; src < BLIT2D_NUM_SRC_TYPES; src++) {
/* Don't need to handle copies between buffers and multisample images. */
@@ -1001,13 +1025,6 @@ radv_device_init_meta_blit2d_state(struct radv_device *device, bool on_demand)
if (src == BLIT2D_SRC_TYPE_IMAGE_3D && log2_samples > 0)
continue;
result = meta_blit2d_create_pipe_layout(device, src, log2_samples);
if (result != VK_SUCCESS)
return result;
if (on_demand)
continue;
for (unsigned j = 0; j < NUM_META_FS_KEYS; ++j) {
VkFormat format = radv_fs_key_format_exemplars[j];
unsigned fs_key = radv_format_meta_fs_key(device, format);