summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>2022-04-12 14:50:21 -0400
committerMarge Bot <emma+marge@anholt.net>2022-04-18 23:45:30 +0000
commit8c539328fd3fc8514117917bf6cd02768ec02d97 (patch)
treea78dfb03ce1564fafbf78771294e51b568d44746
parentd461b1f7226b939359819dc490f02dba9c2fe00d (diff)
zink: require renderpass2
drivers should be able to support this, and it allows for deleting a lot of untested code Acked-by: Adam Jackson <ajax@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15904>
-rw-r--r--docs/drivers/zink.rst1
-rw-r--r--src/gallium/drivers/zink/zink_device_info.py2
-rw-r--r--src/gallium/drivers/zink/zink_render_pass.c120
3 files changed, 3 insertions, 120 deletions
diff --git a/docs/drivers/zink.rst b/docs/drivers/zink.rst
index d1aa10855ce..9c05985af3f 100644
--- a/docs/drivers/zink.rst
+++ b/docs/drivers/zink.rst
@@ -37,6 +37,7 @@ Here's a list of those requirements:
* Device extensions:
* `VK_KHR_maintenance1`_
+ * ``VK_KHR_create_renderpass2``
* ``VK_KHR_timeline_semaphore``
* `VK_EXT_custom_border_color`_
* `VK_EXT_provoking_vertex`_
diff --git a/src/gallium/drivers/zink/zink_device_info.py b/src/gallium/drivers/zink/zink_device_info.py
index 8de8a9645fb..4f1eb965b2f 100644
--- a/src/gallium/drivers/zink/zink_device_info.py
+++ b/src/gallium/drivers/zink/zink_device_info.py
@@ -66,7 +66,7 @@ EXTENSIONS = [
Extension("VK_KHR_external_memory"),
Extension("VK_KHR_external_memory_fd"),
Extension("VK_KHR_external_semaphore_fd"),
- Extension("VK_KHR_create_renderpass2"),
+ Extension("VK_KHR_create_renderpass2", required=True),
Extension("VK_KHR_synchronization2",
alias="sync2",
features=True),
diff --git a/src/gallium/drivers/zink/zink_render_pass.c b/src/gallium/drivers/zink/zink_render_pass.c
index 5c98ad9affe..ae3f9d2ba58 100644
--- a/src/gallium/drivers/zink/zink_render_pass.c
+++ b/src/gallium/drivers/zink/zink_render_pass.c
@@ -28,123 +28,6 @@
#include "util/u_memory.h"
#include "util/u_string.h"
-static VkRenderPass
-create_render_pass(struct zink_screen *screen, struct zink_render_pass_state *state, struct zink_render_pass_pipeline_state *pstate)
-{
-
- VkAttachmentReference color_refs[PIPE_MAX_COLOR_BUFS], zs_ref;
- VkAttachmentReference input_attachments[PIPE_MAX_COLOR_BUFS];
- VkAttachmentDescription attachments[PIPE_MAX_COLOR_BUFS + 1];
- VkPipelineStageFlags dep_pipeline = 0;
- VkAccessFlags dep_access = 0;
- unsigned input_count = 0;
-
- pstate->num_attachments = state->num_cbufs;
- for (int i = 0; i < state->num_cbufs; i++) {
- struct zink_rt_attrib *rt = state->rts + i;
- attachments[i].flags = 0;
- pstate->attachments[i].format = attachments[i].format = rt->format;
- pstate->attachments[i].samples = attachments[i].samples = rt->samples;
- attachments[i].loadOp = rt->clear_color ? VK_ATTACHMENT_LOAD_OP_CLEAR :
- state->swapchain_init && rt->swapchain ?
- VK_ATTACHMENT_LOAD_OP_DONT_CARE :
- VK_ATTACHMENT_LOAD_OP_LOAD;
- attachments[i].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
- attachments[i].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
- attachments[i].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
- /* if layout changes are ever handled here, need VkAttachmentSampleLocationsEXT */
- VkImageLayout layout = rt->fbfetch ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
- attachments[i].initialLayout = layout;
- attachments[i].finalLayout = layout;
- color_refs[i].attachment = i;
- color_refs[i].layout = layout;
- dep_pipeline |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
- if (rt->fbfetch) {
- memcpy(&input_attachments[input_count++], &color_refs[i], sizeof(VkAttachmentReference));
- dep_pipeline |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
- dep_access |= VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
- }
- dep_access |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
- if (attachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_LOAD)
- dep_access |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
- }
-
- int num_attachments = state->num_cbufs;
- if (state->have_zsbuf) {
- struct zink_rt_attrib *rt = state->rts + state->num_cbufs;
- bool has_clear = rt->clear_color || rt->clear_stencil;
- VkImageLayout layout;
- if (rt->mixed_zs)
- layout = VK_IMAGE_LAYOUT_GENERAL;
- else
- layout = rt->needs_write || has_clear ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
- attachments[num_attachments].flags = 0;
- pstate->attachments[num_attachments].format = attachments[num_attachments].format = rt->format;
- pstate->attachments[num_attachments].samples = attachments[num_attachments].samples = rt->samples;
- attachments[num_attachments].loadOp = rt->clear_color ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD;
- if (rt->mixed_zs)
- attachments[num_attachments].storeOp = VK_ATTACHMENT_STORE_OP_NONE;
- else
- attachments[num_attachments].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
- attachments[num_attachments].stencilLoadOp = rt->clear_stencil ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD;
- attachments[num_attachments].stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
- /* if layout changes are ever handled here, need VkAttachmentSampleLocationsEXT */
- attachments[num_attachments].initialLayout = layout;
- attachments[num_attachments].finalLayout = layout;
-
- dep_pipeline |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
- if (layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)
- dep_access |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
- if (attachments[num_attachments].loadOp == VK_ATTACHMENT_LOAD_OP_LOAD ||
- attachments[num_attachments].stencilLoadOp == VK_ATTACHMENT_LOAD_OP_LOAD)
- dep_access |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
-
- zs_ref.attachment = num_attachments++;
- zs_ref.layout = layout;
- pstate->num_attachments++;
- }
-
- if (!screen->info.have_KHR_synchronization2)
- dep_pipeline = MAX2(dep_pipeline, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
- VkSubpassDependency deps[] = {
- {VK_SUBPASS_EXTERNAL, 0, dep_pipeline, dep_pipeline, 0, dep_access, VK_DEPENDENCY_BY_REGION_BIT},
- {0, VK_SUBPASS_EXTERNAL, dep_pipeline, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, dep_access, 0, VK_DEPENDENCY_BY_REGION_BIT}
- };
- VkPipelineStageFlags input_dep = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
- //if (zs_fbfetch) input_dep |= VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
- VkAccessFlags input_access = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
- //if (zs_fbfetch) input_access |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
- VkSubpassDependency fbfetch_deps[] = {
- {VK_SUBPASS_EXTERNAL, 0, dep_pipeline, dep_pipeline, 0, dep_access, VK_DEPENDENCY_BY_REGION_BIT},
- {0, 0, dep_pipeline, input_dep, dep_access, input_access, VK_DEPENDENCY_BY_REGION_BIT},
- {0, VK_SUBPASS_EXTERNAL, dep_pipeline, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, dep_access, 0, VK_DEPENDENCY_BY_REGION_BIT}
- };
-
- VkSubpassDescription subpass = {0};
- subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
- subpass.colorAttachmentCount = state->num_cbufs;
- subpass.pColorAttachments = color_refs;
- subpass.pDepthStencilAttachment = state->have_zsbuf ? &zs_ref : NULL;
- subpass.inputAttachmentCount = input_count;
- subpass.pInputAttachments = input_attachments;
-
- VkRenderPassCreateInfo rpci = {0};
- rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
- rpci.attachmentCount = num_attachments;
- rpci.pAttachments = attachments;
- rpci.subpassCount = 1;
- rpci.pSubpasses = &subpass;
- rpci.dependencyCount = input_count ? 3 : 2;
- rpci.pDependencies = input_count ? fbfetch_deps : deps;
-
- VkRenderPass render_pass;
- if (VKSCR(CreateRenderPass)(screen->dev, &rpci, NULL, &render_pass) != VK_SUCCESS) {
- mesa_loge("ZINK: vkCreateRenderPass failed");
- return VK_NULL_HANDLE;
- }
-
- return render_pass;
-}
static VkRenderPass
create_render_pass2(struct zink_screen *screen, struct zink_render_pass_state *state, struct zink_render_pass_pipeline_state *pstate)
@@ -333,8 +216,7 @@ zink_create_render_pass(struct zink_screen *screen,
if (!rp)
goto fail;
- rp->render_pass = screen->vk_version >= VK_MAKE_VERSION(1,2,0) ?
- create_render_pass2(screen, state, pstate) : create_render_pass(screen, state, pstate);
+ rp->render_pass = create_render_pass2(screen, state, pstate);
if (!rp->render_pass)
goto fail;
memcpy(&rp->state, state, sizeof(struct zink_render_pass_state));