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