Mesa (main): iris/resource: Avoid mapping when not needed in iris_resource_init_aux_buf()

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jul 21 20:54:55 UTC 2022


Module: Mesa
Branch: main
Commit: 618c871a23c0d66c8c134f7cbb5df464080f00aa
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=618c871a23c0d66c8c134f7cbb5df464080f00aa

Author: Jordan Justen <jordan.l.justen at intel.com>
Date:   Mon May 16 02:43:03 2022 -0700

iris/resource: Avoid mapping when not needed in iris_resource_init_aux_buf()

We might not be able to map all vram buffers in the future, so only
map the buffer when actually required.

Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17349>

---

 src/gallium/drivers/iris/iris_resource.c | 41 +++++++++++++++++++++++---------
 1 file changed, 30 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c
index f4c8df376c0..4ba93709f38 100644
--- a/src/gallium/drivers/iris/iris_resource.c
+++ b/src/gallium/drivers/iris/iris_resource.c
@@ -914,26 +914,45 @@ static bool
 iris_resource_init_aux_buf(struct iris_screen *screen,
                            struct iris_resource *res)
 {
-   void *map = iris_bo_map(NULL, res->bo, MAP_WRITE | MAP_RAW);
+   void *map = NULL;
 
-   if (!map)
-      return false;
+   if (iris_resource_get_aux_state(res, 0, 0) != ISL_AUX_STATE_AUX_INVALID &&
+       res->aux.surf.size_B > 0) {
+      if (!map)
+         map = iris_bo_map(NULL, res->bo, MAP_WRITE | MAP_RAW);
+      if (!map)
+         return false;
 
-   if (iris_resource_get_aux_state(res, 0, 0) != ISL_AUX_STATE_AUX_INVALID) {
       /* See iris_resource_configure_aux for the memset_value rationale. */
       uint8_t memset_value = isl_aux_usage_has_mcs(res->aux.usage) ? 0xFF : 0;
       memset((char*)map + res->aux.offset, memset_value,
              res->aux.surf.size_B);
    }
 
-   memset((char*)map + res->aux.extra_aux.offset,
-          0, res->aux.extra_aux.surf.size_B);
+   if (res->aux.extra_aux.surf.size_B > 0) {
+      if (!map)
+         map = iris_bo_map(NULL, res->bo, MAP_WRITE | MAP_RAW);
+      if (!map)
+         return false;
 
-   /* Zero the indirect clear color to match ::fast_clear_color. */
-   memset((char *)map + res->aux.clear_color_offset, 0,
-          iris_get_aux_clear_color_state_size(screen, res));
+      memset((char*)map + res->aux.extra_aux.offset,
+             0, res->aux.extra_aux.surf.size_B);
+   }
 
-   iris_bo_unmap(res->bo);
+   unsigned clear_color_size =
+      iris_get_aux_clear_color_state_size(screen, res);
+   if (clear_color_size > 0) {
+      if (!map)
+         map = iris_bo_map(NULL, res->bo, MAP_WRITE | MAP_RAW);
+      if (!map)
+         return false;
+
+      /* Zero the indirect clear color to match ::fast_clear_color. */
+      memset((char *)map + res->aux.clear_color_offset, 0, clear_color_size);
+   }
+
+   if (map)
+      iris_bo_unmap(res->bo);
 
    if (res->aux.surf.size_B > 0) {
       res->aux.bo = res->bo;
@@ -941,7 +960,7 @@ iris_resource_init_aux_buf(struct iris_screen *screen,
       map_aux_addresses(screen, res, res->internal_format, 0);
    }
 
-   if (iris_get_aux_clear_color_state_size(screen, res) > 0) {
+   if (clear_color_size > 0) {
       res->aux.clear_color_bo = res->bo;
       iris_bo_reference(res->aux.clear_color_bo);
    }



More information about the mesa-commit mailing list