aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2014-07-31 11:22:17 -0700
committerEric Anholt <[email protected]>2014-08-11 14:45:30 -0700
commit100e5679c7cfcabc9c149e63e5e833c55ea81cb0 (patch)
treee84bffdc94a7e1e5d9f26d205673d3d699516a4c /src/gallium/drivers
parentfbaac8407a2397d40cb86ca9c352dfdcec38da7f (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.c43
-rw-r--r--src/gallium/drivers/vc4/vc4_draw.c40
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);
}