[Mesa-dev] [PATCH 08/10] i965: implement DRIImage::createImageFromRenderbuffer2

Eric Engestrom eric.engestrom at imgtec.com
Tue Oct 17 10:29:52 UTC 2017


On Monday, 2017-10-16 16:04:10 +0000, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov at collabora.com>
> 
> The new entry point has a way to feedback the error. Thus we no longer
> need to call _mesa_error() but instead we can pass the correct value.
> 
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> ---
>  src/mesa/drivers/dri/i965/intel_screen.c | 31 ++++++++++++++++++++++++++-----
>  1 file changed, 26 insertions(+), 5 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
> index ea04a72e860..7cbb5e3b060 100644
> --- a/src/mesa/drivers/dri/i965/intel_screen.c
> +++ b/src/mesa/drivers/dri/i965/intel_screen.c
> @@ -474,8 +474,9 @@ intel_create_image_from_name(__DRIscreen *dri_screen,
>  }
>  
>  static __DRIimage *
> -intel_create_image_from_renderbuffer(__DRIcontext *context,
> -				     int renderbuffer, void *loaderPrivate)
> +intel_create_image_from_renderbuffer2(__DRIcontext *context,
> +				      int renderbuffer, void *loaderPrivate,
> +				      unsigned *error)
>  {
>     __DRIimage *image;
>     struct brw_context *brw = context->driverPrivate;
> @@ -485,15 +486,17 @@ intel_create_image_from_renderbuffer(__DRIcontext *context,
>  
>     rb = _mesa_lookup_renderbuffer(ctx, renderbuffer);
>     if (!rb) {
> -      _mesa_error(ctx, GL_INVALID_OPERATION, "glRenderbufferExternalMESA");
> +      *error = __DRI_IMAGE_ERROR_BAD_PARAMETER;
>        return NULL;
>     }

[there]

>  
>     irb = intel_renderbuffer(rb);
>     intel_miptree_make_shareable(brw, irb->mt);
>     image = calloc(1, sizeof *image);
> -   if (image == NULL)
> +   if (image == NULL) {
> +      *error = __DRI_IMAGE_ERROR_BAD_ALLOC;
>        return NULL;
> +   }
>  
>     image->internal_format = rb->InternalFormat;
>     image->format = rb->Format;
> @@ -508,12 +511,29 @@ intel_create_image_from_renderbuffer(__DRIcontext *context,
>     image->height = rb->Height;
>     image->pitch = irb->mt->surf.row_pitch;
>     image->dri_format = driGLFormatToImageFormat(image->format);
> +   if (image->dri_format == __DRI_IMAGE_FORMAT_NONE) {

__DRI_IMAGE_FORMAT_NONE can only come from MESA_FORMAT_NONE; did you
mean `== 0`? Or both?

> +      *error = __DRI_IMAGE_ERROR_BAD_PARAMETER;
> +      brw_bo_unreference(irb->mt->bo);
> +      free(image);
> +      return NULL;
> +   }

You can move this check before the calloc and ref ([there] above), so
that the error path becomes just setting `error` and returning NULL.

You'll want a temp var to avoid calling driGLFormatToImageFormat()
twice:
	uint32_t dri_format = driGLFormatToImageFormat(rb->Format);

> +
>     image->has_depthstencil = irb->mt->stencil_mt? true : false;
>  
>     rb->NeedsFinishRenderTexture = true;
> +   *error = __DRI_IMAGE_ERROR_SUCCESS;
>     return image;
>  }
>  
> +static __DRIimage *
> +intel_create_image_from_renderbuffer(__DRIcontext *context,
> +				     int renderbuffer, void *loaderPrivate)
> +{
> +   unsigned error;
> +   return intel_create_image_from_renderbuffer2(context, renderbuffer,
> +                                                loaderPrivate, &error);

	if (error == __DRI_IMAGE_ERROR_BAD_PARAMETER)
		_mesa_error(ctx, GL_INVALID_OPERATION, "glRenderbufferExternalMESA");

(maybe even `if (error != __DRI_IMAGE_ERROR_SUCCESS)`?)

> +}
> +
>  static __DRIimage *
>  intel_create_image_from_texture(__DRIcontext *context, int target,
>                                  unsigned texture, int zoffset,
> @@ -1289,7 +1309,7 @@ intel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate)
>  }
>  
>  static const __DRIimageExtension intelImageExtension = {
> -    .base = { __DRI_IMAGE, 16 },
> +    .base = { __DRI_IMAGE, 17 },
>  
>      .createImageFromName                = intel_create_image_from_name,
>      .createImageFromRenderbuffer        = intel_create_image_from_renderbuffer,
> @@ -1312,6 +1332,7 @@ static const __DRIimageExtension intelImageExtension = {
>      .queryDmaBufFormats                 = intel_query_dma_buf_formats,
>      .queryDmaBufModifiers               = intel_query_dma_buf_modifiers,
>      .queryDmaBufFormatModifierAttribs   = intel_query_format_modifier_attribs,
> +    .createImageFromRenderbuffer2       = intel_create_image_from_renderbuffer2,
>  };
>  
>  static uint64_t
> -- 
> 2.14.1
> 


More information about the mesa-dev mailing list