Mesa (main): radv: use 3D views for 3D internal operations on GFX6-8
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue May 3 09:53:25 UTC 2022
Module: Mesa
Branch: main
Commit: 3829981eb74103ca5294a4d8e84e55e087329f38
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3829981eb74103ca5294a4d8e84e55e087329f38
Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date: Fri Apr 29 18:24:32 2022 +0200
radv: use 3D views for 3D internal operations on GFX6-8
Instead of binding 2D images views and relying on BASE_ARRAY.
This cleanups the internal driver operations for 3D.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16272>
---
src/amd/vulkan/radv_meta_blit2d.c | 12 +--
src/amd/vulkan/radv_meta_bufimage.c | 191 ++++++++++++++++--------------------
2 files changed, 87 insertions(+), 116 deletions(-)
diff --git a/src/amd/vulkan/radv_meta_blit2d.c b/src/amd/vulkan/radv_meta_blit2d.c
index 798ca9c6c3e..134f7bef206 100644
--- a/src/amd/vulkan/radv_meta_blit2d.c
+++ b/src/amd/vulkan/radv_meta_blit2d.c
@@ -52,9 +52,6 @@ create_iview(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *s
struct radv_image_view *iview, VkFormat depth_format, VkImageAspectFlagBits aspects)
{
VkFormat format;
- VkImageViewType view_type = cmd_buffer->device->physical_device->rad_info.chip_class < GFX9
- ? VK_IMAGE_VIEW_TYPE_2D
- : radv_meta_get_view_type(surf->image);
if (depth_format)
format = depth_format;
@@ -65,7 +62,7 @@ create_iview(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *s
&(VkImageViewCreateInfo){
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.image = radv_image_to_handle(surf->image),
- .viewType = view_type,
+ .viewType = radv_meta_get_view_type(surf->image),
.format = format,
.subresourceRange = {.aspectMask = aspects,
.baseMipLevel = surf->level,
@@ -376,8 +373,7 @@ radv_meta_blit2d(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_sur
struct radv_meta_blit2d_buffer *src_buf, struct radv_meta_blit2d_surf *dst,
unsigned num_rects, struct radv_meta_blit2d_rect *rects)
{
- bool use_3d = cmd_buffer->device->physical_device->rad_info.chip_class >= GFX9 &&
- (src_img && src_img->image->type == VK_IMAGE_TYPE_3D);
+ bool use_3d = (src_img && src_img->image->type == VK_IMAGE_TYPE_3D);
enum blit2d_src_type src_type = src_buf ? BLIT2D_SRC_TYPE_BUFFER
: use_3d ? BLIT2D_SRC_TYPE_IMAGE_3D
: BLIT2D_SRC_TYPE_IMAGE;
@@ -1116,13 +1112,9 @@ VkResult
radv_device_init_meta_blit2d_state(struct radv_device *device, bool on_demand)
{
VkResult result;
- bool create_3d = device->physical_device->rad_info.chip_class >= GFX9;
for (unsigned log2_samples = 0; log2_samples < MAX_SAMPLES_LOG2; log2_samples++) {
for (unsigned src = 0; src < BLIT2D_NUM_SRC_TYPES; src++) {
- if (src == BLIT2D_SRC_TYPE_IMAGE_3D && !create_3d)
- continue;
-
/* Don't need to handle copies between buffers and multisample images. */
if (src == BLIT2D_SRC_TYPE_BUFFER && log2_samples > 0)
continue;
diff --git a/src/amd/vulkan/radv_meta_bufimage.c b/src/amd/vulkan/radv_meta_bufimage.c
index 63307e0b2ec..1d8107fd375 100644
--- a/src/amd/vulkan/radv_meta_bufimage.c
+++ b/src/amd/vulkan/radv_meta_bufimage.c
@@ -29,9 +29,6 @@
* Compute queue: implementation also of buffer->image, image->image, and image clear.
*/
-/* GFX9 needs to use a 3D sampler to access 3D resources, so the shader has the options
- * for that.
- */
static nir_shader *
build_nir_itob_compute_shader(struct radv_device *dev, bool is_3d)
{
@@ -97,10 +94,7 @@ radv_device_init_meta_itob_state(struct radv_device *device)
{
VkResult result;
nir_shader *cs = build_nir_itob_compute_shader(device, false);
- nir_shader *cs_3d = NULL;
-
- if (device->physical_device->rad_info.chip_class >= GFX9)
- cs_3d = build_nir_itob_compute_shader(device, true);
+ nir_shader *cs_3d = build_nir_itob_compute_shader(device, true);
/*
* two descriptors one for the image being sampled
@@ -166,29 +160,28 @@ radv_device_init_meta_itob_state(struct radv_device *device)
if (result != VK_SUCCESS)
goto fail;
- if (device->physical_device->rad_info.chip_class >= GFX9) {
- VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d = {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
- .stage = VK_SHADER_STAGE_COMPUTE_BIT,
- .module = vk_shader_module_handle_from_nir(cs_3d),
- .pName = "main",
- .pSpecializationInfo = NULL,
- };
+ VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d = {
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+ .stage = VK_SHADER_STAGE_COMPUTE_BIT,
+ .module = vk_shader_module_handle_from_nir(cs_3d),
+ .pName = "main",
+ .pSpecializationInfo = NULL,
+ };
- VkComputePipelineCreateInfo vk_pipeline_info_3d = {
- .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
- .stage = pipeline_shader_stage_3d,
- .flags = 0,
- .layout = device->meta_state.itob.img_p_layout,
- };
+ VkComputePipelineCreateInfo vk_pipeline_info_3d = {
+ .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
+ .stage = pipeline_shader_stage_3d,
+ .flags = 0,
+ .layout = device->meta_state.itob.img_p_layout,
+ };
- result = radv_CreateComputePipelines(
- radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache), 1,
- &vk_pipeline_info_3d, NULL, &device->meta_state.itob.pipeline_3d);
- if (result != VK_SUCCESS)
- goto fail;
- ralloc_free(cs_3d);
- }
+ result = radv_CreateComputePipelines(
+ radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache), 1,
+ &vk_pipeline_info_3d, NULL, &device->meta_state.itob.pipeline_3d);
+ if (result != VK_SUCCESS)
+ goto fail;
+
+ ralloc_free(cs_3d);
ralloc_free(cs);
return VK_SUCCESS;
@@ -208,8 +201,7 @@ radv_device_finish_meta_itob_state(struct radv_device *device)
radv_DestroyDescriptorSetLayout(radv_device_to_handle(device), state->itob.img_ds_layout,
&state->alloc);
radv_DestroyPipeline(radv_device_to_handle(device), state->itob.pipeline, &state->alloc);
- if (device->physical_device->rad_info.chip_class >= GFX9)
- radv_DestroyPipeline(radv_device_to_handle(device), state->itob.pipeline_3d, &state->alloc);
+ radv_DestroyPipeline(radv_device_to_handle(device), state->itob.pipeline_3d, &state->alloc);
}
static nir_shader *
@@ -281,9 +273,7 @@ radv_device_init_meta_btoi_state(struct radv_device *device)
{
VkResult result;
nir_shader *cs = build_nir_btoi_compute_shader(device, false);
- nir_shader *cs_3d = NULL;
- if (device->physical_device->rad_info.chip_class >= GFX9)
- cs_3d = build_nir_btoi_compute_shader(device, true);
+ nir_shader *cs_3d = build_nir_btoi_compute_shader(device, true);
/*
* two descriptors one for the image being sampled
* one for the buffer being written.
@@ -348,27 +338,26 @@ radv_device_init_meta_btoi_state(struct radv_device *device)
if (result != VK_SUCCESS)
goto fail;
- if (device->physical_device->rad_info.chip_class >= GFX9) {
- VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d = {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
- .stage = VK_SHADER_STAGE_COMPUTE_BIT,
- .module = vk_shader_module_handle_from_nir(cs_3d),
- .pName = "main",
- .pSpecializationInfo = NULL,
- };
+ VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d = {
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+ .stage = VK_SHADER_STAGE_COMPUTE_BIT,
+ .module = vk_shader_module_handle_from_nir(cs_3d),
+ .pName = "main",
+ .pSpecializationInfo = NULL,
+ };
- VkComputePipelineCreateInfo vk_pipeline_info_3d = {
- .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
- .stage = pipeline_shader_stage_3d,
- .flags = 0,
- .layout = device->meta_state.btoi.img_p_layout,
- };
+ VkComputePipelineCreateInfo vk_pipeline_info_3d = {
+ .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
+ .stage = pipeline_shader_stage_3d,
+ .flags = 0,
+ .layout = device->meta_state.btoi.img_p_layout,
+ };
- result = radv_CreateComputePipelines(
- radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache), 1,
- &vk_pipeline_info_3d, NULL, &device->meta_state.btoi.pipeline_3d);
- ralloc_free(cs_3d);
- }
+ result = radv_CreateComputePipelines(
+ radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache), 1,
+ &vk_pipeline_info_3d, NULL, &device->meta_state.btoi.pipeline_3d);
+
+ ralloc_free(cs_3d);
ralloc_free(cs);
return VK_SUCCESS;
@@ -695,29 +684,27 @@ radv_device_init_meta_itoi_state(struct radv_device *device)
goto fail;
}
- if (device->physical_device->rad_info.chip_class >= GFX9) {
- nir_shader *cs_3d = build_nir_itoi_compute_shader(device, true, 1);
+ nir_shader *cs_3d = build_nir_itoi_compute_shader(device, true, 1);
- VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d = {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
- .stage = VK_SHADER_STAGE_COMPUTE_BIT,
- .module = vk_shader_module_handle_from_nir(cs_3d),
- .pName = "main",
- .pSpecializationInfo = NULL,
- };
+ VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d = {
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+ .stage = VK_SHADER_STAGE_COMPUTE_BIT,
+ .module = vk_shader_module_handle_from_nir(cs_3d),
+ .pName = "main",
+ .pSpecializationInfo = NULL,
+ };
- VkComputePipelineCreateInfo vk_pipeline_info_3d = {
- .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
- .stage = pipeline_shader_stage_3d,
- .flags = 0,
- .layout = device->meta_state.itoi.img_p_layout,
- };
+ VkComputePipelineCreateInfo vk_pipeline_info_3d = {
+ .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
+ .stage = pipeline_shader_stage_3d,
+ .flags = 0,
+ .layout = device->meta_state.itoi.img_p_layout,
+ };
- result = radv_CreateComputePipelines(
- radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache), 1,
- &vk_pipeline_info_3d, NULL, &device->meta_state.itoi.pipeline_3d);
- ralloc_free(cs_3d);
- }
+ result = radv_CreateComputePipelines(
+ radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache), 1,
+ &vk_pipeline_info_3d, NULL, &device->meta_state.itoi.pipeline_3d);
+ ralloc_free(cs_3d);
return VK_SUCCESS;
fail:
@@ -738,8 +725,7 @@ radv_device_finish_meta_itoi_state(struct radv_device *device)
radv_DestroyPipeline(radv_device_to_handle(device), state->itoi.pipeline[i], &state->alloc);
}
- if (device->physical_device->rad_info.chip_class >= GFX9)
- radv_DestroyPipeline(radv_device_to_handle(device), state->itoi.pipeline_3d, &state->alloc);
+ radv_DestroyPipeline(radv_device_to_handle(device), state->itoi.pipeline_3d, &state->alloc);
}
static nir_shader *
@@ -1011,30 +997,28 @@ radv_device_init_meta_cleari_state(struct radv_device *device)
goto fail;
}
- if (device->physical_device->rad_info.chip_class >= GFX9) {
- nir_shader *cs_3d = build_nir_cleari_compute_shader(device, true, 1);
+ nir_shader *cs_3d = build_nir_cleari_compute_shader(device, true, 1);
- /* compute shader */
- VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d = {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
- .stage = VK_SHADER_STAGE_COMPUTE_BIT,
- .module = vk_shader_module_handle_from_nir(cs_3d),
- .pName = "main",
- .pSpecializationInfo = NULL,
- };
+ /* compute shader */
+ VkPipelineShaderStageCreateInfo pipeline_shader_stage_3d = {
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+ .stage = VK_SHADER_STAGE_COMPUTE_BIT,
+ .module = vk_shader_module_handle_from_nir(cs_3d),
+ .pName = "main",
+ .pSpecializationInfo = NULL,
+ };
- VkComputePipelineCreateInfo vk_pipeline_info_3d = {
- .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
- .stage = pipeline_shader_stage_3d,
- .flags = 0,
- .layout = device->meta_state.cleari.img_p_layout,
- };
+ VkComputePipelineCreateInfo vk_pipeline_info_3d = {
+ .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
+ .stage = pipeline_shader_stage_3d,
+ .flags = 0,
+ .layout = device->meta_state.cleari.img_p_layout,
+ };
- result = radv_CreateComputePipelines(
- radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache), 1,
- &vk_pipeline_info_3d, NULL, &device->meta_state.cleari.pipeline_3d);
- ralloc_free(cs_3d);
- }
+ result = radv_CreateComputePipelines(
+ radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache), 1,
+ &vk_pipeline_info_3d, NULL, &device->meta_state.cleari.pipeline_3d);
+ ralloc_free(cs_3d);
return VK_SUCCESS;
fail:
@@ -1238,10 +1222,6 @@ static void
create_iview(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *surf,
struct radv_image_view *iview, VkFormat format, VkImageAspectFlagBits aspects)
{
- VkImageViewType view_type = cmd_buffer->device->physical_device->rad_info.chip_class < GFX9
- ? VK_IMAGE_VIEW_TYPE_2D
- : radv_meta_get_view_type(surf->image);
-
if (format == VK_FORMAT_UNDEFINED)
format = surf->format;
@@ -1249,7 +1229,7 @@ create_iview(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *s
&(VkImageViewCreateInfo){
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.image = radv_image_to_handle(surf->image),
- .viewType = view_type,
+ .viewType = radv_meta_get_view_type(surf->image),
.format = format,
.subresourceRange = {.aspectMask = aspects,
.baseMipLevel = surf->level,
@@ -1344,7 +1324,7 @@ get_image_stride_for_r32g32b32(struct radv_cmd_buffer *cmd_buffer,
{
unsigned stride;
- if (cmd_buffer->device->physical_device->rad_info.chip_class >= GFX9) {
+if (cmd_buffer->device->physical_device->rad_info.chip_class >= GFX9) {
stride = surf->image->planes[0].surface.u.gfx9.surf_pitch;
} else {
stride = surf->image->planes[0].surface.u.legacy.level[0].nblk_x * 3;
@@ -1400,7 +1380,7 @@ radv_meta_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_b
create_bview(cmd_buffer, dst->buffer, dst->offset, dst->format, &dst_view);
itob_bind_descriptors(cmd_buffer, &src_view, &dst_view);
- if (device->physical_device->rad_info.chip_class >= GFX9 && src->image->type == VK_IMAGE_TYPE_3D)
+ if (src->image->type == VK_IMAGE_TYPE_3D)
pipeline = cmd_buffer->device->meta_state.itob.pipeline_3d;
radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE,
@@ -1550,7 +1530,7 @@ radv_meta_buffer_to_image_cs(struct radv_cmd_buffer *cmd_buffer,
create_iview(cmd_buffer, dst, &dst_view, VK_FORMAT_UNDEFINED, dst->aspect_mask);
btoi_bind_descriptors(cmd_buffer, &src_view, &dst_view);
- if (device->physical_device->rad_info.chip_class >= GFX9 && dst->image->type == VK_IMAGE_TYPE_3D)
+ if (dst->image->type == VK_IMAGE_TYPE_3D)
pipeline = cmd_buffer->device->meta_state.btoi.pipeline_3d;
radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE,
pipeline);
@@ -1721,8 +1701,7 @@ radv_meta_image_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta
itoi_bind_descriptors(cmd_buffer, &src_view, &dst_view);
VkPipeline pipeline = cmd_buffer->device->meta_state.itoi.pipeline[samples_log2];
- if (device->physical_device->rad_info.chip_class >= GFX9 &&
- (src->image->type == VK_IMAGE_TYPE_3D || dst->image->type == VK_IMAGE_TYPE_3D))
+ if (src->image->type == VK_IMAGE_TYPE_3D || dst->image->type == VK_IMAGE_TYPE_3D)
pipeline = cmd_buffer->device->meta_state.itoi.pipeline_3d;
radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE,
pipeline);
@@ -1849,7 +1828,7 @@ radv_meta_clear_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_bl
cleari_bind_descriptors(cmd_buffer, &dst_iview);
VkPipeline pipeline = cmd_buffer->device->meta_state.cleari.pipeline[samples_log2];
- if (device->physical_device->rad_info.chip_class >= GFX9 && dst->image->type == VK_IMAGE_TYPE_3D)
+ if (dst->image->type == VK_IMAGE_TYPE_3D)
pipeline = cmd_buffer->device->meta_state.cleari.pipeline_3d;
radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE,
More information about the mesa-commit
mailing list