diff options
-rw-r--r-- | src/sna/gen6_render.c | 10 | ||||
-rw-r--r-- | src/sna/sna_dri.c | 16 |
2 files changed, 22 insertions, 4 deletions
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index 5641b3ca..eb67fc67 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c | |||
@@ -2307,7 +2307,8 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu, | |||
2307 | __FUNCTION__, src_dx, src_dy, dst_dx, dst_dy, n, alu, | 2307 | __FUNCTION__, src_dx, src_dy, dst_dx, dst_dy, n, alu, |
2308 | src_bo == dst_bo)); | 2308 | src_bo == dst_bo)); |
2309 | 2309 | ||
2310 | if (sna->kgem.mode == KGEM_BLT && | 2310 | /* XXX benchmark me! */ |
2311 | if (sna->kgem.mode != KGEM_RENDER && | ||
2311 | sna_blt_compare_depth(&src->drawable, &dst->drawable) && | 2312 | sna_blt_compare_depth(&src->drawable, &dst->drawable) && |
2312 | sna_blt_copy_boxes(sna, alu, | 2313 | sna_blt_copy_boxes(sna, alu, |
2313 | src_bo, src_dx, src_dy, | 2314 | src_bo, src_dx, src_dy, |
@@ -2464,7 +2465,8 @@ gen6_render_copy(struct sna *sna, uint8_t alu, | |||
2464 | src->drawable.width, src->drawable.height, | 2465 | src->drawable.width, src->drawable.height, |
2465 | dst->drawable.width, dst->drawable.height)); | 2466 | dst->drawable.width, dst->drawable.height)); |
2466 | 2467 | ||
2467 | if (sna->kgem.mode == KGEM_BLT && | 2468 | /* XXX benchmark me! */ |
2469 | if (sna->kgem.mode != KGEM_RENDER && | ||
2468 | sna_blt_compare_depth(&src->drawable, &dst->drawable) && | 2470 | sna_blt_compare_depth(&src->drawable, &dst->drawable) && |
2469 | sna_blt_copy(sna, alu, | 2471 | sna_blt_copy(sna, alu, |
2470 | src_bo, dst_bo, | 2472 | src_bo, dst_bo, |
@@ -2577,7 +2579,7 @@ gen6_render_fill_boxes(struct sna *sna, | |||
2577 | return FALSE; | 2579 | return FALSE; |
2578 | } | 2580 | } |
2579 | 2581 | ||
2580 | if (sna->kgem.mode == KGEM_BLT || | 2582 | if (sna->kgem.mode != KGEM_RENDER || |
2581 | dst->drawable.width > 8192 || | 2583 | dst->drawable.width > 8192 || |
2582 | dst->drawable.height > 8192 || | 2584 | dst->drawable.height > 8192 || |
2583 | !gen6_check_dst_format(format)) { | 2585 | !gen6_check_dst_format(format)) { |
@@ -2734,7 +2736,7 @@ gen6_render_fill(struct sna *sna, uint8_t alu, | |||
2734 | op); | 2736 | op); |
2735 | #endif | 2737 | #endif |
2736 | 2738 | ||
2737 | if (sna->kgem.mode == KGEM_BLT && | 2739 | if (sna->kgem.mode != KGEM_RENDER && |
2738 | sna_blt_fill(sna, alu, | 2740 | sna_blt_fill(sna, alu, |
2739 | dst_bo, dst->drawable.bitsPerPixel, | 2741 | dst_bo, dst->drawable.bitsPerPixel, |
2740 | color, | 2742 | color, |
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c index 0a01f8af..f4049f19 100644 --- a/src/sna/sna_dri.c +++ b/src/sna/sna_dri.c | |||
@@ -461,6 +461,22 @@ sna_dri_copy(struct sna *sna, DrawablePtr draw, RegionPtr region, | |||
461 | get_drawable_deltas(draw, dst, &dx, &dy); | 461 | get_drawable_deltas(draw, dst, &dx, &dy); |
462 | } | 462 | } |
463 | 463 | ||
464 | if (sna->kgem.gen >= 60) { | ||
465 | /* Sandybridge introduced a separate ring which it uses to | ||
466 | * perform blits. Switching rendering between rings incurs | ||
467 | * a stall as we wait upon the old ring to finish and | ||
468 | * flush its render cache before we can proceed on with | ||
469 | * the operation on the new ring. | ||
470 | * | ||
471 | * As this buffer, we presume, has just been written to by | ||
472 | * the DRI client using the RENDER ring, we want to perform | ||
473 | * our operation on the same ring, and ideally on the same | ||
474 | * ring as we will flip from (which should be the RENDER ring | ||
475 | * as well). | ||
476 | */ | ||
477 | kgem_set_mode(&sna->kgem, KGEM_RENDER); | ||
478 | } | ||
479 | |||
464 | if (region) { | 480 | if (region) { |
465 | boxes = REGION_RECTS(region); | 481 | boxes = REGION_RECTS(region); |
466 | n = REGION_NUM_RECTS(region); | 482 | n = REGION_NUM_RECTS(region); |