[Mesa-dev] [PATCH 11/12] i965/gen7+: Disable fast color clears on shared regions.

Paul Berry stereotype441 at gmail.com
Tue May 21 16:52:15 PDT 2013


In certain circumstances the memory region underlying a miptree is
shared with other miptrees, or with other code outside Mesa's control.
This happens, for instance, when an extension like GL_OES_EGL_image or
GLX_EXT_texture_from_pixmap extension is used to associate a miptree
with an image existing outside of Mesa.

When this happens, we need to disable fast color clears on the miptree
in question, since there's no good synchronization mechanism to ensure
that deferred clear writes get performed by the time the buffer is
examined from the other miptree, or from outside of Mesa.

Fortunately, this should not be a performance hit for most
applications, since most applications that use these extensions use
them for importing textures into Mesa, rather than for exporting
rendered images out of Mesa.  So most of the time the miptrees
involved will never experience a clear.
---
 src/mesa/drivers/dri/intel/intel_mipmap_tree.h | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.h b/src/mesa/drivers/dri/intel/intel_mipmap_tree.h
index 56e5c88..9829462 100644
--- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.h
+++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.h
@@ -805,9 +805,14 @@ intel_miptree_get_region(struct intel_context *intel,
       intel_miptree_resolve_color(intel, mt);
       break;
    case INTEL_MIPTREE_ACCESS_SHARED:
-      /* TODO: resolve and then discard MCS buffer since fast color clears are
-       * unsafe with shared buffers.
+      /* Fast color clears are unsafe with shared buffers, so resolve and then
+       * discard the MCS buffer, if present.  Also set the mcs_state to
+       * INTEL_MCS_STATE_NONE to ensure that no MCS buffer gets allocated in
+       * the future.
        */
+      intel_miptree_resolve_color(intel, mt);
+      intel_miptree_release(&mt->mcs_mt);
+      mt->mcs_state = INTEL_MCS_STATE_NONE;
       break;
    case INTEL_MIPTREE_ACCESS_RENDER:
       /* If the buffer was previously in fast clear state, change it to
-- 
1.8.2.3



More information about the mesa-dev mailing list