[Mesa-dev] [PATCH v2 3/5] gallium: Implement DRIimageExtension.duplicateImage
Jakob Bornecrantz
wallbraker at gmail.com
Sun Mar 3 07:52:32 PST 2013
On Sun, Mar 3, 2013 at 7:03 AM, John Kåre Alsaker
<john.kare.alsaker at gmail.com> wrote:
> ---
> src/gallium/include/state_tracker/st_api.h | 1 +
> src/gallium/state_trackers/dri/common/dri_screen.c | 1 +
> src/gallium/state_trackers/dri/common/dri_screen.h | 1 +
> src/gallium/state_trackers/dri/drm/dri2.c | 39 +++++++++++++++++++++-
> src/mesa/state_tracker/st_manager.c | 4 +++
> 5 files changed, 45 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h
> index 9f3d2a1..1e63ed3 100644
> --- a/src/gallium/include/state_tracker/st_api.h
> +++ b/src/gallium/include/state_tracker/st_api.h
> @@ -203,6 +203,7 @@ struct st_egl_image
> {
> /* this is owned by the caller */
> struct pipe_resource *texture;
> + enum pipe_format format;
>
> unsigned level;
> unsigned layer;
> diff --git a/src/gallium/state_trackers/dri/common/dri_screen.c b/src/gallium/state_trackers/dri/common/dri_screen.c
> index a908e28..92abaf9 100644
> --- a/src/gallium/state_trackers/dri/common/dri_screen.c
> +++ b/src/gallium/state_trackers/dri/common/dri_screen.c
> @@ -315,6 +315,7 @@ dri_get_egl_image(struct st_manager *smapi,
>
> stimg->texture = NULL;
> pipe_resource_reference(&stimg->texture, img->texture);
> + stimg->format = img->format;
> stimg->level = img->level;
> stimg->layer = img->layer;
>
> diff --git a/src/gallium/state_trackers/dri/common/dri_screen.h b/src/gallium/state_trackers/dri/common/dri_screen.h
> index 181b22f..d37c393 100644
> --- a/src/gallium/state_trackers/dri/common/dri_screen.h
> +++ b/src/gallium/state_trackers/dri/common/dri_screen.h
> @@ -84,6 +84,7 @@ dri_screen(__DRIscreen * sPriv)
>
> struct __DRIimageRec {
> struct pipe_resource *texture;
> + enum pipe_format format;
> unsigned level;
> unsigned layer;
> uint32_t dri_format;
> diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
> index f8d311c..54339fe 100644
> --- a/src/gallium/state_trackers/dri/drm/dri2.c
> +++ b/src/gallium/state_trackers/dri/drm/dri2.c
> @@ -658,6 +658,7 @@ dri2_dup_image(__DRIimage *image, void *loaderPrivate)
> pipe_resource_reference(&img->texture, image->texture);
> img->level = image->level;
> img->layer = image->layer;
> + img->format = image->format;
> /* This should be 0 for sub images, but dup is also used for base images. */
> img->dri_components = image->dri_components;
> img->loader_private = loaderPrivate;
> @@ -749,6 +750,40 @@ dri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate)
> return img;
> }
>
> +static __DRIimage *
> +dri2_duplicate_image(__DRIscreen *_screen, __DRIimage *image,
> + unsigned int flags, void *loaderPrivate)
> +{
> + enum pipe_format format;
> + struct dri_screen *screen = dri_screen(_screen);
> + __DRIimage *img = NULL;
> +
> + if((flags & __DRI_IMAGE_FLAG_SRGB_VIEW) && (flags & __DRI_IMAGE_FLAG_LINEAR_VIEW))
> + return NULL;
> +
> + if(flags & (__DRI_IMAGE_FLAG_SRGB_VIEW | __DRI_IMAGE_FLAG_LINEAR_VIEW)) {
> + if(!image->texture)
> + return NULL;
> +
> + if(flags & __DRI_IMAGE_FLAG_SRGB_VIEW)
> + format = util_format_srgb(image->texture->format);
> + else
> + format = util_format_linear(image->texture->format);
> +
> + if(!screen->base.screen->is_format_supported(screen->base.screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW))
> + return NULL;
> +
> + img = dri2_dup_image(image, loaderPrivate);
> +
> + if (img)
> + img->format = format;
> + } else if (flags == 0) {
> + img = dri2_dup_image(image, loaderPrivate);
> + }
> +
> + return img;
> +}
> +
> static void
> dri2_destroy_image(__DRIimage *img)
> {
> @@ -757,7 +792,7 @@ dri2_destroy_image(__DRIimage *img)
> }
>
> static struct __DRIimageExtensionRec dri2ImageExtension = {
> - { __DRI_IMAGE, 5 },
> + { __DRI_IMAGE, 7 },
> dri2_create_image_from_name,
> dri2_create_image_from_renderbuffer,
> dri2_destroy_image,
> @@ -767,6 +802,8 @@ static struct __DRIimageExtensionRec dri2ImageExtension = {
> dri2_validate_usage,
> dri2_from_names,
> dri2_from_planar,
> + NULL,
> + dri2_duplicate_image,
> };
>
> /*
> diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
> index a3a6771..3659499 100644
> --- a/src/mesa/state_tracker/st_manager.c
> +++ b/src/mesa/state_tracker/st_manager.c
> @@ -810,6 +810,10 @@ st_manager_get_egl_image_surface(struct st_context *st, void *eglimg)
> return NULL;
>
> u_surface_default_template(&surf_tmpl, stimg.texture);
> +
> + if(stimg.format != PIPE_FORMAT_NONE)
> + surf_tmpl.format = stimg.format;
> +
Have you tested if this actually works? I would guess it would
render in the right colorspace but for sampling the state tracker
might just drop the format on the floor.
Cheers, Jakob.
More information about the mesa-dev
mailing list