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 <chad.vers...@linux.intel.com> > --- > 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