From: Leo Liu <leo....@amd.com>

Signed-off-by: Leo Liu <leo....@amd.com>
---
 src/gallium/drivers/radeon/radeon_vce.c        | 22 +++++++++++++++++++---
 src/gallium/drivers/radeon/radeon_vce.h        |  3 +++
 src/gallium/drivers/radeon/radeon_vce_40_2_2.c | 21 +++++++++++++++------
 3 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/radeon/radeon_vce.c 
b/src/gallium/drivers/radeon/radeon_vce.c
index 0d3fe08..eb49863 100644
--- a/src/gallium/drivers/radeon/radeon_vce.c
+++ b/src/gallium/drivers/radeon/radeon_vce.c
@@ -45,8 +45,6 @@
 #include "radeon_video.h"
 #include "radeon_vce.h"
 
-#define CPB_SIZE (40 * 1024 * 1024)
-
 /**
  * flush commands to the hardware
  */
@@ -213,6 +211,9 @@ struct pipe_video_codec *rvce_create_encoder(struct 
pipe_context *context,
 {
        struct r600_common_screen *rscreen = (struct r600_common_screen 
*)context->screen;
        struct rvce_encoder *enc;
+       struct pipe_video_buffer *tmp_buf, templat = {};
+       struct radeon_surface *tmp_surf;
+       unsigned pitch, vpitch;
 
        if (!rscreen->info.vce_fw_version) {
                RVID_ERR("Kernel doesn't supports VCE!\n");
@@ -246,8 +247,23 @@ struct pipe_video_codec *rvce_create_encoder(struct 
pipe_context *context,
        }
 
        enc->ws->cs_set_flush_callback(enc->cs, rvce_cs_flush, enc);
+       templat.buffer_format = PIPE_FORMAT_NV12;
+       templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
+       templat.width = enc->base.width;
+       templat.height = enc->base.height;
+       templat.interlaced = false;
+       if (!(tmp_buf = context->create_video_buffer(context, &templat))) {
+               RVID_ERR("Can't create video buffer.\n");
+               goto error;
+       }
 
-       if (!rvid_create_buffer(enc->ws, &enc->cpb, CPB_SIZE, 
RADEON_DOMAIN_VRAM)) {
+       get_buffer(((struct vl_video_buffer *)tmp_buf)->resources[0], NULL, 
&tmp_surf);
+       pitch = align(tmp_surf->level[0].pitch_bytes, 128);
+       vpitch = align(tmp_surf->npix_y, 16);
+       tmp_buf->destroy(tmp_buf);
+       if (!rvid_create_buffer(enc->ws, &enc->cpb, 
+                       pitch * vpitch * 1.5 * (RVCE_NUM_CPB_FRAMES + 
RVCE_NUM_CPB_EXTRA_FRAMES),
+                       RADEON_DOMAIN_VRAM)) {
                RVID_ERR("Can't create CPB buffer.\n");
                goto error;
        }
diff --git a/src/gallium/drivers/radeon/radeon_vce.h 
b/src/gallium/drivers/radeon/radeon_vce.h
index 80495e5..9dc0c68 100644
--- a/src/gallium/drivers/radeon/radeon_vce.h
+++ b/src/gallium/drivers/radeon/radeon_vce.h
@@ -43,6 +43,9 @@
 #define RVCE_READWRITE(buf, domain) RVCE_CS(RVCE_RELOC(buf, 
RADEON_USAGE_READWRITE, domain) * 4)
 #define RVCE_END() *begin = (&enc->cs->buf[enc->cs->cdw] - begin) * 4; }
 
+#define RVCE_NUM_CPB_FRAMES 2
+#define RVCE_NUM_CPB_EXTRA_FRAMES 2
+
 struct r600_common_screen;
 
 /* driver dependent callback */
diff --git a/src/gallium/drivers/radeon/radeon_vce_40_2_2.c 
b/src/gallium/drivers/radeon/radeon_vce_40_2_2.c
index b0961a9..40b2969 100644
--- a/src/gallium/drivers/radeon/radeon_vce_40_2_2.c
+++ b/src/gallium/drivers/radeon/radeon_vce_40_2_2.c
@@ -218,14 +218,23 @@ static void rdo(struct rvce_encoder *enc)
        RVCE_END();
 }
 
-static void encode(struct rvce_encoder *enc)
+static unsigned frame_offset(struct rvce_encoder *enc,
+               unsigned frame_num, unsigned *chroma_offset)
 {
-       int i;
        unsigned pitch = align(enc->luma->level[0].pitch_bytes, 128);
        unsigned vpitch = align(enc->luma->npix_y, 16);
        unsigned fsize = pitch * (vpitch + vpitch / 2);
-       unsigned chroma_offset = pitch * vpitch;
-       unsigned luma_offset;
+       unsigned base_offset = RVCE_NUM_CPB_EXTRA_FRAMES * fsize;
+
+       *chroma_offset = pitch * vpitch;
+
+       return (base_offset + (frame_num % RVCE_NUM_CPB_FRAMES) * fsize);
+} 
+
+static void encode(struct rvce_encoder *enc)
+{
+       int i;
+       unsigned luma_offset, chroma_offset;
 
        task_info(enc, 0x00000003);
 
@@ -282,7 +291,7 @@ static void encode(struct rvce_encoder *enc)
 
        RVCE_CS(0x00000000); // pictureStructure
 
-       luma_offset = (2 * ((enc->pic.frame_num - 1) % 2) * fsize + 2 * fsize); 
+       luma_offset = frame_offset(enc, enc->pic.frame_num - 1, &chroma_offset);
        if (enc->pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_IDR) { 
                RVCE_CS(0x00000000); // encPicType
                RVCE_CS(0x00000000); // frameNumber
@@ -306,7 +315,7 @@ static void encode(struct rvce_encoder *enc)
                RVCE_CS(0xffffffff); // chromaOffset
        }
        
-       luma_offset = (2 * (enc->pic.frame_num % 2) * fsize + 2 * fsize);
+       luma_offset = frame_offset(enc, enc->pic.frame_num, &chroma_offset);
        RVCE_CS(luma_offset); // encReconstructedLumaOffset
        RVCE_CS(chroma_offset + luma_offset); // encReconstructedChromaOffset
        RVCE_CS(0x00000000); // encColocBufferOffset
-- 
1.8.1.2


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to