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:
parent
52824811b9
commit
a71c3b885a
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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++;
|
||||||
|
|
Loading…
Reference in New Issue