On 28.07.2011 15:59, Christoph Bumiller wrote: > Resolve via glBlitFramebuffer allows resolving a sub-region of a > renderbuffer to a different location in any mipmap level of some > other texture, and, with a new extension, even scaling. Therefore, > location and size parameters are needed. > > The mask parameter was added because resolving only depth or only > stencil of a combined buffer is possible as well. > > Full information about the blit operation allows the drivers to > take the most efficient path they possibly can. So, if there are no objections anymore I'm just going to push this small series in a few days ...
Since no other drivers implement multisampling at the moment it can't break anything (except maybe closed source state trackers I don't know about). > --- > src/gallium/docs/source/context.rst | 7 +++++-- > src/gallium/include/pipe/p_context.h | 8 +++----- > src/gallium/include/pipe/p_defines.h | 4 ++++ > src/gallium/include/pipe/p_state.h | 28 ++++++++++++++++++++++++++++ > 4 files changed, 40 insertions(+), 7 deletions(-) > > diff --git a/src/gallium/docs/source/context.rst > b/src/gallium/docs/source/context.rst > index 25a3245..7968f03 100644 > --- a/src/gallium/docs/source/context.rst > +++ b/src/gallium/docs/source/context.rst > @@ -329,8 +329,11 @@ textured quad blitter.. The source and destination may > be the same resource, > but overlapping blits are not permitted. > > ``resource_resolve`` resolves a multisampled resource into a non-multisampled > -one. Formats and dimensions must match. This function must be present if a > driver > -supports multisampling. > +one. Formats must match, and, if PIPE_CAP_SCALED_RESOLVE is not supported, > +dimensions as well. > +The source and destination resources and coordinates are described > +by ``pipe_resolve_info``. > +This function must be present if a driver supports multisampling. > > The interfaces to these calls are likely to change to make it easier > for a driver to batch multiple blits with the same source and > diff --git a/src/gallium/include/pipe/p_context.h > b/src/gallium/include/pipe/p_context.h > index 3f6d90d..da3ee87 100644 > --- a/src/gallium/include/pipe/p_context.h > +++ b/src/gallium/include/pipe/p_context.h > @@ -49,6 +49,7 @@ struct pipe_index_buffer; > struct pipe_query; > struct pipe_poly_stipple; > struct pipe_rasterizer_state; > +struct pipe_resolve_info; > struct pipe_resource; > struct pipe_sampler_state; > struct pipe_sampler_view; > @@ -268,13 +269,10 @@ struct pipe_context { > > /** > * Resolve a multisampled resource into a non-multisampled one. > - * Source and destination must have the same size and same format. > + * Source and destination must be of the same format. > */ > void (*resource_resolve)(struct pipe_context *pipe, > - struct pipe_resource *dst, > - unsigned dst_layer, > - struct pipe_resource *src, > - unsigned src_layer); > + const struct pipe_resolve_info *info); > > /*@}*/ > > diff --git a/src/gallium/include/pipe/p_defines.h > b/src/gallium/include/pipe/p_defines.h > index 79b8969..7ffdf97 100644 > --- a/src/gallium/include/pipe/p_defines.h > +++ b/src/gallium/include/pipe/p_defines.h > @@ -99,6 +99,9 @@ enum pipe_error { > #define PIPE_MASK_B 0x4 > #define PIPE_MASK_A 0x8 > #define PIPE_MASK_RGBA 0xf > +#define PIPE_MASK_Z 0x10 > +#define PIPE_MASK_S 0x20 > +#define PIPE_MASK_ZS 0x30 > > > /** > @@ -468,6 +471,7 @@ enum pipe_cap { > PIPE_CAP_MIXED_COLORBUFFER_FORMATS = 46, > PIPE_CAP_SEAMLESS_CUBE_MAP = 47, > PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE = 48, > + PIPE_CAP_SCALED_RESOLVE = 49 > }; > > /* Shader caps not specific to any single stage */ > diff --git a/src/gallium/include/pipe/p_state.h > b/src/gallium/include/pipe/p_state.h > index d442c15..840b3ee 100644 > --- a/src/gallium/include/pipe/p_state.h > +++ b/src/gallium/include/pipe/p_state.h > @@ -483,6 +483,34 @@ struct pipe_draw_info > }; > > > +/** > + * Information to describe a resource_resolve call. > + */ > +struct pipe_resolve_info > +{ > + struct { > + struct pipe_resource *res; > + unsigned level; > + unsigned layer; > + int x0; /**< always left */ > + int y0; /**< always top */ > + int x1; /**< determines scale if PIPE_CAP_SCALED_RESOLVE is supported > */ > + int y1; /**< determines scale if PIPE_CAP_SCALED_RESOLVE is supported > */ > + } dst; > + > + struct { > + struct pipe_resource *res; > + unsigned layer; > + int x0; > + int y0; > + int x1; /**< may be < x0 only if PIPE_CAP_SCALED_RESOLVE is supported > */ > + int y1; /**< may be < y1 even if PIPE_CAP_SCALED_RESOLVE not supported > */ > + } src; > + > + unsigned mask; /**< PIPE_MASK_RGBA, Z, S or ZS */ > +}; > + > + > #ifdef __cplusplus > } > #endif _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev