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

v2: make this also compatible with original released firmware
v3: rebase by Marek

Signed-off-by: Leo Liu <leo....@amd.com>
Reviewed-by: Alex Deucher <alexander.deuc...@amd.com>
---
 src/gallium/drivers/radeon/radeon_vce.c        |  1 +
 src/gallium/drivers/radeon/radeon_vce.h        |  1 +
 src/gallium/drivers/radeon/radeon_vce_40_2_2.c | 13 +++++++++++--
 3 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/radeon/radeon_vce.c 
b/src/gallium/drivers/radeon/radeon_vce.c
index b8b35b3..d5ae26d 100644
--- a/src/gallium/drivers/radeon/radeon_vce.c
+++ b/src/gallium/drivers/radeon/radeon_vce.c
@@ -353,6 +353,7 @@ struct pipe_video_codec *rvce_create_encoder(struct 
pipe_context *context,
        if (!enc)
                return NULL;
 
+       enc->fw_ver = rscreen->info.vce_fw_version;
        if (rscreen->info.drm_major == 3)
                enc->use_vm = true;
        if ((rscreen->info.drm_major > 2) || (rscreen->info.drm_minor >= 42))
diff --git a/src/gallium/drivers/radeon/radeon_vce.h 
b/src/gallium/drivers/radeon/radeon_vce.h
index 67ba333..7d37320 100644
--- a/src/gallium/drivers/radeon/radeon_vce.h
+++ b/src/gallium/drivers/radeon/radeon_vce.h
@@ -100,6 +100,7 @@ struct rvce_encoder {
        struct rvid_buffer              cpb;
        struct pipe_h264_enc_picture_desc pic;
        bool                            use_vm;
+       unsigned                        fw_ver;
        bool                            use_vui;
 };
 
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 1e7f278..f1f4cce 100644
--- a/src/gallium/drivers/radeon/radeon_vce_40_2_2.c
+++ b/src/gallium/drivers/radeon/radeon_vce_40_2_2.c
@@ -44,6 +44,8 @@
 #include "radeon_video.h"
 #include "radeon_vce.h"
 
+#define FW_40_2_2 ((40 << 24) | (2 << 16) | (2 << 8))
+
 static const unsigned profiles[7] = { 66, 77, 88, 100, 110, 122, 244 };
 
 static struct rvce_cpb_slot *current_slot(struct rvce_encoder *enc)
@@ -145,6 +147,10 @@ static void rate_control(struct rvce_encoder *enc)
        RVCE_CS(0x00000000); // encBPicsDeltaQP
        RVCE_CS(0x00000000); // encReferenceBPicsDeltaQP
        RVCE_CS(0x00000000); // encRateControlReInitDisable
+       if (enc->fw_ver > FW_40_2_2) {
+               RVCE_CS(0x00000000); // encLCVBRInitQPFlag
+               RVCE_CS(0x00000000); // encLCVBRSATDBasedNonlinearBitBudgetFlag
+       }
        RVCE_END();
 }
 
@@ -314,7 +320,10 @@ static void encode(struct rvce_encoder *enc)
        RVCE_END();
 
        RVCE_BEGIN(0x03000001); // encode
-       RVCE_CS(0x00000000); // insertHeaders
+       if ((enc->fw_ver > FW_40_2_2) && (!enc->pic.frame_num))
+               RVCE_CS(0x00000011); // insertHeaders
+       else
+               RVCE_CS(0x00000000); // insertHeaders
        RVCE_CS(0x00000000); // pictureStructure
        RVCE_CS(enc->bs_size); // allowedMaxBitstreamSize
        RVCE_CS(0x00000000); // forceRefreshMap
@@ -328,7 +337,7 @@ static void encode(struct rvce_encoder *enc)
        RVCE_CS(align(enc->luma->npix_y, 16)); // encInputFrameYPitch
        RVCE_CS(enc->luma->level[0].pitch_bytes); // encInputPicLumaPitch
        RVCE_CS(enc->chroma->level[0].pitch_bytes); // encInputPicChromaPitch
-       RVCE_CS(0x00000000); // encInputPic(Addr|Array)Mode
+       RVCE_CS(0x00000000); // 
encInputPic(Addr|Array)Mode,encDisable(TwoPipeMode|MBOffloading)
        RVCE_CS(0x00000000); // encInputPicTileConfig
        RVCE_CS(enc->pic.picture_type); // encPicType
        RVCE_CS(enc->pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_IDR); // 
encIdrFlag
-- 
2.1.0

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

Reply via email to