Rev 3263 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3263 | Rev 3278 | ||
---|---|---|---|
Line 35... | Line 35... | ||
35 | #endif |
35 | #endif |
Line 36... | Line 36... | ||
36 | 36 | ||
37 | #include "sna.h" |
37 | #include "sna.h" |
38 | #include "sna_reg.h" |
38 | #include "sna_reg.h" |
39 | #include "sna_render.h" |
39 | #include "sna_render.h" |
40 | //#include "sna_render_inline.h" |
40 | #include "sna_render_inline.h" |
Line 41... | Line 41... | ||
41 | //#include "sna_video.h" |
41 | //#include "sna_video.h" |
42 | 42 | ||
Line 245... | Line 245... | ||
245 | return BLEND_OFFSET(src, dst); |
245 | return BLEND_OFFSET(src, dst); |
246 | } |
246 | } |
Line 247... | Line 247... | ||
247 | 247 | ||
248 | static uint32_t gen6_get_card_format(PictFormat format) |
248 | static uint32_t gen6_get_card_format(PictFormat format) |
- | 249 | { |
|
- | 250 | switch (format) { |
|
- | 251 | default: |
|
- | 252 | return -1; |
|
249 | { |
253 | case PICT_a8r8g8b8: |
- | 254 | return GEN6_SURFACEFORMAT_B8G8R8A8_UNORM; |
|
- | 255 | case PICT_x8r8g8b8: |
|
- | 256 | return GEN6_SURFACEFORMAT_B8G8R8X8_UNORM; |
|
- | 257 | case PICT_a8: |
|
- | 258 | return GEN6_SURFACEFORMAT_A8_UNORM; |
|
Line 250... | Line 259... | ||
250 | return GEN6_SURFACEFORMAT_B8G8R8A8_UNORM; |
259 | }; |
251 | 260 | ||
252 | /* |
261 | /* |
253 | switch (format) { |
262 | switch (format) { |
Line 392... | Line 401... | ||
392 | gen6_choose_composite_kernel(int op, bool has_mask, bool is_ca, bool is_affine) |
401 | gen6_choose_composite_kernel(int op, bool has_mask, bool is_ca, bool is_affine) |
393 | { |
402 | { |
394 | int base; |
403 | int base; |
Line 395... | Line 404... | ||
395 | 404 | ||
396 | if (has_mask) { |
405 | if (has_mask) { |
397 | /* |
406 | |
398 | if (is_ca) { |
407 | if (is_ca) { |
399 | if (gen6_blend_op[op].src_alpha) |
408 | if (gen6_blend_op[op].src_alpha) |
400 | base = GEN6_WM_KERNEL_MASKSA; |
409 | base = GEN6_WM_KERNEL_MASKSA; |
401 | else |
410 | else |
402 | base = GEN6_WM_KERNEL_MASKCA; |
411 | base = GEN6_WM_KERNEL_MASKCA; |
403 | } else |
412 | } else |
404 | base = GEN6_WM_KERNEL_MASK; |
413 | base = GEN6_WM_KERNEL_MASK; |
405 | */ |
414 | |
406 | } else |
415 | } else |
Line 407... | Line 416... | ||
407 | base = GEN6_WM_KERNEL_NOMASK; |
416 | base = GEN6_WM_KERNEL_NOMASK; |
408 | 417 | ||
Line 1329... | Line 1338... | ||
1329 | sna->render_state.gen6.floats_per_vertex = op->floats_per_vertex; |
1338 | sna->render_state.gen6.floats_per_vertex = op->floats_per_vertex; |
1330 | } |
1339 | } |
1331 | assert((sna->render.vertex_used % op->floats_per_vertex) == 0); |
1340 | assert((sna->render.vertex_used % op->floats_per_vertex) == 0); |
1332 | } |
1341 | } |
Line 1333... | Line -... | ||
1333 | - | ||
Line 1334... | Line 1342... | ||
1334 | #if 0 |
1342 | |
1335 | 1343 | ||
1336 | fastcall static void |
1344 | fastcall static void |
1337 | gen6_render_composite_blt(struct sna *sna, |
1345 | gen6_render_composite_blt(struct sna *sna, |
1338 | const struct sna_composite_op *op, |
1346 | const struct sna_composite_op *op, |
1339 | const struct sna_composite_rectangles *r) |
1347 | const struct sna_composite_rectangles *r) |
1340 | { |
1348 | { |
1341 | gen6_get_rectangles(sna, op, 1, gen6_emit_composite_state); |
1349 | gen6_get_rectangles(sna, op, 1, gen6_emit_composite_state); |
Line -... | Line 1350... | ||
- | 1350 | op->prim_emit(sna, op, r); |
|
- | 1351 | } |
|
1342 | op->prim_emit(sna, op, r); |
1352 | |
1343 | } |
1353 | #if 0 |
1344 | 1354 | ||
1345 | fastcall static void |
1355 | fastcall static void |
1346 | gen6_render_composite_box(struct sna *sna, |
1356 | gen6_render_composite_box(struct sna *sna, |
Line 1811... | Line 1821... | ||
1811 | if (channel->card_format == (unsigned)-1) |
1821 | if (channel->card_format == (unsigned)-1) |
1812 | channel->card_format = gen6_get_card_format(channel->pict_format); |
1822 | channel->card_format = gen6_get_card_format(channel->pict_format); |
1813 | assert(channel->card_format != (unsigned)-1); |
1823 | assert(channel->card_format != (unsigned)-1); |
1814 | } |
1824 | } |
Line -... | Line 1825... | ||
- | 1825 | ||
- | 1826 | #endif |
|
1815 | 1827 | ||
1816 | static void gen6_render_composite_done(struct sna *sna, |
1828 | static void gen6_render_composite_done(struct sna *sna, |
1817 | const struct sna_composite_op *op) |
1829 | const struct sna_composite_op *op) |
1818 | { |
1830 | { |
Line 1830... | Line 1842... | ||
1830 | kgem_bo_destroy(&sna->kgem, op->src.bo); |
1842 | kgem_bo_destroy(&sna->kgem, op->src.bo); |
Line 1831... | Line 1843... | ||
1831 | 1843 | ||
1832 | // sna_render_composite_redirect_done(sna, op); |
1844 | // sna_render_composite_redirect_done(sna, op); |
Line -... | Line 1845... | ||
- | 1845 | } |
|
- | 1846 | ||
1833 | } |
1847 | #if 0 |
1834 | 1848 | ||
1835 | static bool |
1849 | static bool |
1836 | gen6_composite_set_target(struct sna *sna, |
1850 | gen6_composite_set_target(struct sna *sna, |
1837 | struct sna_composite_op *op, |
1851 | struct sna_composite_op *op, |
Line 1851... | Line 1865... | ||
1851 | box.x2 = x + w; |
1865 | box.x2 = x + w; |
1852 | box.y2 = y + h; |
1866 | box.y2 = y + h; |
1853 | } else |
1867 | } else |
1854 | sna_render_picture_extents(dst, &box); |
1868 | sna_render_picture_extents(dst, &box); |
Line 1855... | Line 1869... | ||
1855 | 1869 | ||
1856 | op->dst.bo = sna_drawable_use_bo (dst->pDrawable, |
1870 | // op->dst.bo = sna_drawable_use_bo (dst->pDrawable, |
1857 | PREFER_GPU | FORCE_GPU | RENDER_GPU, |
1871 | // PREFER_GPU | FORCE_GPU | RENDER_GPU, |
1858 | &box, &op->damage); |
1872 | // &box, &op->damage); |
1859 | if (op->dst.bo == NULL) |
1873 | if (op->dst.bo == NULL) |
Line 1860... | Line 1874... | ||
1860 | return false; |
1874 | return false; |
1861 | 1875 | ||
Line 1878... | Line 1892... | ||
1878 | 1892 | ||
1879 | return true; |
1893 | return true; |
Line 1880... | Line -... | ||
1880 | } |
- | |
1881 | 1894 | } |
|
1882 | 1895 | ||
1883 | 1896 | ||
1884 | static bool |
1897 | static bool |
1885 | gen6_render_composite(struct sna *sna, |
1898 | gen6_render_composite(struct sna *sna, |
Line 1897... | Line 1910... | ||
1897 | return false; |
1910 | return false; |
Line 1898... | Line 1911... | ||
1898 | 1911 | ||
1899 | DBG(("%s: %dx%d, current mode=%d\n", __FUNCTION__, |
1912 | DBG(("%s: %dx%d, current mode=%d\n", __FUNCTION__, |
Line 1900... | Line -... | ||
1900 | width, height, sna->kgem.ring)); |
- | |
1901 | - | ||
1902 | if (mask == NULL && |
- | |
1903 | try_blt(sna, dst, src, width, height) && |
- | |
1904 | sna_blt_composite(sna, op, |
- | |
1905 | src, dst, |
- | |
1906 | src_x, src_y, |
- | |
1907 | dst_x, dst_y, |
- | |
1908 | width, height, |
- | |
1909 | tmp, false)) |
- | |
1910 | return true; |
- | |
1911 | - | ||
1912 | if (gen6_composite_fallback(sna, src, mask, dst)) |
- | |
1913 | return false; |
- | |
1914 | - | ||
1915 | if (need_tiling(sna, width, height)) |
- | |
1916 | return sna_tiling_composite(op, src, mask, dst, |
- | |
1917 | src_x, src_y, |
- | |
1918 | msk_x, msk_y, |
- | |
1919 | dst_x, dst_y, |
- | |
1920 | width, height, |
- | |
1921 | tmp); |
1913 | width, height, sna->kgem.ring)); |
1922 | 1914 | ||
1923 | if (op == PictOpClear) |
1915 | if (op == PictOpClear) |
1924 | op = PictOpSrc; |
1916 | op = PictOpSrc; |
1925 | tmp->op = op; |
1917 | tmp->op = op; |
Line 2012... | Line 2004... | ||
2012 | tmp->mask.bo != NULL, |
2004 | tmp->mask.bo != NULL, |
2013 | tmp->has_component_alpha, |
2005 | tmp->has_component_alpha, |
2014 | tmp->is_affine), |
2006 | tmp->is_affine), |
2015 | gen4_choose_composite_emitter(tmp)); |
2007 | gen4_choose_composite_emitter(tmp)); |
Line 2016... | Line 2008... | ||
2016 | 2008 | ||
2017 | tmp->blt = gen6_render_composite_blt; |
2009 | // tmp->blt = gen6_render_composite_blt; |
2018 | tmp->box = gen6_render_composite_box; |
2010 | // tmp->box = gen6_render_composite_box; |
2019 | tmp->boxes = gen6_render_composite_boxes__blt; |
2011 | // tmp->boxes = gen6_render_composite_boxes__blt; |
2020 | if (tmp->emit_boxes) { |
2012 | // if (tmp->emit_boxes) { |
2021 | tmp->boxes = gen6_render_composite_boxes; |
2013 | // tmp->boxes = gen6_render_composite_boxes; |
2022 | tmp->thread_boxes = gen6_render_composite_boxes__thread; |
2014 | // tmp->thread_boxes = gen6_render_composite_boxes__thread; |
2023 | } |
2015 | // } |
Line 2024... | Line 2016... | ||
2024 | tmp->done = gen6_render_composite_done; |
2016 | tmp->done = gen6_render_composite_done; |
2025 | 2017 | ||
2026 | kgem_set_mode(&sna->kgem, KGEM_RENDER, tmp->dst.bo); |
2018 | kgem_set_mode(&sna->kgem, KGEM_RENDER, tmp->dst.bo); |
Line 2049... | Line 2041... | ||
2049 | if (tmp->redirect.real_bo) |
2041 | if (tmp->redirect.real_bo) |
2050 | kgem_bo_destroy(&sna->kgem, tmp->dst.bo); |
2042 | kgem_bo_destroy(&sna->kgem, tmp->dst.bo); |
2051 | return false; |
2043 | return false; |
2052 | } |
2044 | } |
Line -... | Line 2045... | ||
- | 2045 | ||
2053 | 2046 | ||
2054 | #if !NO_COMPOSITE_SPANS |
2047 | #if !NO_COMPOSITE_SPANS |
2055 | fastcall static void |
2048 | fastcall static void |
2056 | gen6_render_composite_spans_box(struct sna *sna, |
2049 | gen6_render_composite_spans_box(struct sna *sna, |
2057 | const struct sna_composite_spans_op *op, |
2050 | const struct sna_composite_spans_op *op, |
Line 2687... | Line 2680... | ||
2687 | op->blt = gen6_render_copy_blt; |
2680 | op->blt = gen6_render_copy_blt; |
2688 | op->done = gen6_render_copy_done; |
2681 | op->done = gen6_render_copy_done; |
2689 | return true; |
2682 | return true; |
2690 | } |
2683 | } |
Line -... | Line 2684... | ||
- | 2684 | ||
- | 2685 | ||
- | 2686 | bool |
|
- | 2687 | gen6_composite(struct sna *sna, |
|
- | 2688 | uint8_t op, |
|
- | 2689 | PixmapPtr src, struct kgem_bo *src_bo, |
|
- | 2690 | PixmapPtr mask,struct kgem_bo *mask_bo, |
|
- | 2691 | PixmapPtr dst, struct kgem_bo *dst_bo, |
|
- | 2692 | int32_t src_x, int32_t src_y, |
|
- | 2693 | int32_t msk_x, int32_t msk_y, |
|
- | 2694 | int32_t dst_x, int32_t dst_y, |
|
- | 2695 | int32_t width, int32_t height, |
|
- | 2696 | struct sna_composite_op *tmp) |
|
- | 2697 | { |
|
- | 2698 | ||
- | 2699 | DBG(("%s: %dx%d, current mode=%d\n", __FUNCTION__, |
|
- | 2700 | width, height, sna->kgem.ring)); |
|
- | 2701 | ||
- | 2702 | tmp->op = PictOpSrc; |
|
- | 2703 | ||
- | 2704 | tmp->dst.pixmap = dst; |
|
- | 2705 | tmp->dst.bo = dst_bo; |
|
- | 2706 | tmp->dst.width = dst->drawable.width; |
|
- | 2707 | tmp->dst.height = dst->drawable.height; |
|
- | 2708 | tmp->dst.format = PICT_x8r8g8b8; |
|
- | 2709 | ||
- | 2710 | ||
- | 2711 | tmp->src.repeat = RepeatNone; |
|
- | 2712 | tmp->src.filter = PictFilterNearest; |
|
- | 2713 | tmp->src.is_affine = true; |
|
- | 2714 | ||
- | 2715 | tmp->src.bo = src_bo; |
|
- | 2716 | tmp->src.pict_format = PICT_x8r8g8b8; |
|
- | 2717 | tmp->src.card_format = gen6_get_card_format(tmp->src.pict_format); |
|
- | 2718 | tmp->src.width = src->drawable.width; |
|
- | 2719 | tmp->src.height = src->drawable.height; |
|
- | 2720 | ||
- | 2721 | tmp->is_affine = tmp->src.is_affine; |
|
- | 2722 | tmp->has_component_alpha = false; |
|
- | 2723 | tmp->need_magic_ca_pass = false; |
|
- | 2724 | ||
- | 2725 | ||
- | 2726 | tmp->mask.repeat = SAMPLER_EXTEND_NONE; |
|
- | 2727 | tmp->mask.filter = SAMPLER_FILTER_NEAREST; |
|
- | 2728 | tmp->mask.is_affine = true; |
|
- | 2729 | ||
- | 2730 | tmp->mask.bo = mask_bo; |
|
- | 2731 | tmp->mask.pict_format = PIXMAN_a8; |
|
- | 2732 | tmp->mask.card_format = gen6_get_card_format(tmp->mask.pict_format); |
|
- | 2733 | tmp->mask.width = mask->drawable.width; |
|
- | 2734 | tmp->mask.height = mask->drawable.height; |
|
- | 2735 | ||
- | 2736 | ||
- | 2737 | tmp->src.scale[0] = 1.f/width; //src->width; |
|
- | 2738 | tmp->src.scale[1] = 1.f/height; //src->height; |
|
- | 2739 | // tmp->src.offset[0] = -dst_x; |
|
- | 2740 | // tmp->src.offset[1] = -dst_y; |
|
- | 2741 | ||
- | 2742 | ||
- | 2743 | tmp->mask.scale[0] = 1.f/mask->drawable.width; |
|
- | 2744 | tmp->mask.scale[1] = 1.f/mask->drawable.height; |
|
- | 2745 | // tmp->mask.offset[0] = -dst_x; |
|
- | 2746 | // tmp->mask.offset[1] = -dst_y; |
|
- | 2747 | ||
- | 2748 | tmp->u.gen6.flags = |
|
- | 2749 | GEN6_SET_FLAGS(SAMPLER_OFFSET(tmp->src.filter, |
|
- | 2750 | tmp->src.repeat, |
|
- | 2751 | tmp->mask.filter, |
|
- | 2752 | tmp->mask.repeat), |
|
- | 2753 | gen6_get_blend(tmp->op, |
|
- | 2754 | tmp->has_component_alpha, |
|
- | 2755 | tmp->dst.format), |
|
- | 2756 | /* gen6_choose_composite_kernel(tmp->op, |
|
- | 2757 | tmp->mask.bo != NULL, |
|
- | 2758 | tmp->has_component_alpha, |
|
- | 2759 | tmp->is_affine), |
|
- | 2760 | */ |
|
- | 2761 | GEN6_WM_KERNEL_MASK, |
|
- | 2762 | gen4_choose_composite_emitter(tmp)); |
|
- | 2763 | ||
- | 2764 | tmp->blt = gen6_render_composite_blt; |
|
- | 2765 | // tmp->box = gen6_render_composite_box; |
|
- | 2766 | tmp->done = gen6_render_composite_done; |
|
- | 2767 | ||
- | 2768 | kgem_set_mode(&sna->kgem, KGEM_RENDER, tmp->dst.bo); |
|
- | 2769 | if (!kgem_check_bo(&sna->kgem, |
|
- | 2770 | tmp->dst.bo, tmp->src.bo, tmp->mask.bo, |
|
- | 2771 | NULL)) { |
|
- | 2772 | kgem_submit(&sna->kgem); |
|
- | 2773 | _kgem_set_mode(&sna->kgem, KGEM_RENDER); |
|
- | 2774 | } |
|
- | 2775 | ||
- | 2776 | gen6_emit_composite_state(sna, tmp); |
|
- | 2777 | gen6_align_vertex(sna, tmp); |
|
- | 2778 | return true; |
|
- | 2779 | ||
- | 2780 | } |
|
- | 2781 | ||
- | 2782 | ||
2691 | 2783 | ||
Line 2692... | Line 2784... | ||
2692 | #if 0 |
2784 | #if 0 |
2693 | 2785 | ||
2694 | static void |
2786 | static void |
Line 3402... | Line 3494... | ||
3402 | sna->render.max_3d_pitch = 1 << 18; |
3494 | sna->render.max_3d_pitch = 1 << 18; |
3403 | return true; |
3495 | return true; |
3404 | } |
3496 | }><>>>>>>><>=>=>=>=>=>=>=>>=>=>>>>>>>>>>>>><>>>>>>>><>><>><>><>><>><>><>><>><>><>=>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><> |
Line 3405... | Line -... | ||
3405 | - | ||
3406 | - | ||
3407 | void gen4_vertex_flush(struct sna *sna) |
- | |
3408 | { |
- | |
3409 | DBG(("%s[%x] = %d\n", __FUNCTION__, |
- | |
3410 | 4*sna->render.vertex_offset, |
- | |
3411 | sna->render.vertex_index - sna->render.vertex_start)); |
- | |
3412 | - | ||
3413 | assert(sna->render.vertex_offset); |
- | |
3414 | assert(sna->render.vertex_index > sna->render.vertex_start); |
- | |
3415 | - | ||
3416 | sna->kgem.batch[sna->render.vertex_offset] = |
- | |
3417 | sna->render.vertex_index - sna->render.vertex_start; |
- | |
3418 | sna->render.vertex_offset = 0; |
- | |
3419 | } |
- | |
3420 | - | ||
3421 | int gen4_vertex_finish(struct sna *sna) |
- | |
3422 | { |
- | |
3423 | struct kgem_bo *bo; |
- | |
3424 | unsigned int i; |
- | |
3425 | unsigned hint, size; |
- | |
3426 | - | ||
3427 | DBG(("%s: used=%d / %d\n", __FUNCTION__, |
- | |
3428 | sna->render.vertex_used, sna->render.vertex_size)); |
- | |
3429 | assert(sna->render.vertex_offset == 0); |
- | |
3430 | assert(sna->render.vertex_used); |
- | |
3431 | - | ||
3432 | // sna_vertex_wait__locked(&sna->render); |
- | |
3433 | - | ||
3434 | /* Note: we only need dword alignment (currently) */ |
- | |
3435 | - | ||
3436 | bo = sna->render.vbo; |
- | |
3437 | if (bo) { |
- | |
3438 | for (i = 0; i < sna->render.nvertex_reloc; i++) { |
- | |
3439 | DBG(("%s: reloc[%d] = %d\n", __FUNCTION__, |
- | |
3440 | i, sna->render.vertex_reloc[i])); |
- | |
3441 | - | ||
3442 | sna->kgem.batch[sna->render.vertex_reloc[i]] = |
- | |
3443 | kgem_add_reloc(&sna->kgem, |
- | |
3444 | sna->render.vertex_reloc[i], bo, |
- | |
3445 | I915_GEM_DOMAIN_VERTEX << 16, |
- | |
3446 | 0); |
- | |
3447 | } |
- | |
3448 | - | ||
3449 | assert(!sna->render.active); |
- | |
3450 | sna->render.nvertex_reloc = 0; |
- | |
3451 | sna->render.vertex_used = 0; |
- | |
3452 | sna->render.vertex_index = 0; |
- | |
3453 | sna->render.vbo = NULL; |
- | |
3454 | sna->render.vb_id = 0; |
- | |
3455 | - | ||
3456 | kgem_bo_destroy(&sna->kgem, bo); |
- | |
3457 | } |
- | |
3458 | - | ||
3459 | hint = CREATE_GTT_MAP; |
- | |
3460 | if (bo) |
- | |
3461 | hint |= CREATE_CACHED | CREATE_NO_THROTTLE; |
- | |
3462 | - | ||
3463 | size = 256*1024; |
- | |
3464 | assert(!sna->render.active); |
- | |
3465 | sna->render.vertices = NULL; |
- | |
3466 | sna->render.vbo = kgem_create_linear(&sna->kgem, size, hint); |
- | |
3467 | while (sna->render.vbo == NULL && size > 16*1024) { |
- | |
3468 | size /= 2; |
- | |
3469 | sna->render.vbo = kgem_create_linear(&sna->kgem, size, hint); |
- | |
3470 | } |
- | |
3471 | if (sna->render.vbo == NULL) |
- | |
3472 | sna->render.vbo = kgem_create_linear(&sna->kgem, |
- | |
3473 | 256*1024, CREATE_GTT_MAP); |
- | |
3474 | if (sna->render.vbo) |
- | |
3475 | sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo); |
- | |
3476 | if (sna->render.vertices == NULL) { |
- | |
3477 | if (sna->render.vbo) { |
- | |
3478 | kgem_bo_destroy(&sna->kgem, sna->render.vbo); |
- | |
3479 | sna->render.vbo = NULL; |
- | |
3480 | } |
- | |
3481 | sna->render.vertices = sna->render.vertex_data; |
- | |
3482 | sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); |
- | |
3483 | return 0; |
- | |
3484 | } |
- | |
3485 | - | ||
3486 | if (sna->render.vertex_used) { |
- | |
3487 | DBG(("%s: copying initial buffer x %d to handle=%d\n", |
- | |
3488 | __FUNCTION__, |
- | |
3489 | sna->render.vertex_used, |
- | |
3490 | sna->render.vbo->handle)); |
- | |
3491 | assert(sizeof(float)*sna->render.vertex_used <= |
- | |
3492 | __kgem_bo_size(sna->render.vbo)); |
- | |
3493 | memcpy(sna->render.vertices, |
- | |
3494 | sna->render.vertex_data, |
- | |
3495 | sizeof(float)*sna->render.vertex_used); |
- | |
3496 | } |
- | |
3497 | - | ||
3498 | size = __kgem_bo_size(sna->render.vbo)/4; |
- | |
3499 | if (size >= UINT16_MAX) |
- | |
3500 | size = UINT16_MAX - 1; |
- | |
3501 | - | ||
3502 | DBG(("%s: create vbo handle=%d, size=%d\n", |
- | |
3503 | __FUNCTION__, sna->render.vbo->handle, size)); |
- | |
3504 | - | ||
3505 | sna->render.vertex_size = size; |
- | |
3506 | return sna->render.vertex_size - sna->render.vertex_used; |
- | |
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); |
- |