Subversion Repositories Kolibri OS

Rev

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