diff options
Diffstat (limited to 'src/gallium/drivers/radeon/r600_pipe_common.c')
-rw-r--r-- | src/gallium/drivers/radeon/r600_pipe_common.c | 64 |
1 files changed, 64 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. */ |