vc4: Refactor flushing before mapping a BO.

I'm going to want to make some other decisions here before flushing.
This commit is contained in:
Eric Anholt 2014-10-24 16:45:04 +01:00
parent 52824811b9
commit a71c3b885a
3 changed files with 13 additions and 12 deletions

View File

@ -350,13 +350,13 @@ vc4_pipe_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence,
* *
* This helps avoid flushing the command buffers when unnecessary. * This helps avoid flushing the command buffers when unnecessary.
*/ */
void bool
vc4_flush_for_bo(struct pipe_context *pctx, struct vc4_bo *bo) vc4_cl_references_bo(struct pipe_context *pctx, struct vc4_bo *bo)
{ {
struct vc4_context *vc4 = vc4_context(pctx); struct vc4_context *vc4 = vc4_context(pctx);
if (!vc4->needs_flush) if (!vc4->needs_flush)
return; return false;
/* Walk all the referenced BOs in the drawing command list to see if /* Walk all the referenced BOs in the drawing command list to see if
* they match. * they match.
@ -365,8 +365,7 @@ vc4_flush_for_bo(struct pipe_context *pctx, struct vc4_bo *bo)
for (int i = 0; i < (vc4->bo_handles.next - for (int i = 0; i < (vc4->bo_handles.next -
vc4->bo_handles.base) / 4; i++) { vc4->bo_handles.base) / 4; i++) {
if (referenced_bos[i] == bo) { if (referenced_bos[i] == bo) {
vc4_flush(pctx); return true;
return;
} }
} }
@ -377,8 +376,7 @@ vc4_flush_for_bo(struct pipe_context *pctx, struct vc4_bo *bo)
if (csurf) { if (csurf) {
struct vc4_resource *ctex = vc4_resource(csurf->base.texture); struct vc4_resource *ctex = vc4_resource(csurf->base.texture);
if (ctex->bo == bo) { if (ctex->bo == bo) {
vc4_flush(pctx); return true;
return;
} }
} }
@ -387,10 +385,11 @@ vc4_flush_for_bo(struct pipe_context *pctx, struct vc4_bo *bo)
struct vc4_resource *ztex = struct vc4_resource *ztex =
vc4_resource(zsurf->base.texture); vc4_resource(zsurf->base.texture);
if (ztex->bo == bo) { if (ztex->bo == bo) {
vc4_flush(pctx); return true;
return;
} }
} }
return false;
} }
static void static void

View File

@ -278,7 +278,7 @@ void vc4_write_uniforms(struct vc4_context *vc4,
struct vc4_texture_stateobj *texstate); struct vc4_texture_stateobj *texstate);
void vc4_flush(struct pipe_context *pctx); void vc4_flush(struct pipe_context *pctx);
void vc4_flush_for_bo(struct pipe_context *pctx, struct vc4_bo *bo); bool vc4_cl_references_bo(struct pipe_context *pctx, struct vc4_bo *bo);
void vc4_emit_state(struct pipe_context *pctx); void vc4_emit_state(struct pipe_context *pctx);
void vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c); void vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c);
struct qpu_reg *vc4_register_allocate(struct vc4_context *vc4, struct vc4_compile *c); struct qpu_reg *vc4_register_allocate(struct vc4_context *vc4, struct vc4_compile *c);

View File

@ -80,8 +80,10 @@ vc4_resource_transfer_map(struct pipe_context *pctx,
rsc->bo = vc4_bo_alloc(vc4->screen, size, "resource"); rsc->bo = vc4_bo_alloc(vc4->screen, size, "resource");
} }
if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) {
vc4_flush_for_bo(pctx, rsc->bo); if (vc4_cl_references_bo(pctx, rsc->bo))
vc4_flush(pctx);
}
if (usage & PIPE_TRANSFER_WRITE) if (usage & PIPE_TRANSFER_WRITE)
rsc->writes++; rsc->writes++;