On Fri, Apr 24, 2015 at 09:59:07AM +0300, kevin.rogo...@intel.com wrote: > From: Kevin Rogovin <kevin.rogo...@intel.com> > > To assist drivers to implement ARB_framebuffer_no_attachment, provide > a set of convenience functions that check for gl_framebuffer::_HasAttachments > that return the geometry of the gl_framebuffer.
This is in fact two changes: introduction of the helpers and refactoring of the intersection code to be used with caller provided bounding box. > > --- > src/mesa/main/framebuffer.c | 49 > ++++++++++++++++++++++++++++++--------------- > src/mesa/main/framebuffer.h | 29 +++++++++++++++++++++++++++ > src/mesa/main/mtypes.h | 21 ++++++++++--------- > 3 files changed, 74 insertions(+), 25 deletions(-) > > diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c > index 4e4d896..7d8921b 100644 > --- a/src/mesa/main/framebuffer.c > +++ b/src/mesa/main/framebuffer.c > @@ -357,30 +357,20 @@ update_framebuffer_size(struct gl_context *ctx, struct > gl_framebuffer *fb) > } > > > + > /** > - * Calculate the inclusive bounding box for the scissor of a specific > viewport > + * Given a bounding box, intersect the bounding box with the scirros of > + * a specified vieport. > * > * \param ctx GL context. > - * \param buffer Framebuffer to be checked against > * \param idx Index of the desired viewport > * \param bbox Bounding box for the scissored viewport. Stored as xmin, > * xmax, ymin, ymax. > - * > - * \warning This function assumes that the framebuffer dimensions are up to > - * date (e.g., update_framebuffer_size has been recently called on \c > buffer). > - * > - * \sa _mesa_clip_to_region > */ > -void > -_mesa_scissor_bounding_box(const struct gl_context *ctx, > - const struct gl_framebuffer *buffer, > - unsigned idx, int *bbox) > +extern void > +_mesa_intersect_scissor_bounding_box(const struct gl_context *ctx, > + unsigned idx, int *bbox) > { > - bbox[0] = 0; > - bbox[2] = 0; > - bbox[1] = buffer->Width; > - bbox[3] = buffer->Height; > - > if (ctx->Scissor.EnableFlags & (1u << idx)) { > if (ctx->Scissor.ScissorArray[idx].X > bbox[0]) { > bbox[0] = ctx->Scissor.ScissorArray[idx].X; > @@ -402,6 +392,33 @@ _mesa_scissor_bounding_box(const struct gl_context *ctx, > bbox[2] = bbox[3]; > } > } > +} > + > +/** > + * Calculate the inclusive bounding box for the scissor of a specific > viewport > + * > + * \param ctx GL context. > + * \param buffer Framebuffer to be checked against > + * \param idx Index of the desired viewport > + * \param bbox Bounding box for the scissored viewport. Stored as xmin, > + * xmax, ymin, ymax. > + * > + * \warning This function assumes that the framebuffer dimensions are up to > + * date (e.g., update_framebuffer_size has been recently called on \c > buffer). > + * > + * \sa _mesa_clip_to_region > + */ > +void > +_mesa_scissor_bounding_box(const struct gl_context *ctx, > + const struct gl_framebuffer *buffer, > + unsigned idx, int *bbox) > +{ > + bbox[0] = 0; > + bbox[2] = 0; > + bbox[1] = buffer->Width; > + bbox[3] = buffer->Height; > + > + _mesa_intersect_scissor_bounding_box(ctx, idx, bbox); > > assert(bbox[0] <= bbox[1]); > assert(bbox[2] <= bbox[3]); > diff --git a/src/mesa/main/framebuffer.h b/src/mesa/main/framebuffer.h > index a427421..8b84d26 100644 > --- a/src/mesa/main/framebuffer.h > +++ b/src/mesa/main/framebuffer.h > @@ -76,6 +76,35 @@ _mesa_scissor_bounding_box(const struct gl_context *ctx, > const struct gl_framebuffer *buffer, > unsigned idx, int *bbox); > > +extern void > +_mesa_intersect_scissor_bounding_box(const struct gl_context *ctx, > + unsigned idx, int *bbox); > + > +static inline GLuint > +_mesa_geometric_width(const struct gl_framebuffer *buffer) > +{ > + return buffer->_HasAttachments ? buffer->Width : > buffer->DefaultGeometry.Width; > +} > + > + > +static inline GLuint > +_mesa_geometric_height(const struct gl_framebuffer *buffer) > +{ > + return buffer->_HasAttachments ? buffer->Height : > buffer->DefaultGeometry.Height; > +} > + > +static inline GLuint > +_mesa_geometric_samples(const struct gl_framebuffer *buffer) > +{ > + return buffer->_HasAttachments ? buffer->Visual.samples : > buffer->DefaultGeometry.NumSamples; > +} > + > +static inline GLuint > +_mesa_geometric_layers(const struct gl_framebuffer *buffer) > +{ > + return buffer->_HasAttachments ? buffer->MaxNumLayers : > buffer->DefaultGeometry.Layers; > +} > + > extern void > _mesa_update_draw_buffer_bounds(struct gl_context *ctx); > > diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h > index 38a3817..ac7cdb6 100644 > --- a/src/mesa/main/mtypes.h > +++ b/src/mesa/main/mtypes.h > @@ -3134,13 +3134,13 @@ struct gl_framebuffer > struct gl_config Visual; > > /** > - * size of frame buffer in pixels, > - * no attachments has these values as 0 > + * size of frame buffer in pixels, > + * no attachments has these values as 0 > */ > - GLuint Width, Height; > + GLuint Width, Height; > > /** > - * In the case that the framebuffer has no attachment (i.e. > + * In the case that the framebuffer has no attachment (i.e. > * GL_ARB_framebuffer_no_attachments) then the geometry of > * the framebuffer is specified by the default values. > */ > @@ -3154,8 +3154,8 @@ struct gl_framebuffer > * (inclusive for _Xmin and _Ymin while exclusive for _Xmax and _Ymax) > */ > /*@{*/ > - GLint _Xmin, _Xmax; > - GLint _Ymin, _Ymax; > + GLint _Xmin, _Xmax; > + GLint _Ymin, _Ymax; > /*@}*/ > > /** \name Derived Z buffer stuff */ > @@ -3172,13 +3172,16 @@ struct gl_framebuffer > * - one of Attachment has gl_renderbuffer_attachment::Type != GL_NONE > * - _Status is GL_FRAMEBUFFER_COMPLETE_EXT > * NOTE: the values for Width and Height are set to 0 in the > - * case of no attachments, a backend driver supporting > - * GL_ARB_framebuffer_no_attachments must check for > + * case of no attachments, a backend driver supporting > + * GL_ARB_framebuffer_no_attachments must check for > * the flag _HasAttachments and if GL_FALSE, must then > * use the values in DefaultGeometry to initialize its > * viewport, scissor and so on (in particular _Xmin, _Xmax, > * _Ymin and _Ymax do NOT take into account _HasAttachments > - * being false > + * being false. To get the geometry of the framebuffer, the > + * helper functions _mesa_geometric_width(), _mesa_geometric_height(), > + * _mesa_geometric_samples() and _mesa_geometric_layers() > + * are available that check _HasAttachments > */ > GLboolean _HasAttachments; > > -- > 1.9.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev