From 52f9ccefcb75a9d42307890d7714b1cd92e864cb Mon Sep 17 00:00:00 2001 From: Michal Srb Date: Tue, 28 Mar 2017 23:39:28 +0300 Subject: [PATCH] st: Add cubeMapFace parameter to st_finalize_texture. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit st_finalize_texture always accesses image at face 0, but it may not be set if we are working with cubemap that had other face set. This fixes crash in piglit same-attachment-glFramebufferTexture2D-GL_DEPTH_STENCIL_ATTACHMENT. Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Nicolai Hähnle --- src/gallium/state_trackers/dri/dri2.c | 2 +- src/mesa/state_tracker/st_atom_image.c | 2 +- src/mesa/state_tracker/st_atom_texture.c | 2 +- src/mesa/state_tracker/st_cb_fbo.c | 2 +- src/mesa/state_tracker/st_cb_texture.c | 5 +++-- src/mesa/state_tracker/st_cb_texture.h | 3 ++- src/mesa/state_tracker/st_gen_mipmap.c | 2 +- 7 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index b50e0964431..ed6004f836d 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -1808,7 +1808,7 @@ dri2_interop_export_object(__DRIcontext *_ctx, return MESA_GLINTEROP_INVALID_MIP_LEVEL; } - if (!st_finalize_texture(ctx, st->pipe, obj)) { + if (!st_finalize_texture(ctx, st->pipe, obj, 0)) { mtx_unlock(&ctx->Shared->Mutex); return MESA_GLINTEROP_OUT_OF_RESOURCES; } diff --git a/src/mesa/state_tracker/st_atom_image.c b/src/mesa/state_tracker/st_atom_image.c index 5dd2cd64f90..4101552dff4 100644 --- a/src/mesa/state_tracker/st_atom_image.c +++ b/src/mesa/state_tracker/st_atom_image.c @@ -64,7 +64,7 @@ st_bind_images(struct st_context *st, struct gl_program *prog, struct pipe_image_view *img = &images[i]; if (!_mesa_is_image_unit_valid(st->ctx, u) || - !st_finalize_texture(st->ctx, st->pipe, u->TexObj) || + !st_finalize_texture(st->ctx, st->pipe, u->TexObj, 0) || !stObj->pt) { memset(img, 0, sizeof(*img)); continue; diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c index 92023e0dc3a..5b481ec4344 100644 --- a/src/mesa/state_tracker/st_atom_texture.c +++ b/src/mesa/state_tracker/st_atom_texture.c @@ -73,7 +73,7 @@ update_single_texture(struct st_context *st, } stObj = st_texture_object(texObj); - retval = st_finalize_texture(ctx, st->pipe, texObj); + retval = st_finalize_texture(ctx, st->pipe, texObj, 0); if (!retval) { /* out of mem */ return GL_FALSE; diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c index 78433bff046..dce4239438a 100644 --- a/src/mesa/state_tracker/st_cb_fbo.c +++ b/src/mesa/state_tracker/st_cb_fbo.c @@ -488,7 +488,7 @@ st_render_texture(struct gl_context *ctx, struct st_renderbuffer *strb = st_renderbuffer(rb); struct pipe_resource *pt; - if (!st_finalize_texture(ctx, pipe, att->Texture)) + if (!st_finalize_texture(ctx, pipe, att->Texture, att->CubeMapFace)) return; pt = st_get_texobj_resource(att->Texture); diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index bc6f108a860..1b486d7c3c8 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -2434,7 +2434,8 @@ copy_image_data_to_texture(struct st_context *st, GLboolean st_finalize_texture(struct gl_context *ctx, struct pipe_context *pipe, - struct gl_texture_object *tObj) + struct gl_texture_object *tObj, + GLuint cubeMapFace) { struct st_context *st = st_context(ctx); struct st_texture_object *stObj = st_texture_object(tObj); @@ -2478,7 +2479,7 @@ st_finalize_texture(struct gl_context *ctx, } - firstImage = st_texture_image_const(_mesa_base_tex_image(&stObj->base)); + firstImage = st_texture_image_const(stObj->base.Image[cubeMapFace][stObj->base.BaseLevel]); assert(firstImage); /* If both firstImage and stObj point to a texture which can contain diff --git a/src/mesa/state_tracker/st_cb_texture.h b/src/mesa/state_tracker/st_cb_texture.h index 415d59ffe98..f647b16c8dc 100644 --- a/src/mesa/state_tracker/st_cb_texture.h +++ b/src/mesa/state_tracker/st_cb_texture.h @@ -47,7 +47,8 @@ st_get_blit_mask(GLenum srcFormat, GLenum dstFormat); extern GLboolean st_finalize_texture(struct gl_context *ctx, struct pipe_context *pipe, - struct gl_texture_object *tObj); + struct gl_texture_object *tObj, + GLuint cubeMapFace); extern void diff --git a/src/mesa/state_tracker/st_gen_mipmap.c b/src/mesa/state_tracker/st_gen_mipmap.c index 10af11e17b4..16b914a8845 100644 --- a/src/mesa/state_tracker/st_gen_mipmap.c +++ b/src/mesa/state_tracker/st_gen_mipmap.c @@ -125,7 +125,7 @@ st_generate_mipmap(struct gl_context *ctx, GLenum target, * * After this, we'll have all mipmap levels in one resource. */ - st_finalize_texture(ctx, st->pipe, texObj); + st_finalize_texture(ctx, st->pipe, texObj, 0); } pt = stObj->pt; -- 2.30.2