i965: in set_read_rb_tex_image() check _mesa_meta_bind_rb_as_tex_image() did succeed
authorJuha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
Wed, 28 May 2014 10:28:58 +0000 (13:28 +0300)
committerTapani Pälli <tapani.palli@intel.com>
Tue, 23 Sep 2014 07:25:02 +0000 (10:25 +0300)
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 <juhapekka.heikkila@gmail.com>
Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
src/mesa/drivers/common/meta_blit.c
src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c

index fc9848a7acd4398491e8da2cdd943aff8c61fdaa..3cd06a5f527041adfc0079298a7950e2bd2fa2c5 100644 (file)
@@ -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);
index 0b4742693db23bc494ea532b34b760f4d616a3ff..b9b481b90eb663b9ce54b80b4d541c64798568ca 100644 (file)
@@ -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);