[Mesa-dev] [PATCH 12/41] intel: Track the miptree layer wrapped by a renderbuffer

2011-11-17 Thread Chad Versace
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;
+   }
+
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
-- 
1.7.7.1

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 12/41] intel: Track the miptree layer wrapped by a renderbuffer

2011-11-18 Thread Kenneth Graunke
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