radeon/vce: add config task and put task info into encoder v2
The config task has own task ID, extract the configuration functions into config task. v2 (chk): calculate offset automatically Signed-off-by: Leo Liu <leo.liu@amd.com> Signed-off-by: Christian König <christian.koenig@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -56,6 +56,7 @@
|
||||
static void flush(struct rvce_encoder *enc)
|
||||
{
|
||||
enc->ws->cs_flush(enc->cs, RADEON_FLUSH_ASYNC, NULL, 0);
|
||||
enc->task_info_idx = 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
@@ -280,24 +281,19 @@ static void rvce_begin_frame(struct pipe_video_codec *encoder,
|
||||
enc->fb = &fb;
|
||||
enc->session(enc);
|
||||
enc->create(enc);
|
||||
enc->rate_control(enc);
|
||||
need_rate_control = false;
|
||||
enc->config_extension(enc);
|
||||
enc->motion_estimation(enc);
|
||||
enc->rdo(enc);
|
||||
if (enc->use_vui)
|
||||
enc->vui(enc);
|
||||
enc->pic_control(enc);
|
||||
enc->config(enc);
|
||||
enc->feedback(enc);
|
||||
flush(enc);
|
||||
//dump_feedback(enc, &fb);
|
||||
rvid_destroy_buffer(&fb);
|
||||
need_rate_control = false;
|
||||
}
|
||||
|
||||
enc->session(enc);
|
||||
|
||||
if (need_rate_control)
|
||||
enc->rate_control(enc);
|
||||
if (need_rate_control) {
|
||||
enc->session(enc);
|
||||
enc->config(enc);
|
||||
flush(enc);
|
||||
}
|
||||
}
|
||||
|
||||
static void rvce_encode_bitstream(struct pipe_video_codec *encoder,
|
||||
@@ -314,6 +310,7 @@ static void rvce_encode_bitstream(struct pipe_video_codec *encoder,
|
||||
RVID_ERR("Can't create feedback buffer.\n");
|
||||
return;
|
||||
}
|
||||
enc->session(enc);
|
||||
enc->encode(enc);
|
||||
enc->feedback(enc);
|
||||
}
|
||||
|
||||
@@ -77,8 +77,12 @@ struct rvce_encoder {
|
||||
void (*motion_estimation)(struct rvce_encoder *enc);
|
||||
void (*rdo)(struct rvce_encoder *enc);
|
||||
void (*vui)(struct rvce_encoder *enc);
|
||||
void (*config)(struct rvce_encoder *enc);
|
||||
void (*encode)(struct rvce_encoder *enc);
|
||||
void (*destroy)(struct rvce_encoder *enc);
|
||||
void (*task_info)(struct rvce_encoder *enc, uint32_t op,
|
||||
uint32_t dep, uint32_t fb_idx,
|
||||
uint32_t ring_idx);
|
||||
|
||||
unsigned stream_handle;
|
||||
|
||||
@@ -102,6 +106,8 @@ struct rvce_encoder {
|
||||
struct rvid_buffer *fb;
|
||||
struct rvid_buffer cpb;
|
||||
struct pipe_h264_enc_picture_desc pic;
|
||||
unsigned task_info_idx;
|
||||
|
||||
bool use_vm;
|
||||
bool use_vui;
|
||||
bool dual_pipe;
|
||||
|
||||
@@ -53,15 +53,24 @@ static void session(struct rvce_encoder *enc)
|
||||
RVCE_END();
|
||||
}
|
||||
|
||||
static void task_info(struct rvce_encoder *enc, uint32_t taskOperation)
|
||||
static void task_info(struct rvce_encoder *enc, uint32_t op,
|
||||
uint32_t dep, uint32_t fb_idx, uint32_t ring_idx)
|
||||
{
|
||||
RVCE_BEGIN(0x00000002); // task info
|
||||
if (op == 0x3) {
|
||||
if (enc->task_info_idx) {
|
||||
uint32_t offs = enc->cs->cdw - enc->task_info_idx + 3;
|
||||
// Update offsetOfNextTaskInfo
|
||||
enc->cs->buf[enc->task_info_idx] = offs;
|
||||
}
|
||||
enc->task_info_idx = enc->cs->cdw;
|
||||
}
|
||||
RVCE_CS(0xffffffff); // offsetOfNextTaskInfo
|
||||
RVCE_CS(taskOperation); // taskOperation
|
||||
RVCE_CS(0x00000000); // referencePictureDependency
|
||||
RVCE_CS(op); // taskOperation
|
||||
RVCE_CS(dep); // referencePictureDependency
|
||||
RVCE_CS(0x00000000); // collocateFlagDependency
|
||||
RVCE_CS(0x00000000); // feedbackIndex
|
||||
RVCE_CS(0x00000000); // videoBitstreamRingIndex
|
||||
RVCE_CS(fb_idx); // feedbackIndex
|
||||
RVCE_CS(ring_idx); // videoBitstreamRingIndex
|
||||
RVCE_END();
|
||||
}
|
||||
|
||||
@@ -75,7 +84,7 @@ static void feedback(struct rvce_encoder *enc)
|
||||
|
||||
static void create(struct rvce_encoder *enc)
|
||||
{
|
||||
task_info(enc, 0x00000000);
|
||||
enc->task_info(enc, 0x00000000, 0, 0, 0);
|
||||
|
||||
RVCE_BEGIN(0x01000001); // create cmd
|
||||
RVCE_CS(0x00000000); // encUseCircularBuffer
|
||||
@@ -271,12 +280,24 @@ static void vui(struct rvce_encoder *enc)
|
||||
RVCE_END();
|
||||
}
|
||||
|
||||
static void config(struct rvce_encoder *enc)
|
||||
{
|
||||
enc->task_info(enc, 0x00000002, 0, 0xffffffff, 0);
|
||||
enc->rate_control(enc);
|
||||
enc->config_extension(enc);
|
||||
enc->motion_estimation(enc);
|
||||
enc->rdo(enc);
|
||||
if (enc->use_vui)
|
||||
enc->vui(enc);
|
||||
enc->pic_control(enc);
|
||||
}
|
||||
|
||||
static void encode(struct rvce_encoder *enc)
|
||||
{
|
||||
int i;
|
||||
unsigned luma_offset, chroma_offset;
|
||||
|
||||
task_info(enc, 0x00000003);
|
||||
enc->task_info(enc, 0x00000003, 0, 0, 0);
|
||||
|
||||
RVCE_BEGIN(0x05000001); // context buffer
|
||||
RVCE_READWRITE(enc->cpb.res->cs_buf, enc->cpb.res->domains, 0x0); // encodeContextAddressHi/Lo
|
||||
@@ -401,7 +422,7 @@ static void encode(struct rvce_encoder *enc)
|
||||
|
||||
static void destroy(struct rvce_encoder *enc)
|
||||
{
|
||||
task_info(enc, 0x00000001);
|
||||
enc->task_info(enc, 0x00000001, 0, 0, 0);
|
||||
|
||||
RVCE_BEGIN(0x02000001); // destroy
|
||||
RVCE_END();
|
||||
@@ -410,6 +431,7 @@ static void destroy(struct rvce_encoder *enc)
|
||||
void radeon_vce_40_2_2_init(struct rvce_encoder *enc)
|
||||
{
|
||||
enc->session = session;
|
||||
enc->task_info = task_info;
|
||||
enc->create = create;
|
||||
enc->feedback = feedback;
|
||||
enc->rate_control = rate_control;
|
||||
@@ -418,6 +440,7 @@ void radeon_vce_40_2_2_init(struct rvce_encoder *enc)
|
||||
enc->motion_estimation = motion_estimation;
|
||||
enc->rdo = rdo;
|
||||
enc->vui = vui;
|
||||
enc->config = config;
|
||||
enc->encode = encode;
|
||||
enc->destroy = destroy;
|
||||
}
|
||||
|
||||
@@ -44,18 +44,6 @@
|
||||
#include "radeon_video.h"
|
||||
#include "radeon_vce.h"
|
||||
|
||||
static void task_info(struct rvce_encoder *enc, uint32_t taskOperation)
|
||||
{
|
||||
RVCE_BEGIN(0x00000002); // task info
|
||||
RVCE_CS(0xffffffff); // offsetOfNextTaskInfo
|
||||
RVCE_CS(taskOperation); // taskOperation
|
||||
RVCE_CS(0x00000000); // referencePictureDependency
|
||||
RVCE_CS(0x00000000); // collocateFlagDependency
|
||||
RVCE_CS(0x00000000); // feedbackIndex
|
||||
RVCE_CS(0x00000000); // videoBitstreamRingIndex
|
||||
RVCE_END();
|
||||
}
|
||||
|
||||
static void rate_control(struct rvce_encoder *enc)
|
||||
{
|
||||
RVCE_BEGIN(0x04000005); // rate control
|
||||
@@ -93,7 +81,7 @@ static void encode(struct rvce_encoder *enc)
|
||||
int i;
|
||||
unsigned luma_offset, chroma_offset;
|
||||
|
||||
task_info(enc, 0x00000003);
|
||||
enc->task_info(enc, 0x00000003, 0, 0, 0);
|
||||
|
||||
RVCE_BEGIN(0x05000001); // context buffer
|
||||
RVCE_READWRITE(enc->cpb.res->cs_buf, enc->cpb.res->domains, 0); // encodeContextAddressHi/Lo
|
||||
|
||||
Reference in New Issue
Block a user