From c4df2e333765164e0d4926f03b969a3c9fdca691 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 12 Sep 2012 01:36:31 +0200 Subject: [PATCH] gallium: add blit into the interface MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Tested-by: Michel Dänzer Reviewed-by: Brian Paul --- src/gallium/docs/source/context.rst | 9 +++++++++ src/gallium/include/pipe/p_context.h | 7 +++++++ src/gallium/include/pipe/p_state.h | 21 +++++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst index 4555c384453..29b38e50e4e 100644 --- a/src/gallium/docs/source/context.rst +++ b/src/gallium/docs/source/context.rst @@ -434,6 +434,15 @@ formats, i.e., formats for which copying the bytes from the source resource unmodified to the destination resource will achieve the same effect of a textured quad blitter.. The source and destination may be the same resource, but overlapping blits are not permitted. +This can be considered the equivalent of a CPU memcpy. + +``blit`` blits a region of a resource to a region of another resource, including +scaling, format conversion, and up-/downsampling, as well as +a destination clip rectangle (scissors). +As opposed to manually drawing a textured quad, this lets the pipe driver choose +the optimal method for blitting (like using a special 2D engine), and usually +offers, for example, accelerated stencil-only copies even where +PIPE_CAP_SHADER_STENCIL_EXPORT is not available. ``resource_resolve`` resolves a multisampled resource into a non-multisampled one. Their formats must match. This function must be present if a driver diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h index 5d468127779..3c33bc6cb84 100644 --- a/src/gallium/include/pipe/p_context.h +++ b/src/gallium/include/pipe/p_context.h @@ -39,6 +39,7 @@ extern "C" { struct pipe_blend_color; struct pipe_blend_state; +struct pipe_blit_info; struct pipe_box; struct pipe_clip_state; struct pipe_constant_buffer; @@ -297,6 +298,12 @@ struct pipe_context { unsigned src_level, const struct pipe_box *src_box); + /* Optimal hardware path for blitting pixels. + * Scaling, format conversion, up- and downsampling (resolve) are allowed. + */ + void (*blit)(struct pipe_context *pipe, + const struct pipe_blit_info *info); + /** * Resolve a multisampled resource into a non-multisampled one. * Source and destination must be of the same format. diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index 9ea9c0e3286..1f748cdda4f 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -564,6 +564,27 @@ struct pipe_draw_info }; +/** + * Information to describe a blit call. + */ +struct pipe_blit_info +{ + struct { + struct pipe_resource *resource; + unsigned level; + struct pipe_box box; /**< negative width, height only legal for src */ + /* For pipe_surface-like format casting: */ + enum pipe_format format; /**< must be supported for sampling (src) + or rendering (dst), ZS is always supported */ + } dst, src; + + unsigned mask; /**< bitmask of PIPE_MASK_R/G/B/A/Z/S */ + unsigned filter; /**< PIPE_TEX_FILTER_* */ + + boolean scissor_enable; + struct pipe_scissor_state scissor; +}; + /** * Information to describe a resource_resolve call. */ -- 2.30.2