@@ -80,6 +80,9 @@ struct evergreen_cs_track {
80
80
bool cb_dirty ;
81
81
bool db_dirty ;
82
82
bool streamout_dirty ;
83
+ u32 htile_offset ;
84
+ u32 htile_surface ;
85
+ struct radeon_bo * htile_bo ;
83
86
};
84
87
85
88
static u32 evergreen_cs_get_aray_mode (u32 tiling_flags )
@@ -144,6 +147,9 @@ static void evergreen_cs_track_init(struct evergreen_cs_track *track)
144
147
track -> db_s_read_bo = NULL ;
145
148
track -> db_s_write_bo = NULL ;
146
149
track -> db_dirty = true;
150
+ track -> htile_bo = NULL ;
151
+ track -> htile_offset = 0xFFFFFFFF ;
152
+ track -> htile_surface = 0 ;
147
153
148
154
for (i = 0 ; i < 4 ; i ++ ) {
149
155
track -> vgt_strmout_size [i ] = 0 ;
@@ -444,6 +450,62 @@ static int evergreen_cs_track_validate_cb(struct radeon_cs_parser *p, unsigned i
444
450
return 0 ;
445
451
}
446
452
453
+ static int evergreen_cs_track_validate_htile (struct radeon_cs_parser * p ,
454
+ unsigned nbx , unsigned nby )
455
+ {
456
+ struct evergreen_cs_track * track = p -> track ;
457
+ unsigned long size ;
458
+
459
+ if (track -> htile_bo == NULL ) {
460
+ dev_warn (p -> dev , "%s:%d htile enabled without htile surface 0x%08x\n" ,
461
+ __func__ , __LINE__ , track -> db_z_info );
462
+ return - EINVAL ;
463
+ }
464
+
465
+ if (G_028ABC_LINEAR (track -> htile_surface )) {
466
+ /* pitch must be 16 htiles aligned == 16 * 8 pixel aligned */
467
+ nbx = round_up (nbx , 16 * 8 );
468
+ /* height is npipes htiles aligned == npipes * 8 pixel aligned */
469
+ nby = round_up (nby , track -> npipes * 8 );
470
+ } else {
471
+ switch (track -> npipes ) {
472
+ case 8 :
473
+ nbx = round_up (nbx , 64 * 8 );
474
+ nby = round_up (nby , 64 * 8 );
475
+ break ;
476
+ case 4 :
477
+ nbx = round_up (nbx , 64 * 8 );
478
+ nby = round_up (nby , 32 * 8 );
479
+ break ;
480
+ case 2 :
481
+ nbx = round_up (nbx , 32 * 8 );
482
+ nby = round_up (nby , 32 * 8 );
483
+ break ;
484
+ case 1 :
485
+ nbx = round_up (nbx , 32 * 8 );
486
+ nby = round_up (nby , 16 * 8 );
487
+ break ;
488
+ default :
489
+ dev_warn (p -> dev , "%s:%d invalid num pipes %d\n" ,
490
+ __func__ , __LINE__ , track -> npipes );
491
+ return - EINVAL ;
492
+ }
493
+ }
494
+ /* compute number of htile */
495
+ nbx = nbx / 8 ;
496
+ nby = nby / 8 ;
497
+ size = nbx * nby * 4 ;
498
+ size += track -> htile_offset ;
499
+
500
+ if (size > radeon_bo_size (track -> htile_bo )) {
501
+ dev_warn (p -> dev , "%s:%d htile surface too small %ld for %ld (%d %d)\n" ,
502
+ __func__ , __LINE__ , radeon_bo_size (track -> htile_bo ),
503
+ size , nbx , nby );
504
+ return - EINVAL ;
505
+ }
506
+ return 0 ;
507
+ }
508
+
447
509
static int evergreen_cs_track_validate_stencil (struct radeon_cs_parser * p )
448
510
{
449
511
struct evergreen_cs_track * track = p -> track ;
@@ -530,6 +592,14 @@ static int evergreen_cs_track_validate_stencil(struct radeon_cs_parser *p)
530
592
return - EINVAL ;
531
593
}
532
594
595
+ /* hyperz */
596
+ if (G_028040_TILE_SURFACE_ENABLE (track -> db_z_info )) {
597
+ r = evergreen_cs_track_validate_htile (p , surf .nbx , surf .nby );
598
+ if (r ) {
599
+ return r ;
600
+ }
601
+ }
602
+
533
603
return 0 ;
534
604
}
535
605
@@ -617,6 +687,14 @@ static int evergreen_cs_track_validate_depth(struct radeon_cs_parser *p)
617
687
return - EINVAL ;
618
688
}
619
689
690
+ /* hyperz */
691
+ if (G_028040_TILE_SURFACE_ENABLE (track -> db_z_info )) {
692
+ r = evergreen_cs_track_validate_htile (p , surf .nbx , surf .nby );
693
+ if (r ) {
694
+ return r ;
695
+ }
696
+ }
697
+
620
698
return 0 ;
621
699
}
622
700
@@ -850,7 +928,7 @@ static int evergreen_cs_track_check(struct radeon_cs_parser *p)
850
928
return r ;
851
929
}
852
930
/* Check depth buffer */
853
- if (G_028800_Z_WRITE_ENABLE (track -> db_depth_control )) {
931
+ if (G_028800_Z_ENABLE (track -> db_depth_control )) {
854
932
r = evergreen_cs_track_validate_depth (p );
855
933
if (r )
856
934
return r ;
@@ -1616,6 +1694,23 @@ static int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
1616
1694
track -> cb_color_bo [tmp ] = reloc -> robj ;
1617
1695
track -> cb_dirty = true;
1618
1696
break ;
1697
+ case DB_HTILE_DATA_BASE :
1698
+ r = evergreen_cs_packet_next_reloc (p , & reloc );
1699
+ if (r ) {
1700
+ dev_warn (p -> dev , "bad SET_CONTEXT_REG "
1701
+ "0x%04X\n" , reg );
1702
+ return - EINVAL ;
1703
+ }
1704
+ track -> htile_offset = radeon_get_ib_value (p , idx );
1705
+ ib [idx ] += (u32 )((reloc -> lobj .gpu_offset >> 8 ) & 0xffffffff );
1706
+ track -> htile_bo = reloc -> robj ;
1707
+ track -> db_dirty = true;
1708
+ break ;
1709
+ case DB_HTILE_SURFACE :
1710
+ /* 8x8 only */
1711
+ track -> htile_surface = radeon_get_ib_value (p , idx );
1712
+ track -> db_dirty = true;
1713
+ break ;
1619
1714
case CB_IMMED0_BASE :
1620
1715
case CB_IMMED1_BASE :
1621
1716
case CB_IMMED2_BASE :
@@ -1628,7 +1723,6 @@ static int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
1628
1723
case CB_IMMED9_BASE :
1629
1724
case CB_IMMED10_BASE :
1630
1725
case CB_IMMED11_BASE :
1631
- case DB_HTILE_DATA_BASE :
1632
1726
case SQ_PGM_START_FS :
1633
1727
case SQ_PGM_START_ES :
1634
1728
case SQ_PGM_START_VS :
0 commit comments