[Mesa-dev] [PATCH 3/7] i965: Create multiple miptrees planar YUV images
Kristian Høgsberg
krh at bitplanet.net
Fri May 6 00:04:02 UTC 2016
From: Kristian Høgsberg Kristensen <kristian.h.kristensen at intel.com>
---
src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 3 ++
src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 5 ++
src/mesa/drivers/dri/i965/intel_tex_image.c | 73 ++++++++++++++++++++++-----
src/mesa/drivers/dri/i965/intel_tex_obj.h | 2 +
4 files changed, 71 insertions(+), 12 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
index 26c297d..e3e2a8f 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
@@ -990,6 +990,9 @@ intel_miptree_release(struct intel_mipmap_tree **mt)
intel_miptree_release(&(*mt)->mcs_mt);
intel_resolve_map_clear(&(*mt)->hiz_map);
+ intel_miptree_release(&(*mt)->plane[0]);
+ intel_miptree_release(&(*mt)->plane[1]);
+
for (i = 0; i < MAX_TEXTURE_LEVELS; i++) {
free((*mt)->level[i].slice);
}
diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
index 7862152..9ab4b23 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
@@ -625,6 +625,11 @@ struct intel_mipmap_tree
struct intel_mipmap_tree *mcs_mt;
/**
+ * Planes 1 and 2 in case this is a planar surface.
+ */
+ struct intel_mipmap_tree *plane[2];
+
+ /**
* Fast clear state for this buffer.
*/
enum intel_fast_clear_state fast_clear_state;
diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c b/src/mesa/drivers/dri/i965/intel_tex_image.c
index bee8be1..ad7ee97 100644
--- a/src/mesa/drivers/dri/i965/intel_tex_image.c
+++ b/src/mesa/drivers/dri/i965/intel_tex_image.c
@@ -332,18 +332,67 @@ intel_image_target_texture_2d(struct gl_context *ctx, GLenum target,
return;
}
- /* 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.
- */
- intel_set_texture_image_bo(ctx, texImage, image->bo,
- target, image->internal_format,
- image->format, image->offset,
- image->width, image->height,
- image->pitch,
- image->tile_x, image->tile_y,
- MIPTREE_LAYOUT_DISABLE_AUX);
+ struct intel_texture_image *intel_image = intel_texture_image(texImage);
+ struct gl_texture_object *texobj = texImage->TexObject;
+ struct intel_texture_object *intel_texobj = intel_texture_object(texobj);
+ struct intel_image_format *f = image->planar_format;
+ struct intel_mipmap_tree *planar_mt;
+
+ for (int i = 0; i < f->nplanes; i++) {
+ 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;
+ mt->level[0].slice[0].x_offset = 0;
+ mt->level[0].slice[0].y_offset = 0;
+
+ if (i == 0)
+ planar_mt = mt;
+ else
+ planar_mt->plane[i - 1] = mt;
+ }
+
+ intel_texobj->dri_image = image;
+
+ const uint32_t internal_format = _mesa_get_format_base_format(planar_mt->format);
+ _mesa_init_teximage_fields(&brw->ctx, texImage,
+ image->width, image->height, 1,
+ 0, internal_format, planar_mt->format);
+
+ ctx->Driver.FreeTextureImageBuffer(ctx, texImage);
+
+ intel_miptree_reference(&intel_image->mt, planar_mt);
+
+ assert(planar_mt->pitch % planar_mt->cpp == 0);
+ intel_image->base.RowStride = planar_mt->pitch / planar_mt->cpp;
+
+ /* The miptree is in a validated state, so no need to check later. */
+ intel_miptree_reference(&intel_texobj->mt, intel_image->mt);
+ intel_texobj->validated_first_level = 0;
+ intel_texobj->validated_last_level = 0;
+ intel_texobj->_Format = planar_mt->format;
+ intel_texobj->needs_validate = true;
+
+ intel_miptree_reference(&planar_mt, NULL);
}
/**
diff --git a/src/mesa/drivers/dri/i965/intel_tex_obj.h b/src/mesa/drivers/dri/i965/intel_tex_obj.h
index 750e4c3..ad78570 100644
--- a/src/mesa/drivers/dri/i965/intel_tex_obj.h
+++ b/src/mesa/drivers/dri/i965/intel_tex_obj.h
@@ -58,6 +58,8 @@ struct intel_texture_object
* since the mt is shared across views with differing formats.
*/
mesa_format _Format;
+
+ struct __DRIimageRec *dri_image;
};
--
2.5.0
More information about the mesa-dev
mailing list