[Mesa-dev] [PATCH 06/30] i965: Move the DRIimage -> miptree code to intel_mipmap_tree.c
Pohjolainen, Topi
topi.pohjolainen at gmail.com
Wed Jun 21 19:02:35 UTC 2017
On Fri, Jun 16, 2017 at 03:41:28PM -0700, Jason Ekstrand wrote:
> This is mostly a direct port. The only bit of refactoring that was done
> was to make creating a planar miptree be an early return from the
> non-planar case. Alternatively, we could have three functions: two
> helpers and a main function to just call the right helper. Making the
> planar case an early return seemed cleaner.
> ---
> src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 91 +++++++++++++++++++++++++
> src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 5 ++
> src/mesa/drivers/dri/i965/intel_tex_image.c | 97 +--------------------------
> 3 files changed, 97 insertions(+), 96 deletions(-)
Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
>
> diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> index 101317f..023c6aa 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> @@ -27,6 +27,7 @@
> #include <GL/internal/dri_interface.h>
>
> #include "intel_batchbuffer.h"
> +#include "intel_image.h"
> #include "intel_mipmap_tree.h"
> #include "intel_tex.h"
> #include "intel_blit.h"
> @@ -856,6 +857,96 @@ intel_miptree_create_for_bo(struct brw_context *brw,
> return mt;
> }
>
> +static struct intel_mipmap_tree *
> +miptree_create_for_planar_image(struct brw_context *brw,
> + __DRIimage *image, GLenum target)
> +{
> + struct intel_image_format *f = image->planar_format;
> + struct intel_mipmap_tree *planar_mt;
> +
> + for (int i = 0; i < f->nplanes; i++) {
> + const int index = f->planes[i].buffer_index;
> + const uint32_t dri_format = f->planes[i].dri_format;
> + const mesa_format format = driImageFormatToGLFormat(dri_format);
> + const uint32_t width = image->width >> f->planes[i].width_shift;
> + const uint32_t height = image->height >> f->planes[i].height_shift;
> +
> + /* Disable creation of the texture's aux buffers because the driver
> + * exposes no EGL API to manage them. That is, there is no API for
> + * resolving the aux buffer's content to the main buffer nor for
> + * invalidating the aux buffer's content.
> + */
> + struct intel_mipmap_tree *mt =
> + intel_miptree_create_for_bo(brw, image->bo, format,
> + image->offsets[index],
> + width, height, 1,
> + image->strides[index],
> + MIPTREE_LAYOUT_DISABLE_AUX);
> + if (mt == NULL)
> + return NULL;
> +
> + mt->target = target;
> + mt->total_width = width;
> + mt->total_height = height;
> +
> + if (i == 0)
> + planar_mt = mt;
> + else
> + planar_mt->plane[i - 1] = mt;
> + }
> +
> + return planar_mt;
> +}
> +
> +struct intel_mipmap_tree *
> +intel_miptree_create_for_dri_image(struct brw_context *brw,
> + __DRIimage *image, GLenum target)
> +{
> + if (image->planar_format && image->planar_format->nplanes > 0)
> + return miptree_create_for_planar_image(brw, image, target);
> +
> + if (!brw->ctx.TextureFormatSupported[image->format])
> + return NULL;
> +
> + /* Disable creation of the texture's aux buffers because the driver exposes
> + * no EGL API to manage them. That is, there is no API for resolving the aux
> + * buffer's content to the main buffer nor for invalidating the aux buffer's
> + * content.
> + */
> + struct intel_mipmap_tree *mt =
> + intel_miptree_create_for_bo(brw, image->bo, image->format,
> + 0, image->width, image->height, 1,
> + image->pitch,
> + MIPTREE_LAYOUT_DISABLE_AUX);
> + if (mt == NULL)
> + return NULL;
> +
> + mt->target = target;
> + mt->total_width = image->width;
> + mt->total_height = image->height;
> + mt->level[0].slice[0].x_offset = image->tile_x;
> + mt->level[0].slice[0].y_offset = image->tile_y;
> +
> + /* From "OES_EGL_image" error reporting. We report GL_INVALID_OPERATION
> + * for EGL images from non-tile aligned sufaces in gen4 hw and earlier which has
> + * trouble resolving back to destination image due to alignment issues.
> + */
> + if (!brw->has_surface_tile_offset) {
> + uint32_t draw_x, draw_y;
> + intel_miptree_get_tile_offsets(mt, 0, 0, &draw_x, &draw_y);
> +
> + if (draw_x != 0 || draw_y != 0) {
> + _mesa_error(&brw->ctx, GL_INVALID_OPERATION, __func__);
> + intel_miptree_release(&mt);
> + return NULL;
> + }
> + }
> +
> + mt->offset = image->offset;
> +
> + return mt;
> +}
> +
> /**
> * For a singlesample renderbuffer, this simply wraps the given BO with a
> * miptree.
> diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> index f34be9a..9b6bc40 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> @@ -696,6 +696,11 @@ intel_miptree_create_for_bo(struct brw_context *brw,
> int pitch,
> uint32_t layout_flags);
>
> +struct intel_mipmap_tree *
> +intel_miptree_create_for_dri_image(struct brw_context *brw,
> + __DRIimage *image,
> + GLenum target);
> +
> void
> intel_update_winsys_renderbuffer_miptree(struct brw_context *intel,
> struct intel_renderbuffer *irb,
> diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c b/src/mesa/drivers/dri/i965/intel_tex_image.c
> index ea166f0..580e3b2 100644
> --- a/src/mesa/drivers/dri/i965/intel_tex_image.c
> +++ b/src/mesa/drivers/dri/i965/intel_tex_image.c
> @@ -201,98 +201,6 @@ intel_set_texture_image_mt(struct brw_context *brw,
> intel_miptree_reference(&intel_texobj->mt, mt);
> }
>
> -static struct intel_mipmap_tree *
> -create_mt_for_planar_dri_image(struct brw_context *brw,
> - GLenum target, __DRIimage *image)
> -{
> - struct intel_image_format *f = image->planar_format;
> - struct intel_mipmap_tree *planar_mt;
> -
> - for (int i = 0; i < f->nplanes; i++) {
> - const int index = f->planes[i].buffer_index;
> - const uint32_t dri_format = f->planes[i].dri_format;
> - const mesa_format format = driImageFormatToGLFormat(dri_format);
> - const uint32_t width = image->width >> f->planes[i].width_shift;
> - const uint32_t height = image->height >> f->planes[i].height_shift;
> -
> - /* Disable creation of the texture's aux buffers because the driver
> - * exposes no EGL API to manage them. That is, there is no API for
> - * resolving the aux buffer's content to the main buffer nor for
> - * invalidating the aux buffer's content.
> - */
> - struct intel_mipmap_tree *mt =
> - intel_miptree_create_for_bo(brw, image->bo, format,
> - image->offsets[index],
> - width, height, 1,
> - image->strides[index],
> - MIPTREE_LAYOUT_DISABLE_AUX);
> - if (mt == NULL)
> - return NULL;
> -
> - mt->target = target;
> - mt->total_width = width;
> - mt->total_height = height;
> -
> - if (i == 0)
> - planar_mt = mt;
> - else
> - planar_mt->plane[i - 1] = mt;
> - }
> -
> - return planar_mt;
> -}
> -
> -/**
> - * Binds a BO to a texture image, as if it was uploaded by glTexImage2D().
> - *
> - * Used for GLX_EXT_texture_from_pixmap and EGL image extensions,
> - */
> -static struct intel_mipmap_tree *
> -create_mt_for_dri_image(struct brw_context *brw,
> - GLenum target, __DRIimage *image)
> -{
> - struct gl_context *ctx = &brw->ctx;
> - struct intel_mipmap_tree *mt;
> - uint32_t draw_x, draw_y;
> -
> - if (!ctx->TextureFormatSupported[image->format])
> - return NULL;
> -
> - /* Disable creation of the texture's aux buffers because the driver exposes
> - * no EGL API to manage them. That is, there is no API for resolving the aux
> - * buffer's content to the main buffer nor for invalidating the aux buffer's
> - * content.
> - */
> - mt = intel_miptree_create_for_bo(brw, image->bo, image->format,
> - 0, image->width, image->height, 1,
> - image->pitch,
> - MIPTREE_LAYOUT_DISABLE_AUX);
> - if (mt == NULL)
> - return NULL;
> -
> - mt->target = target;
> - mt->total_width = image->width;
> - mt->total_height = image->height;
> - mt->level[0].slice[0].x_offset = image->tile_x;
> - mt->level[0].slice[0].y_offset = image->tile_y;
> -
> - intel_miptree_get_tile_offsets(mt, 0, 0, &draw_x, &draw_y);
> -
> - /* From "OES_EGL_image" error reporting. We report GL_INVALID_OPERATION
> - * for EGL images from non-tile aligned sufaces in gen4 hw and earlier which has
> - * trouble resolving back to destination image due to alignment issues.
> - */
> - if (!brw->has_surface_tile_offset &&
> - (draw_x != 0 || draw_y != 0)) {
> - _mesa_error(&brw->ctx, GL_INVALID_OPERATION, __func__);
> - intel_miptree_release(&mt);
> - return NULL;
> - }
> -
> - mt->offset = image->offset;
> -
> - return mt;
> -}
>
> void
> intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
> @@ -435,10 +343,7 @@ intel_image_target_texture_2d(struct gl_context *ctx, GLenum target,
> return;
> }
>
> - if (image->planar_format && image->planar_format->nplanes > 0)
> - mt = create_mt_for_planar_dri_image(brw, target, image);
> - else
> - mt = create_mt_for_dri_image(brw, target, image);
> + mt = intel_miptree_create_for_dri_image(brw, image, target);
> if (mt == NULL)
> return;
>
> --
> 2.5.0.400.gff86faf
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list