Rev 3258 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3258 | Rev 3263 | ||
---|---|---|---|
Line 1147... | Line 1147... | ||
1147 | const struct sna_composite_op *op) |
1147 | const struct sna_composite_op *op) |
1148 | { |
1148 | { |
1149 | int id = 1 << GEN6_VERTEX(op->u.gen6.flags); |
1149 | int id = 1 << GEN6_VERTEX(op->u.gen6.flags); |
1150 | int ndwords; |
1150 | int ndwords; |
Line -... | Line 1151... | ||
- | 1151 | ||
- | 1152 | if (sna_vertex_wait__locked(&sna->render) && sna->render.vertex_offset) |
|
- | 1153 | return true; |
|
1151 | 1154 | ||
1152 | ndwords = op->need_magic_ca_pass ? 60 : 6; |
1155 | ndwords = op->need_magic_ca_pass ? 60 : 6; |
1153 | if ((sna->render.vb_id & id) == 0) |
1156 | if ((sna->render.vb_id & id) == 0) |
1154 | ndwords += 5; |
1157 | ndwords += 5; |
1155 | if (!kgem_check_batch(&sna->kgem, ndwords)) |
1158 | if (!kgem_check_batch(&sna->kgem, ndwords)) |
Line 1163... | Line 1166... | ||
1163 | } |
1166 | } |
Line 1164... | Line 1167... | ||
1164 | 1167 | ||
1165 | static int gen6_get_rectangles__flush(struct sna *sna, |
1168 | static int gen6_get_rectangles__flush(struct sna *sna, |
1166 | const struct sna_composite_op *op) |
1169 | const struct sna_composite_op *op) |
- | 1170 | { |
|
- | 1171 | /* Preventing discarding new vbo after lock contention */ |
|
- | 1172 | if (sna_vertex_wait__locked(&sna->render)) { |
|
- | 1173 | int rem = vertex_space(sna); |
|
- | 1174 | if (rem > op->floats_per_rect) |
|
- | 1175 | return rem; |
|
Line 1167... | Line 1176... | ||
1167 | { |
1176 | } |
1168 | 1177 | ||
1169 | if (!kgem_check_batch(&sna->kgem, op->need_magic_ca_pass ? 65 : 5)) |
1178 | if (!kgem_check_batch(&sna->kgem, op->need_magic_ca_pass ? 65 : 5)) |
1170 | return 0; |
1179 | return 0; |
Line 1216... | Line 1225... | ||
1216 | flush: |
1225 | flush: |
1217 | if (sna->render.vertex_offset) { |
1226 | if (sna->render.vertex_offset) { |
1218 | gen4_vertex_flush(sna); |
1227 | gen4_vertex_flush(sna); |
1219 | gen6_magic_ca_pass(sna, op); |
1228 | gen6_magic_ca_pass(sna, op); |
1220 | } |
1229 | } |
1221 | // sna_vertex_wait__locked(&sna->render); |
1230 | sna_vertex_wait__locked(&sna->render); |
1222 | _kgem_submit(&sna->kgem); |
1231 | _kgem_submit(&sna->kgem); |
1223 | emit_state(sna, op); |
1232 | emit_state(sna, op); |
1224 | goto start; |
1233 | goto start; |
1225 | } |
1234 | } |
Line 2012... | Line 2021... | ||
2012 | tmp->boxes = gen6_render_composite_boxes; |
2021 | tmp->boxes = gen6_render_composite_boxes; |
2013 | tmp->thread_boxes = gen6_render_composite_boxes__thread; |
2022 | tmp->thread_boxes = gen6_render_composite_boxes__thread; |
2014 | } |
2023 | } |
2015 | tmp->done = gen6_render_composite_done; |
2024 | tmp->done = gen6_render_composite_done; |
Line -... | Line 2025... | ||
- | 2025 | ||
- | 2026 | kgem_set_mode(&sna->kgem, KGEM_RENDER, tmp->dst.bo); |
|
- | 2027 | if (!kgem_check_bo(&sna->kgem, |
|
- | 2028 | tmp->dst.bo, tmp->src.bo, tmp->mask.bo, |
|
- | 2029 | NULL)) { |
|
- | 2030 | kgem_submit(&sna->kgem); |
|
- | 2031 | if (!kgem_check_bo(&sna->kgem, |
|
- | 2032 | tmp->dst.bo, tmp->src.bo, tmp->mask.bo, |
|
- | 2033 | NULL)) |
|
- | 2034 | goto cleanup_mask; |
|
2016 | 2035 | _kgem_set_mode(&sna->kgem, KGEM_RENDER); |
|
Line 2017... | Line 2036... | ||
2017 | 2036 | } |
|
2018 | 2037 | ||
2019 | gen6_emit_composite_state(sna, tmp); |
2038 | gen6_emit_composite_state(sna, tmp); |
Line 2652... | Line 2671... | ||
2652 | op->base.u.gen6.flags = COPY_FLAGS(alu); |
2671 | op->base.u.gen6.flags = COPY_FLAGS(alu); |
2653 | assert(GEN6_KERNEL(op->base.u.gen6.flags) == GEN6_WM_KERNEL_NOMASK); |
2672 | assert(GEN6_KERNEL(op->base.u.gen6.flags) == GEN6_WM_KERNEL_NOMASK); |
2654 | assert(GEN6_SAMPLER(op->base.u.gen6.flags) == COPY_SAMPLER); |
2673 | assert(GEN6_SAMPLER(op->base.u.gen6.flags) == COPY_SAMPLER); |
2655 | assert(GEN6_VERTEX(op->base.u.gen6.flags) == COPY_VERTEX); |
2674 | assert(GEN6_VERTEX(op->base.u.gen6.flags) == COPY_VERTEX); |
Line -... | Line 2675... | ||
- | 2675 | ||
- | 2676 | kgem_set_mode(&sna->kgem, KGEM_RENDER, dst_bo); |
|
- | 2677 | if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) { |
|
- | 2678 | kgem_submit(&sna->kgem); |
|
- | 2679 | if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) |
|
- | 2680 | goto fallback; |
|
- | 2681 | _kgem_set_mode(&sna->kgem, KGEM_RENDER); |
|
Line 2656... | Line 2682... | ||
2656 | 2682 | } |
|
2657 | 2683 | ||
Line 2658... | Line 2684... | ||
2658 | gen6_emit_copy_state(sna, &op->base); |
2684 | gen6_emit_copy_state(sna, &op->base); |
Line 3147... | Line 3173... | ||
3147 | tmp.u.gen6.flags = FILL_FLAGS_NOBLEND; |
3173 | tmp.u.gen6.flags = FILL_FLAGS_NOBLEND; |
3148 | assert(GEN6_KERNEL(tmp.u.gen6.flags) == GEN6_WM_KERNEL_NOMASK); |
3174 | assert(GEN6_KERNEL(tmp.u.gen6.flags) == GEN6_WM_KERNEL_NOMASK); |
3149 | assert(GEN6_SAMPLER(tmp.u.gen6.flags) == FILL_SAMPLER); |
3175 | assert(GEN6_SAMPLER(tmp.u.gen6.flags) == FILL_SAMPLER); |
3150 | assert(GEN6_VERTEX(tmp.u.gen6.flags) == FILL_VERTEX); |
3176 | assert(GEN6_VERTEX(tmp.u.gen6.flags) == FILL_VERTEX); |
Line -... | Line 3177... | ||
- | 3177 | ||
- | 3178 | if (!kgem_check_bo(&sna->kgem, bo, NULL)) { |
|
- | 3179 | kgem_submit(&sna->kgem); |
|
- | 3180 | if (!kgem_check_bo(&sna->kgem, bo, NULL)) { |
|
- | 3181 | kgem_bo_destroy(&sna->kgem, tmp.src.bo); |
|
- | 3182 | return false; |
|
3151 | 3183 | } |
|
Line 3152... | Line 3184... | ||
3152 | 3184 | } |
|
3153 | 3185 | ||
Line 3154... | Line 3186... | ||
3154 | gen6_emit_fill_state(sna, &tmp); |
3186 | gen6_emit_fill_state(sna, &tmp); |
Line 3171... | Line 3203... | ||
3171 | gen4_vertex_flush(sna); |
3203 | gen4_vertex_flush(sna); |
3172 | kgem_bo_destroy(&sna->kgem, tmp.src.bo); |
3204 | kgem_bo_destroy(&sna->kgem, tmp.src.bo); |
Line 3173... | Line 3205... | ||
3173 | 3205 | ||
3174 | return true; |
3206 | return true; |
- | 3207 | } |
|
Line 3175... | Line 3208... | ||
3175 | } |
3208 | #endif |
3176 | 3209 | ||
3177 | static void gen6_render_flush(struct sna *sna) |
3210 | static void gen6_render_flush(struct sna *sna) |
Line 3178... | Line 3211... | ||
3178 | { |
3211 | { |
3179 | gen4_vertex_close(sna); |
3212 | gen4_vertex_close(sna); |
3180 | 3213 | ||
Line 3181... | Line 3214... | ||
3181 | assert(sna->render.vb_id == 0); |
3214 | assert(sna->render.vb_id == 0); |
- | 3215 | assert(sna->render.vertex_offset == 0); |
|
- | 3216 | } |
|
- | 3217 | ||
- | 3218 | static void |
|
- | 3219 | gen6_render_context_switch(struct kgem *kgem, |
|
- | 3220 | int new_mode) |
|
- | 3221 | { |
|
- | 3222 | if (kgem->nbatch) { |
|
- | 3223 | DBG(("%s: from %d to %d\n", __FUNCTION__, kgem->mode, new_mode)); |
|
- | 3224 | _kgem_submit(kgem); |
|
Line 3182... | Line 3225... | ||
3182 | assert(sna->render.vertex_offset == 0); |
3225 | } |
3183 | } |
3226 | |
3184 | 3227 | kgem->ring = new_mode; |
|
3185 | #endif |
3228 | } |
Line 3198... | Line 3241... | ||
3198 | sna->render.vertex_used = 0; |
3241 | sna->render.vertex_used = 0; |
3199 | sna->render.vertex_index = 0; |
3242 | sna->render.vertex_index = 0; |
3200 | } |
3243 | } |
3201 | } |
3244 | } |
Line -... | Line 3245... | ||
- | 3245 | ||
- | 3246 | static void |
|
- | 3247 | gen6_render_expire(struct kgem *kgem) |
|
- | 3248 | { |
|
- | 3249 | struct sna *sna; |
|
- | 3250 | ||
- | 3251 | sna = container_of(kgem, struct sna, kgem); |
|
- | 3252 | if (sna->render.vbo && !sna->render.vertex_used) { |
|
- | 3253 | DBG(("%s: discarding vbo handle=%d\n", __FUNCTION__, sna->render.vbo->handle)); |
|
- | 3254 | kgem_bo_destroy(kgem, sna->render.vbo); |
|
- | 3255 | assert(!sna->render.active); |
|
- | 3256 | sna->render.vbo = NULL; |
|
- | 3257 | sna->render.vertices = sna->render.vertex_data; |
|
- | 3258 | sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); |
|
- | 3259 | sna->render.vertex_used = 0; |
|
- | 3260 | sna->render.vertex_index = 0; |
|
- | 3261 | } |
|
Line 3202... | Line 3262... | ||
3202 | 3262 | } |
|
3203 | 3263 | ||
3204 | static void gen6_render_reset(struct sna *sna) |
3264 | static void gen6_render_reset(struct sna *sna) |
3205 | { |
3265 | { |
Line 3317... | Line 3377... | ||
3317 | bool gen6_render_init(struct sna *sna) |
3377 | bool gen6_render_init(struct sna *sna) |
3318 | { |
3378 | { |
3319 | if (!gen6_render_setup(sna)) |
3379 | if (!gen6_render_setup(sna)) |
3320 | return false; |
3380 | return false; |
Line 3321... | Line 3381... | ||
3321 | 3381 | ||
3322 | // sna->kgem.context_switch = gen6_render_context_switch; |
3382 | sna->kgem.context_switch = gen6_render_context_switch; |
- | 3383 | sna->kgem.retire = gen6_render_retire; |
|
Line 3323... | Line 3384... | ||
3323 | sna->kgem.retire = gen6_render_retire; |
3384 | sna->kgem.expire = gen6_render_expire; |
3324 | 3385 | ||
Line 3325... | Line 3386... | ||
3325 | // sna->render.composite = gen6_render_composite; |
3386 | // sna->render.composite = gen6_render_composite; |
Line 3443... | Line 3504... | ||
3443 | 3504 | ||
3444 | sna->render.vertex_size = size; |
3505 | sna->render.vertex_size = size; |
3445 | return sna->render.vertex_size - sna->render.vertex_used; |
3506 | return sna->render.vertex_size - sna->render.vertex_used; |
Line -... | Line 3507... | ||
- | 3507 | } |
|
- | 3508 | ||
- | 3509 | void gen4_vertex_close(struct sna *sna) |
|
- | 3510 | { |
|
- | 3511 | struct kgem_bo *bo, *free_bo = NULL; |
|
- | 3512 | unsigned int i, delta = 0; |
|
- | 3513 | ||
- | 3514 | assert(sna->render.vertex_offset == 0); |
|
- | 3515 | if (!sna->render.vb_id) |
|
- | 3516 | return; |
|
- | 3517 | ||
- | 3518 | DBG(("%s: used=%d, vbo active? %d, vb=%x, nreloc=%d\n", |
|
- | 3519 | __FUNCTION__, sna->render.vertex_used, sna->render.vbo ? sna->render.vbo->handle : 0, |
|
- | 3520 | sna->render.vb_id, sna->render.nvertex_reloc)); |
|
- | 3521 | ||
- | 3522 | assert(!sna->render.active); |
|
- | 3523 | ||
- | 3524 | bo = sna->render.vbo; |
|
- | 3525 | if (bo) { |
|
- | 3526 | if (sna->render.vertex_size - sna->render.vertex_used < 64) { |
|
- | 3527 | DBG(("%s: discarding vbo (full), handle=%d\n", __FUNCTION__, sna->render.vbo->handle)); |
|
- | 3528 | sna->render.vbo = NULL; |
|
- | 3529 | sna->render.vertices = sna->render.vertex_data; |
|
- | 3530 | sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); |
|
- | 3531 | free_bo = bo; |
|
- | 3532 | } else if (IS_CPU_MAP(bo->map) && !sna->kgem.has_llc) { |
|
- | 3533 | DBG(("%s: converting CPU map to GTT\n", __FUNCTION__)); |
|
- | 3534 | sna->render.vertices = |
|
- | 3535 | kgem_bo_map__gtt(&sna->kgem, sna->render.vbo); |
|
- | 3536 | if (sna->render.vertices == NULL) { |
|
- | 3537 | sna->render.vbo = NULL; |
|
- | 3538 | sna->render.vertices = sna->render.vertex_data; |
|
- | 3539 | sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); |
|
- | 3540 | free_bo = bo; |
|
- | 3541 | } |
|
- | 3542 | ||
- | 3543 | } |
|
- | 3544 | } else { |
|
- | 3545 | if (sna->kgem.nbatch + sna->render.vertex_used <= sna->kgem.surface) { |
|
- | 3546 | DBG(("%s: copy to batch: %d @ %d\n", __FUNCTION__, |
|
- | 3547 | sna->render.vertex_used, sna->kgem.nbatch)); |
|
- | 3548 | memcpy(sna->kgem.batch + sna->kgem.nbatch, |
|
- | 3549 | sna->render.vertex_data, |
|
- | 3550 | sna->render.vertex_used * 4); |
|
- | 3551 | delta = sna->kgem.nbatch * 4; |
|
- | 3552 | bo = NULL; |
|
- | 3553 | sna->kgem.nbatch += sna->render.vertex_used; |
|
- | 3554 | } else { |
|
- | 3555 | bo = kgem_create_linear(&sna->kgem, |
|
- | 3556 | 4*sna->render.vertex_used, |
|
- | 3557 | CREATE_NO_THROTTLE); |
|
- | 3558 | if (bo && !kgem_bo_write(&sna->kgem, bo, |
|
- | 3559 | sna->render.vertex_data, |
|
- | 3560 | 4*sna->render.vertex_used)) { |
|
- | 3561 | kgem_bo_destroy(&sna->kgem, bo); |
|
- | 3562 | bo = NULL; |
|
- | 3563 | } |
|
- | 3564 | DBG(("%s: new vbo: %d\n", __FUNCTION__, |
|
- | 3565 | sna->render.vertex_used)); |
|
- | 3566 | free_bo = bo; |
|
- | 3567 | } |
|
- | 3568 | } |
|
- | 3569 | ||
- | 3570 | assert(sna->render.nvertex_reloc); |
|
- | 3571 | for (i = 0; i < sna->render.nvertex_reloc; i++) { |
|
- | 3572 | DBG(("%s: reloc[%d] = %d\n", __FUNCTION__, |
|
- | 3573 | i, sna->render.vertex_reloc[i])); |
|
- | 3574 | ||
- | 3575 | sna->kgem.batch[sna->render.vertex_reloc[i]] = |
|
- | 3576 | kgem_add_reloc(&sna->kgem, |
|
- | 3577 | sna->render.vertex_reloc[i], bo, |
|
- | 3578 | I915_GEM_DOMAIN_VERTEX << 16, |
|
- | 3579 | delta); |
|
- | 3580 | } |
|
- | 3581 | sna->render.nvertex_reloc = 0; |
|
- | 3582 | sna->render.vb_id = 0; |
|
- | 3583 | ||
- | 3584 | if (sna->render.vbo == NULL) { |
|
- | 3585 | assert(!sna->render.active); |
|
- | 3586 | sna->render.vertex_used = 0; |
|
- | 3587 | sna->render.vertex_index = 0; |
|
- | 3588 | assert(sna->render.vertices == sna->render.vertex_data); |
|
- | 3589 | assert(sna->render.vertex_size == ARRAY_SIZE(sna->render.vertex_data)); |
|
- | 3590 | } |
|
- | 3591 | ||
- | 3592 | if (free_bo) |
|
- | 3593 | kgem_bo_destroy(&sna->kgem, free_bo); |