etnaviv TS buffer sharing
This MR enables etnaviv to share the TS buffer between compositor and client and also to the display engine on hardware where this is possible. This gets rid of a lot of tile fills and/or decompressions, significantly improving performance. More details about the different levels of performance impact on different hardware generations can be found in the commit message.
glmark2 running on Weston is kind of a best case to show of the performance improvements, as many scenes include a lot of unfilled tiles. Real-world performance impact will be lower, but it nicely shows the effect of the changes. Some of the scenes go from being GPU or memory bound to being CPU bound.
benchmark | FPS GC3000 before | FPS GC3000 after | FPS GC7000 before | FPS GC7000 after |
---|---|---|---|---|
[build] use-vbo=false | 482 | 545 | 1111 | 1691 |
[build] use-vbo=true | 914 | 1176 | 1296 | 3085 |
[texture] texture-filter=nearest | 837 | 1038 | 924 | 1761 |
[texture] texture-filter=linear | 811 | 1022 | 900 | 1691 |
[texture] texture-filter=mipmap | 826 | 1074 | 908 | 1697 |
[shading] shading=gouraud | 689 | 950 | 913 | 1479 |
[shading] shading=blinn-phong-inf | 548 | 711 | 788 | 1256 |
[shading] shading=phong | 369 | 442 | 559 | 766 |
[shading] shading=cel | 272 | 308 | 421 | 533 |
[bump] bump-render=high-poly | 375 | 454 | 515 | 697 |
[bump] bump-render=normals | 720 | 1011 | 1008 | 1855 |
[bump] bump-render=height | 546 | 714 | 758 | 1167 |
[effect2d] kernel=0,1,0;1,-4,1;0,1,0; | 209 | 211 | 300 | 369 |
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1; | 62 | 62 | 121 | 132 |
[pulsar] light=false:quads=5:texture=false | 617 | 704 | 1121 | 2103 |
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4 | 96 | 97 | 161 | 178 |
[desktop] effect=shadow:windows=4 | 360 | 366 | 482 | 675 |
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map | 71 | 73 | 158 | 165 |
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata | 67 | 70 | 147 | 154 |
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map | 95 | 97 | 229 | 240 |
[ideas] speed=duration | 143 | 140 | 323 | 325 |
[jellyfish] | 171 | 174 | 236 | 263 |
[terrain] | 11 | 11 | 20 | 20 |
[shadow] | 427 | 499 | 600 | 827 |
[refract] | 39 | 39 | 47 | 48 |
[conditionals] fragment-steps=0:vertex-steps=0 | 709 | 843 | 848 | 1549 |
[conditionals] fragment-steps=5:vertex-steps=0 | 185 | 196 | 281 | 332 |
[conditionals] fragment-steps=0:vertex-steps=5 | 631 | 738 | 816 | 1452 |
[function] fragment-complexity=low:fragment-steps=5 | 384 | 428 | 527 | 748 |
[function] fragment-complexity=medium:fragment-steps=5 | 181 | 192 | 279 | 329 |
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5 | 354 | 392 | 513 | 721 |
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5 | 354 | 392 | 513 | 721 |
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5 | 179 | 189 | 280 | 331 |