Subversion Repositories Kolibri OS

Rev

Rev 4359 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4359 Rev 4501
Line 40... Line 40...
40
#include "sna_render_inline.h"
40
#include "sna_render_inline.h"
41
//#include "sna_video.h"
41
//#include "sna_video.h"
Line 42... Line 42...
42
 
42
 
43
#include "brw/brw.h"
43
#include "brw/brw.h"
-
 
44
#include "gen7_render.h"
44
#include "gen7_render.h"
45
#include "gen4_common.h"
45
#include "gen4_source.h"
46
#include "gen4_source.h"
-
 
47
#include "gen4_vertex.h"
Line -... Line 48...
-
 
48
#include "gen6_common.h"
46
#include "gen4_vertex.h"
49
 
-
 
50
#define ALWAYS_INVALIDATE 0
Line 47... Line 51...
47
 
51
#define ALWAYS_FLUSH 0
48
#define ALWAYS_FLUSH 0
52
#define ALWAYS_STALL 0
49
 
53
 
50
#define NO_COMPOSITE 0
54
#define NO_COMPOSITE 0
Line 1020... Line 1024...
1020
static void
1024
static void
1021
gen7_emit_state(struct sna *sna,
1025
gen7_emit_state(struct sna *sna,
1022
		const struct sna_composite_op *op,
1026
		const struct sna_composite_op *op,
1023
		uint16_t wm_binding_table)
1027
		uint16_t wm_binding_table)
