gallium: extend resource_resolve to accommodate BlitFramebuffer
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.
This commit is contained in:
@@ -329,8 +329,15 @@ 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
|
||||
one. Their formats must match. This function must be present if a driver
|
||||
supports multisampling.
|
||||
The region that is to be resolved is described by ``pipe_resolve_info``, which
|
||||
provides a source and a destination rectangle.
|
||||
The source rectangle may be vertically flipped, but otherwise the dimensions
|
||||
of the rectangles must match, unless PIPE_CAP_SCALED_RESOLVE is supported,
|
||||
in which case scaling and horizontal flipping are allowed as well.
|
||||
The result of resolving depth/stencil values may be any function of the values at
|
||||
the sample points, but returning the value of the centermost sample is preferred.
|
||||
|
||||
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
|
||||
|
@@ -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);
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
@@ -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 */
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user