From: Kristian Høgsberg Kristensen <kristian.h.kristen...@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 | 49 ++++++++++++++++++++++++++- src/mesa/drivers/dri/i965/intel_tex_obj.h | 2 ++ 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c index 94f6333..e2405cb 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 4d20a86..a58edf2 100644 --- a/src/mesa/drivers/dri/i965/intel_tex_image.c +++ b/src/mesa/drivers/dri/i965/intel_tex_image.c @@ -162,6 +162,47 @@ 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(). * @@ -348,10 +389,16 @@ intel_image_target_texture_2d(struct gl_context *ctx, GLenum target, return; } - mt = create_mt_for_dri_image(brw, target, image); + 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); if (mt == NULL) return; + struct intel_texture_object *intel_texobj = intel_texture_object(texObj); + intel_texobj->dri_image = image; + intel_set_texture_image_mt(brw, texImage, mt); intel_miptree_release(&mt); } 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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev