475
499
drm_intel_bo_unmap(surface_bo);
502
static void gen7_create_dst_surface_state(ScrnInfoPtr scrn,
504
drm_intel_bo *surf_bo,
507
intel_screen_private *intel = intel_get_screen_private(scrn);
508
struct gen7_surface_state *dest_surf_state;
509
drm_intel_bo *pixmap_bo = intel_get_pixmap_bo(pixmap);
511
if (drm_intel_bo_map(surf_bo, TRUE) != 0)
514
dest_surf_state = (struct gen7_surface_state *)((char *)surf_bo->virtual + offset);
515
memset(dest_surf_state, 0, sizeof(*dest_surf_state));
517
dest_surf_state->ss0.surface_type = BRW_SURFACE_2D;
518
dest_surf_state->ss0.tiled_surface = intel_pixmap_tiled(pixmap);
519
dest_surf_state->ss0.tile_walk = 0; /* TileX */
521
if (intel->cpp == 2) {
522
dest_surf_state->ss0.surface_format = BRW_SURFACEFORMAT_B5G6R5_UNORM;
524
dest_surf_state->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
527
dest_surf_state->ss1.base_addr =
528
intel_emit_reloc(surf_bo,
529
offset + offsetof(struct gen7_surface_state, ss1),
531
I915_GEM_DOMAIN_SAMPLER, 0);
533
dest_surf_state->ss2.height = pixmap->drawable.height - 1;
534
dest_surf_state->ss2.width = pixmap->drawable.width - 1;
536
dest_surf_state->ss3.pitch = intel_pixmap_pitch(pixmap) - 1;
538
drm_intel_bo_unmap(surf_bo);
541
static void gen7_create_src_surface_state(ScrnInfoPtr scrn,
542
drm_intel_bo * src_bo,
547
uint32_t src_surf_format,
548
drm_intel_bo *surface_bo,
551
struct gen7_surface_state *src_surf_state;
553
if (drm_intel_bo_map(surface_bo, TRUE) != 0)
556
src_surf_state = (struct gen7_surface_state *)((char *)surface_bo->virtual + offset);
557
memset(src_surf_state, 0, sizeof(*src_surf_state));
559
src_surf_state->ss0.surface_type = BRW_SURFACE_2D;
560
src_surf_state->ss0.surface_format = src_surf_format;
563
src_surf_state->ss1.base_addr =
564
intel_emit_reloc(surface_bo,
565
offset + offsetof(struct gen7_surface_state, ss1),
567
I915_GEM_DOMAIN_SAMPLER, 0);
569
src_surf_state->ss1.base_addr = src_offset;
572
src_surf_state->ss2.width = src_width - 1;
573
src_surf_state->ss2.height = src_height - 1;
575
src_surf_state->ss3.pitch = src_pitch - 1;
577
drm_intel_bo_unmap(surface_bo);
478
580
static void i965_create_binding_table(ScrnInfoPtr scrn,
479
581
drm_intel_bo *bind_bo,
1351
1474
gen6_create_vidoe_objects(ScrnInfoPtr scrn)
1353
1476
intel_screen_private *intel = intel_get_screen_private(scrn);
1477
drm_intel_bo *(*create_sampler_state)(ScrnInfoPtr);
1478
const uint32_t *packed_ps_kernel, *planar_ps_kernel;
1479
unsigned int packed_ps_size, planar_ps_size;
1481
if (INTEL_INFO(intel)->gen >= 70) {
1482
create_sampler_state = gen7_create_sampler_state;
1483
packed_ps_kernel = &ps_kernel_packed_static_gen7[0][0];
1484
packed_ps_size = sizeof(ps_kernel_packed_static_gen7);
1485
planar_ps_kernel = &ps_kernel_planar_static_gen7[0][0];
1486
planar_ps_size = sizeof(ps_kernel_planar_static_gen7);
1488
create_sampler_state = i965_create_sampler_state;
1489
packed_ps_kernel = &ps_kernel_packed_static_gen6[0][0];
1490
packed_ps_size = sizeof(ps_kernel_packed_static_gen6);
1491
planar_ps_kernel = &ps_kernel_planar_static_gen6[0][0];
1492
planar_ps_size = sizeof(ps_kernel_planar_static_gen6);
1355
1495
if (intel->video.gen4_sampler_bo == NULL)
1356
intel->video.gen4_sampler_bo = i965_create_sampler_state(scrn);
1496
intel->video.gen4_sampler_bo = create_sampler_state(scrn);
1358
1498
if (intel->video.wm_prog_packed_bo == NULL)
1359
1499
intel->video.wm_prog_packed_bo =
1360
1500
i965_create_program(scrn,
1361
&ps_kernel_packed_static_gen6[0][0],
1362
sizeof(ps_kernel_packed_static_gen6));
1364
1504
if (intel->video.wm_prog_planar_bo == NULL)
1365
1505
intel->video.wm_prog_planar_bo =
1366
1506
i965_create_program(scrn,
1367
&ps_kernel_planar_static_gen6[0][0],
1368
sizeof(ps_kernel_planar_static_gen6));
1370
1510
if (intel->video.gen4_cc_vp_bo == NULL)
1371
1511
intel->video.gen4_cc_vp_bo = i965_create_cc_vp_state(scrn);
1438
gen6_upload_viewport_state_pointers(ScrnInfoPtr scrn)
1440
intel_screen_private *intel = intel_get_screen_private(scrn);
1442
OUT_BATCH(GEN6_3DSTATE_VIEWPORT_STATE_POINTERS |
1443
GEN6_3DSTATE_VIEWPORT_STATE_MODIFY_CC |
1447
OUT_RELOC(intel->video.gen4_cc_vp_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
1451
gen6_upload_urb(ScrnInfoPtr scrn)
1453
intel_screen_private *intel = intel_get_screen_private(scrn);
1455
OUT_BATCH(GEN6_3DSTATE_URB | (3 - 2));
1456
OUT_BATCH(((1 - 1) << GEN6_3DSTATE_URB_VS_SIZE_SHIFT) |
1457
(24 << GEN6_3DSTATE_URB_VS_ENTRIES_SHIFT)); /* at least 24 on GEN6 */
1458
OUT_BATCH((0 << GEN6_3DSTATE_URB_GS_SIZE_SHIFT) |
1459
(0 << GEN6_3DSTATE_URB_GS_ENTRIES_SHIFT)); /* no GS thread */
1463
gen6_upload_cc_state_pointers(ScrnInfoPtr scrn)
1465
intel_screen_private *intel = intel_get_screen_private(scrn);
1467
OUT_BATCH(GEN6_3DSTATE_CC_STATE_POINTERS | (4 - 2));
1468
OUT_RELOC(intel->video.gen6_blend_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1);
1469
OUT_RELOC(intel->video.gen6_depth_stencil_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1);
1470
OUT_RELOC(intel->video.gen4_cc_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1);
1474
gen6_upload_sampler_state_pointers(ScrnInfoPtr scrn)
1476
intel_screen_private *intel = intel_get_screen_private(scrn);
1478
OUT_BATCH(GEN6_3DSTATE_SAMPLER_STATE_POINTERS |
1479
GEN6_3DSTATE_SAMPLER_STATE_MODIFY_PS |
1481
OUT_BATCH(0); /* VS */
1482
OUT_BATCH(0); /* GS */
1483
OUT_RELOC(intel->video.gen4_sampler_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
1487
gen6_upload_binding_table(ScrnInfoPtr scrn, uint32_t ps_binding_table_offset)
1489
intel_screen_private *intel = intel_get_screen_private(scrn);
1491
/* Binding table pointers */
1492
OUT_BATCH(BRW_3DSTATE_BINDING_TABLE_POINTERS |
1493
GEN6_3DSTATE_BINDING_TABLE_MODIFY_PS |
1495
OUT_BATCH(0); /* vs */
1496
OUT_BATCH(0); /* gs */
1497
/* Only the PS uses the binding table */
1498
OUT_BATCH(ps_binding_table_offset);
1502
gen6_upload_depth_buffer_state(ScrnInfoPtr scrn)
1504
intel_screen_private *intel = intel_get_screen_private(scrn);
1506
OUT_BATCH(BRW_3DSTATE_DEPTH_BUFFER | (7 - 2));
1507
OUT_BATCH((BRW_SURFACE_NULL << BRW_3DSTATE_DEPTH_BUFFER_TYPE_SHIFT) |
1508
(BRW_DEPTHFORMAT_D32_FLOAT << BRW_3DSTATE_DEPTH_BUFFER_FORMAT_SHIFT));
1515
OUT_BATCH(BRW_3DSTATE_CLEAR_PARAMS | (2 - 2));
1520
1550
gen6_upload_drawing_rectangle(ScrnInfoPtr scrn, PixmapPtr pixmap)
1522
1552
intel_screen_private *intel = intel_get_screen_private(scrn);
1531
gen6_upload_vs_state(ScrnInfoPtr scrn)
1533
intel_screen_private *intel = intel_get_screen_private(scrn);
1535
/* disable VS constant buffer */
1536
OUT_BATCH(GEN6_3DSTATE_CONSTANT_VS | (5 - 2));
1542
OUT_BATCH(GEN6_3DSTATE_VS | (6 - 2));
1543
OUT_BATCH(0); /* without VS kernel */
1547
OUT_BATCH(0); /* pass-through */
1551
gen6_upload_gs_state(ScrnInfoPtr scrn)
1553
intel_screen_private *intel = intel_get_screen_private(scrn);
1555
/* disable GS constant buffer */
1556
OUT_BATCH(GEN6_3DSTATE_CONSTANT_GS | (5 - 2));
1562
OUT_BATCH(GEN6_3DSTATE_GS | (7 - 2));
1563
OUT_BATCH(0); /* without GS kernel */
1568
OUT_BATCH(0); /* pass-through */
1572
gen6_upload_clip_state(ScrnInfoPtr scrn)
1574
intel_screen_private *intel = intel_get_screen_private(scrn);
1576
OUT_BATCH(GEN6_3DSTATE_CLIP | (4 - 2));
1578
OUT_BATCH(0); /* pass-through */
1583
gen6_upload_sf_state(ScrnInfoPtr scrn)
1585
intel_screen_private *intel = intel_get_screen_private(scrn);
1587
OUT_BATCH(GEN6_3DSTATE_SF | (20 - 2));
1588
OUT_BATCH((1 << GEN6_3DSTATE_SF_NUM_OUTPUTS_SHIFT) |
1589
(1 << GEN6_3DSTATE_SF_URB_ENTRY_READ_LENGTH_SHIFT) |
1590
(0 << GEN6_3DSTATE_SF_URB_ENTRY_READ_OFFSET_SHIFT));
1592
OUT_BATCH(GEN6_3DSTATE_SF_CULL_NONE);
1593
OUT_BATCH(2 << GEN6_3DSTATE_SF_TRIFAN_PROVOKE_SHIFT); /* DW4 */
1598
OUT_BATCH(0); /* DW9 */
1603
OUT_BATCH(0); /* DW14 */
1608
OUT_BATCH(0); /* DW19 */
1612
1561
gen6_upload_wm_state(ScrnInfoPtr scrn, Bool is_packed)
1614
1563
intel_screen_private *intel = intel_get_screen_private(scrn);
1672
1621
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
1676
gen6_emit_video_setup(ScrnInfoPtr scrn, drm_intel_bo *surface_state_binding_table_bo, int n_src_surf, PixmapPtr pixmap)
1625
gen6_upload_vertex_buffer(ScrnInfoPtr scrn, drm_intel_bo *vertex_bo, uint32_t end_address_offset)
1627
intel_screen_private *intel = intel_get_screen_private(scrn);
1629
/* Set up the pointer to our vertex buffer */
1630
OUT_BATCH(BRW_3DSTATE_VERTEX_BUFFERS | (5 - 2));
1631
/* four 32-bit floats per vertex */
1632
OUT_BATCH((0 << GEN6_VB0_BUFFER_INDEX_SHIFT) |
1633
GEN6_VB0_VERTEXDATA |
1634
((4 * 4) << VB0_BUFFER_PITCH_SHIFT));
1635
OUT_RELOC(vertex_bo, I915_GEM_DOMAIN_VERTEX, 0, 0);
1636
OUT_RELOC(vertex_bo, I915_GEM_DOMAIN_VERTEX, 0, end_address_offset);
1637
OUT_BATCH(0); /* reserved */
1641
gen6_upload_primitive(ScrnInfoPtr scrn)
1643
intel_screen_private *intel = intel_get_screen_private(scrn);
1645
OUT_BATCH(BRW_3DPRIMITIVE |
1646
BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL |
1647
(_3DPRIM_RECTLIST << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) |
1648
(0 << 9) | /* Internal Vertex Count */
1650
OUT_BATCH(3); /* vertex count per instance */
1651
OUT_BATCH(0); /* start vertex offset */
1652
OUT_BATCH(1); /* single instance */
1653
OUT_BATCH(0); /* start instance location */
1654
OUT_BATCH(0); /* index buffer offset, ignored */
1658
gen6_emit_video_setup(ScrnInfoPtr scrn,
1659
drm_intel_bo *surface_state_binding_table_bo, int n_src_surf,
1661
drm_intel_bo *vertex_bo, uint32_t end_address_offset)
1678
1663
intel_screen_private *intel = intel_get_screen_private(scrn);
1681
1666
IntelEmitInvarientState(scrn);
1682
1667
intel->last_3d = LAST_3D_VIDEO;
1684
gen6_upload_invarient_states(scrn);
1669
gen6_upload_invariant_states(intel);
1685
1670
gen6_upload_state_base_address(scrn, surface_state_binding_table_bo);
1686
gen6_upload_viewport_state_pointers(scrn);
1687
gen6_upload_urb(scrn);
1688
gen6_upload_cc_state_pointers(scrn);
1689
gen6_upload_sampler_state_pointers(scrn);
1690
gen6_upload_vs_state(scrn);
1691
gen6_upload_gs_state(scrn);
1692
gen6_upload_clip_state(scrn);
1693
gen6_upload_sf_state(scrn);
1671
gen6_upload_viewport_state_pointers(intel, intel->video.gen4_cc_vp_bo);
1672
gen6_upload_urb(intel);
1673
gen6_upload_cc_state_pointers(intel, intel->video.gen6_blend_bo, intel->video.gen4_cc_bo, intel->video.gen6_depth_stencil_bo, 0);
1674
gen6_upload_sampler_state_pointers(intel, intel->video.gen4_sampler_bo);
1675
gen6_upload_vs_state(intel);
1676
gen6_upload_gs_state(intel);
1677
gen6_upload_clip_state(intel);
1678
gen6_upload_sf_state(intel, 1, 0);
1694
1679
gen6_upload_wm_state(scrn, n_src_surf == 1 ? TRUE : FALSE);
1695
gen6_upload_binding_table(scrn, (n_src_surf + 1) * ALIGN(sizeof(struct brw_surface_state), 32));;
1696
gen6_upload_depth_buffer_state(scrn);
1697
gen6_upload_drawing_rectangle(scrn, pixmap);
1698
gen6_upload_vertex_element_state(scrn);
1680
gen6_upload_binding_table(intel, (n_src_surf + 1) * SURFACE_STATE_PADDED_SIZE);
1681
gen6_upload_depth_buffer_state(intel);
1682
gen6_upload_drawing_rectangle(scrn, pixmap);
1683
gen6_upload_vertex_element_state(scrn);
1684
gen6_upload_vertex_buffer(scrn, vertex_bo, end_address_offset);
1685
gen6_upload_primitive(scrn);
1689
gen7_upload_wm_state(ScrnInfoPtr scrn, Bool is_packed)
1691
intel_screen_private *intel = intel_get_screen_private(scrn);
1693
/* disable WM constant buffer */
1694
OUT_BATCH(GEN6_3DSTATE_CONSTANT_PS | (7 - 2));
1702
OUT_BATCH(GEN6_3DSTATE_WM | (3 - 2));
1703
OUT_BATCH(GEN7_WM_DISPATCH_ENABLE |
1704
GEN7_WM_PERSPECTIVE_PIXEL_BARYCENTRIC);
1707
OUT_BATCH(GEN7_3DSTATE_PS | (8 - 2));
1710
OUT_RELOC(intel->video.wm_prog_packed_bo,
1711
I915_GEM_DOMAIN_INSTRUCTION, 0,
1713
OUT_BATCH((1 << GEN7_PS_SAMPLER_COUNT_SHIFT) |
1714
(2 << GEN7_PS_BINDING_TABLE_ENTRY_COUNT_SHIFT));
1716
OUT_RELOC(intel->video.wm_prog_planar_bo,
1717
I915_GEM_DOMAIN_INSTRUCTION, 0,
1719
OUT_BATCH((1 << GEN7_PS_SAMPLER_COUNT_SHIFT) |
1720
(7 << GEN7_PS_BINDING_TABLE_ENTRY_COUNT_SHIFT));
1723
OUT_BATCH(0); /* scratch space base offset */
1725
((86 - 1) << GEN7_PS_MAX_THREADS_SHIFT) |
1726
GEN7_PS_ATTRIBUTE_ENABLE |
1727
GEN7_PS_16_DISPATCH_ENABLE);
1729
(6 << GEN7_PS_DISPATCH_START_GRF_SHIFT_0));
1730
OUT_BATCH(0); /* kernel 1 pointer */
1731
OUT_BATCH(0); /* kernel 2 pointer */
1735
gen7_upload_vertex_buffer(ScrnInfoPtr scrn, drm_intel_bo *vertex_bo, uint32_t end_address_offset)
1737
intel_screen_private *intel = intel_get_screen_private(scrn);
1739
/* Set up the pointer to our vertex buffer */
1740
OUT_BATCH(BRW_3DSTATE_VERTEX_BUFFERS | (5 - 2));
1741
/* four 32-bit floats per vertex */
1742
OUT_BATCH((0 << GEN6_VB0_BUFFER_INDEX_SHIFT) |
1743
GEN6_VB0_VERTEXDATA |
1744
GEN7_VB0_ADDRESS_MODIFYENABLE |
1745
((4 * 4) << VB0_BUFFER_PITCH_SHIFT));
1746
OUT_RELOC(vertex_bo, I915_GEM_DOMAIN_VERTEX, 0, 0);
1747
OUT_RELOC(vertex_bo, I915_GEM_DOMAIN_VERTEX, 0, end_address_offset);
1748
OUT_BATCH(0); /* reserved */
1752
gen7_upload_primitive(ScrnInfoPtr scrn)
1754
intel_screen_private *intel = intel_get_screen_private(scrn);
1756
OUT_BATCH(BRW_3DPRIMITIVE | (7 - 2));
1757
OUT_BATCH(_3DPRIM_RECTLIST |
1758
GEN7_3DPRIM_VERTEXBUFFER_ACCESS_SEQUENTIAL);
1759
OUT_BATCH(3); /* vertex count per instance */
1760
OUT_BATCH(0); /* start vertex offset */
1761
OUT_BATCH(1); /* single instance */
1762
OUT_BATCH(0); /* start instance location */
1767
gen7_emit_video_setup(ScrnInfoPtr scrn,
1768
drm_intel_bo *surface_state_binding_table_bo, int n_src_surf,
1770
drm_intel_bo *vertex_bo, uint32_t end_address_offset)
1772
intel_screen_private *intel = intel_get_screen_private(scrn);
1774
assert(n_src_surf == 1 || n_src_surf == 6);
1775
IntelEmitInvarientState(scrn);
1776
intel->last_3d = LAST_3D_VIDEO;
1778
gen6_upload_invariant_states(intel);
1779
gen6_upload_state_base_address(scrn, surface_state_binding_table_bo);
1780
gen7_upload_viewport_state_pointers(intel, intel->video.gen4_cc_vp_bo);
1781
gen7_upload_urb(intel);
1782
gen7_upload_cc_state_pointers(intel, intel->video.gen6_blend_bo, intel->video.gen4_cc_bo, intel->video.gen6_depth_stencil_bo, 0);
1783
gen7_upload_sampler_state_pointers(intel, intel->video.gen4_sampler_bo);
1784
gen7_upload_bypass_states(intel);
1785
gen6_upload_vs_state(intel);
1786
gen6_upload_clip_state(intel);
1787
gen7_upload_sf_state(intel, 1, 0);
1788
gen7_upload_wm_state(scrn, n_src_surf == 1 ? TRUE : FALSE);
1789
gen7_upload_binding_table(intel, (n_src_surf + 1) * SURFACE_STATE_PADDED_SIZE);
1790
gen7_upload_depth_buffer_state(intel);
1791
gen6_upload_drawing_rectangle(scrn, pixmap);
1792
gen6_upload_vertex_element_state(scrn);
1793
gen7_upload_vertex_buffer(scrn, vertex_bo, end_address_offset);
1794
gen7_upload_primitive(scrn);
1701
1797
void Gen6DisplayVideoTextured(ScrnInfoPtr scrn,
1853
1972
intel_batch_submit(scrn);
1855
1974
intel_batch_start_atomic(scrn, 200);
1856
gen6_emit_video_setup(scrn, surface_state_binding_table_bo, n_src_surf, pixmap);
1858
/* Set up the pointer to our vertex buffer */
1859
OUT_BATCH(BRW_3DSTATE_VERTEX_BUFFERS | (5 - 2));
1860
/* four 32-bit floats per vertex */
1861
OUT_BATCH((0 << GEN6_VB0_BUFFER_INDEX_SHIFT) |
1862
GEN6_VB0_VERTEXDATA |
1863
((4 * 4) << VB0_BUFFER_PITCH_SHIFT));
1864
OUT_RELOC(vb_bo, I915_GEM_DOMAIN_VERTEX, 0, 0);
1865
OUT_RELOC(vb_bo, I915_GEM_DOMAIN_VERTEX, 0, i * 4);
1866
OUT_BATCH(0); /* reserved */
1868
OUT_BATCH(BRW_3DPRIMITIVE |
1869
BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL |
1870
(_3DPRIM_RECTLIST << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) |
1871
(0 << 9) | /* Internal Vertex Count */
1873
OUT_BATCH(3); /* vertex count per instance */
1874
OUT_BATCH(0); /* start vertex offset */
1875
OUT_BATCH(1); /* single instance */
1876
OUT_BATCH(0); /* start instance location */
1877
OUT_BATCH(0); /* index buffer offset, ignored */
1975
emit_video_setup(scrn, surface_state_binding_table_bo, n_src_surf, pixmap, vb_bo, i * 4);
1879
1976
intel_batch_end_atomic(scrn);
1880
1978
drm_intel_bo_unreference(vb_bo);