On 06.06.2016 16:16, Nicolai Hähnle wrote:
Patches 1 & 2:

Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>

Hold off on patch #2 - how does this work together with shader image writes? Then we're in an ugly situation where the other process could write to DCC, but we still need to decompress while the texture is bound as a shader image? That doesn't sound good to me...

Nicolai


On 03.06.2016 12:52, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com>

We don't import textures with DCC now, but soon we will.
---
  src/gallium/drivers/radeon/r600_pipe_common.h |  2 +-
  src/gallium/drivers/radeon/r600_texture.c     | 31
+++++++++++++++++++--------
  2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h
b/src/gallium/drivers/radeon/r600_pipe_common.h
index 8072833..2d60da4 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -676,7 +676,7 @@ void evergreen_do_fast_color_clear(struct
r600_common_context *rctx,
                     struct r600_atom *fb_state,
                     unsigned *buffers, unsigned *dirty_cbufs,
                     const union pipe_color_union *color);
-void r600_texture_disable_dcc(struct r600_common_screen *rscreen,
+bool r600_texture_disable_dcc(struct r600_common_screen *rscreen,
                    struct r600_texture *rtex);
  void r600_init_screen_texture_functions(struct r600_common_screen
*rscreen);
  void r600_init_context_texture_functions(struct r600_common_context
*rctx);
diff --git a/src/gallium/drivers/radeon/r600_texture.c
b/src/gallium/drivers/radeon/r600_texture.c
index 71758c4..0f5c08f 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -32,7 +32,7 @@
  #include <errno.h>
  #include <inttypes.h>

-static void r600_texture_discard_dcc(struct r600_common_screen *rscreen,
+static bool r600_texture_discard_dcc(struct r600_common_screen *rscreen,
                       struct r600_texture *rtex);
  static void r600_texture_discard_cmask(struct r600_common_screen
*rscreen,
                         struct r600_texture *rtex);
@@ -86,7 +86,8 @@ bool r600_prepare_for_dma_blit(struct
r600_common_context *rctx,
                                src_box->height, src_box->depth))
              return false;

-        r600_texture_discard_dcc(rctx->screen, rdst);
+        if (!r600_texture_discard_dcc(rctx->screen, rdst))
+            return false;
      }

      /* CMASK as:
@@ -376,25 +377,37 @@ static void r600_texture_discard_cmask(struct
r600_common_screen *rscreen,
      p_atomic_inc(&rscreen->compressed_colortex_counter);
  }

-static void r600_texture_discard_dcc(struct r600_common_screen *rscreen,
+static bool r600_can_disable_dcc(struct r600_texture *rtex)
+{
+    /* We can't disable DCC if it can be written by another process. */
+    return rtex->dcc_offset &&
+           (!rtex->resource.is_shared ||
+        !(rtex->resource.external_usage & PIPE_HANDLE_USAGE_WRITE));
+}
+
+static bool r600_texture_discard_dcc(struct r600_common_screen *rscreen,
                       struct r600_texture *rtex)
  {
+    if (!r600_can_disable_dcc(rtex))
+        return false;
+
      /* Disable DCC. */
      rtex->dcc_offset = 0;
      rtex->cb_color_info &= ~VI_S_028C70_DCC_ENABLE(1);

      /* Notify all contexts about the change. */
      r600_dirty_all_framebuffer_states(rscreen);
+    return true;
  }

-void r600_texture_disable_dcc(struct r600_common_screen *rscreen,
+bool r600_texture_disable_dcc(struct r600_common_screen *rscreen,
                    struct r600_texture *rtex)
  {
      struct r600_common_context *rctx =
          (struct r600_common_context *)rscreen->aux_context;

-    if (!rtex->dcc_offset)
-        return;
+    if (!r600_can_disable_dcc(rtex))
+        return false;

      /* Decompress DCC. */
      pipe_mutex_lock(rscreen->aux_context_lock);
@@ -402,7 +415,7 @@ void r600_texture_disable_dcc(struct
r600_common_screen *rscreen,
      rctx->b.flush(&rctx->b, NULL, 0);
      pipe_mutex_unlock(rscreen->aux_context_lock);

-    r600_texture_discard_dcc(rscreen, rtex);
+    return r600_texture_discard_dcc(rscreen, rtex);
  }

  static void r600_degrade_tile_mode_to_linear(struct
r600_common_context *rctx,
@@ -497,8 +510,8 @@ static boolean r600_texture_get_handle(struct
pipe_screen* screen,
           * access.
           */
          if (usage & PIPE_HANDLE_USAGE_WRITE && rtex->dcc_offset) {
-            r600_texture_disable_dcc(rscreen, rtex);
-            update_metadata = true;
+            if (r600_texture_disable_dcc(rscreen, rtex))
+                update_metadata = true;
          }

          if (!(usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH) &&

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to