summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2014-07-29 18:50:04 +0200
committerLucas Stach <l.stach@pengutronix.de>2014-07-30 12:22:54 +0200
commit36962c854c61e2731b5155c707b2f99f7f076923 (patch)
treebb3cdfeb1bb193715bae0ba1c829de34ba83c5e1
parent6841b35cb6cd25d82b16109d099c77b2f08baa3b (diff)
downloadmesa-36962c854c61e2731b5155c707b2f99f7f076923.tar.gz
mesa-36962c854c61e2731b5155c707b2f99f7f076923.tar.xz
etna: implement flush_front_buffer as pipe blit
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-rw-r--r--src/gallium/drivers/etna/etna_screen.c68
1 files changed, 16 insertions, 52 deletions
diff --git a/src/gallium/drivers/etna/etna_screen.c b/src/gallium/drivers/etna/etna_screen.c
index 591596a37e..0a82256238 100644
--- a/src/gallium/drivers/etna/etna_screen.c
+++ b/src/gallium/drivers/etna/etna_screen.c
@@ -435,62 +435,26 @@ static void etna_screen_flush_frontbuffer( struct pipe_screen *screen,
struct etna_resource *drawable = winsys_drawable_handle;
struct etna_resource *rt_resource = etna_resource(resource);
struct etna_pipe_context *ectx = rt_resource->last_ctx;
+ struct pipe_blit_info blit;
assert(level <= resource->last_level && layer < resource->array_size);
assert(ectx);
- struct etna_ctx *ctx = ectx->ctx;
- etna_set_state(ctx, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_COLOR);
- etna_stall(ctx, SYNC_RECIPIENT_RA, SYNC_RECIPIENT_PE);
+ memset(&blit, 0, sizeof(blit));
+ blit.mask = PIPE_MASK_RGBA;
+ blit.filter = PIPE_TEX_FILTER_LINEAR;
+ blit.src.resource = &rt_resource->base;
+ blit.src.format = rt_resource->base.format;
+ blit.src.level = level;
+ blit.src.box.width = rt_resource->levels[level].width;
+ blit.src.box.height = rt_resource->levels[level].height;
+ blit.dst.resource = &drawable->base;
+ blit.dst.format = drawable->base.format;
+ blit.dst.level = 0;
+ blit.dst.box.width = drawable->levels[0].width;
+ blit.dst.box.height = drawable->levels[0].height;
+
+ ectx->base.blit(&ectx->base, &blit);
- /* Set up color TS to source surface before blit, if needed */
- uint32_t ts_mem_config = 0;
- if(rt_resource->base.nr_samples > 1)
- ts_mem_config |= VIVS_TS_MEM_CONFIG_MSAA | translate_msaa_format(rt_resource->base.format, false);
- if(rt_resource->levels[level].ts_size)
- {
- etna_set_state_multi(ctx, VIVS_TS_MEM_CONFIG, 4, (uint32_t[]) {
- ectx->gpu3d.TS_MEM_CONFIG = VIVS_TS_MEM_CONFIG_COLOR_FAST_CLEAR | ts_mem_config,
- ectx->gpu3d.TS_COLOR_STATUS_BASE = etna_bo_gpu_address(rt_resource->ts_bo) + rt_resource->levels[level].ts_offset,
- ectx->gpu3d.TS_COLOR_SURFACE_BASE = etna_bo_gpu_address(rt_resource->bo) + rt_resource->levels[level].offset,
- ectx->gpu3d.TS_COLOR_CLEAR_VALUE = rt_resource->levels[level].clear_value
- });
- } else {
- etna_set_state(ctx, VIVS_TS_MEM_CONFIG,
- ectx->gpu3d.TS_MEM_CONFIG = ts_mem_config);
- }
- ectx->dirty_bits |= ETNA_STATE_TS;
-
- int msaa_xscale=1, msaa_yscale=1;
- if(!translate_samples_to_xyscale(resource->nr_samples, &msaa_xscale, &msaa_yscale, NULL))
- return;
-
- /* Kick off RS here */
- struct compiled_rs_state copy_to_screen;
- etna_compile_rs_state(ctx, &copy_to_screen, &(struct rs_state){
- .source_format = translate_rt_format(rt_resource->base.format, false),
- .source_tiling = rt_resource->layout,
- .source_addr[0] = etna_get_level_pipe_addr(rt_resource, level, 0),
- .source_addr[1] = etna_get_level_pipe_addr(rt_resource, level, 1),
- .source_stride = rt_resource->levels[level].stride,
- .dest_format = translate_rt_format(drawable->base.format, false),
- .dest_tiling = drawable->layout,
- .dest_addr[0] = etna_bo_gpu_address(drawable->bo),
- .dest_stride = drawable->levels[0].stride,
- .downsample_x = msaa_xscale > 1,
- .downsample_y = msaa_yscale > 1,
- .swap_rb = translate_rb_src_dst_swap(rt_resource->base.format,
- drawable->base.format),
- .dither = {0xffffffff, 0xffffffff}, // XXX dither when going from 24 to 16 bit?
- .clear_mode = VIVS_RS_CLEAR_CONTROL_MODE_DISABLED,
- .width = drawable->levels[0].width * msaa_xscale,
- .height = drawable->levels[0].height * msaa_yscale
- });
- etna_submit_rs_state(ctx, &copy_to_screen);
- DBG_F(ETNA_DBG_FRAME_MSGS,
- "Queued RS command to flush screen from %08x to %08x stride=%08x width=%i height=%i, ctx %p",
- etna_bo_gpu_address(rt_resource->bo) + rt_resource->levels[level].offset,
- etna_bo_gpu_address(drawable->bo), drawable->levels[0].stride,
- drawable->levels[0].width, drawable->levels[0].height, ctx);
ectx->base.flush(&ectx->base, NULL, 0);
}