[Mesa-dev] [PATCH 2/4] st/mesa: check of out-of-memory in st_DrawPixels()

Brian Paul brianp at vmware.com
Fri Oct 16 15:20:17 PDT 2015


On 10/16/2015 04:11 PM, Jose Fonseca wrote:
> On 15/10/15 20:01, Brian Paul wrote:
>> Before, if make_texture() or st_create_texture_sampler_view() failed
>> we silently no-op'd the glDrawPixels.  Now, set GL_OUT_OF_MEMORY.
>> This also allows us to un-nest a bunch of code.
>> ---
>>   src/mesa/state_tracker/st_cb_drawpixels.c | 74
>> +++++++++++++++++--------------
>>   1 file changed, 40 insertions(+), 34 deletions(-)
>>
>> diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c
>> b/src/mesa/state_tracker/st_cb_drawpixels.c
>> index e4d3580..05f6e6b 100644
>> --- a/src/mesa/state_tracker/st_cb_drawpixels.c
>> +++ b/src/mesa/state_tracker/st_cb_drawpixels.c
>> @@ -975,6 +975,7 @@ st_DrawPixels(struct gl_context *ctx, GLint x,
>> GLint y,
>>      int num_sampler_view = 1;
>>      struct gl_pixelstore_attrib clippedUnpack;
>>      struct st_fp_variant *fpv = NULL;
>> +   struct pipe_resource *pt;
>>
>>      /* Mesa state should be up to date by now */
>>      assert(ctx->NewState == 0x0);
>> @@ -1030,42 +1031,47 @@ st_DrawPixels(struct gl_context *ctx, GLint x,
>> GLint y,
>>         st_upload_constants(st, fpv->parameters, PIPE_SHADER_FRAGMENT);
>>      }
>>
>> -   /* draw with textured quad */
>> -   {
>> -      struct pipe_resource *pt
>> -         = make_texture(st, width, height, format, type, unpack,
>> pixels);
>> -      if (pt) {
>> -         sv[0] = st_create_texture_sampler_view(st->pipe, pt);
>> -
>> -         if (sv[0]) {
>> -            /* Create a second sampler view to read stencil.
>> -             * The stencil is written using the shader stencil export
>> -             * functionality. */
>> -            if (write_stencil) {
>> -               enum pipe_format stencil_format =
>> -                     util_format_stencil_only(pt->format);
>> -               /* we should not be doing pixel map/transfer (see
>> above) */
>> -               assert(num_sampler_view == 1);
>> -               sv[1] =
>> st_create_texture_sampler_view_format(st->pipe, pt,
>> -
>> stencil_format);
>> -               num_sampler_view++;
>> -            }
>> +   /* Put glDrawPixels image into a texture */
>> +   pt = make_texture(st, width, height, format, type, unpack, pixels);
>> +   if (!pt) {
>> +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glDrawPixels");
>> +      return;
>> +   }
>>
>> -            draw_textured_quad(ctx, x, y, ctx->Current.RasterPos[2],
>> -                               width, height,
>> -                               ctx->Pixel.ZoomX, ctx->Pixel.ZoomY,
>> -                               sv,
>> -                               num_sampler_view,
>> -                               driver_vp,
>> -                               driver_fp, fpv,
>> -                               color, GL_FALSE, write_depth,
>> write_stencil);
>> -            pipe_sampler_view_reference(&sv[0], NULL);
>> -            if (num_sampler_view > 1)
>> -               pipe_sampler_view_reference(&sv[1], NULL);
>> -         }
>> -         pipe_resource_reference(&pt, NULL);
>> -      }
>> +   /* create sampler view for the image */
>> +   sv[0] = st_create_texture_sampler_view(st->pipe, pt);
>> +   if (!sv[0]) {
>> +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glDrawPixels");
>> +      pipe_resource_reference(&pt, NULL);
>> +      return;
>>      }
>> +
>> +   /* Create a second sampler view to read stencil.  The stencil is
>> +    * written using the shader stencil export functionality.
>> +    */
>> +   if (write_stencil) {
>> +      enum pipe_format stencil_format =
>> +         util_format_stencil_only(pt->format);
>> +      /* we should not be doing pixel map/transfer (see above) */
>> +      assert(num_sampler_view == 1);
>> +      sv[1] = st_create_texture_sampler_view_format(st->pipe, pt,
>> +                                                    stencil_format);
>
> Should check null sv[1] here too.

Yes, I'll post a v2.

-Brian




More information about the mesa-dev mailing list