diff options
author | Eric Anholt <[email protected]> | 2014-07-31 11:22:17 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2014-08-11 14:45:30 -0700 |
commit | 100e5679c7cfcabc9c149e63e5e833c55ea81cb0 (patch) | |
tree | e84bffdc94a7e1e5d9f26d205673d3d699516a4c /src/gallium/drivers | |
parent | fbaac8407a2397d40cb86ca9c352dfdcec38da7f (diff) |
vc4: Move render command list calls to vc4_flush()
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/vc4/vc4_context.c | 43 | ||||
-rw-r--r-- | src/gallium/drivers/vc4/vc4_draw.c | 40 |
2 files changed, 43 insertions, 40 deletions
diff --git a/src/gallium/drivers/vc4/vc4_context.c b/src/gallium/drivers/vc4/vc4_context.c index c75cea2fcb4..9f10473846d 100644 --- a/src/gallium/drivers/vc4/vc4_context.c +++ b/src/gallium/drivers/vc4/vc4_context.c @@ -84,6 +84,47 @@ dump_fbo(struct vc4_context *vc4, struct vc4_bo *fbo) #endif } +static void +vc4_rcl_tile_calls(struct vc4_context *vc4) +{ + struct vc4_surface *csurf = vc4_surface(vc4->framebuffer.cbufs[0]); + struct vc4_resource *ctex = vc4_resource(csurf->base.texture); + uint32_t width = vc4->framebuffer.width; + uint32_t height = vc4->framebuffer.height; + uint32_t xtiles = align(width, 64) / 64; + uint32_t ytiles = align(height, 64) / 64; + + for (int x = 0; x < xtiles; x++) { + for (int y = 0; y < ytiles; y++) { + cl_u8(&vc4->rcl, VC4_PACKET_TILE_COORDINATES); + cl_u8(&vc4->rcl, x); + cl_u8(&vc4->rcl, y); + + cl_start_reloc(&vc4->rcl, 1); + cl_u8(&vc4->rcl, VC4_PACKET_LOAD_TILE_BUFFER_GENERAL); + cl_u8(&vc4->rcl, + VC4_LOADSTORE_TILE_BUFFER_COLOR | + VC4_LOADSTORE_TILE_BUFFER_FORMAT_RASTER); + cl_u8(&vc4->rcl, + VC4_LOADSTORE_TILE_BUFFER_RGBA8888); + cl_reloc(vc4, &vc4->rcl, ctex->bo, csurf->offset); + + cl_start_reloc(&vc4->rcl, 1); + cl_u8(&vc4->rcl, VC4_PACKET_BRANCH_TO_SUB_LIST); + cl_reloc(vc4, &vc4->rcl, vc4->tile_alloc, + (y * xtiles + x) * 32); + + if (x == xtiles - 1 && y == ytiles - 1) { + cl_u8(&vc4->rcl, + VC4_PACKET_STORE_MS_TILE_BUFFER_AND_EOF); + } else { + cl_u8(&vc4->rcl, + VC4_PACKET_STORE_MS_TILE_BUFFER); + } + } + } +} + void vc4_flush(struct pipe_context *pctx) { @@ -101,6 +142,8 @@ vc4_flush(struct pipe_context *pctx) struct drm_vc4_submit_cl submit; memset(&submit, 0, sizeof(submit)); + vc4_rcl_tile_calls(vc4); + submit.bo_handles = vc4->bo_handles.base; submit.bo_handle_count = (vc4->bo_handles.next - vc4->bo_handles.base) / 4; diff --git a/src/gallium/drivers/vc4/vc4_draw.c b/src/gallium/drivers/vc4/vc4_draw.c index d4382c6a415..2867aac38d6 100644 --- a/src/gallium/drivers/vc4/vc4_draw.c +++ b/src/gallium/drivers/vc4/vc4_draw.c @@ -31,44 +31,6 @@ #include "vc4_resource.h" static void -vc4_rcl_tile_calls(struct vc4_context *vc4, - struct vc4_surface *csurf, - uint32_t xtiles, uint32_t ytiles) -{ - struct vc4_resource *ctex = vc4_resource(csurf->base.texture); - - for (int x = 0; x < xtiles; x++) { - for (int y = 0; y < ytiles; y++) { - cl_u8(&vc4->rcl, VC4_PACKET_TILE_COORDINATES); - cl_u8(&vc4->rcl, x); - cl_u8(&vc4->rcl, y); - - cl_start_reloc(&vc4->rcl, 1); - cl_u8(&vc4->rcl, VC4_PACKET_LOAD_TILE_BUFFER_GENERAL); - cl_u8(&vc4->rcl, - VC4_LOADSTORE_TILE_BUFFER_COLOR | - VC4_LOADSTORE_TILE_BUFFER_FORMAT_RASTER); - cl_u8(&vc4->rcl, - VC4_LOADSTORE_TILE_BUFFER_RGBA8888); - cl_reloc(vc4, &vc4->rcl, ctex->bo, csurf->offset); - - cl_start_reloc(&vc4->rcl, 1); - cl_u8(&vc4->rcl, VC4_PACKET_BRANCH_TO_SUB_LIST); - cl_reloc(vc4, &vc4->rcl, vc4->tile_alloc, - (y * xtiles + x) * 32); - - if (x == xtiles - 1 && y == ytiles - 1) { - cl_u8(&vc4->rcl, - VC4_PACKET_STORE_MS_TILE_BUFFER_AND_EOF); - } else { - cl_u8(&vc4->rcl, - VC4_PACKET_STORE_MS_TILE_BUFFER); - } - } - } -} - -static void vc4_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) { struct vc4_context *vc4 = vc4_context(pctx); @@ -239,8 +201,6 @@ vc4_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) cl_u32(&vc4->rcl, 0); // no address is needed } - vc4_rcl_tile_calls(vc4, csurf, tilew, tileh); - vc4_flush(pctx); } |