Rev 2360 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2360 | Rev 2361 | ||
---|---|---|---|
Line 88... | Line 88... | ||
88 | const char *name; |
88 | const char *name; |
89 | const void *data; |
89 | const void *data; |
90 | unsigned int size; |
90 | unsigned int size; |
91 | Bool has_mask; |
91 | Bool has_mask; |
92 | } wm_kernels[] = { |
92 | } wm_kernels[] = { |
93 | KERNEL(NOMASK, ps_kernel_nomask_affine, FALSE), |
93 | // KERNEL(NOMASK, ps_kernel_nomask_affine, FALSE), |
- | 94 | // KERNEL(MASK, ps_kernel_masknoca_affine, TRUE), |
|
- | 95 | KERNEL(NOMASK, ps_kernel_masknoca_affine, TRUE), |
|
94 | KERNEL(MASK, ps_kernel_masknoca_affine, TRUE), |
96 | KERNEL(MASK, ps_kernel_masknoca_affine, TRUE), |
95 | }; |
97 | }; |
96 | #undef KERNEL |
98 | #undef KERNEL |
Line 97... | Line 99... | ||
97 | 99 | ||
Line 169... | Line 171... | ||
169 | bool has_component_alpha, |
171 | bool has_component_alpha, |
170 | uint32_t dst_format) |
172 | uint32_t dst_format) |
171 | { |
173 | { |
172 | uint32_t src, dst; |
174 | uint32_t src, dst; |
Line -... | Line 175... | ||
- | 175 | ||
- | 176 | // src = GEN6_BLENDFACTOR_ONE; //gen6_blend_op[op].src_blend; |
|
- | 177 | // dst = GEN6_BLENDFACTOR_ZERO; //gen6_blend_op[op].dst_blend; |
|
173 | 178 | ||
174 | src = GEN6_BLENDFACTOR_ONE; //gen6_blend_op[op].src_blend; |
179 | src = GEN6_BLENDFACTOR_ONE; //gen6_blend_op[op].src_blend; |
Line 175... | Line 180... | ||
175 | dst = GEN6_BLENDFACTOR_ZERO; //gen6_blend_op[op].dst_blend; |
180 | dst = GEN6_BLENDFACTOR_INV_SRC_ALPHA; //gen6_blend_op[op].dst_blend; |
176 | 181 | ||
177 | #if 0 |
182 | #if 0 |
178 | /* If there's no dst alpha channel, adjust the blend op so that |
183 | /* If there's no dst alpha channel, adjust the blend op so that |
Line 1300... | Line 1305... | ||
1300 | 1305 | ||
1301 | if (sna->render_state.gen6.needs_invariant) |
1306 | if (sna->render_state.gen6.needs_invariant) |
1302 | gen6_emit_invariant(sna); |
1307 | gen6_emit_invariant(sna); |
Line -... | Line 1308... | ||
- | 1308 | } |
|
- | 1309 | ||
- | 1310 | static void gen6_emit_composite_state(struct sna *sna, |
|
- | 1311 | const struct sna_composite_op *op) |
|
- | 1312 | { |
|
- | 1313 | uint32_t *binding_table; |
|
- | 1314 | uint16_t offset; |
|
- | 1315 | bool dirty; |
|
- | 1316 | ||
- | 1317 | gen6_get_batch(sna); |
|
- | 1318 | dirty = FALSE; |
|
- | 1319 | ||
- | 1320 | binding_table = gen6_composite_get_binding_table(sna, &offset); |
|
- | 1321 | ||
- | 1322 | binding_table[0] = |
|
- | 1323 | gen6_bind_bo(sna, |
|
- | 1324 | op->dst.bo, op->dst.width, op->dst.height, |
|
- | 1325 | op->dst.format, |
|
- | 1326 | TRUE); |
|
- | 1327 | binding_table[1] = |
|
- | 1328 | gen6_bind_bo(sna, |
|
- | 1329 | op->src.bo, op->src.width, op->src.height, |
|
- | 1330 | op->src.card_format, |
|
- | 1331 | FALSE); |
|
- | 1332 | if (op->mask.bo) { |
|
- | 1333 | binding_table[2] = |
|
- | 1334 | gen6_bind_bo(sna, |
|
- | 1335 | op->mask.bo, |
|
- | 1336 | op->mask.width, |
|
- | 1337 | op->mask.height, |
|
- | 1338 | op->mask.card_format, |
|
- | 1339 | FALSE); |
|
- | 1340 | } |
|
- | 1341 | ||
- | 1342 | if (sna->kgem.surface == offset && |
|
- | 1343 | *(uint64_t *)(sna->kgem.batch + sna->render_state.gen6.surface_table) == *(uint64_t*)binding_table && |
|
- | 1344 | (op->mask.bo == NULL || |
|
- | 1345 | sna->kgem.batch[sna->render_state.gen6.surface_table+2] == binding_table[2])) { |
|
- | 1346 | sna->kgem.surface += sizeof(struct gen6_surface_state_padded) / sizeof(uint32_t); |
|
- | 1347 | offset = sna->render_state.gen6.surface_table; |
|
- | 1348 | } |
|
- | 1349 | ||
- | 1350 | gen6_emit_state(sna, op, offset | dirty); |
|
- | 1351 | } |
|
Line 1303... | Line 1352... | ||
1303 | } |
1352 | |
1304 | 1353 | ||
1305 | 1354 | ||
1306 | static void |
1355 | static void |
Line 1584... | Line 1633... | ||
1584 | return TRUE; |
1633 | return TRUE; |
1585 | } |
1634 | } |
Line 1586... | Line 1635... | ||
1586 | 1635 | ||
Line -... | Line 1636... | ||
- | 1636 | #endif |
|
- | 1637 | ||
- | 1638 | ||
- | 1639 | fastcall static void |
|
- | 1640 | gen6_emit_composite_primitive_identity_source_mask(struct sna *sna, |
|
- | 1641 | const struct sna_composite_op *op, |
|
- | 1642 | const struct sna_composite_rectangles *r) |
|
- | 1643 | { |
|
- | 1644 | union { |
|
- | 1645 | struct sna_coordinate p; |
|
- | 1646 | float f; |
|
- | 1647 | } dst; |
|
- | 1648 | float src_x, src_y; |
|
- | 1649 | float msk_x, msk_y; |
|
- | 1650 | float w, h; |
|
- | 1651 | float *v; |
|
- | 1652 | ||
- | 1653 | src_x = r->src.x + op->src.offset[0]; |
|
- | 1654 | src_y = r->src.y + op->src.offset[1]; |
|
- | 1655 | msk_x = r->mask.x + op->mask.offset[0]; |
|
- | 1656 | msk_y = r->mask.y + op->mask.offset[1]; |
|
- | 1657 | w = r->width; |
|
- | 1658 | h = r->height; |
|
- | 1659 | ||
- | 1660 | v = sna->render.vertices + sna->render.vertex_used; |
|
- | 1661 | sna->render.vertex_used += 15; |
|
- | 1662 | ||
- | 1663 | dst.p.x = r->dst.x + r->width; |
|
- | 1664 | dst.p.y = r->dst.y + r->height; |
|
- | 1665 | v[0] = dst.f; |
|
- | 1666 | v[1] = (src_x + w) * op->src.scale[0]; |
|
- | 1667 | v[2] = (src_y + h) * op->src.scale[1]; |
|
- | 1668 | v[3] = (msk_x + w) * op->mask.scale[0]; |
|
- | 1669 | v[4] = (msk_y + h) * op->mask.scale[1]; |
|
- | 1670 | ||
- | 1671 | dst.p.x = r->dst.x; |
|
- | 1672 | v[5] = dst.f; |
|
- | 1673 | v[6] = src_x * op->src.scale[0]; |
|
- | 1674 | v[7] = v[2]; |
|
- | 1675 | v[8] = msk_x * op->mask.scale[0]; |
|
- | 1676 | v[9] = v[4]; |
|
- | 1677 | ||
- | 1678 | dst.p.y = r->dst.y; |
|
- | 1679 | v[10] = dst.f; |
|
- | 1680 | v[11] = v[6]; |
|
- | 1681 | v[12] = src_y * op->src.scale[1]; |
|
- | 1682 | v[13] = v[8]; |
|
- | 1683 | v[14] = msk_y * op->mask.scale[1]; |
|
- | 1684 | } |
|
- | 1685 | ||
- | 1686 | fastcall static void |
|
- | 1687 | gen6_render_composite_box(struct sna *sna, |
|
- | 1688 | const struct sna_composite_op *op, |
|
- | 1689 | const BoxRec *box) |
|
- | 1690 | { |
|
- | 1691 | struct sna_composite_rectangles r; |
|
- | 1692 | ||
- | 1693 | if (unlikely(!gen6_get_rectangles(sna, op, 1))) { |
|
- | 1694 | // _kgem_submit(&sna->kgem); |
|
- | 1695 | // gen6_emit_composite_state(sna, op); |
|
- | 1696 | // gen6_get_rectangles(sna, op, 1); |
|
- | 1697 | } |
|
- | 1698 | ||
- | 1699 | DBG((" %s: (%d, %d), (%d, %d)\n", |
|
- | 1700 | __FUNCTION__, |
|
- | 1701 | box->x1, box->y1, box->x2, box->y2)); |
|
- | 1702 | ||
- | 1703 | r.dst.x = box->x1; |
|
- | 1704 | r.dst.y = box->y1; |
|
- | 1705 | r.width = box->x2 - box->x1; |
|
- | 1706 | r.height = box->y2 - box->y1; |
|
- | 1707 | r.src = r.mask = r.dst; |
|
- | 1708 | ||
- | 1709 | op->prim_emit(sna, op, &r); |
|
- | 1710 | } |
|
1587 | #endif |
1711 | |
1588 | 1712 | ||
1589 | static void gen6_render_composite_done(struct sna *sna, |
1713 | static void gen6_render_composite_done(struct sna *sna, |
1590 | const struct sna_composite_op *op) |
1714 | const struct sna_composite_op *op) |
Line 1603... | Line 1727... | ||
1603 | 1727 | ||
1604 | // sna_render_composite_redirect_done(sna, op); |
1728 | // sna_render_composite_redirect_done(sna, op); |
Line -... | Line 1729... | ||
- | 1729 | } |
|
- | 1730 | ||
- | 1731 | ||
- | 1732 | static Bool |
|
- | 1733 | gen6_render_composite(struct sna *sna, |
|
- | 1734 | uint8_t op, |
|
- | 1735 | bitmap_t *src, |
|
- | 1736 | struct kgem_bo *src_bo, |
|
- | 1737 | bitmap_t *mask, |
|
- | 1738 | struct kgem_bo *mask_bo, |
|
- | 1739 | bitmap_t *dst, |
|
- | 1740 | struct kgem_bo *dst_bo, |
|
- | 1741 | int16_t src_x, int16_t src_y, |
|
- | 1742 | int16_t msk_x, int16_t msk_y, |
|
- | 1743 | int16_t dst_x, int16_t dst_y, |
|
- | 1744 | int16_t width, int16_t height, |
|
- | 1745 | struct sna_composite_op *tmp) |
|
- | 1746 | { |
|
- | 1747 | // if (op >= ARRAY_SIZE(gen6_blend_op)) |
|
- | 1748 | // return FALSE; |
|
- | 1749 | ||
- | 1750 | // ENTER(); |
|
- | 1751 | ||
- | 1752 | DBG(("%s: %dx%d, current mode=%d\n", __FUNCTION__, |
|
- | 1753 | width, height, sna->kgem.ring)); |
|
- | 1754 | ||
- | 1755 | tmp->op = PictOpSrc; |
|
- | 1756 | ||
- | 1757 | tmp->dst.bo = dst_bo; |
|
- | 1758 | tmp->dst.width = dst->width; |
|
- | 1759 | tmp->dst.height = dst->height; |
|
- | 1760 | tmp->dst.format = GEN6_SURFACEFORMAT_B8G8R8A8_UNORM; |
|
- | 1761 | ||
- | 1762 | ||
- | 1763 | tmp->src.bo = src_bo; |
|
- | 1764 | tmp->src.card_format = GEN6_SURFACEFORMAT_B8G8R8A8_UNORM; |
|
- | 1765 | tmp->src.width = src->width; |
|
- | 1766 | tmp->src.height = src->height; |
|
- | 1767 | ||
- | 1768 | tmp->src.scale[0] = 1.f/width; //src->width; |
|
- | 1769 | tmp->src.scale[1] = 1.f/height; //src->height; |
|
- | 1770 | tmp->src.filter = SAMPLER_FILTER_BILINEAR; |
|
- | 1771 | tmp->src.repeat = SAMPLER_EXTEND_NONE; |
|
- | 1772 | tmp->src.offset[0] = -dst_x; |
|
- | 1773 | tmp->src.offset[1] = -dst_y; |
|
- | 1774 | tmp->src.is_affine = TRUE; |
|
- | 1775 | ||
- | 1776 | ||
- | 1777 | tmp->mask.bo = mask_bo; |
|
- | 1778 | tmp->mask.card_format = GEN6_SURFACEFORMAT_A8_UNORM; |
|
- | 1779 | tmp->mask.width = mask->width; |
|
- | 1780 | tmp->mask.height = mask->height; |
|
- | 1781 | ||
- | 1782 | tmp->mask.scale[0] = 1.f/mask->width; |
|
- | 1783 | tmp->mask.scale[1] = 1.f/mask->height; |
|
- | 1784 | tmp->mask.filter = SAMPLER_FILTER_NEAREST; |
|
- | 1785 | tmp->mask.repeat = SAMPLER_EXTEND_NONE; |
|
- | 1786 | tmp->mask.offset[0] = -dst_x; |
|
- | 1787 | tmp->mask.offset[1] = -dst_y; |
|
- | 1788 | tmp->mask.is_affine = TRUE; |
|
- | 1789 | ||
- | 1790 | tmp->is_affine = TRUE; |
|
- | 1791 | tmp->has_component_alpha = FALSE; |
|
- | 1792 | tmp->need_magic_ca_pass = FALSE; |
|
- | 1793 | ||
- | 1794 | tmp->prim_emit = gen6_emit_composite_primitive_identity_source_mask; |
|
- | 1795 | ||
- | 1796 | tmp->floats_per_vertex = 5 + 2 * !tmp->is_affine; |
|
- | 1797 | ||
- | 1798 | tmp->floats_per_rect = 3 * tmp->floats_per_vertex; |
|
- | 1799 | ||
- | 1800 | tmp->u.gen6.wm_kernel = GEN6_WM_KERNEL_MASK; |
|
- | 1801 | tmp->u.gen6.nr_surfaces = 2 + 1; |
|
- | 1802 | tmp->u.gen6.nr_inputs = 1 + 1; |
|
- | 1803 | tmp->u.gen6.ve_id = gen6_choose_composite_vertex_buffer(tmp); |
|
- | 1804 | ||
- | 1805 | tmp->need_magic_ca_pass = TRUE; |
|
- | 1806 | ||
- | 1807 | // tmp->blt = gen6_render_composite_blt; |
|
- | 1808 | tmp->box = gen6_render_composite_box; |
|
- | 1809 | // tmp->boxes = gen6_render_composite_boxes; |
|
- | 1810 | tmp->done = gen6_render_composite_done; |
|
- | 1811 | ||
- | 1812 | gen6_emit_composite_state(sna, tmp); |
|
- | 1813 | gen6_align_vertex(sna, tmp); |
|
- | 1814 | ||
- | 1815 | // LEAVE(); |
|
- | 1816 | ||
Line 1605... | Line 1817... | ||
1605 | } |
1817 | return TRUE; |
1606 | 1818 | } |
|
1607 | 1819 | ||
1608 | 1820 | ||
Line 1928... | Line 2140... | ||
1928 | return FALSE; |
2140 | return FALSE; |
Line 1929... | Line 2141... | ||
1929 | 2141 | ||
1930 | // sna->kgem.context_switch = gen6_render_context_switch; |
2142 | // sna->kgem.context_switch = gen6_render_context_switch; |
Line 1931... | Line 2143... | ||
1931 | sna->kgem.retire = gen6_render_retire; |
2143 | sna->kgem.retire = gen6_render_retire; |
1932 | 2144 | ||
Line 1933... | Line 2145... | ||
1933 | // sna->render.composite = gen6_render_composite; |
2145 | sna->render.composite = gen6_render_composite; |
1934 | // sna->render.video = gen6_render_video; |
2146 | // sna->render.video = gen6_render_video; |