sna/kgem: Check all operation bo in a single amalgamation

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2011-09-25 09:38:43 +01:00
parent ccf6547a8f
commit 46fedf0cf1
8 changed files with 77 additions and 113 deletions

View File

@ -1347,11 +1347,9 @@ gen2_render_composite(struct sna *sna,
tmp->boxes = gen2_render_composite_boxes;
tmp->done = gen2_render_composite_done;
if (!kgem_check_bo(&sna->kgem, tmp->dst.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->src.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->mask.bo))
if (!kgem_check_bo(&sna->kgem,
tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
@ -1720,9 +1718,9 @@ gen2_render_composite_spans(struct sna *sna,
tmp->boxes = gen2_render_composite_spans_boxes;
tmp->done = gen2_render_composite_spans_done;
if (!kgem_check_bo(&sna->kgem, tmp->base.dst.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->base.src.bo))
if (!kgem_check_bo(&sna->kgem,
tmp->base.dst.bo, tmp->base.src.bo,
NULL))
kgem_submit(&sna->kgem);
gen2_emit_composite_spans_state(sna, tmp);
@ -1876,7 +1874,7 @@ gen2_render_fill_boxes(struct sna *sna,
tmp.dst.bo = dst_bo;
tmp.floats_per_vertex = 2;
if (!kgem_check_bo(&sna->kgem, dst_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
kgem_submit(&sna->kgem);
gen2_emit_fill_composite_state(sna, &tmp, pixel);
@ -1995,7 +1993,7 @@ gen2_render_fill(struct sna *sna, uint8_t alu,
tmp->base.u.gen2.pixel =
sna_rgba_for_color(color, dst->drawable.depth);
if (!kgem_check_bo(&sna->kgem, dst_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
kgem_submit(&sna->kgem);
tmp->blt = gen2_render_fill_blt;
@ -2119,9 +2117,7 @@ gen2_render_copy_boxes(struct sna *sna, uint8_t alu,
box, n);
}
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, src_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(src_bo))
@ -2263,9 +2259,7 @@ gen2_render_copy(struct sna *sna, uint8_t alu,
tmp->base.floats_per_vertex = 4;
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, src_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(src_bo))

View File

@ -2338,11 +2338,9 @@ gen3_render_composite(struct sna *sna,
tmp->boxes = gen3_render_composite_boxes;
tmp->done = gen3_render_composite_done;
if (!kgem_check_bo(&sna->kgem, tmp->dst.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->src.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->mask.bo))
if (!kgem_check_bo(&sna->kgem,
tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
@ -2743,9 +2741,9 @@ gen3_render_composite_spans(struct sna *sna,
tmp->boxes = gen3_render_composite_spans_boxes;
tmp->done = gen3_render_composite_spans_done;
if (!kgem_check_bo(&sna->kgem, tmp->base.dst.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->base.src.bo))
if (!kgem_check_bo(&sna->kgem,
tmp->base.dst.bo, tmp->base.src.bo,
NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(tmp->base.src.bo)) {
@ -3283,9 +3281,7 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
box, n);
}
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, src_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(src_bo))
@ -3433,9 +3429,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
tmp->base.floats_per_vertex = 4;
tmp->base.mask.u.gen3.type = SHADER_NONE;
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, src_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(src_bo))
@ -3552,7 +3546,7 @@ gen3_render_fill_boxes(struct sna *sna,
tmp.src.u.gen3.type = op == PictOpClear ? SHADER_ZERO : SHADER_CONSTANT;
tmp.src.u.gen3.mode = pixel;
if (!kgem_check_bo(&sna->kgem, dst_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
kgem_submit(&sna->kgem);
gen3_emit_composite_state(sna, &tmp);
@ -3654,7 +3648,7 @@ gen3_render_fill(struct sna *sna, uint8_t alu,
tmp->base.src.u.gen3.mode =
sna_rgba_for_color(color, dst->drawable.depth);
if (!kgem_check_bo(&sna->kgem, dst_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
kgem_submit(&sna->kgem);
tmp->blt = gen3_render_fill_blt;

View File

@ -1637,9 +1637,7 @@ gen4_render_video(struct sna *sna,
tmp.floats_per_vertex = 3;
tmp.u.gen4.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, tmp.dst.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, frame->bo))
if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
kgem_submit(&sna->kgem);
if (!kgem_bo_is_dirty(frame->bo))
@ -2034,11 +2032,9 @@ gen4_render_composite(struct sna *sna,
tmp->boxes = gen4_render_composite_boxes;
tmp->done = gen4_render_composite_done;
if (!kgem_check_bo(&sna->kgem, tmp->dst.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->src.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->mask.bo))
if (!kgem_check_bo(&sna->kgem,
tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
@ -2209,9 +2205,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
tmp.u.gen4.wm_kernel = WM_KERNEL;
tmp.u.gen4.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, src_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(src_bo))
@ -2309,9 +2303,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
op->base.u.gen4.wm_kernel = WM_KERNEL;
op->base.u.gen4.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, src_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(src_bo))
@ -2464,7 +2456,7 @@ gen4_render_fill_boxes(struct sna *sna,
tmp.u.gen4.wm_kernel = WM_KERNEL;
tmp.u.gen4.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
kgem_submit(&sna->kgem);
gen4_fill_bind_surfaces(sna, &tmp);
@ -2547,7 +2539,7 @@ gen4_render_fill(struct sna *sna, uint8_t alu,
op->base.u.gen4.wm_kernel = WM_KERNEL;
op->base.u.gen4.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
kgem_submit(&sna->kgem);
gen4_fill_bind_surfaces(sna, &op->base);

View File

@ -720,7 +720,7 @@ gen5_bind_bo(struct sna *sna,
DBG(("[%x] bind bo(handle=%d, addr=%d), format=%d, width=%d, height=%d, pitch=%d, tiling=%d -> %s\n",
offset, bo->handle, ss[1],
format, width, height, bo->pitch, bo->tiling,
format, width, height, bo->pitch, bo->tiling,
domains & 0xffff ? "render" : "sampler"));
return offset;
@ -1664,9 +1664,7 @@ gen5_render_video(struct sna *sna,
tmp.is_affine = TRUE;
tmp.floats_per_vertex = 3;
if (!kgem_check_bo(&sna->kgem, tmp.dst.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, frame->bo))
if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
kgem_submit(&sna->kgem);
if (!kgem_bo_is_dirty(frame->bo))
@ -2045,11 +2043,8 @@ gen5_render_composite(struct sna *sna,
tmp->boxes = gen5_render_composite_boxes;
tmp->done = gen5_render_composite_done;
if (!kgem_check_bo(&sna->kgem, tmp->dst.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->src.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->mask.bo))
if (!kgem_check_bo(&sna->kgem,
tmp->dst.bo, tmp->src.bo, tmp->mask.bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
@ -2159,9 +2154,7 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
tmp.u.gen5.wm_kernel = WM_KERNEL;
tmp.u.gen5.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, src_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(src_bo))
@ -2295,9 +2288,7 @@ gen5_render_copy(struct sna *sna, uint8_t alu,
op->base.u.gen5.wm_kernel = WM_KERNEL;
op->base.u.gen5.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, src_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(src_bo))
@ -2368,17 +2359,17 @@ gen5_render_fill_boxes(struct sna *sna,
dst->drawable.height > 8192 ||
!gen5_check_dst_format(format)) {
uint8_t alu = GXcopy;
uint8_t _op = op;
if (op == PictOpClear) {
if (_op == PictOpClear) {
alu = GXclear;
pixel = 0;
op = PictOpSrc;
_op = PictOpSrc;
}
if (op == PictOpOver && color->alpha >= 0xff00)
op = PictOpSrc;
if (_op == PictOpOver && color->alpha >= 0xff00)
_op = PictOpSrc;
if (op == PictOpSrc &&
if (_op == PictOpSrc &&
sna_get_pixel_from_rgba(&pixel,
color->red,
color->green,
@ -2423,7 +2414,7 @@ gen5_render_fill_boxes(struct sna *sna,
tmp.u.gen5.wm_kernel = WM_KERNEL;
tmp.u.gen5.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
kgem_submit(&sna->kgem);
gen5_fill_bind_surfaces(sna, &tmp);
@ -2542,7 +2533,7 @@ gen5_render_fill(struct sna *sna, uint8_t alu,
op->base.u.gen5.wm_kernel = WM_KERNEL;
op->base.u.gen5.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
kgem_submit(&sna->kgem);
gen5_fill_bind_surfaces(sna, &op->base);

View File

@ -1838,9 +1838,7 @@ gen6_render_video(struct sna *sna,
tmp.u.gen6.nr_inputs = 1;
tmp.u.gen6.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, tmp.dst.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, frame->bo))
if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(frame->bo))
@ -2222,11 +2220,9 @@ gen6_render_composite(struct sna *sna,
tmp->boxes = gen6_render_composite_boxes;
tmp->done = gen6_render_composite_done;
if (!kgem_check_bo(&sna->kgem, tmp->dst.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->src.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->mask.bo))
if (!kgem_check_bo(&sna->kgem,
tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
@ -2355,9 +2351,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
tmp.u.gen6.nr_inputs = 1;
tmp.u.gen6.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, src_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(src_bo))
@ -2503,9 +2497,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
op->base.u.gen6.nr_inputs = 1;
op->base.u.gen6.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, src_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(src_bo))
@ -2642,7 +2634,7 @@ gen6_render_fill_boxes(struct sna *sna,
tmp.u.gen6.nr_inputs = 1;
tmp.u.gen6.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
kgem_submit(&sna->kgem);
gen6_emit_fill_state(sna, &tmp);
@ -2768,7 +2760,7 @@ gen6_render_fill(struct sna *sna, uint8_t alu,
op->base.u.gen6.nr_inputs = 1;
op->base.u.gen6.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
kgem_submit(&sna->kgem);
gen6_emit_fill_state(sna, &op->base);

View File

@ -1970,9 +1970,7 @@ gen7_render_video(struct sna *sna,
tmp.u.gen7.nr_inputs = 1;
tmp.u.gen7.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, tmp.dst.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, frame->bo))
if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(frame->bo))
@ -2355,11 +2353,9 @@ gen7_render_composite(struct sna *sna,
tmp->boxes = gen7_render_composite_boxes;
tmp->done = gen7_render_composite_done;
if (!kgem_check_bo(&sna->kgem, tmp->dst.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->src.bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, tmp->mask.bo))
if (!kgem_check_bo(&sna->kgem,
tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
@ -2490,9 +2486,7 @@ gen7_render_copy_boxes(struct sna *sna, uint8_t alu,
tmp.u.gen7.nr_inputs = 1;
tmp.u.gen7.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, src_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(src_bo))
@ -2640,9 +2634,7 @@ gen7_render_copy(struct sna *sna, uint8_t alu,
op->base.u.gen7.nr_inputs = 1;
op->base.u.gen7.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
if (!kgem_check_bo(&sna->kgem, src_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
kgem_submit(&sna->kgem);
if (kgem_bo_is_dirty(src_bo))
@ -2785,7 +2777,7 @@ gen7_render_fill_boxes(struct sna *sna,
tmp.u.gen7.nr_inputs = 1;
tmp.u.gen7.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
kgem_submit(&sna->kgem);
gen7_emit_fill_state(sna, &tmp);
@ -2912,7 +2904,7 @@ gen7_render_fill(struct sna *sna, uint8_t alu,
op->base.u.gen7.nr_inputs = 1;
op->base.u.gen7.ve_id = 1;
if (!kgem_check_bo(&sna->kgem, dst_bo))
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
kgem_submit(&sna->kgem);
gen7_emit_fill_state(sna, &op->base);

View File

@ -1209,7 +1209,7 @@ search_linear_cache(struct kgem *kgem, unsigned int size, bool use_active)
use_active ? "active" : "inactive"));
assert(bo->refcnt == 0);
assert(bo->reusable);
assert(use_active || !kgem_busy(kgem, bo->handle));
//assert(use_active || !kgem_busy(kgem, bo->handle));
return bo;
}
@ -1562,21 +1562,30 @@ void __kgem_flush(struct kgem *kgem, struct kgem_bo *bo)
kgem_busy(kgem, bo->handle);
}
bool kgem_check_bo(struct kgem *kgem, struct kgem_bo *bo)
bool kgem_check_bo(struct kgem *kgem, ...)
{
if (bo == NULL)
return true;
if (bo->exec)
return true;
va_list ap;
struct kgem_bo *bo;
int num_exec = 0;
int size = 0;
if (kgem->aperture > kgem->aperture_low)
return false;
if (bo->size + kgem->aperture > kgem->aperture_high)
va_start(ap, kgem);
while ((bo = va_arg(ap, struct kgem_bo *))) {
if (bo->exec)
continue;
size += bo->size;
num_exec++;
}
va_end(ap);
if (size + kgem->aperture > kgem->aperture_high)
return false;
if (kgem->nexec == KGEM_EXEC_SIZE(kgem))
if (kgem->nexec + num_exec >= KGEM_EXEC_SIZE(kgem))
return false;
return true;

View File

@ -271,7 +271,7 @@ static inline void kgem_advance_batch(struct kgem *kgem, int num_dwords)
kgem->nbatch += num_dwords;
}
bool kgem_check_bo(struct kgem *kgem, struct kgem_bo *bo);
bool kgem_check_bo(struct kgem *kgem, ...) __attribute__((sentinel(NULL)));
bool kgem_check_bo_fenced(struct kgem *kgem, ...) __attribute__((sentinel(NULL)));
void _kgem_add_bo(struct kgem *kgem, struct kgem_bo *bo);