1024
{
1028
{
-
 
1029
	bool need_invalidate;
-
 
1030
	bool need_flush;
1025
	bool need_stall;
1031
	bool need_stall;
Line 1026... Line 1032...
1026
 
1032
 
Line 1027... Line 1033...
1027
	assert(op->dst.bo->exec);
1033
	assert(op->dst.bo->exec);
-
 
1034
 
1028
 
1035
	need_invalidate = kgem_bo_is_dirty(op->src.bo) || kgem_bo_is_dirty(op->mask.bo);
-
 
1036
	if (ALWAYS_INVALIDATE)
-
 
1037
		need_invalidate = true;
1029
	gen7_emit_cc(sna, GEN7_BLEND(op->u.gen7.flags));
1038
 
1030
	gen7_emit_sampler(sna, GEN7_SAMPLER(op->u.gen7.flags));
1039
	need_flush =
-
 
1040
		sna->render_state.gen7.emit_flush &&
-
 
1041
		wm_binding_table & GEN7_READS_DST(op->u.gen7.flags);
-
 
1042
	if (ALWAYS_FLUSH)
1031
	gen7_emit_sf(sna, GEN7_VERTEX(op->u.gen7.flags) >> 2);
1043
		need_flush = true;
Line 1032... Line 1044...
1032
	gen7_emit_wm(sna, GEN7_KERNEL(op->u.gen7.flags));
1044
 
1033
	gen7_emit_vertex_elements(sna, op);
1045
	wm_binding_table &= ~1;
-
 
1046
 
-
 
1047
	need_stall = sna->render_state.gen7.surface_table != wm_binding_table;
Line 1034... Line 1048...
1034
 
1048
	need_stall &= gen7_emit_drawing_rectangle(sna, op);
1035
	need_stall = gen7_emit_binding_table(sna, wm_binding_table);
1049
	if (ALWAYS_STALL)
1036
	need_stall &= gen7_emit_drawing_rectangle(sna, op);
1050
		need_stall = true;
1037
 
1051
 
1038
	if (ALWAYS_FLUSH || kgem_bo_is_dirty(op->src.bo) || kgem_bo_is_dirty(op->mask.bo)) {
1052
	if (need_invalidate) {
-
 
1053
		gen7_emit_pipe_invalidate(sna);
1039
		gen7_emit_pipe_invalidate(sna);
1054
		kgem_clear_dirty(&sna->kgem);
1040
		kgem_clear_dirty(&sna->kgem);
1055
		assert(op->dst.bo->exec);
1041
		assert(op->dst.bo->exec);
1056
			kgem_bo_mark_dirty(op->dst.bo);
1042
			kgem_bo_mark_dirty(op->dst.bo);
1057
 
1043
		sna->render_state.gen7.emit_flush = false;
1058
		need_flush = false;
1044
		need_stall = false;
1059
		need_stall = false;
1045
	}
1060
	}
1046
	if (sna->render_state.gen7.emit_flush) {
1061
	if (need_flush) {
1047
		gen7_emit_pipe_flush(sna, need_stall);
1062
		gen7_emit_pipe_flush(sna, need_stall);
Line -... Line 1063...
-
 
1063
		need_stall = false;
-
 
1064
	}
-
 
1065
	if (need_stall)
-
 
1066
		gen7_emit_pipe_stall(sna);
-
 
1067
 
-
 
1068
	gen7_emit_cc(sna, GEN7_BLEND(op->u.gen7.flags));
-
 
1069
	gen7_emit_sampler(sna, GEN7_SAMPLER(op->u.gen7.flags));
1048
		need_stall = false;
1070
	gen7_emit_sf(sna, GEN7_VERTEX(op->u.gen7.flags) >> 2);
1049
	}
1071
	gen7_emit_wm(sna, GEN7_KERNEL(op->u.gen7.flags));
Line 1050... Line 1072...
1050
	if (need_stall)
1072
	gen7_emit_vertex_elements(sna, op);
1051
		gen7_emit_pipe_stall(sna);
1073
	gen7_emit_binding_table(sna, wm_binding_table);
Line 1402... Line 1424...
1402
 
1424
 
1403
static void gen7_emit_composite_state(struct sna *sna,
1425
static void gen7_emit_composite_state(struct sna *sna,
1404
				      const struct sna_composite_op *op)
1426
				      const struct sna_composite_op *op)
1405
{
1427
{
1406
	uint32_t *binding_table;
1428
	uint32_t *binding_table;
Line 1407... Line 1429...
1407
	uint16_t offset;
1429
	uint16_t offset, dirty;
Line 1408... Line 1430...
1408
 
1430
 
Line -... Line 1431...
-
 
1431
	gen7_get_batch(sna, op);
-
 
1432
 
1409
	gen7_get_batch(sna, op);
1433
	binding_table = gen7_composite_get_binding_table(sna, &offset);
1410
 
1434
 
1411
	binding_table = gen7_composite_get_binding_table(sna, &offset);
1435
	dirty = kgem_bo_is_dirty(op->dst.bo);
1412
 
1436
 
1413
	binding_table[0] =
1437
	binding_table[0] =
Line 1436... Line 1460...
1436
	     sna->kgem.batch[sna->render_state.gen7.surface_table+2] == binding_table[2])) {
1460
	     sna->kgem.batch[sna->render_state.gen7.surface_table+2] == binding_table[2])) {
1437
		sna->kgem.surface += sizeof(struct gen7_surface_state) / sizeof(uint32_t);
1461
		sna->kgem.surface += sizeof(struct gen7_surface_state) / sizeof(uint32_t);
1438
		offset = sna->render_state.gen7.surface_table;
1462
		offset = sna->render_state.gen7.surface_table;
1439
	}
1463
	}
Line 1440... Line 1464...
1440
 
1464
 
1441
	gen7_emit_state(sna, op, offset);
1465
	gen7_emit_state(sna, op, offset | dirty);
Line 1442... Line 1466...
1442
}
1466
}
1443
 
1467
 
1444
static void
1468
static void
1445
gen7_align_vertex(struct sna *sna, const struct sna_composite_op *op)
1469
gen7_align_vertex(struct sna *sna, const struct sna_composite_op *op)
1446
{
-
 
1447
	if (op->floats_per_vertex != sna->render_state.gen7.floats_per_vertex) {
-
 
1448
		if (sna->render.vertex_size - sna->render.vertex_used < 2*op->floats_per_rect)
-
 
1449
			gen4_vertex_finish(sna);
1470
{
1450
 
1471
	if (op->floats_per_vertex != sna->render_state.gen7.floats_per_vertex) {
1451
		DBG(("aligning vertex: was %d, now %d floats per vertex, %d->%d\n",
-
 
1452
		     sna->render_state.gen7.floats_per_vertex,
1472
		DBG(("aligning vertex: was %d, now %d floats per vertex\n",
1453
		     op->floats_per_vertex,
-
 
1454
		     sna->render.vertex_index,
-
 
1455
		     (sna->render.vertex_used + op->floats_per_vertex - 1) / op->floats_per_vertex));
-
 
1456
		sna->render.vertex_index = (sna->render.vertex_used + op->floats_per_vertex - 1) / op->floats_per_vertex;
1473
		     sna->render_state.gen7.floats_per_vertex, op->floats_per_vertex));
1457
		sna->render.vertex_used = sna->render.vertex_index * op->floats_per_vertex;
1474
		gen4_vertex_align(sna, op);
1458
		sna->render_state.gen7.floats_per_vertex = op->floats_per_vertex;
1475
		sna->render_state.gen7.floats_per_vertex = op->floats_per_vertex;
Line 1459... Line 1476...
1459
	}
1476
	}
Line 1546... Line 1563...
1546
	uint32_t src_surf_base[6];
1563
	uint32_t src_surf_base[6];
1547
	int src_width[6];
1564
	int src_width[6];
1548
	int src_height[6];
1565
	int src_height[6];
1549
	int src_pitch[6];
1566
	int src_pitch[6];
1550
	uint32_t *binding_table;
1567
	uint32_t *binding_table;
1551
	uint16_t offset;
1568
	uint16_t offset, dirty;
1552
	int n_src, n;
1569
	int n_src, n;
Line 1553... Line 1570...
1553
 
1570
 
Line 1554... Line 1571...
1554
	gen7_get_batch(sna, op);
1571
	gen7_get_batch(sna, op);
Line 1584... Line 1601...
1584
		n_src = 1;
1601
		n_src = 1;
1585
	}
1602
	}
Line 1586... Line 1603...
1586
 
1603
 
Line -... Line 1604...
-
 
1604
	binding_table = gen7_composite_get_binding_table(sna, &offset);
-
 
1605
 
1587
	binding_table = gen7_composite_get_binding_table(sna, &offset);
1606
	dirty = kgem_bo_is_dirty(op->dst.bo);
1588
 
1607
 
1589
	binding_table[0] =
1608
	binding_table[0] =
1590
		gen7_bind_bo(sna,
1609
		gen7_bind_bo(sna,
1591
			     op->dst.bo, op->dst.width, op->dst.height,
1610
			     op->dst.bo, op->dst.width, op->dst.height,
Line 1600... Line 1619...
1600
					       src_height[n],
1619
					       src_height[n],
1601
					       src_pitch[n],
1620
					       src_pitch[n],
1602
					       src_surf_format);
1621
					       src_surf_format);
1603
	}
1622
	}
Line 1604... Line 1623...
1604
 
1623
 
1605
	gen7_emit_state(sna, op, offset);
1624
	gen7_emit_state(sna, op, offset | dirty);
Line 1606... Line 1625...
1606
}
1625
}
1607
 
1626
 
1608
static bool
1627
static bool
Line 1667... Line 1686...
1667
	tmp.priv = frame;
1686
	tmp.priv = frame;
Line 1668... Line 1687...
1668
 
1687
 
1669
	kgem_set_mode(&sna->kgem, KGEM_RENDER, tmp.dst.bo);
1688
	kgem_set_mode(&sna->kgem, KGEM_RENDER, tmp.dst.bo);
1670
	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) {
1689
	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) {
1671
		kgem_submit(&sna->kgem);
1690
		kgem_submit(&sna->kgem);
-
 
1691
		if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
-
 
1692
			return false;
1672
		assert(kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL));
1693
 
1673
		_kgem_set_mode(&sna->kgem, KGEM_RENDER);
1694
		_kgem_set_mode(&sna->kgem, KGEM_RENDER);
Line 1674... Line -...
1674
	}
-
 
1675
 
1695
	}
-
 
1696
 
Line 1676... Line 1697...
1676
	gen7_emit_video_state(sna, &tmp);
1697
	gen7_align_vertex(sna, &tmp);
1677
	gen7_align_vertex(sna, &tmp);
1698
	gen7_emit_video_state(sna, &tmp);
1678
 
1699
 
1679
	/* Set up the offset for translating from the given region (in screen
1700
	/* Set up the offset for translating from the given region (in screen
Line 1872... Line 1893...
1872
		DBG(("%s: fallback due to unhandled blend op: %d\n",
1893
		DBG(("%s: fallback due to unhandled blend op: %d\n",
1873
		     __FUNCTION__, op));
1894
		     __FUNCTION__, op));
1874
		return false;
1895
		return false;
1875
	}
1896
	}
Line -... Line 1897...
-
 
1897
 
1876
 
1898
	if (prefer_blt_fill(sna, dst_bo, FILL_BOXES) ||
1877
	if (prefer_blt_fill(sna, dst_bo) || !gen7_check_dst_format(format)) {
1899
	    !gen7_check_dst_format(format)) {
Line 1878... Line 1900...
1878
		uint8_t alu = GXinvalid;
1900
		uint8_t alu = GXinvalid;
1879
 
1901
 
1880
		if (op <= PictOpSrc) {
1902
		if (op <= PictOpSrc) {
Line 1947... Line 1969...
1947
	tmp.u.gen7.flags = FILL_FLAGS(op, format);
1969
	tmp.u.gen7.flags = FILL_FLAGS(op, format);
Line 1948... Line 1970...
1948
 
1970
 
1949
	kgem_set_mode(&sna->kgem, KGEM_RENDER, dst_bo);
1971
	kgem_set_mode(&sna->kgem, KGEM_RENDER, dst_bo);
1950
	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
1972
	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
1951
		kgem_submit(&sna->kgem);
1973
		kgem_submit(&sna->kgem);
-
 
1974
		if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
-
 
1975
			kgem_bo_destroy(&sna->kgem, tmp.src.bo);
-
 
1976
			if (tmp.redirect.real_bo)
-
 
1977
				kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
-
 
1978
			return false;
-
 
1979
		}
1952
		assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
1980
		_kgem_set_mode(&sna->kgem, KGEM_RENDER);
Line 1953... Line -...
1953
	}
-
 
1954
 
1981
	}
-
 
1982
 
Line 1955... Line 1983...
1955
	gen7_emit_fill_state(sna, &tmp);
1983
	gen7_align_vertex(sna, &tmp);
1956
	gen7_align_vertex(sna, &tmp);
1984
	gen7_emit_fill_state(sna, &tmp);
1957
 
1985
 
Line 1985... Line 2013...
1985
	sna_render_composite_redirect_done(sna, &tmp);
2013
	sna_render_composite_redirect_done(sna, &tmp);
1986
	return true;
2014
	return true;
1987
}
2015
}
1988
#endif
2016
#endif
Line 1989... Line -...
1989
 
-
 
1990
static void gen7_render_flush(struct sna *sna)
-
 
1991
{
-
 
1992
	gen4_vertex_close(sna);
-
 
1993
 
-
 
1994
	assert(sna->render.vb_id == 0);
-
 
1995
	assert(sna->render.vertex_offset == 0);
-
 
1996
}
-
 
1997
 
-
 
1998
static void
-
 
1999
gen7_render_context_switch(struct kgem *kgem,
-
 
2000
			   int new_mode)
-
 
2001
{
-
 
2002
	if (kgem->nbatch) {
-
 
2003
		DBG(("%s: switch rings %d -> %d\n",
-
 
2004
		     __FUNCTION__, kgem->mode, new_mode));
-
 
2005
		_kgem_submit(kgem);
-
 
2006
	}
-
 
2007
 
-
 
2008
	kgem->ring = new_mode;
-
 
2009
}
-
 
2010
 
-
 
2011
static void
-
 
2012
gen7_render_retire(struct kgem *kgem)
-
 
2013
{
-
 
2014
	struct sna *sna;
-
 
2015
 
-
 
2016
	if (kgem->ring && (kgem->has_semaphores || !kgem->need_retire))
-
 
2017
		kgem->ring = kgem->mode;
-
 
2018
 
-
 
2019
	sna = container_of(kgem, struct sna, kgem);
-
 
2020
	if (kgem->nbatch == 0 && sna->render.vbo && !kgem_bo_is_busy(sna->render.vbo)) {
-
 
2021
		DBG(("%s: resetting idle vbo\n", __FUNCTION__));
-
 
2022
		sna->render.vertex_used = 0;
-
 
2023
		sna->render.vertex_index = 0;
-
 
2024
	}
-
 
2025
}
-
 
2026
 
-
 
2027
static void
-
 
2028
gen7_render_expire(struct kgem *kgem)
-
 
2029
{
-
 
2030
	struct sna *sna;
-
 
2031
 
-
 
2032
	sna = container_of(kgem, struct sna, kgem);
-
 
2033
	if (sna->render.vbo && !sna->render.vertex_used) {
-
 
2034
		DBG(("%s: discarding vbo\n", __FUNCTION__));
-
 
2035
		kgem_bo_destroy(kgem, sna->render.vbo);
-
 
2036
		sna->render.vbo = NULL;
-
 
2037
		sna->render.vertices = sna->render.vertex_data;
-
 
2038
		sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
-
 
2039
		sna->render.vertex_used = 0;
-
 
2040
		sna->render.vertex_index = 0;
-
 
2041
	}
-
 
2042
}
-
 
2043
 
2017
 
2044
static void gen7_render_reset(struct sna *sna)
2018
static void gen7_render_reset(struct sna *sna)
2045
{
2019
{
2046
	sna->render_state.gen7.emit_flush = false;
2020
	sna->render_state.gen7.emit_flush = false;
2047
	sna->render_state.gen7.needs_invariant = true;
2021
	sna->render_state.gen7.needs_invariant = true;
Line 2054... Line 2028...
2054
	sna->render_state.gen7.kernel = -1;
2028
	sna->render_state.gen7.kernel = -1;
2055
	sna->render_state.gen7.drawrect_offset = -1;
2029
	sna->render_state.gen7.drawrect_offset = -1;
2056
	sna->render_state.gen7.drawrect_limit = -1;
2030
	sna->render_state.gen7.drawrect_limit = -1;
2057
	sna->render_state.gen7.surface_table = -1;
2031
	sna->render_state.gen7.surface_table = -1;
Line -... Line 2032...
-
 
2032
 
-
 
2033
	if (sna->render.vbo && !kgem_bo_can_map(&sna->kgem, sna->render.vbo)) {
-
 
2034
		DBG(("%s: discarding unmappable vbo\n", __FUNCTION__));
-
 
2035
		discard_vbo(sna);
-
 
2036
	}
2058
 
2037
 
2059
	sna->render.vertex_offset = 0;
2038
	sna->render.vertex_offset = 0;
2060
	sna->render.nvertex_reloc = 0;
2039
	sna->render.nvertex_reloc = 0;
2061
	sna->render.vb_id = 0;
2040
	sna->render.vb_id = 0;
Line 2062... Line 2041...
2062
}
2041
}
2063
 
2042
 
2064
static void gen7_render_fini(struct sna *sna)
2043
static void gen7_render_fini(struct sna *sna)
2065
{
2044
{
Line 2066... Line 2045...
2066
	kgem_bo_destroy(&sna->kgem, sna->render_state.gen7.general_bo);
2045
	kgem_bo_destroy(&sna->kgem, sna->render_state.gen7.general_bo);
2067
}
2046
}
2068
 
2047
 
2069
static bool is_gt3(struct sna *sna)
2048
static bool is_gt3(struct sna *sna, int devid)
2070
{
2049
{
Line 2071... Line 2050...
2071
	assert(sna->kgem.gen == 075);
2050
	assert(sna->kgem.gen == 075);
2072
	return sna->PciInfo->device_id & 0x20;
2051
	return devid & 0x20;
2073
}
2052
}
2074
 
2053
 
Line 2075... Line 2054...
2075
static bool is_gt2(struct sna *sna)
2054
static bool is_gt2(struct sna *sna, int devid)
2076
{
2055
{
2077
	return sna->PciInfo->device_id & (is_hsw(sna)? 0x30 : 0x20);
2056
	return devid & (is_hsw(sna)? 0x30 : 0x20);
2078
}
2057
}
Line 2079... Line 2058...
2079
 
2058
 
2080
static bool is_mobile(struct sna *sna)
2059
static bool is_mobile(struct sna *sna, int devid)
2081
{
2060
{
2082
	return (sna->PciInfo->device_id & 0xf) == 0x6;
2061
	return (devid & 0xf) == 0x6;
2083
}
2062
}
2084
 
2063
 
Line 2085... Line 2064...
2085
static bool gen7_render_setup(struct sna *sna)
2064
static bool gen7_render_setup(struct sna *sna, int devid)
2086
{
2065
{
2087
    struct gen7_render_state *state = &sna->render_state.gen7;
2066
    struct gen7_render_state *state = &sna->render_state.gen7;
2088
    struct sna_static_stream general;
2067
    struct sna_static_stream general;
2089
    struct gen7_sampler_state *ss;
2068
    struct gen7_sampler_state *ss;
2090
    int i, j, k, l, m;
2069
    int i, j, k, l, m;
2091
 
2070
 
2092
	if (is_ivb(sna)) {
2071
	if (is_ivb(sna)) {
2093
        state->info = &ivb_gt_info;
2072
        state->info = &ivb_gt_info;
2094
		if (sna->PciInfo->device_id & 0xf) {
2073
		if (devid & 0xf) {
2095
            state->info = &ivb_gt1_info;
2074
            state->info = &ivb_gt1_info;
2096
            if (is_gt2(sna))
2075
			if (is_gt2(sna, devid))
2097
                state->info = &ivb_gt2_info; /* XXX requires GT_MODE WiZ disabled */
