gallium/radeon: use VM for UVD
authorChristian König <christian.koenig@amd.com>
Wed, 9 Apr 2014 17:41:06 +0000 (19:41 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 14 Aug 2015 13:02:30 +0000 (15:02 +0200)
v2: (leo) add checking for driver backend
v3: (leo) change variable name from use_amdgpu to use_vm
v4: rebase by Marek

Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
src/gallium/drivers/radeon/radeon_uvd.c

index 79fc0c726c4216cefc34d1cacc906bad881a1502..b203e64f81544c376b2949863f1fafcdef96fcb2 100644 (file)
@@ -82,6 +82,7 @@ struct ruvd_decoder {
        unsigned                        bs_size;
 
        struct rvid_buffer              dpb;
+       bool                            use_legacy;
 };
 
 /* flush IB to the hardware */
@@ -107,8 +108,16 @@ static void send_cmd(struct ruvd_decoder *dec, unsigned cmd,
 
        reloc_idx = dec->ws->cs_add_reloc(dec->cs, cs_buf, usage, domain,
                                          RADEON_PRIO_MIN);
-       set_reg(dec, RUVD_GPCOM_VCPU_DATA0, off);
-       set_reg(dec, RUVD_GPCOM_VCPU_DATA1, reloc_idx * 4);
+       if (!dec->use_legacy) {
+               uint64_t addr;
+               addr = dec->ws->buffer_get_virtual_address(cs_buf);
+               addr = addr + off;
+               set_reg(dec, RUVD_GPCOM_VCPU_DATA0, addr);
+               set_reg(dec, RUVD_GPCOM_VCPU_DATA1, addr >> 32);
+       } else {
+               set_reg(dec, RUVD_GPCOM_VCPU_DATA0, off);
+               set_reg(dec, RUVD_GPCOM_VCPU_DATA1, reloc_idx * 4);
+       }
        set_reg(dec, RUVD_GPCOM_VCPU_CMD, cmd << 1);
 }
 
@@ -792,6 +801,9 @@ struct pipe_video_codec *ruvd_create_decoder(struct pipe_context *context,
        if (!dec)
                return NULL;
 
+       if (info.drm_major < 3)
+               dec->use_legacy = TRUE;
+
        dec->base = *templ;
        dec->base.context = context;
        dec->base.width = width;