From a82b29d52627c0b0a35efa437c4d81aaaafbbe0c Mon Sep 17 00:00:00 2001 From: Juha-Pekka Heikkila Date: Wed, 28 May 2014 13:28:58 +0300 Subject: [PATCH] i965: in set_read_rb_tex_image() check _mesa_meta_bind_rb_as_tex_image() did succeed Check if _mesa_meta_bind_rb_as_tex_image() did give the texture. If no texture was given there is already either GL_INVALID_VALUE or GL_OUT_OF_MEMORY error set in context. Signed-off-by: Juha-Pekka Heikkila Reviewed-by: Topi Pohjolainen --- src/mesa/drivers/common/meta_blit.c | 9 ++++++++- src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c | 14 ++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/mesa/drivers/common/meta_blit.c b/src/mesa/drivers/common/meta_blit.c index fc9848a..3cd06a5 100644 --- a/src/mesa/drivers/common/meta_blit.c +++ b/src/mesa/drivers/common/meta_blit.c @@ -624,13 +624,20 @@ _mesa_meta_bind_rb_as_tex_image(struct gl_context *ctx, GLenum *target) { struct gl_texture_image *texImage; + GLuint tempTex; if (rb->NumSamples > 1) *target = GL_TEXTURE_2D_MULTISAMPLE; else *target = GL_TEXTURE_2D; - _mesa_GenTextures(1, tex); + tempTex = 0; + _mesa_GenTextures(1, &tempTex); + if (tempTex == 0) + return false; + + *tex = tempTex; + _mesa_BindTexture(*target, *tex); *texObj = _mesa_lookup_texture(ctx, *tex); texImage = _mesa_get_tex_image(ctx, *texObj, *target, 0); diff --git a/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c b/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c index 0b47426..b9b481b 100644 --- a/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c +++ b/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c @@ -371,7 +371,7 @@ prepare_vertex_data(void) _mesa_BufferSubData(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts); } -static void +static bool set_read_rb_tex_image(struct gl_context *ctx, struct fb_tex_blit_state *blit, GLenum *target) { @@ -387,8 +387,10 @@ set_read_rb_tex_image(struct gl_context *ctx, struct fb_tex_blit_state *blit, *target = tex_obj->Target; level = att->TextureLevel; } else { - _mesa_meta_bind_rb_as_tex_image(ctx, rb, &blit->tempTex, &tex_obj, - target); + if (!_mesa_meta_bind_rb_as_tex_image(ctx, rb, &blit->tempTex, &tex_obj, + target)) { + return false; + } } blit->baseLevelSave = tex_obj->BaseLevel; @@ -396,6 +398,7 @@ set_read_rb_tex_image(struct gl_context *ctx, struct fb_tex_blit_state *blit, blit->stencilSamplingSave = tex_obj->StencilSampling; blit->sampler = _mesa_meta_setup_sampler(ctx, tex_obj, *target, GL_NEAREST, level); + return true; } static void @@ -424,7 +427,9 @@ brw_meta_stencil_blit(struct brw_context *brw, _mesa_DrawBuffer(GL_COLOR_ATTACHMENT0); ctx->DrawBuffer->_Status = GL_FRAMEBUFFER_COMPLETE; - set_read_rb_tex_image(ctx, &blit, &target); + if (!set_read_rb_tex_image(ctx, &blit, &target)) { + goto error; + } _mesa_TexParameteri(target, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX); @@ -445,6 +450,7 @@ brw_meta_stencil_blit(struct brw_context *brw, _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4); +error: _mesa_meta_fb_tex_blit_end(ctx, target, &blit); _mesa_meta_end(ctx); -- 2.7.4