2076
                state->info = &ivb_gt2_info; /* XXX requires GT_MODE WiZ disabled */
2098
        }
2077
        }
2099
	} else if (is_byt(sna)) {
2078
	} else if (is_byt(sna)) {
2100
		state->info = &byt_gt_info;
2079
		state->info = &byt_gt_info;
2101
	} else if (is_hsw(sna)) {
2080
	} else if (is_hsw(sna)) {
2102
        state->info = &hsw_gt_info;
2081
        state->info = &hsw_gt_info;
2103
		if (sna->PciInfo->device_id & 0xf) {
2082
		if (devid & 0xf) {
2104
			if (is_gt3(sna))
2083
			if (is_gt3(sna, devid))
2105
				state->info = &hsw_gt3_info;
2084
				state->info = &hsw_gt3_info;
Line -... Line 2085...
-
 
2085
			else if (is_gt2(sna, devid))
-
 
2086
				state->info = &hsw_gt2_info;
2106
			else if (is_gt2(sna))
2087
			else
Line 2107... Line 2088...
2107
				state->info = &hsw_gt2_info;
2088
            state->info = &hsw_gt1_info;
2108
			else
2089
        }
2109
            state->info = &hsw_gt1_info;
2090
    } else
Line 2173... Line 2154...
2173
    return state->general_bo != NULL;
2154
    return state->general_bo != NULL;
2174
}
2155
}
Line 2175... Line 2156...
2175
 
