Mesa (master): zink: break out color/zs no_rp clear into separate functions

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jan 15 16:46:10 UTC 2021


Module: Mesa
Branch: master
Commit: 526db0fe82fc0abe16d19d9b81caa2ec3cd0c8ee
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=526db0fe82fc0abe16d19d9b81caa2ec3cd0c8ee

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Thu Aug 13 15:09:30 2020 -0400

zink: break out color/zs no_rp clear into separate functions

make more code more reusable

Reviewed-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8512>

---

 src/gallium/drivers/zink/zink_clear.c | 114 ++++++++++++++++++++--------------
 1 file changed, 66 insertions(+), 48 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_clear.c b/src/gallium/drivers/zink/zink_clear.c
index d2e3a8c89ab..f849447b4d3 100644
--- a/src/gallium/drivers/zink/zink_clear.c
+++ b/src/gallium/drivers/zink/zink_clear.c
@@ -105,6 +105,44 @@ clear_in_rp(struct pipe_context *pctx,
    vkCmdClearAttachments(batch->cmdbuf, num_attachments, attachments, 1, &cr);
 }
 
+static void
+clear_color_no_rp(struct zink_batch *batch, struct zink_resource *res, const union pipe_color_union *pcolor, unsigned level, unsigned layer, unsigned layerCount)
+{
+   VkImageSubresourceRange range = {};
+   range.baseMipLevel = level;
+   range.levelCount = 1;
+   range.baseArrayLayer = layer;
+   range.layerCount = layerCount;
+   range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+
+   VkClearColorValue color;
+   color.float32[0] = pcolor->f[0];
+   color.float32[1] = pcolor->f[1];
+   color.float32[2] = pcolor->f[2];
+   color.float32[3] = pcolor->f[3];
+
+   if (res->layout != VK_IMAGE_LAYOUT_GENERAL && res->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
+      zink_resource_barrier(batch->cmdbuf, res, range.aspectMask, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+   vkCmdClearColorImage(batch->cmdbuf, res->image, res->layout, &color, 1, &range);
+}
+
+static void
+clear_zs_no_rp(struct zink_batch *batch, struct zink_resource *res, VkImageAspectFlags aspects, double depth, unsigned stencil, unsigned level, unsigned layer, unsigned layerCount)
+{
+   VkImageSubresourceRange range = {};
+   range.baseMipLevel = level;
+   range.levelCount = 1;
+   range.baseArrayLayer = layer;
+   range.layerCount = layerCount;
+   range.aspectMask = aspects;
+
+   VkClearDepthStencilValue zs_value = {depth, stencil};
+
+   if (res->layout != VK_IMAGE_LAYOUT_GENERAL && res->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
+      zink_resource_barrier(batch->cmdbuf, res, res->aspect, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+   vkCmdClearDepthStencilImage(batch->cmdbuf, res->image, res->layout, &zs_value, 1, &range);
+}
+
 static struct zink_batch *
 get_clear_batch(struct zink_context *ctx, unsigned width, unsigned height, struct u_rect *region)
 {
@@ -150,65 +188,45 @@ zink_clear(struct pipe_context *pctx,
       return;
    }
 
-   VkImageSubresourceRange range = {};
-   range.levelCount = 1;
    if (buffers & PIPE_CLEAR_COLOR) {
-      range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
       for (unsigned i = 0; i < fb->nr_cbufs; i++) {
-         if (!(buffers & (PIPE_CLEAR_COLOR0 << i)) || !fb->cbufs[i])
-            continue;
-          VkClearColorValue color;
-          struct pipe_surface *psurf = fb->cbufs[i];
-
-          if (psurf->texture->target == PIPE_TEXTURE_3D && !check_3d_layers(psurf)) {
-             clear_in_rp(pctx, buffers, scissor_state, pcolor, depth, stencil);
-             return;
-          }
-
-          struct zink_resource *res = zink_resource(psurf->texture);
-          if (res->layout != VK_IMAGE_LAYOUT_GENERAL && res->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
-             zink_resource_barrier(batch->cmdbuf, res, range.aspectMask, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
-          if (psurf->format != res->base.format &&
-              !util_format_is_srgb(psurf->format) && util_format_is_srgb(res->base.format)) {
-             /* if SRGB mode is disabled for the fb with a backing srgb image then we have to
-              * convert this to srgb color
-              */
-             color.float32[0] = util_format_srgb_to_linear_float(pcolor->f[0]);
-             color.float32[1] = util_format_srgb_to_linear_float(pcolor->f[1]);
-             color.float32[2] = util_format_srgb_to_linear_float(pcolor->f[2]);
-          } else {
-             color.float32[0] = pcolor->f[0];
-             color.float32[1] = pcolor->f[1];
-             color.float32[2] = pcolor->f[2];
-          }
-          color.float32[3] = pcolor->f[3];
-          range.baseMipLevel = psurf->u.tex.level;
-          range.baseArrayLayer = psurf->u.tex.first_layer;
-          range.layerCount = psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1;
-
-          vkCmdClearColorImage(batch->cmdbuf, res->image, res->layout, &color, 1, &range);
+         if ((buffers & (PIPE_CLEAR_COLOR0 << i)) && fb->cbufs[i]) {
+            struct pipe_surface *psurf = fb->cbufs[i];
+
+            if (psurf->texture->target == PIPE_TEXTURE_3D && !check_3d_layers(psurf)) {
+               clear_in_rp(pctx, buffers, scissor_state, pcolor, depth, stencil);
+               return;
+            }
+            struct zink_resource *res = zink_resource(psurf->texture);
+            union pipe_color_union color = *pcolor;
+            if (psurf->format != res->base.format &&
+                !util_format_is_srgb(psurf->format) && util_format_is_srgb(res->base.format)) {
+               /* if SRGB mode is disabled for the fb with a backing srgb image then we have to
+                * convert this to srgb color
+                */
+               color.f[0] = util_format_srgb_to_linear_float(pcolor->f[0]);
+               color.f[1] = util_format_srgb_to_linear_float(pcolor->f[1]);
+               color.f[2] = util_format_srgb_to_linear_float(pcolor->f[2]);
+            }
+            clear_color_no_rp(batch, zink_resource(fb->cbufs[i]->texture), &color,
+                              psurf->u.tex.level, psurf->u.tex.first_layer,
+                              psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1);
+         }
       }
    }
 
-   range.aspectMask = 0;
    if (buffers & PIPE_CLEAR_DEPTHSTENCIL && fb->zsbuf) {
       if (fb->zsbuf->texture->target == PIPE_TEXTURE_3D && !check_3d_layers(fb->zsbuf)) {
          clear_in_rp(pctx, buffers, scissor_state, pcolor, depth, stencil);
          return;
       }
-
+      VkImageAspectFlags aspects = 0;
       if (buffers & PIPE_CLEAR_DEPTH)
-         range.aspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT;
+         aspects |= VK_IMAGE_ASPECT_DEPTH_BIT;
       if (buffers & PIPE_CLEAR_STENCIL)
-         range.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
-      VkClearDepthStencilValue zs_value = {depth, stencil};
-      range.baseMipLevel = fb->zsbuf->u.tex.level;
-      range.baseArrayLayer = fb->zsbuf->u.tex.first_layer;
-      range.layerCount = fb->zsbuf->u.tex.last_layer - fb->zsbuf->u.tex.first_layer + 1;
-
-      struct zink_resource *res = zink_resource(fb->zsbuf->texture);
-      if (res->layout != VK_IMAGE_LAYOUT_GENERAL && res->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
-         zink_resource_barrier(batch->cmdbuf, res, range.aspectMask, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
-      vkCmdClearDepthStencilImage(batch->cmdbuf, res->image, res->layout, &zs_value, 1, &range);
+         aspects |= VK_IMAGE_ASPECT_STENCIL_BIT;
+      clear_zs_no_rp(batch, zink_resource(fb->zsbuf->texture), aspects,
+                     depth, stencil, fb->zsbuf->u.tex.level, fb->zsbuf->u.tex.first_layer,
+                     fb->zsbuf->u.tex.last_layer - fb->zsbuf->u.tex.first_layer + 1);
    }
 }



More information about the mesa-commit mailing list