[Mesa-dev] [PATCH 2/4] gallium: extend resource_resolve to accommodate BlitFramebuffer
Christoph Bumiller
e0425955 at student.tuwien.ac.at
Tue Aug 2 03:34:45 PDT 2011
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
More information about the mesa-dev
mailing list