On 11/17/2011 07:58 PM, Chad Versace wrote:
> Add two fields to intel_renderbuffer:
> mt_level
> mt_layer
>
> Multiple renderbuffers may simultaneously wrap a single texture and each
> provide a different view into that texture. [Consider
> glFramebufferTextureLayer()]. The new fields indicate which slice of the
> miptree is wrapped by the renderbuffer.
>
> The buffer resolve operations, to be introduced in the future, require
> these fields in order to resolve the correct slice in the miptree.
>
> Signed-off-by: Chad Versace
> ---
> src/mesa/drivers/dri/intel/intel_fbo.c | 24
> src/mesa/drivers/dri/intel/intel_fbo.h | 17 +
> 2 files changed, 41 insertions(+), 0 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c
> b/src/mesa/drivers/dri/intel/intel_fbo.c
> index 8c41956..ed58078 100644
> --- a/src/mesa/drivers/dri/intel/intel_fbo.c
> +++ b/src/mesa/drivers/dri/intel/intel_fbo.c
> @@ -973,15 +973,39 @@ intel_update_wrapper(struct gl_context *ctx, struct
> intel_renderbuffer *irb,
> irb->Base.Delete = intel_delete_renderbuffer;
> irb->Base.AllocStorage = intel_nop_alloc_storage;
>
> + irb->mt_level = att->TextureLevel;
> + if (att->CubeMapFace > 0) {
> + assert(att->Zoffset == 0);
> + irb->mt_layer = att->CubeMapFace;
> + } else {
> + irb->mt_layer= att->Zoffset;
> + }
Ditto...relying on the unclear property that att->Zoffset == 0 when
att->CubeMapFace == 0. Maybe att->Texture->Target ==
GL_TEXTURE_CUBE_MAP? (Hopefully att->Texture is guaranteed to be !=
NULL...)
> +
> if (intel_image->stencil_rb) {
>/* The tex image has packed depth/stencil format, but is using
> separate
> * stencil. It shares its embedded depth and stencil renderbuffers
> with
> * the renderbuffer wrapper.
> + *
> + * FIXME: glFramebufferTexture*() is broken for depthstencil textures
> + * FIXME: with separate stencil. To fix this, we must create a
> separate
> + * FIXME: pair of depth/stencil renderbuffers for each attached slice
> + * FIXME: of the miptree.
> */
> + struct intel_renderbuffer *depth_irb;
> + struct intel_renderbuffer *stencil_irb;
> +
>_mesa_reference_renderbuffer(&irb->wrapped_depth,
> intel_image->depth_rb);
>_mesa_reference_renderbuffer(&irb->wrapped_stencil,
> intel_image->stencil_rb);
> +
> + depth_irb = intel_renderbuffer(intel_image->depth_rb);
> + depth_irb->mt_level = irb->mt_level;
> + depth_irb->mt_layer = irb->mt_layer;
> +
> + stencil_irb = intel_renderbuffer(intel_image->stencil_rb);
> + stencil_irb->mt_level = irb->mt_level;
> + stencil_irb->mt_layer = irb->mt_layer;
> } else {
>intel_miptree_reference(&irb->mt, intel_image->mt);
> }
> diff --git a/src/mesa/drivers/dri/intel/intel_fbo.h
> b/src/mesa/drivers/dri/intel/intel_fbo.h
> index 34d2f9a..3a21374 100644
> --- a/src/mesa/drivers/dri/intel/intel_fbo.h
> +++ b/src/mesa/drivers/dri/intel/intel_fbo.h
> @@ -52,6 +52,23 @@ struct intel_renderbuffer
> GLbitfield map_mode;
>
> /**
> +* \name Miptree view
> +* \{
> +*
> +* Multiple renderbuffers may simultaneously wrap a single texture and
> each
> +* provide a different view into that texture. The fields below indicate
> +* which miptree slice is wrapped by this renderbuffer. The fields'
> values
> +* are consistent with the 'level' and 'layer' parameters of
> +* glFramebufferTextureLayer().
> +*
> +* For renderbuffers not created with glFramebufferTexture*(), mt_level
> and
> +* mt_layer are 0.
> +*/
> + unsigned int mt_level;
> + unsigned int mt_layer;
> + /** \} */
> +
> + /**
> * \name Packed depth/stencil unwrappers
> *
> * If the intel_context is using separate stencil and this renderbuffer
> has
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev