From: Marek Olšák Date: Sun, 17 Aug 2014 22:55:40 +0000 (+0200) Subject: radeonsi: use r600_draw_rectangle from r600g X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=db51ab6d6ada69287dfe3a671ecc1b338917e7aa;p=mesa.git radeonsi: use r600_draw_rectangle from r600g Rectangles are easier than triangles for the rasterizer. Reviewed-by: Michel Dänzer --- diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c index c98206fe903..a3cfdae6b73 100644 --- a/src/gallium/drivers/r600/r600_blit.c +++ b/src/gallium/drivers/r600/r600_blit.c @@ -22,7 +22,6 @@ */ #include "r600_pipe.h" #include "util/u_surface.h" -#include "util/u_blitter.h" #include "util/u_format.h" #include "evergreend.h" diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index 4543347555e..226ad6e0200 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -30,7 +30,6 @@ #include #include "pipe/p_shader_tokens.h" -#include "util/u_blitter.h" #include "util/u_debug.h" #include "util/u_memory.h" #include "util/u_simple_shaders.h" diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index d04fef80df1..ee836b771f7 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -32,7 +32,6 @@ #include "r600_llvm.h" #include "r600_public.h" -#include "util/u_blitter.h" #include "util/u_suballoc.h" #include "util/u_double_list.h" #include "util/u_transfer.h" @@ -633,9 +632,6 @@ void r600_sampler_views_dirty(struct r600_context *rctx, void r600_sampler_states_dirty(struct r600_context *rctx, struct r600_sampler_states *state); void r600_constant_buffers_dirty(struct r600_context *rctx, struct r600_constbuf_state *state); -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); uint32_t r600_translate_stencil_op(int s_op); uint32_t r600_translate_fill(uint32_t func); unsigned r600_tex_wrap(unsigned wrap); diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index d29e137d511..d2f0d174c9f 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -28,7 +28,6 @@ #include "r600_shader.h" #include "r600d.h" -#include "util/u_draw_quad.h" #include "util/u_format_s3tc.h" #include "util/u_index_modify.h" #include "util/u_memory.h" @@ -36,8 +35,6 @@ #include "util/u_math.h" #include "tgsi/tgsi_parse.h" -#define R600_PRIM_RECTANGLE_LIST PIPE_PRIM_MAX - void r600_init_command_buffer(struct r600_command_buffer *cb, unsigned num_dw) { assert(!cb->buf); @@ -1550,67 +1547,6 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info rctx->b.num_draw_calls++; } -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_context *rctx = (struct r600_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.b.set_viewport_states(&rctx->b.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->b.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.b, NULL, buf, rctx->blitter->vb_slot, offset, - R600_PRIM_RECTANGLE_LIST, 3, 2); - pipe_resource_reference(&buf, NULL); -} - uint32_t r600_translate_stencil_op(int s_op) { switch (s_op) { 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); diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 9a7a2fef690..2806b468ee5 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -22,7 +22,6 @@ */ #include "si_pipe.h" -#include "util/u_blitter.h" #include "util/u_format.h" enum si_blitter_op /* bitmask */ diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 3c3d642b791..845ab20da37 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -26,7 +26,6 @@ #include "sid.h" #include "radeon/radeon_uvd.h" -#include "util/u_blitter.h" #include "util/u_memory.h" #include "util/u_simple_shaders.h" #include "vl/vl_decoder.h" @@ -128,6 +127,7 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen, void * sctx->blitter = util_blitter_create(&sctx->b.b); if (sctx->blitter == NULL) goto fail; + sctx->blitter->draw_rectangle = r600_draw_rectangle; sctx->dummy_pixel_shader = util_make_fragment_cloneinput_shader(&sctx->b.b, 0, diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index 411ea04059f..573487cedab 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -29,7 +29,6 @@ #include "../radeon/r600_cs.h" #include "sid.h" -#include "util/u_blitter.h" #include "util/u_format.h" #include "util/u_index_modify.h" #include "util/u_memory.h" @@ -346,7 +345,8 @@ static unsigned si_conv_pipe_prim(unsigned pprim) [PIPE_PRIM_LINES_ADJACENCY] = V_008958_DI_PT_LINELIST_ADJ, [PIPE_PRIM_LINE_STRIP_ADJACENCY] = V_008958_DI_PT_LINESTRIP_ADJ, [PIPE_PRIM_TRIANGLES_ADJACENCY] = V_008958_DI_PT_TRILIST_ADJ, - [PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = V_008958_DI_PT_TRISTRIP_ADJ + [PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = V_008958_DI_PT_TRISTRIP_ADJ, + [R600_PRIM_RECTANGLE_LIST] = V_008958_DI_PT_RECTLIST }; unsigned result = prim_conv[pprim]; if (result == ~0) { @@ -371,7 +371,8 @@ static unsigned si_conv_prim_to_gs_out(unsigned mode) [PIPE_PRIM_LINES_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_LINESTRIP, [PIPE_PRIM_LINE_STRIP_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_LINESTRIP, [PIPE_PRIM_TRIANGLES_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_TRISTRIP, - [PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_TRISTRIP + [PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_TRISTRIP, + [R600_PRIM_RECTANGLE_LIST] = V_028A6C_OUTPRIM_TYPE_TRISTRIP }; assert(mode < Elements(prim_conv));