2156
 
2176
const char *gen7_render_init(struct sna *sna, const char *backend)
2157
const char *gen7_render_init(struct sna *sna, const char *backend)
-
 
2158
{
-
 
2159
	int devid = intel_get_device_id(sna);
2177
{
2160
 
2178
    if (!gen7_render_setup(sna))
2161
	if (!gen7_render_setup(sna, devid))
Line 2179... Line 2162...
2179
		return backend;
2162
		return backend;
2180
 
2163
 
2181
    sna->kgem.context_switch = gen7_render_context_switch;
2164
	sna->kgem.context_switch = gen6_render_context_switch;
Line 2182... Line 2165...
2182
    sna->kgem.retire = gen7_render_retire;
2165
	sna->kgem.retire = gen6_render_retire;
2183
    sna->kgem.expire = gen7_render_expire;
2166
	sna->kgem.expire = gen4_render_expire;
2184
 
2167
 
2185
#if 0
2168
#if 0
2186
#if !NO_COMPOSITE
2169
#if !NO_COMPOSITE
2187
	sna->render.composite = gen7_render_composite;
2170
	sna->render.composite = gen7_render_composite;
2188
	sna->render.prefer_gpu |= PREFER_GPU_RENDER;
2171
	sna->render.prefer_gpu |= PREFER_GPU_RENDER;
2189
#endif
2172
#endif
2190
#if !NO_COMPOSITE_SPANS
2173
#if !NO_COMPOSITE_SPANS
2191
	sna->render.check_composite_spans = gen7_check_composite_spans;
2174
	sna->render.check_composite_spans = gen7_check_composite_spans;
2192
	sna->render.composite_spans = gen7_render_composite_spans;
2175
	sna->render.composite_spans = gen7_render_composite_spans;
2193
	if (is_mobile(sna) || is_gt2(sna) || is_byt(sna))
2176
	if (is_mobile(sna, devid) || is_gt2(sna, devid) || is_byt(sna))
Line 2194... Line 2177...
2194
		sna->render.prefer_gpu |= PREFER_GPU_SPANS;
2177
		sna->render.prefer_gpu |= PREFER_GPU_SPANS;
Line 2217... Line 2200...
2217
#endif
2200
#endif
Line 2218... Line 2201...
2218
 
2201
 
2219
    sna->render.blit_tex = gen7_blit_tex;
2202
    sna->render.blit_tex = gen7_blit_tex;
Line 2220... Line 2203...
2220
    sna->render.caps = HW_BIT_BLIT | HW_TEX_BLIT;
2203
    sna->render.caps = HW_BIT_BLIT | HW_TEX_BLIT;
2221
 
2204
 
2222
    sna->render.flush = gen7_render_flush;
2205
	sna->render.flush = gen4_render_flush;
Line 2223... Line 2206...
2223
    sna->render.reset = gen7_render_reset;
2206
    sna->render.reset = gen7_render_reset;
2224
    sna->render.fini = gen7_render_fini;
2207
    sna->render.fini = gen7_render_fini;
Line 2310... Line 2293...
2310
 
2293
 
2311
	tmp->blt   = gen7_render_composite_blt;
2294
	tmp->blt   = gen7_render_composite_blt;
2312
//	tmp->box   = gen7_render_composite_box;
2295
//	tmp->box   = gen7_render_composite_box;
Line 2313... Line 2296...
2313
	tmp->done  = gen7_render_composite_done;
2296
	tmp->done  = gen7_render_composite_done;
2314
 
2297
 
2315
	kgem_set_mode(&sna->kgem, KGEM_RENDER, tmp->dst.bo);
2298
	kgem_set_mode(&sna->kgem, KGEM_RENDER, dst_bo);
2316
	if (!kgem_check_bo(&sna->kgem,
2299
	if (!kgem_check_bo(&sna->kgem,
2317
			   tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
2300
			   tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
2318
			   NULL)) {
2301
			   NULL)) {
2319
		kgem_submit(&sna->kgem);
2302
		kgem_submit(&sna->kgem);
Line 2320... Line -...
2320
		_kgem_set_mode(&sna->kgem, KGEM_RENDER);
-
 
2321
	}
2303
		_kgem_set_mode(&sna->kgem, KGEM_RENDER);
-
 
2304
	}
2322
 
2305
 
2323
	gen7_emit_composite_state(sna, tmp);
2306
	gen7_align_vertex(sna, tmp);