radeonsi: increase performance for DRI PRIME offloading if 2nd GPU is CIK or VI
authorMarek Olšák <marek.olsak@amd.com>
Thu, 18 Aug 2016 11:05:29 +0000 (13:05 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 26 Aug 2016 13:50:10 +0000 (15:50 +0200)
SDMA is much faster for tiled->linear blits from VRAM to GTT.
I have Bonaire in my second PCIe slot.

$ glxinfo | grep OpenGL.renderer
OpenGL renderer string: Gallium 0.4 on AMD TONGA ...

$ DRI_PRIME=1 glxinfo | grep OpenGL.renderer
OpenGL renderer string: Gallium 0.4 on AMD BONAIRE ...

Without SDMA:
$ DRI_PRIME=1 glxgears
8796 frames in 5.0 seconds = 1759.074 FPS
8899 frames in 5.0 seconds = 1779.672 FPS

With SDMA:
$ DRI_PRIME=1 glxgears
12765 frames in 5.0 seconds = 2552.788 FPS
12888 frames in 5.0 seconds = 2577.495 FPS

The 1st GPU is irrelevant. The improvement should be much lower at 60 fps,
but definitely measurable.

SI will get this once we add SDMA blit support for it.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/gallium/drivers/radeonsi/si_blit.c

index 3cfd0114d517750cf97b34d2ced37a07e6cc8007..1147b5b3e22c042e0628fb6b1c76ab6339edb63c 100644 (file)
@@ -1096,11 +1096,30 @@ static void si_blit(struct pipe_context *ctx,
                    const struct pipe_blit_info *info)
 {
        struct si_context *sctx = (struct si_context*)ctx;
+       struct r600_texture *rdst = (struct r600_texture *)info->dst.resource;
 
        if (do_hardware_msaa_resolve(ctx, info)) {
                return;
        }
 
+       /* Using SDMA for copying to a linear texture in GTT is much faster.
+        * This improves DRI PRIME performance.
+        *
+        * resource_copy_region can't do this yet, because dma_copy calls it
+        * on failure (recursion).
+        */
+       if (rdst->surface.level[info->dst.level].mode ==
+           RADEON_SURF_MODE_LINEAR_ALIGNED &&
+           sctx->b.dma_copy &&
+           util_can_blit_via_copy_region(info, false)) {
+               sctx->b.dma_copy(ctx, info->dst.resource, info->dst.level,
+                                info->dst.box.x, info->dst.box.y,
+                                info->dst.box.z,
+                                info->src.resource, info->src.level,
+                                &info->src.box);
+               return;
+       }
+
        assert(util_blitter_is_blit_supported(sctx->blitter, info));
 
        /* The driver doesn't decompress resources automatically while