mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 15:48:36 +02:00
u_blitter: add draw_rectangle callback which can be overridden by a driver
This commit is contained in:
parent
749e24521a
commit
9be8f7d226
2 changed files with 104 additions and 19 deletions
|
|
@ -107,6 +107,14 @@ struct blitter_context_priv
|
|||
unsigned dst_height;
|
||||
};
|
||||
|
||||
static void blitter_draw_rectangle(struct blitter_context *blitter,
|
||||
unsigned x, unsigned y,
|
||||
unsigned width, unsigned height,
|
||||
float depth,
|
||||
enum blitter_attrib_type type,
|
||||
const float attrib[4]);
|
||||
|
||||
|
||||
struct blitter_context *util_blitter_create(struct pipe_context *pipe)
|
||||
{
|
||||
struct blitter_context_priv *ctx;
|
||||
|
|
@ -122,6 +130,7 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
|
|||
return NULL;
|
||||
|
||||
ctx->base.pipe = pipe;
|
||||
ctx->base.draw_rectangle = blitter_draw_rectangle;
|
||||
|
||||
/* init state objects for them to be considered invalid */
|
||||
ctx->base.saved_blend_state = INVALID_PTR;
|
||||
|
|
@ -604,6 +613,31 @@ void *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx,
|
|||
return ctx->fs_texfetch_depth[tex_target];
|
||||
}
|
||||
|
||||
static void blitter_draw_rectangle(struct blitter_context *blitter,
|
||||
unsigned x1, unsigned y1,
|
||||
unsigned x2, unsigned y2,
|
||||
float depth,
|
||||
enum blitter_attrib_type type,
|
||||
const float attrib[4])
|
||||
{
|
||||
struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
|
||||
|
||||
switch (type) {
|
||||
case UTIL_BLITTER_ATTRIB_COLOR:
|
||||
blitter_set_clear_color(ctx, attrib);
|
||||
break;
|
||||
|
||||
case UTIL_BLITTER_ATTRIB_TEXCOORD:
|
||||
set_texcoords_in_vertices(attrib, &ctx->vertices[0][1][0], 8);
|
||||
break;
|
||||
|
||||
default:;
|
||||
}
|
||||
|
||||
blitter_set_rectangle(ctx, x1, y1, x2, y2, depth);
|
||||
blitter_draw_quad(ctx);
|
||||
}
|
||||
|
||||
void util_blitter_clear(struct blitter_context *blitter,
|
||||
unsigned width, unsigned height,
|
||||
unsigned num_cbufs,
|
||||
|
|
@ -647,9 +681,8 @@ void util_blitter_clear(struct blitter_context *blitter,
|
|||
pipe->bind_vs_state(pipe, ctx->vs_col);
|
||||
|
||||
blitter_set_dst_dimensions(ctx, width, height);
|
||||
blitter_set_clear_color(ctx, rgba);
|
||||
blitter_set_rectangle(ctx, 0, 0, width, height, depth);
|
||||
blitter_draw_quad(ctx);
|
||||
blitter->draw_rectangle(blitter, 0, 0, width, height, depth,
|
||||
UTIL_BLITTER_ATTRIB_COLOR, rgba);
|
||||
blitter_restore_CSOs(ctx);
|
||||
}
|
||||
|
||||
|
|
@ -762,29 +795,45 @@ void util_blitter_copy_region(struct blitter_context *blitter,
|
|||
pipe->set_fragment_sampler_views(pipe, 1, &view);
|
||||
pipe->set_framebuffer_state(pipe, &fb_state);
|
||||
|
||||
/* Set texture coordinates. */
|
||||
blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
|
||||
|
||||
switch (src->target) {
|
||||
/* Draw the quad with the draw_rectangle callback. */
|
||||
case PIPE_TEXTURE_1D:
|
||||
case PIPE_TEXTURE_2D:
|
||||
blitter_set_texcoords_2d(ctx, src, subsrc,
|
||||
srcx, srcy, srcx+width, srcy+height);
|
||||
{
|
||||
/* Set texture coordinates. */
|
||||
float coord[4];
|
||||
get_normalized_texcoords(src, subsrc, srcx, srcy,
|
||||
srcx+width, srcy+height, coord);
|
||||
|
||||
/* Draw. */
|
||||
blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
|
||||
UTIL_BLITTER_ATTRIB_TEXCOORD, coord);
|
||||
}
|
||||
break;
|
||||
|
||||
/* Draw the quad with the generic codepath. */
|
||||
case PIPE_TEXTURE_3D:
|
||||
blitter_set_texcoords_3d(ctx, src, subsrc, srcz,
|
||||
srcx, srcy, srcx+width, srcy+height);
|
||||
break;
|
||||
case PIPE_TEXTURE_CUBE:
|
||||
blitter_set_texcoords_cube(ctx, src, subsrc,
|
||||
srcx, srcy, srcx+width, srcy+height);
|
||||
/* Set texture coordinates. */
|
||||
if (src->target == PIPE_TEXTURE_3D)
|
||||
blitter_set_texcoords_3d(ctx, src, subsrc, srcz,
|
||||
srcx, srcy, srcx+width, srcy+height);
|
||||
else
|
||||
blitter_set_texcoords_cube(ctx, src, subsrc,
|
||||
srcx, srcy, srcx+width, srcy+height);
|
||||
|
||||
/* Draw. */
|
||||
blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0);
|
||||
blitter_draw_quad(ctx);
|
||||
break;
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
return;
|
||||
}
|
||||
|
||||
blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
|
||||
blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0);
|
||||
blitter_draw_quad(ctx);
|
||||
blitter_restore_CSOs(ctx);
|
||||
|
||||
pipe_surface_reference(&dstsurf, NULL);
|
||||
|
|
@ -827,9 +876,8 @@ void util_blitter_clear_render_target(struct blitter_context *blitter,
|
|||
pipe->set_framebuffer_state(pipe, &fb_state);
|
||||
|
||||
blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
|
||||
blitter_set_clear_color(ctx, rgba);
|
||||
blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0);
|
||||
blitter_draw_quad(ctx);
|
||||
blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
|
||||
UTIL_BLITTER_ATTRIB_COLOR, rgba);
|
||||
blitter_restore_CSOs(ctx);
|
||||
}
|
||||
|
||||
|
|
@ -888,7 +936,7 @@ void util_blitter_clear_depth_stencil(struct blitter_context *blitter,
|
|||
pipe->set_framebuffer_state(pipe, &fb_state);
|
||||
|
||||
blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
|
||||
blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, depth);
|
||||
blitter_draw_quad(ctx);
|
||||
blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth,
|
||||
UTIL_BLITTER_ATTRIB_NONE, NULL);
|
||||
blitter_restore_CSOs(ctx);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,8 +39,45 @@ extern "C" {
|
|||
|
||||
struct pipe_context;
|
||||
|
||||
enum blitter_attrib_type {
|
||||
UTIL_BLITTER_ATTRIB_NONE,
|
||||
UTIL_BLITTER_ATTRIB_COLOR,
|
||||
UTIL_BLITTER_ATTRIB_TEXCOORD
|
||||
};
|
||||
|
||||
struct blitter_context
|
||||
{
|
||||
/**
|
||||
* Draw a rectangle.
|
||||
*
|
||||
* \param x1 An X coordinate of the top-left corner.
|
||||
* \param y1 A Y coordinate of the top-left corner.
|
||||
* \param x2 An X coordinate of the bottom-right corner.
|
||||
* \param y2 A Y coordinate of the bottom-right corner.
|
||||
* \param depth A depth which the rectangle is rendered at.
|
||||
*
|
||||
* \param type Semantics of the attributes "attrib".
|
||||
* If type is UTIL_BLITTER_ATTRIB_NONE, ignore them.
|
||||
* If type is UTIL_BLITTER_ATTRIB_COLOR, the attributes
|
||||
* make up a constant RGBA color, and should go to the COLOR0
|
||||
* varying slot of a fragment shader.
|
||||
* If type is UTIL_BLITTER_ATTRIB_TEXCOORD, {a1, a2} and
|
||||
* {a3, a4} specify top-left and bottom-right texture
|
||||
* coordinates of the rectangle, respectively, and should go
|
||||
* to the GENERIC0 varying slot of a fragment shader.
|
||||
*
|
||||
* \param attrib See type.
|
||||
*
|
||||
* \note A driver may optionally override this callback to implement
|
||||
* a specialized hardware path for drawing a rectangle, e.g. using
|
||||
* a rectangular point sprite.
|
||||
*/
|
||||
void (*draw_rectangle)(struct blitter_context *blitter,
|
||||
unsigned x1, unsigned y1, unsigned x2, unsigned y2,
|
||||
float depth,
|
||||
enum blitter_attrib_type type,
|
||||
const float attrib[4]);
|
||||
|
||||
/* Private members, really. */
|
||||
struct pipe_context *pipe; /**< pipe context */
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue