radeon/uvd: add session context buffer for polaris 10/11 v2
This way we have unlimited UVD sessions. v2: only enable it when kernel supports it as well. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Leo Liu <leo.liu@amd.com>
This commit is contained in:
parent
134d6e4e4f
commit
3e1ad846f9
|
@ -59,6 +59,7 @@
|
||||||
#define FB_BUFFER_SIZE 2048
|
#define FB_BUFFER_SIZE 2048
|
||||||
#define FB_BUFFER_SIZE_TONGA (2048 * 64)
|
#define FB_BUFFER_SIZE_TONGA (2048 * 64)
|
||||||
#define IT_SCALING_TABLE_SIZE 992
|
#define IT_SCALING_TABLE_SIZE 992
|
||||||
|
#define UVD_SESSION_CONTEXT_SIZE (128 * 1024)
|
||||||
|
|
||||||
/* UVD decoder representation */
|
/* UVD decoder representation */
|
||||||
struct ruvd_decoder {
|
struct ruvd_decoder {
|
||||||
|
@ -89,6 +90,7 @@ struct ruvd_decoder {
|
||||||
struct rvid_buffer dpb;
|
struct rvid_buffer dpb;
|
||||||
bool use_legacy;
|
bool use_legacy;
|
||||||
struct rvid_buffer ctx;
|
struct rvid_buffer ctx;
|
||||||
|
struct rvid_buffer sessionctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* flush IB to the hardware */
|
/* flush IB to the hardware */
|
||||||
|
@ -170,6 +172,12 @@ static void send_msg_buf(struct ruvd_decoder *dec)
|
||||||
dec->fb = NULL;
|
dec->fb = NULL;
|
||||||
dec->it = NULL;
|
dec->it = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
if (dec->sessionctx.res)
|
||||||
|
send_cmd(dec, RUVD_CMD_SESSION_CONTEXT_BUFFER,
|
||||||
|
dec->sessionctx.res->buf, 0, RADEON_USAGE_READWRITE,
|
||||||
|
RADEON_DOMAIN_VRAM);
|
||||||
|
|
||||||
/* and send it to the hardware */
|
/* and send it to the hardware */
|
||||||
send_cmd(dec, RUVD_CMD_MSG_BUFFER, buf->res->buf, 0,
|
send_cmd(dec, RUVD_CMD_MSG_BUFFER, buf->res->buf, 0,
|
||||||
RADEON_USAGE_READ, RADEON_DOMAIN_GTT);
|
RADEON_USAGE_READ, RADEON_DOMAIN_GTT);
|
||||||
|
@ -938,6 +946,7 @@ static void ruvd_destroy(struct pipe_video_codec *decoder)
|
||||||
|
|
||||||
rvid_destroy_buffer(&dec->dpb);
|
rvid_destroy_buffer(&dec->dpb);
|
||||||
rvid_destroy_buffer(&dec->ctx);
|
rvid_destroy_buffer(&dec->ctx);
|
||||||
|
rvid_destroy_buffer(&dec->sessionctx);
|
||||||
|
|
||||||
FREE(dec);
|
FREE(dec);
|
||||||
}
|
}
|
||||||
|
@ -1259,6 +1268,16 @@ struct pipe_video_codec *ruvd_create_decoder(struct pipe_context *context,
|
||||||
rvid_clear_buffer(context, &dec->ctx);
|
rvid_clear_buffer(context, &dec->ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (info.family >= CHIP_POLARIS10 && info.drm_minor >= 3) {
|
||||||
|
if (!rvid_create_buffer(dec->screen, &dec->sessionctx,
|
||||||
|
UVD_SESSION_CONTEXT_SIZE,
|
||||||
|
PIPE_USAGE_DEFAULT)) {
|
||||||
|
RVID_ERR("Can't allocated session ctx.\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
rvid_clear_buffer(context, &dec->sessionctx);
|
||||||
|
}
|
||||||
|
|
||||||
map_msg_fb_it_buf(dec);
|
map_msg_fb_it_buf(dec);
|
||||||
dec->msg->size = sizeof(*dec->msg);
|
dec->msg->size = sizeof(*dec->msg);
|
||||||
dec->msg->msg_type = RUVD_MSG_CREATE;
|
dec->msg->msg_type = RUVD_MSG_CREATE;
|
||||||
|
@ -1286,6 +1305,7 @@ error:
|
||||||
|
|
||||||
rvid_destroy_buffer(&dec->dpb);
|
rvid_destroy_buffer(&dec->dpb);
|
||||||
rvid_destroy_buffer(&dec->ctx);
|
rvid_destroy_buffer(&dec->ctx);
|
||||||
|
rvid_destroy_buffer(&dec->sessionctx);
|
||||||
|
|
||||||
FREE(dec);
|
FREE(dec);
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,7 @@
|
||||||
#define RUVD_CMD_DPB_BUFFER 0x00000001
|
#define RUVD_CMD_DPB_BUFFER 0x00000001
|
||||||
#define RUVD_CMD_DECODING_TARGET_BUFFER 0x00000002
|
#define RUVD_CMD_DECODING_TARGET_BUFFER 0x00000002
|
||||||
#define RUVD_CMD_FEEDBACK_BUFFER 0x00000003
|
#define RUVD_CMD_FEEDBACK_BUFFER 0x00000003
|
||||||
|
#define RUVD_CMD_SESSION_CONTEXT_BUFFER 0x00000005
|
||||||
#define RUVD_CMD_BITSTREAM_BUFFER 0x00000100
|
#define RUVD_CMD_BITSTREAM_BUFFER 0x00000100
|
||||||
#define RUVD_CMD_ITSCALING_TABLE_BUFFER 0x00000204
|
#define RUVD_CMD_ITSCALING_TABLE_BUFFER 0x00000204
|
||||||
#define RUVD_CMD_CONTEXT_BUFFER 0x00000206
|
#define RUVD_CMD_CONTEXT_BUFFER 0x00000206
|
||||||
|
|
Loading…
Reference in New Issue