sna/gen[23]: Remark the destination bo as dirty after flushing
One of the side-effects of emitting the composite state is that it tags the destination surface as dirty as a result of the *forthcoming* operation. So emitting the flush after emitting the composite state clears that tag, so we need to restore it for future coherency. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
2f09363a6e
commit
a11b22d172
|
|
@ -1657,6 +1657,8 @@ gen2_render_composite(struct sna *sna,
|
|||
int16_t width, int16_t height,
|
||||
struct sna_composite_op *tmp)
|
||||
{
|
||||
bool need_flush;
|
||||
|
||||
DBG(("%s()\n", __FUNCTION__));
|
||||
|
||||
if (op >= ARRAY_SIZE(gen2_blend_op)) {
|
||||
|
|
@ -1808,8 +1810,10 @@ gen2_render_composite(struct sna *sna,
|
|||
NULL))
|
||||
kgem_submit(&sna->kgem);
|
||||
|
||||
need_flush =
|
||||
kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo);
|
||||
gen2_emit_composite_state(sna, tmp);
|
||||
if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
|
||||
if (need_flush) {
|
||||
if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) {
|
||||
kgem_emit_flush(&sna->kgem);
|
||||
} else {
|
||||
|
|
@ -1819,6 +1823,7 @@ gen2_render_composite(struct sna *sna,
|
|||
kgem_clear_dirty(&sna->kgem);
|
||||
}
|
||||
assert(sna->kgem.mode == KGEM_RENDER);
|
||||
kgem_bo_mark_dirty(tmp->dst.bo);
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
|
|
@ -2154,6 +2159,8 @@ gen2_render_composite_spans(struct sna *sna,
|
|||
unsigned flags,
|
||||
struct sna_composite_spans_op *tmp)
|
||||
{
|
||||
bool need_flush;
|
||||
|
||||
DBG(("%s(src=(%d, %d), dst=(%d, %d), size=(%d, %d))\n", __FUNCTION__,
|
||||
src_x, src_y, dst_x, dst_y, width, height));
|
||||
|
||||
|
|
@ -2229,8 +2236,9 @@ gen2_render_composite_spans(struct sna *sna,
|
|||
NULL))
|
||||
kgem_submit(&sna->kgem);
|
||||
|
||||
need_flush = tmp->base.src.bo;
|
||||
gen2_emit_composite_spans_state(sna, tmp);
|
||||
if (kgem_bo_is_dirty(tmp->base.src.bo)) {
|
||||
if (need_flush) {
|
||||
if (tmp->base.src.bo == tmp->base.dst.bo) {
|
||||
kgem_emit_flush(&sna->kgem);
|
||||
} else {
|
||||
|
|
@ -2240,6 +2248,7 @@ gen2_render_composite_spans(struct sna *sna,
|
|||
kgem_clear_dirty(&sna->kgem);
|
||||
}
|
||||
assert(sna->kgem.mode == KGEM_RENDER);
|
||||
kgem_bo_mark_dirty(tmp->base.dst.bo);
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
|
|
|
|||
|
|
@ -2560,6 +2560,8 @@ gen3_render_composite(struct sna *sna,
|
|||
int16_t width, int16_t height,
|
||||
struct sna_composite_op *tmp)
|
||||
{
|
||||
bool need_flush;
|
||||
|
||||
DBG(("%s()\n", __FUNCTION__));
|
||||
|
||||
if (op >= ARRAY_SIZE(gen3_blend_op)) {
|
||||
|
|
@ -2800,8 +2802,10 @@ gen3_render_composite(struct sna *sna,
|
|||
NULL))
|
||||
kgem_submit(&sna->kgem);
|
||||
|
||||
need_flush =
|
||||
kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo);
|
||||
gen3_emit_composite_state(sna, tmp);
|
||||
if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
|
||||
if (need_flush) {
|
||||
if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) {
|
||||
kgem_emit_flush(&sna->kgem);
|
||||
} else {
|
||||
|
|
@ -2811,6 +2815,7 @@ gen3_render_composite(struct sna *sna,
|
|||
kgem_clear_dirty(&sna->kgem);
|
||||
}
|
||||
assert(sna->kgem.mode == KGEM_RENDER);
|
||||
kgem_bo_mark_dirty(tmp->dst.bo);
|
||||
}
|
||||
|
||||
gen3_align_vertex(sna, tmp);
|
||||
|
|
@ -3136,7 +3141,7 @@ gen3_render_composite_spans(struct sna *sna,
|
|||
unsigned flags,
|
||||
struct sna_composite_spans_op *tmp)
|
||||
{
|
||||
bool no_offset;
|
||||
bool no_offset, need_flush;
|
||||
|
||||
DBG(("%s(src=(%d, %d), dst=(%d, %d), size=(%d, %d))\n", __FUNCTION__,
|
||||
src_x, src_y, dst_x, dst_y, width, height));
|
||||
|
|
@ -3241,8 +3246,9 @@ gen3_render_composite_spans(struct sna *sna,
|
|||
NULL))
|
||||
kgem_submit(&sna->kgem);
|
||||
|
||||
need_flush = kgem_bo_is_dirty(tmp->base.src.bo);
|
||||
gen3_emit_composite_state(sna, &tmp->base);
|
||||
if (kgem_bo_is_dirty(tmp->base.src.bo)) {
|
||||
if (need_flush) {
|
||||
if (tmp->base.src.bo == tmp->base.dst.bo) {
|
||||
kgem_emit_flush(&sna->kgem);
|
||||
} else {
|
||||
|
|
@ -3252,6 +3258,7 @@ gen3_render_composite_spans(struct sna *sna,
|
|||
kgem_clear_dirty(&sna->kgem);
|
||||
}
|
||||
assert(sna->kgem.mode == KGEM_RENDER);
|
||||
kgem_bo_mark_dirty(tmp->base.dst.bo);
|
||||
}
|
||||
|
||||
gen3_align_vertex(sna, &tmp->base);
|
||||
|
|
|
|||
|
|
@ -1663,7 +1663,7 @@ static void gen6_emit_composite_state(struct sna *sna,
|
|||
FALSE);
|
||||
}
|
||||
|
||||
if (sna->kgem.surface == offset&&
|
||||
if (sna->kgem.surface == offset &&
|
||||
*(uint64_t *)(sna->kgem.batch + sna->render_state.gen6.surface_table) == *(uint64_t*)binding_table &&
|
||||
(op->mask.bo == NULL ||
|
||||
sna->kgem.batch[sna->render_state.gen6.surface_table+2] == binding_table[2])) {
|
||||
|
|
|
|||
|
|
@ -2884,9 +2884,10 @@ struct kgem_bo *kgem_create_proxy(struct kgem_bo *target,
|
|||
{
|
||||
struct kgem_bo *bo;
|
||||
|
||||
assert(target->proxy == NULL);
|
||||
DBG(("%s: target handle=%d, offset=%d, length=%d, io=%d\n",
|
||||
__FUNCTION__, target->handle, offset, length, target->io));
|
||||
assert(target->proxy == NULL);
|
||||
assert(target->tiling == I915_TILING_NONE);
|
||||
|
||||
bo = __kgem_bo_alloc(target->handle, length);
|
||||
if (bo == NULL)
|
||||
|
|
|
|||
Loading…
Reference in New Issue