diff options
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 19 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_screen.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_tex.h | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_tex_image.c | 63 |
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, |