diff options
Diffstat (limited to 'src/gallium/drivers/radeon')
-rw-r--r-- | src/gallium/drivers/radeon/r600_pipe_common.c | 64 | ||||
-rw-r--r-- | src/gallium/drivers/radeon/r600_pipe_common.h | 8 |
2 files changed, 72 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index 5ceadb4d3e5..a6bba8f0a94 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -27,6 +27,7 @@ #include "r600_pipe_common.h" #include "r600_cs.h" #include "tgsi/tgsi_parse.h" +#include "util/u_draw_quad.h" #include "util/u_memory.h" #include "util/u_format_s3tc.h" #include "util/u_upload_mgr.h" @@ -39,6 +40,69 @@ * pipe_context */ +void r600_draw_rectangle(struct blitter_context *blitter, + int x1, int y1, int x2, int y2, float depth, + enum blitter_attrib_type type, + const union pipe_color_union *attrib) +{ + struct r600_common_context *rctx = + (struct r600_common_context*)util_blitter_get_pipe(blitter); + struct pipe_viewport_state viewport; + struct pipe_resource *buf = NULL; + unsigned offset = 0; + float *vb; + + if (type == UTIL_BLITTER_ATTRIB_TEXCOORD) { + util_blitter_draw_rectangle(blitter, x1, y1, x2, y2, depth, type, attrib); + return; + } + + /* Some operations (like color resolve on r6xx) don't work + * with the conventional primitive types. + * One that works is PT_RECTLIST, which we use here. */ + + /* setup viewport */ + viewport.scale[0] = 1.0f; + viewport.scale[1] = 1.0f; + viewport.scale[2] = 1.0f; + viewport.scale[3] = 1.0f; + viewport.translate[0] = 0.0f; + viewport.translate[1] = 0.0f; + viewport.translate[2] = 0.0f; + viewport.translate[3] = 0.0f; + rctx->b.set_viewport_states(&rctx->b, 0, 1, &viewport); + + /* Upload vertices. The hw rectangle has only 3 vertices, + * I guess the 4th one is derived from the first 3. + * The vertex specification should match u_blitter's vertex element state. */ + u_upload_alloc(rctx->uploader, 0, sizeof(float) * 24, &offset, &buf, (void**)&vb); + vb[0] = x1; + vb[1] = y1; + vb[2] = depth; + vb[3] = 1; + + vb[8] = x1; + vb[9] = y2; + vb[10] = depth; + vb[11] = 1; + + vb[16] = x2; + vb[17] = y1; + vb[18] = depth; + vb[19] = 1; + + if (attrib) { + memcpy(vb+4, attrib->f, sizeof(float)*4); + memcpy(vb+12, attrib->f, sizeof(float)*4); + memcpy(vb+20, attrib->f, sizeof(float)*4); + } + + /* draw */ + util_draw_vertex_buffer(&rctx->b, NULL, buf, blitter->vb_slot, offset, + R600_PRIM_RECTANGLE_LIST, 3, 2); + pipe_resource_reference(&buf, NULL); +} + void r600_need_dma_space(struct r600_common_context *ctx, unsigned num_dw) { /* The number of dwords we already used in the DMA so far. */ diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index ab348ae02cc..ed16e1a7b0c 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -36,6 +36,7 @@ #include "../../winsys/radeon/drm/radeon_winsys.h" +#include "util/u_blitter.h" #include "util/u_double_list.h" #include "util/u_range.h" #include "util/u_slab.h" @@ -74,6 +75,9 @@ #define R600_CONTEXT_VGT_FLUSH (1 << 19) #define R600_CONTEXT_VGT_STREAMOUT_SYNC (1 << 20) +/* special primitive types */ +#define R600_PRIM_RECTANGLE_LIST PIPE_PRIM_MAX + /* Debug flags. */ /* logging */ #define DBG_TEX (1 << 0) @@ -427,6 +431,10 @@ struct pipe_resource *r600_buffer_create(struct pipe_screen *screen, unsigned alignment); /* r600_common_pipe.c */ +void r600_draw_rectangle(struct blitter_context *blitter, + int x1, int y1, int x2, int y2, float depth, + enum blitter_attrib_type type, + const union pipe_color_union *attrib); bool r600_common_screen_init(struct r600_common_screen *rscreen, struct radeon_winsys *ws); void r600_destroy_common_screen(struct r600_common_screen *rscreen); |