aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mesa/drivers/dri/i965/intel_mipmap_tree.c19
-rw-r--r--src/mesa/drivers/dri/i965/intel_mipmap_tree.h3
-rw-r--r--src/mesa/drivers/dri/i965/intel_screen.c2
-rw-r--r--src/mesa/drivers/dri/i965/intel_tex.h2
-rw-r--r--src/mesa/drivers/dri/i965/intel_tex_image.c63
5 files changed, 87 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
index 819c36b2135..c6213b21629 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
@@ -2796,6 +2796,25 @@ intel_miptree_prepare_external(struct brw_context *brw,
aux_usage, supports_fast_clear);
}
+void
+intel_miptree_finish_external(struct brw_context *brw,
+ struct intel_mipmap_tree *mt)
+{
+ if (!mt->mcs_buf)
+ return;
+
+ /* We don't know the actual aux state of the aux surface. The previous
+ * owner could have given it to us in a number of different states.
+ * Because we don't know the aux state, we reset the aux state to the
+ * least common denominator of possible valid states.
+ */
+ enum isl_aux_state default_aux_state =
+ isl_drm_modifier_get_default_aux_state(mt->drm_modifier);
+ assert(mt->last_level == mt->first_level);
+ intel_miptree_set_aux_state(brw, mt, 0, 0, INTEL_REMAINING_LAYERS,
+ default_aux_state);
+}
+
/**
* Make it possible to share the BO backing the given miptree with another
* process or another miptree.
diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
index 7fcf09f118a..07c85807e80 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
@@ -675,6 +675,9 @@ intel_miptree_finish_depth(struct brw_context *brw,
void
intel_miptree_prepare_external(struct brw_context *brw,
struct intel_mipmap_tree *mt);
+void
+intel_miptree_finish_external(struct brw_context *brw,
+ struct intel_mipmap_tree *mt);
void
intel_miptree_make_shareable(struct brw_context *brw,
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index ef5aee894fa..1f9b0efa42f 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -130,7 +130,7 @@ static const __DRItexBufferExtension intelTexBufferExtension = {
.setTexBuffer = intelSetTexBuffer,
.setTexBuffer2 = intelSetTexBuffer2,
- .releaseTexBuffer = NULL,
+ .releaseTexBuffer = intelReleaseTexBuffer,
};
static void
diff --git a/src/mesa/drivers/dri/i965/intel_tex.h b/src/mesa/drivers/dri/i965/intel_tex.h
index 9fb1b3ffbc4..4c48875f820 100644
--- a/src/mesa/drivers/dri/i965/intel_tex.h
+++ b/src/mesa/drivers/dri/i965/intel_tex.h
@@ -43,6 +43,8 @@ void intelSetTexBuffer(__DRIcontext *pDRICtx,
GLint target, __DRIdrawable *pDraw);
void intelSetTexBuffer2(__DRIcontext *pDRICtx,
GLint target, GLint format, __DRIdrawable *pDraw);
+void intelReleaseTexBuffer(__DRIcontext *pDRICtx, GLint target,
+ __DRIdrawable *dPriv);
struct intel_mipmap_tree *
intel_miptree_create_for_teximage(struct brw_context *brw,
diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c b/src/mesa/drivers/dri/i965/intel_tex_image.c
index 8c4e0da5a05..e25bc9a0c08 100644
--- a/src/mesa/drivers/dri/i965/intel_tex_image.c
+++ b/src/mesa/drivers/dri/i965/intel_tex_image.c
@@ -487,7 +487,7 @@ intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
internal_format = GL_RGB;
}
- intel_miptree_make_shareable(brw, rb->mt);
+ intel_miptree_finish_external(brw, rb->mt);
_mesa_lock_texture(&brw->ctx, texObj);
texImage = _mesa_get_tex_image(ctx, texObj, target, 0);
@@ -496,6 +496,67 @@ intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
_mesa_unlock_texture(&brw->ctx, texObj);
}
+void
+intelReleaseTexBuffer(__DRIcontext *pDRICtx, GLint target,
+ __DRIdrawable *dPriv)
+{
+ struct brw_context *brw = pDRICtx->driverPrivate;
+ struct gl_context *ctx = &brw->ctx;
+ struct gl_texture_object *tex_obj;
+ struct intel_texture_object *intel_tex;
+
+ tex_obj = _mesa_get_current_tex_object(ctx, target);
+ if (!tex_obj)
+ return;
+
+ _mesa_lock_texture(&brw->ctx, tex_obj);
+
+ intel_tex = intel_texture_object(tex_obj);
+ if (!intel_tex->mt) {
+ _mesa_unlock_texture(&brw->ctx, tex_obj);
+ return;
+ }
+
+ /* The intel_miptree_prepare_external below as well as the finish_external
+ * above in intelSetTexBuffer2 *should* do nothing. The BindTexImage call
+ * from both GLX and EGL has TexImage2D and not TexSubImage2D semantics so
+ * the texture is not immutable. This means that the user cannot create a
+ * texture view of the image with a different format. Since the only three
+ * formats available when using BindTexImage are all UNORM, we can never
+ * end up with an sRGB format being used for texturing and so we shouldn't
+ * get any format-related resolves when texturing from it.
+ *
+ * While very unlikely, it is possible that the client could use the bound
+ * texture with GL_ARB_image_load_store. In that case, we'll do a resolve
+ * but that's not actually a problem as it just means that we lose
+ * compression on this texture until the next time it's used as a render
+ * target.
+ *
+ * The only other way we could end up with an unexpected aux usage would be
+ * if we rendered to the image from the same context as we have it bound as
+ * a texture between BindTexImage and ReleaseTexImage. However, the spec
+ * clearly calls this case out and says you shouldn't do that. It doesn't
+ * explicitly prevent binding the texture to a framebuffer but it says the
+ * results of trying to render to it while bound are undefined.
+ *
+ * Just to keep everything safe and sane, we do a prepare_external but it
+ * should be a no-op in almost all cases. On the off chance that someone
+ * ever triggers this, we should at least warn them.
+ */
+ if (intel_tex->mt->mcs_buf &&
+ intel_miptree_get_aux_state(intel_tex->mt, 0, 0) !=
+ isl_drm_modifier_get_default_aux_state(intel_tex->mt->drm_modifier)) {
+ _mesa_warning(ctx, "Aux state changed between BindTexImage and "
+ "ReleaseTexImage. Most likely someone tried to draw "
+ "to the pixmap bound in BindTexImage or used it with "
+ "image_load_store.");
+ }
+
+ intel_miptree_prepare_external(brw, intel_tex->mt);
+
+ _mesa_unlock_texture(&brw->ctx, tex_obj);
+}
+
static GLboolean
intel_bind_renderbuffer_tex_image(struct gl_context *ctx,
struct gl_renderbuffer *rb,