Subversion Repositories Kolibri OS

Rev

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);
-