blob: a170b8e93be027cb1a89f14a3c21f631c371db8d [file] [log] [blame]
/*===================== begin_copyright_notice ==================================
Copyright (c) 2017-2019, Intel Corporation
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
======================= end_copyright_notice ==================================*/
//!
//! \file mhw_vdbox_hcp_g12_X.cpp
//! \brief Constructs VdBox HCP commands on Gen12-based platforms
#include "mhw_vdbox_hcp_g12_X.h"
#include "mhw_mi_hwcmd_g12_X.h"
#include "mhw_vdbox_vdenc_hwcmd_g12_X.h"
#include "mhw_sfc_hwcmd_g12_X.h"
#include "mhw_vdbox_g12_X.h"
#include "mhw_mmio_g12.h"
#include "mhw_sfc_g12_X.h"
#include "mos_interface.h"
#include "hal_oca_interface.h"
static uint16_t RDOQLamdas8bits[2][2][2][52] = //[Intra Slice/Inter Slice][Intra/Inter][Luma/Chroma][QP]
{
{
{
{ //Intra Luma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0002, 0x0002, 0x0003, 0x0003, 0x0004, 0x0005,
0x0007, 0x0008, 0x000a, 0x000d, 0x0011, 0x0015, 0x001a, 0x0021,
0x002a, 0x0034, 0x0042, 0x0053, 0x0069, 0x0084, 0x00a6, 0x00d2,
0x0108, 0x014d, 0x01a3, 0x0210, 0x029a, 0x0347, 0x0421, 0x0533,
0x068d, 0x0841, 0x0a66, 0x0d1a, 0x1082, 0x14cd, 0x1a35, 0x2105,
0x299a, 0x346a, 0x4209, 0x5333
},
{ //Intra Chroma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0002, 0x0002, 0x0003, 0x0003, 0x0004, 0x0005,
0x0007, 0x0008, 0x000a, 0x000d, 0x0011, 0x0015, 0x001a, 0x0021,
0x002a, 0x0034, 0x0042, 0x0053, 0x0069, 0x0084, 0x00a6, 0x00d2,
0x0108, 0x014d, 0x01a3, 0x0210, 0x029a, 0x0347, 0x0421, 0x0533,
0x068d, 0x0841, 0x0a66, 0x0d1a, 0x1082, 0x14cd, 0x1a35, 0x2105,
0x299a, 0x346a, 0x4209, 0x5333
},
},
{
{ //Inter Luma
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003,
0x0003, 0x0004, 0x0006, 0x0007, 0x0009, 0x000b, 0x000e, 0x0012,
0x0016, 0x001c, 0x0023, 0x002c, 0x0038, 0x0046, 0x0059, 0x0075,
0x009b, 0x00cc, 0x010c, 0x0160, 0x01cd, 0x025b, 0x0314, 0x0405,
0x053d, 0x06d2, 0x08df, 0x0b2d, 0x0e14, 0x11bd, 0x165a, 0x1c29,
0x237b, 0x2cb4, 0x3852, 0x46f5, 0x5967, 0x70a4, 0x8deb, 0xb2ce,
0xe148, 0xffff, 0xffff, 0xffff
},
{ //Inter Chroma
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003,
0x0003, 0x0004, 0x0005, 0x0007, 0x0008, 0x000b, 0x000d, 0x0011,
0x0015, 0x001b, 0x0021, 0x002a, 0x0035, 0x0043, 0x0054, 0x006c,
0x008c, 0x00b4, 0x00e7, 0x0129, 0x017d, 0x01ea, 0x0275, 0x0327,
0x040c, 0x0530, 0x06a7, 0x0862, 0x0a8f, 0x0d4e, 0x10c3, 0x151f,
0x1a9c, 0x2187, 0x2a3d, 0x3538, 0x430d, 0x547b, 0x6a70, 0x861b,
0xa8f6, 0xd4e0, 0xffff, 0xffff
},
},
},
{
{
{ //Intra Luma
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003,
0x0003, 0x0004, 0x0006, 0x0007, 0x0009, 0x000b, 0x000e, 0x0012,
0x0016, 0x001c, 0x0023, 0x002c, 0x0038, 0x0046, 0x0059, 0x0075,
0x009b, 0x00cc, 0x010c, 0x0160, 0x01cd, 0x025b, 0x0314, 0x0405,
0x053d, 0x06d2, 0x08df, 0x0b2d, 0x0e14, 0x11bd, 0x165a, 0x1c29,
0x237b, 0x2cb4, 0x3852, 0x46f5, 0x5967, 0x70a4, 0x8deb, 0xb2ce,
0xe148, 0xffff, 0xffff, 0xffff
},
{ //Intra Chroma
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003,
0x0003, 0x0004, 0x0005, 0x0007, 0x0008, 0x000b, 0x000d, 0x0011,
0x0015, 0x001b, 0x0021, 0x002a, 0x0035, 0x0043, 0x0054, 0x006c,
0x008c, 0x00b4, 0x00e7, 0x0129, 0x017d, 0x01ea, 0x0275, 0x0327,
0x040c, 0x0530, 0x06a7, 0x0862, 0x0a8f, 0x0d4e, 0x10c3, 0x151f,
0x1a9c, 0x2187, 0x2a3d, 0x3538, 0x430d, 0x547b, 0x6a70, 0x861b,
0xa8f6, 0xd4e0, 0xffff, 0xffff
},
},
{
{ //Inter Luma
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003,
0x0003, 0x0004, 0x0006, 0x0007, 0x0009, 0x000b, 0x000e, 0x0012,
0x0016, 0x001c, 0x0023, 0x002c, 0x0038, 0x0046, 0x0059, 0x0075,
0x009b, 0x00cc, 0x010c, 0x0160, 0x01cd, 0x025b, 0x0314, 0x0405,
0x053d, 0x06d2, 0x08df, 0x0b2d, 0x0e14, 0x11bd, 0x165a, 0x1c29,
0x237b, 0x2cb4, 0x3852, 0x46f5, 0x5967, 0x70a4, 0x8deb, 0xb2ce,
0xe148, 0xffff, 0xffff, 0xffff
},
{ //Inter Chroma
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003,
0x0003, 0x0004, 0x0005, 0x0007, 0x0008, 0x000b, 0x000d, 0x0011,
0x0015, 0x001b, 0x0021, 0x002a, 0x0035, 0x0043, 0x0054, 0x006c,
0x008c, 0x00b4, 0x00e7, 0x0129, 0x017d, 0x01ea, 0x0275, 0x0327,
0x040c, 0x0530, 0x06a7, 0x0862, 0x0a8f, 0x0d4e, 0x10c3, 0x151f,
0x1a9c, 0x2187, 0x2a3d, 0x3538, 0x430d, 0x547b, 0x6a70, 0x861b,
0xa8f6, 0xd4e0, 0xffff, 0xffff
},
},
}
};
static uint16_t RDOQLamdas10bits[2][2][2][64] = //[Intra Slice/Inter Slice][Intra/Inter][Luma/Chroma][QP]
{
{
{
{ //Intra Luma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002,
0x0003, 0x0003, 0x0004, 0x0005, 0x0007, 0x0008, 0x000a, 0x000d,
0x0011, 0x0015, 0x001a, 0x0021, 0x002a, 0x0034, 0x0042, 0x0053,
0x0069, 0x0084, 0x00a6, 0x00d2, 0x0108, 0x014d, 0x01a3, 0x0210,
0x029a, 0x0347, 0x0421, 0x0533, 0x068d, 0x0841, 0x0a66, 0x0d1a,
0x1082, 0x14cd, 0x1a35, 0x2105, 0x299a, 0x346a, 0x4209, 0x5333
},
{ //Intra Chroma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002,
0x0003, 0x0003, 0x0004, 0x0005, 0x0007, 0x0008, 0x000a, 0x000d,
0x0011, 0x0015, 0x001a, 0x0021, 0x002a, 0x0034, 0x0042, 0x0053,
0x0069, 0x0084, 0x00a6, 0x00d2, 0x0108, 0x014d, 0x01a3, 0x0210,
0x029a, 0x0347, 0x0421, 0x0533, 0x068d, 0x0841, 0x0a66, 0x0d1a,
0x1082, 0x14cd, 0x1a35, 0x2105, 0x299a, 0x346a, 0x4209, 0x5333
},
},
{
{ //Inter Luma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0002, 0x0002, 0x0003, 0x0003, 0x0004, 0x0006, 0x0007,
0x0009, 0x000b, 0x000e, 0x0012, 0x0016, 0x001c, 0x0023, 0x002c,
0x0038, 0x0046, 0x0059, 0x0075, 0x009b, 0x00cc, 0x010c, 0x0160,
0x01cd, 0x025b, 0x0314, 0x0405, 0x053d, 0x06d2, 0x08df, 0x0b2d,
0x0e14, 0x11bd, 0x165a, 0x1c29, 0x237b, 0x2cb4, 0x3852, 0x46f5,
0x5967, 0x70a4, 0x8deb, 0xb2ce, 0xe148, 0xffff, 0xffff, 0xffff
},
{ //Inter Chroma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0002, 0x0002, 0x0003, 0x0003, 0x0004, 0x0005, 0x0007,
0x0008, 0x000b, 0x000d, 0x0011, 0x0015, 0x001b, 0x0021, 0x002a,
0x0035, 0x0043, 0x0054, 0x006c, 0x008c, 0x00b4, 0x00e7, 0x0129,
0x017d, 0x01ea, 0x0275, 0x0327, 0x040c, 0x0530, 0x06a7, 0x0862,
0x0a8f, 0x0d4e, 0x10c3, 0x151f, 0x1a9c, 0x2187, 0x2a3d, 0x3538,
0x430d, 0x547b, 0x6a70, 0x861b, 0xa8f6, 0xd4e0, 0xffff, 0xffff
},
},
},
{
{
{ //Intra Luma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0002, 0x0002, 0x0003, 0x0003, 0x0004, 0x0006, 0x0007,
0x0009, 0x000b, 0x000e, 0x0012, 0x0016, 0x001c, 0x0023, 0x002c,
0x0038, 0x0046, 0x0059, 0x0075, 0x009b, 0x00cc, 0x010c, 0x0160,
0x01cd, 0x025b, 0x0314, 0x0405, 0x053d, 0x06d2, 0x08df, 0x0b2d,
0x0e14, 0x11bd, 0x165a, 0x1c29, 0x237b, 0x2cb4, 0x3852, 0x46f5,
0x5967, 0x70a4, 0x8deb, 0xb2ce, 0xe148, 0xffff, 0xffff, 0xffff
},
{ //Intra Chroma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0002, 0x0002, 0x0003, 0x0003, 0x0004, 0x0005, 0x0007,
0x0008, 0x000b, 0x000d, 0x0011, 0x0015, 0x001b, 0x0021, 0x002a,
0x0035, 0x0043, 0x0054, 0x006c, 0x008c, 0x00b4, 0x00e7, 0x0129,
0x017d, 0x01ea, 0x0275, 0x0327, 0x040c, 0x0530, 0x06a7, 0x0862,
0x0a8f, 0x0d4e, 0x10c3, 0x151f, 0x1a9c, 0x2187, 0x2a3d, 0x3538,
0x430d, 0x547b, 0x6a70, 0x861b, 0xa8f6, 0xd4e0, 0xffff, 0xffff
},
},
{
{ //Inter Luma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0002, 0x0002, 0x0003, 0x0003, 0x0004, 0x0006, 0x0007,
0x0009, 0x000b, 0x000e, 0x0012, 0x0016, 0x001c, 0x0023, 0x002c,
0x0038, 0x0046, 0x0059, 0x0075, 0x009b, 0x00cc, 0x010c, 0x0160,
0x01cd, 0x025b, 0x0314, 0x0405, 0x053d, 0x06d2, 0x08df, 0x0b2d,
0x0e14, 0x11bd, 0x165a, 0x1c29, 0x237b, 0x2cb4, 0x3852, 0x46f5,
0x5967, 0x70a4, 0x8deb, 0xb2ce, 0xe148, 0xffff, 0xffff, 0xffff
},
{ //Inter Chroma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0002, 0x0002, 0x0003, 0x0003, 0x0004, 0x0005, 0x0007,
0x0008, 0x000b, 0x000d, 0x0011, 0x0015, 0x001b, 0x0021, 0x002a,
0x0035, 0x0043, 0x0054, 0x006c, 0x008c, 0x00b4, 0x00e7, 0x0129,
0x017d, 0x01ea, 0x0275, 0x0327, 0x040c, 0x0530, 0x06a7, 0x0862,
0x0a8f, 0x0d4e, 0x10c3, 0x151f, 0x1a9c, 0x2187, 0x2a3d, 0x3538,
0x430d, 0x547b, 0x6a70, 0x861b, 0xa8f6, 0xd4e0, 0xffff, 0xffff
},
},
}
};
static uint16_t RDOQLamdas12bits[2][2][2][76] = //[Intra Slice/Inter Slice][Intra/Inter][Luma/Chroma][QP]
{
{
{
{ //Intra Luma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0002, 0x0002, 0x0003, 0x0003, 0x0004, 0x0005,
0x0007, 0x0008, 0x000a, 0x000d, 0x0011, 0x0015, 0x001a, 0x0021,
0x002a, 0x0034, 0x0042, 0x0053, 0x0069, 0x0084, 0x00a6, 0x00d2,
0x0108, 0x014d, 0x01a3, 0x0210, 0x029a, 0x0347, 0x0421, 0x0533,
0x068d, 0x0841, 0x0a66, 0x0d1a, 0x1082, 0x14cd, 0x1a35, 0x2105,
0x299a, 0x346a, 0x4209, 0x5333
},
{ //Intra Chroma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0002, 0x0002, 0x0003, 0x0003, 0x0004, 0x0005,
0x0007, 0x0008, 0x000a, 0x000d, 0x0011, 0x0015, 0x001a, 0x0021,
0x002a, 0x0034, 0x0042, 0x0053, 0x0069, 0x0084, 0x00a6, 0x00d2,
0x0108, 0x014d, 0x01a3, 0x0210, 0x029a, 0x0347, 0x0421, 0x0533,
0x068d, 0x0841, 0x0a66, 0x0d1a, 0x1082, 0x14cd, 0x1a35, 0x2105,
0x299a, 0x346a, 0x4209, 0x5333
},
},
{
{ //Inter Luma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003,
0x0003, 0x0004, 0x0006, 0x0007, 0x0009, 0x000b, 0x000e, 0x0012,
0x0016, 0x001c, 0x0023, 0x002c, 0x0038, 0x0046, 0x0059, 0x0075,
0x009b, 0x00cc, 0x010c, 0x0160, 0x01cd, 0x025b, 0x0314, 0x0405,
0x053d, 0x06d2, 0x08df, 0x0b2d, 0x0e14, 0x11bd, 0x165a, 0x1c29,
0x237b, 0x2cb4, 0x3852, 0x46f5, 0x5967, 0x70a4, 0x8deb, 0xb2ce,
0xe148, 0xffff, 0xffff, 0xffff
},
{ //Inter Chroma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003,
0x0003, 0x0004, 0x0005, 0x0007, 0x0008, 0x000b, 0x000d, 0x0011,
0x0015, 0x001b, 0x0021, 0x002a, 0x0035, 0x0043, 0x0054, 0x006c,
0x008c, 0x00b4, 0x00e7, 0x0129, 0x017d, 0x01ea, 0x0275, 0x0327,
0x040c, 0x0530, 0x06a7, 0x0862, 0x0a8f, 0x0d4e, 0x10c3, 0x151f,
0x1a9c, 0x2187, 0x2a3d, 0x3538, 0x430d, 0x547b, 0x6a70, 0x861b,
0xa8f6, 0xd4e0, 0xffff, 0xffff
},
},
},
{
{
{ //Intra Luma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003,
0x0003, 0x0004, 0x0006, 0x0007, 0x0009, 0x000b, 0x000e, 0x0012,
0x0016, 0x001c, 0x0023, 0x002c, 0x0038, 0x0046, 0x0059, 0x0075,
0x009b, 0x00cc, 0x010c, 0x0160, 0x01cd, 0x025b, 0x0314, 0x0405,
0x053d, 0x06d2, 0x08df, 0x0b2d, 0x0e14, 0x11bd, 0x165a, 0x1c29,
0x237b, 0x2cb4, 0x3852, 0x46f5, 0x5967, 0x70a4, 0x8deb, 0xb2ce,
0xe148, 0xffff, 0xffff, 0xffff
},
{ //Intra Chroma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003,
0x0003, 0x0004, 0x0005, 0x0007, 0x0008, 0x000b, 0x000d, 0x0011,
0x0015, 0x001b, 0x0021, 0x002a, 0x0035, 0x0043, 0x0054, 0x006c,
0x008c, 0x00b4, 0x00e7, 0x0129, 0x017d, 0x01ea, 0x0275, 0x0327,
0x040c, 0x0530, 0x06a7, 0x0862, 0x0a8f, 0x0d4e, 0x10c3, 0x151f,
0x1a9c, 0x2187, 0x2a3d, 0x3538, 0x430d, 0x547b, 0x6a70, 0x861b,
0xa8f6, 0xd4e0, 0xffff, 0xffff
},
},
{
{ //Inter Luma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003,
0x0003, 0x0004, 0x0006, 0x0007, 0x0009, 0x000b, 0x000e, 0x0012,
0x0016, 0x001c, 0x0023, 0x002c, 0x0038, 0x0046, 0x0059, 0x0075,
0x009b, 0x00cc, 0x010c, 0x0160, 0x01cd, 0x025b, 0x0314, 0x0405,
0x053d, 0x06d2, 0x08df, 0x0b2d, 0x0e14, 0x11bd, 0x165a, 0x1c29,
0x237b, 0x2cb4, 0x3852, 0x46f5, 0x5967, 0x70a4, 0x8deb, 0xb2ce,
0xe148, 0xffff, 0xffff, 0xffff
},
{ //Inter Chroma
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003,
0x0003, 0x0004, 0x0005, 0x0007, 0x0008, 0x000b, 0x000d, 0x0011,
0x0015, 0x001b, 0x0021, 0x002a, 0x0035, 0x0043, 0x0054, 0x006c,
0x008c, 0x00b4, 0x00e7, 0x0129, 0x017d, 0x01ea, 0x0275, 0x0327,
0x040c, 0x0530, 0x06a7, 0x0862, 0x0a8f, 0x0d4e, 0x10c3, 0x151f,
0x1a9c, 0x2187, 0x2a3d, 0x3538, 0x430d, 0x547b, 0x6a70, 0x861b,
0xa8f6, 0xd4e0, 0xffff, 0xffff
},
},
}
};
void MhwVdboxHcpInterfaceG12::InitMmioRegisters()
{
MmioRegistersHcp *mmioRegisters = &m_mmioRegisters[MHW_VDBOX_NODE_1];
mmioRegisters->watchdogCountCtrlOffset = WATCHDOG_COUNT_CTRL_OFFSET_INIT_G12;
mmioRegisters->watchdogCountThresholdOffset = WATCHDOG_COUNT_THRESTHOLD_OFFSET_INIT_G12;
mmioRegisters->hcpDebugFEStreamOutSizeRegOffset = HCP_DEBUG_FE_STREAM_OUT_SIZE_REG_OFFSET_INIT_G12;
mmioRegisters->hcpEncImageStatusMaskRegOffset = HCP_ENC_IMAGE_STATUS_MASK_REG_OFFSET_INIT_G12;
mmioRegisters->hcpEncImageStatusCtrlRegOffset = HCP_ENC_IMAGE_STATUS_CTRL_REG_OFFSET_INIT_G12;
mmioRegisters->hcpEncBitstreamBytecountFrameRegOffset = HCP_ENC_BIT_STREAM_BYTE_COUNT_FRAME_REG_OFFSET_INIT_G12;
mmioRegisters->hcpEncBitstreamSeBitcountFrameRegOffset = HCP_ENC_BIT_STREAM_SE_BIT_COUNT_FRAME_REG_OFFSET_INIT_G12;
mmioRegisters->hcpEncBitstreamBytecountFrameNoHeaderRegOffset = HCP_ENC_BIT_STREAM_BYTE_COUNT_FRAME_NO_HEADER_REG_OFFSET_INIT_G12;
mmioRegisters->hcpEncQpStatusCountRegOffset = HCP_ENC_QP_STATUS_COUNT_REG_OFFSET_INIT_G12;
mmioRegisters->hcpEncSliceCountRegOffset = HCP_ENC_SLICE_COUNT_REG_OFFSET_INIT_G12;
mmioRegisters->hcpEncVdencModeTimerRegOffset = HCP_ENC_VDENC_MODE_TIMER_REG_OFFSET_INIT_G12;
mmioRegisters->hcpVp9EncBitstreamBytecountFrameRegOffset = HCP_VP9_ENC_BITSTREAM_BYTE_COUNT_FRAME_REG_OFFSET_INIT_G12;
mmioRegisters->hcpVp9EncBitstreamBytecountFrameNoHeaderRegOffset = HCP_VP9_ENC_BITSTREAM_BYTE_COUNT_FRAME_NO_HEADER_REG_OFFSET_INIT_G12;
mmioRegisters->hcpVp9EncImageStatusMaskRegOffset = HCP_VP9_ENC_IMAGE_STATUS_MASK_REG_OFFSET_INIT_G12;
mmioRegisters->hcpVp9EncImageStatusCtrlRegOffset = HCP_VP9_ENC_IMAGE_STATUS_CTRL_REG_OFFSET_INIT_G12;
mmioRegisters->csEngineIdOffset = CS_ENGINE_ID_OFFSET_INIT_G12;
mmioRegisters->hcpDecStatusRegOffset = HCP_DEC_STATUS_REG_OFFSET_INIT_G12;
mmioRegisters->hcpCabacStatusRegOffset = HCP_CABAC_STATUS_REG_OFFSET_INIT_G12;
mmioRegisters->hcpFrameCrcRegOffset = HCP_FRAME_CRC_REG_OFFSET_INIT_G12;
m_mmioRegisters[MHW_VDBOX_NODE_2] = m_mmioRegisters[MHW_VDBOX_NODE_1];
}
void MhwVdboxHcpInterfaceG12::InitRowstoreUserFeatureSettings()
{
MOS_USER_FEATURE_VALUE_DATA userFeatureData;
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
if (m_osInterface->bSimIsActive)
{
// GEN12 can support row store cache
userFeatureData.u32Data = 1;
}
else
{
userFeatureData.u32Data = 0;
}
userFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE;
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_ROWSTORE_CACHE_DISABLE_ID,
&userFeatureData,
m_osInterface->pOsContext);
#endif // _DEBUG || _RELEASE_INTERNAL
m_rowstoreCachingSupported = userFeatureData.i32Data ? false : true;
if (m_rowstoreCachingSupported)
{
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_HEVCDATROWSTORECACHE_DISABLE_ID,
&userFeatureData,
m_osInterface->pOsContext);
#endif // _DEBUG || _RELEASE_INTERNAL
m_hevcDatRowStoreCache.bSupported = userFeatureData.i32Data ? false : true;
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_HEVCDFROWSTORECACHE_DISABLE_ID,
&userFeatureData,
m_osInterface->pOsContext);
#endif // _DEBUG || _RELEASE_INTERNAL
m_hevcDfRowStoreCache.bSupported = userFeatureData.i32Data ? false : true;
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_HEVCSAOROWSTORECACHE_DISABLE_ID,
&userFeatureData,
m_osInterface->pOsContext);
#endif // _DEBUG || _RELEASE_INTERNAL
m_hevcSaoRowStoreCache.bSupported = userFeatureData.i32Data ? false : true;
m_hevcHSaoRowStoreCache.bSupported = m_hevcSaoRowStoreCache.bSupported;
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_VP9_HVDROWSTORECACHE_DISABLE_ID,
&userFeatureData,
m_osInterface->pOsContext);
#endif // _DEBUG || _RELEASE_INTERNAL
m_vp9HvdRowStoreCache.bSupported = userFeatureData.i32Data ? false : true;
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_VP9_DATROWSTORECACHE_DISABLE_ID,
&userFeatureData,
m_osInterface->pOsContext);
#endif // _DEBUG || _RELEASE_INTERNAL
m_vp9DatRowStoreCache.bSupported = userFeatureData.i32Data ? false : true;
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_VP9_DFROWSTORECACHE_DISABLE_ID,
&userFeatureData,
m_osInterface->pOsContext);
#endif // _DEBUG || _RELEASE_INTERNAL
m_vp9DfRowStoreCache.bSupported = userFeatureData.i32Data ? false : true;
}
}
MOS_STATUS MhwVdboxHcpInterfaceG12::GetRowstoreCachingAddrs(
PMHW_VDBOX_ROWSTORE_PARAMS rowstoreParams)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_ASSERT(rowstoreParams);
MHW_FUNCTION_ENTER;
bool is8bit = rowstoreParams->ucBitDepthMinus8 == 0;
bool is10bit = rowstoreParams->ucBitDepthMinus8 == 1 || rowstoreParams->ucBitDepthMinus8 == 2;
bool is12bit = rowstoreParams->ucBitDepthMinus8 > 2;
bool isLcu32or64 = rowstoreParams->ucLCUSize == 32 || rowstoreParams->ucLCUSize == 64;
bool isGt2k = rowstoreParams->dwPicWidth > 2048;
bool isGt4k = rowstoreParams->dwPicWidth > 4096;
bool isGt8k = rowstoreParams->dwPicWidth > 8192;
uint32_t index = 0;
//HCP pipe for both HEVC decoder and HEVC encoder
if (rowstoreParams->Mode == CODECHAL_DECODE_MODE_HEVCVLD || rowstoreParams->Mode == CODECHAL_ENCODE_MODE_HEVC)
{
m_hevcDatRowStoreCache.bEnabled = false;
m_hevcDatRowStoreCache.dwAddress = 0;
m_hevcDfRowStoreCache.bEnabled = false;
m_hevcDfRowStoreCache.dwAddress = 0;
m_hevcSaoRowStoreCache.bEnabled = false;
m_hevcSaoRowStoreCache.dwAddress = 0;
m_hevcHSaoRowStoreCache.bEnabled = false;
m_hevcHSaoRowStoreCache.dwAddress = 0;
if (isGt8k)
{
// Gen12 does not support row store cache for pic width > 8K
return eStatus;
}
if ((rowstoreParams->ucChromaFormat == HCP_CHROMA_FORMAT_YUV420) ||
(rowstoreParams->ucChromaFormat == HCP_CHROMA_FORMAT_YUV422))
{
index = 2 * isGt4k + isLcu32or64;
}
else if (rowstoreParams->ucChromaFormat == HCP_CHROMA_FORMAT_YUV444)
{
uint32_t subidx = is12bit ? 2 : (is10bit ? 1 : 0);
index = 4 + 6 * isLcu32or64 + 2 * subidx + isGt4k;
}
else
{
return eStatus;
}
if (m_hevcDatRowStoreCache.bSupported)
{
m_hevcDatRowStoreCache.bEnabled = RowStoreCacheEnableHEVC[index][0];
m_hevcDatRowStoreCache.dwAddress = RowStoreCacheAddrHEVC[index][0];
}
if (m_hevcDfRowStoreCache.bSupported)
{
m_hevcDfRowStoreCache.bEnabled = RowStoreCacheEnableHEVC[index][1];
m_hevcDfRowStoreCache.dwAddress = RowStoreCacheAddrHEVC[index][1];
}
if (m_hevcSaoRowStoreCache.bSupported)
{
m_hevcSaoRowStoreCache.bEnabled = RowStoreCacheEnableHEVC[index][2];
m_hevcSaoRowStoreCache.dwAddress = RowStoreCacheAddrHEVC[index][2];
}
if (m_hevcHSaoRowStoreCache.bSupported)
{
m_hevcHSaoRowStoreCache.bEnabled = RowStoreCacheEnableHEVC[index][4];
m_hevcHSaoRowStoreCache.dwAddress = RowStoreCacheAddrHEVC[index][4];
}
}
if (rowstoreParams->Mode == CODECHAL_DECODE_MODE_VP9VLD || rowstoreParams->Mode == CODECHAL_ENCODE_MODE_VP9)
{
m_vp9HvdRowStoreCache.bEnabled = false;
m_vp9HvdRowStoreCache.dwAddress = 0;
m_vp9DatRowStoreCache.bEnabled = false;
m_vp9DatRowStoreCache.dwAddress = 0;
m_vp9DfRowStoreCache.bEnabled = false;
m_vp9DfRowStoreCache.dwAddress = 0;
if (isGt8k)
{
// Gen12 does not support row store cache for pic width > 8K
return eStatus;
}
if ((rowstoreParams->ucChromaFormat >= HCP_CHROMA_FORMAT_YUV420) &&
(rowstoreParams->ucChromaFormat <= HCP_CHROMA_FORMAT_YUV444))
{
index = 4 * (rowstoreParams->ucChromaFormat - HCP_CHROMA_FORMAT_YUV420) + 2 * (!is8bit) + isGt4k;
}
else
{
return eStatus;
}
if (rowstoreParams->ucChromaFormat == HCP_CHROMA_FORMAT_YUV444 && !is8bit)
{
index += isGt2k;
}
if (m_vp9HvdRowStoreCache.bSupported)
{
m_vp9HvdRowStoreCache.bEnabled = RowStoreCacheEnableVP9[index][0];
m_vp9HvdRowStoreCache.dwAddress = RowStoreCacheAddrVP9[index][0];
}
if (m_vp9DatRowStoreCache.bSupported)
{
m_vp9DatRowStoreCache.bEnabled = RowStoreCacheEnableVP9[index][1];
m_vp9DatRowStoreCache.dwAddress = RowStoreCacheAddrVP9[index][1];
}
if (m_vp9DfRowStoreCache.bSupported)
{
m_vp9DfRowStoreCache.bEnabled = RowStoreCacheEnableVP9[index][2];
m_vp9DfRowStoreCache.dwAddress = RowStoreCacheAddrVP9[index][2];
}
}
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::GetHcpStateCommandSize(
uint32_t mode,
uint32_t *commandsSize,
uint32_t *patchListSize,
PMHW_VDBOX_STATE_CMDSIZE_PARAMS params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
uint32_t maxSize = 0;
uint32_t patchListMaxSize = 0;
uint32_t standard = CodecHal_GetStandardFromMode(mode);
MHW_CHK_NULL_RETURN(params);
auto paramsG12 = dynamic_cast<PMHW_VDBOX_STATE_CMDSIZE_PARAMS_G12>(params);
MHW_CHK_NULL_RETURN(paramsG12);
if (standard == CODECHAL_HEVC)
{
maxSize =
mhw_vdbox_vdenc_g12_X::VD_PIPELINE_FLUSH_CMD::byteSize +
mhw_mi_g12_X::MI_FLUSH_DW_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_PIPE_MODE_SELECT_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_SURFACE_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_PIPE_BUF_ADDR_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_IND_OBJ_BASE_ADDR_STATE_CMD::byteSize +
mhw_mi_g12_X::MI_LOAD_REGISTER_REG_CMD::byteSize * 8;
patchListMaxSize =
PATCH_LIST_COMMAND(VD_PIPELINE_FLUSH_CMD) +
PATCH_LIST_COMMAND(MI_FLUSH_DW_CMD) +
PATCH_LIST_COMMAND(HCP_PIPE_MODE_SELECT_CMD) +
PATCH_LIST_COMMAND(HCP_SURFACE_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_PIPE_BUF_ADDR_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_IND_OBJ_BASE_ADDR_STATE_CMD);
if (mode == CODECHAL_ENCODE_MODE_HEVC)
{
/* HCP_QM_STATE_CMD may be issued up to 20 times: 3x Colour Component plus 2x intra/inter plus 4x SizeID minus 4 for the 32x32 chroma components.
HCP_FQP_STATE_CMD may be issued up to 8 times: 4 scaling list per intra and inter. */
maxSize +=
2 * mhw_mi_g12_X::VD_CONTROL_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_SURFACE_STATE_CMD::byteSize + // encoder needs two surface state commands. One is for raw and another one is for recon surfaces.
20 * mhw_vdbox_hcp_g12_X::HCP_QM_STATE_CMD::byteSize +
8 * mhw_vdbox_hcp_g12_X::HCP_FQM_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_PIC_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HEVC_VP9_RDOQ_STATE_CMD::byteSize + // RDOQ
2 * mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize + // Slice level commands
2 * mhw_mi_g12_X::MI_FLUSH_DW_CMD::byteSize + // need for Status report, Mfc Status and
10 * mhw_mi_g12_X::MI_STORE_REGISTER_MEM_CMD::byteSize + // 8 for BRCStatistics and 2 for RC6 WAs
mhw_mi_g12_X::MI_LOAD_REGISTER_MEM_CMD::byteSize + // 1 for RC6 WA
2 * mhw_vdbox_hcp_g12_X::HCP_PAK_INSERT_OBJECT_CMD::byteSize + // Two PAK insert object commands are for headers before the slice header and the header for the end of stream
4 * mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize + // two (BRC+reference frame) for clean-up HW semaphore memory and another two for signal it
17 * mhw_mi_g12_X::MI_SEMAPHORE_WAIT_CMD::byteSize +// Use HW wait command for each reference and one wait for current semaphore object
mhw_mi_g12_X::MI_SEMAPHORE_WAIT_CMD::byteSize + // Use HW wait command for each BRC pass
+ mhw_mi_g12_X::MI_SEMAPHORE_WAIT_CMD::byteSize // Use HW wait command for each VDBOX
+ 2 * mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize // One is for reset and another one for set per VDBOX
+ 8 * mhw_mi_g12_X::MI_COPY_MEM_MEM_CMD::byteSize // Need to copy SSE statistics/ Slice Size overflow into memory
;
patchListMaxSize +=
20 * PATCH_LIST_COMMAND(HCP_QM_STATE_CMD) +
8 * PATCH_LIST_COMMAND(HCP_FQM_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_PIC_STATE_CMD) +
PATCH_LIST_COMMAND(MI_BATCH_BUFFER_START_CMD) + // When BRC is on, HCP_PIC_STATE_CMD command is in the BB
2 * PATCH_LIST_COMMAND(MI_STORE_DATA_IMM_CMD) + // Slice level commands
2 * PATCH_LIST_COMMAND(MI_FLUSH_DW_CMD) + // need for Status report, Mfc Status and
11 * PATCH_LIST_COMMAND(MI_STORE_REGISTER_MEM_CMD) + // 8 for BRCStatistics and 3 for RC6 WAs
22 * PATCH_LIST_COMMAND(MI_STORE_DATA_IMM_CMD) // Use HW wait commands plus its memory clean-up and signal (4+ 16 + 1 + 1)
+ 8 * PATCH_LIST_COMMAND(MI_BATCH_BUFFER_START_CMD) // At maximal, there are 8 batch buffers for 8 VDBOXes for VE. Each box has one BB.
+ PATCH_LIST_COMMAND(MI_FLUSH_DW_CMD) // Need one flush before copy command
+ PATCH_LIST_COMMAND(MFX_WAIT_CMD) // Need one wait after copy command
+ 3 * PATCH_LIST_COMMAND(MI_STORE_DATA_IMM_CMD) // one wait commands and two for reset and set semaphore memory
+ 8 * PATCH_LIST_COMMAND(MI_COPY_MEM_MEM_CMD) // Need to copy SSE statistics/ Slice Size overflow into memory
;
}
else
{
maxSize +=
2 * mhw_mi_g12_X::VD_CONTROL_STATE_CMD::byteSize + // VD_CONTROL_STATE Hcp init and flush
20 * mhw_vdbox_hcp_g12_X::HCP_QM_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_PIC_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_TILE_STATE_CMD::byteSize;
patchListMaxSize +=
20 * PATCH_LIST_COMMAND(HCP_QM_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_PIC_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_TILE_STATE_CMD);
if (params->bSfcInUse)
{
maxSize +=
mhw_sfc_g12_X::SFC_LOCK_CMD::byteSize +
2 * mhw_mi_g12_X::VD_CONTROL_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_AVS_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_AVS_LUMA_Coeff_Table_CMD::byteSize +
mhw_sfc_g12_X::SFC_AVS_CHROMA_Coeff_Table_CMD::byteSize +
mhw_sfc_g12_X::SFC_IEF_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_FRAME_START_CMD::byteSize;
patchListMaxSize +=
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_STATE_CMD_NUMBER_OF_ADDRESSES +
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_AVS_CHROMA_Coeff_Table_CMD_NUMBER_OF_ADDRESSES +
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_AVS_LUMA_Coeff_Table_CMD_NUMBER_OF_ADDRESSES +
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_AVS_STATE_CMD_NUMBER_OF_ADDRESSES +
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_FRAME_START_CMD_NUMBER_OF_ADDRESSES +
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_IEF_STATE_CMD_NUMBER_OF_ADDRESSES +
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_LOCK_CMD_NUMBER_OF_ADDRESSES;
}
if (paramsG12->bScalableMode)
{
// VD_CONTROL_STATE Hcp lock and unlock
maxSize += 2 * mhw_mi_g12_X::VD_CONTROL_STATE_CMD::byteSize;
// Due to the fact that there is no slice level command in BE status, we mainly consider commands in FE.
maxSize +=
4 * mhw_mi_g12_X::MI_ATOMIC_CMD::byteSize + // used to reset semaphore in BEs
2 * mhw_mi_g12_X::MI_CONDITIONAL_BATCH_BUFFER_END_CMD::byteSize + // 1 Conditional BB END for FE hang, 1 for streamout buffer writing over allocated size
3 * mhw_mi_g12_X::MI_SEMAPHORE_WAIT_CMD::byteSize + // for FE & BE0, BEs sync
15 * mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize + // for placeholder cmds to resolve the hazard between BEs sync
3 * mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize + // for FE status set and clear
3 * mhw_mi_g12_X::MI_LOAD_REGISTER_IMM_CMD::byteSize + // for FE status set
2 * mhw_mi_g12_X::MI_FLUSH_DW_CMD::byteSize + // 2 needed for command flush in slice level
2 * mhw_mi_g12_X::MI_STORE_REGISTER_MEM_CMD::byteSize + // store the carry flag of reported size in FE
4 * sizeof(MHW_MI_ALU_PARAMS) + // 4 ALU commands needed for substract opertaion in FE
mhw_mi_g12_X::MI_MATH_CMD::byteSize + // 1 needed for FE status set
mhw_mi_g12_X::MI_LOAD_REGISTER_REG_CMD::byteSize; // 1 needed for FE status set
mhw_mi_g12_X::MI_MATH_CMD::byteSize + // 1 needed for FE status set
mhw_mi_g12_X::MI_LOAD_REGISTER_REG_CMD::byteSize; // 1 needed for FE status set
patchListMaxSize +=
4 * PATCH_LIST_COMMAND(MI_ATOMIC_CMD) +
2 * PATCH_LIST_COMMAND(MI_CONDITIONAL_BATCH_BUFFER_END_CMD) +
3 * PATCH_LIST_COMMAND(MI_SEMAPHORE_WAIT_CMD) +
18 * PATCH_LIST_COMMAND(MI_STORE_DATA_IMM_CMD) +
2 * PATCH_LIST_COMMAND(MI_FLUSH_DW_CMD) +
2 * PATCH_LIST_COMMAND(MI_STORE_REGISTER_MEM_CMD);
if (params->bSfcInUse)
{
maxSize +=
mhw_sfc_g12_X::SFC_LOCK_CMD::byteSize +
2 * mhw_mi_g12_X::VD_CONTROL_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_AVS_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_AVS_LUMA_Coeff_Table_CMD::byteSize +
mhw_sfc_g12_X::SFC_AVS_CHROMA_Coeff_Table_CMD::byteSize +
mhw_sfc_g12_X::SFC_IEF_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_FRAME_START_CMD::byteSize;
patchListMaxSize +=
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_STATE_CMD_NUMBER_OF_ADDRESSES +
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_AVS_CHROMA_Coeff_Table_CMD_NUMBER_OF_ADDRESSES +
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_AVS_LUMA_Coeff_Table_CMD_NUMBER_OF_ADDRESSES +
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_AVS_STATE_CMD_NUMBER_OF_ADDRESSES +
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_FRAME_START_CMD_NUMBER_OF_ADDRESSES +
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_IEF_STATE_CMD_NUMBER_OF_ADDRESSES +
MhwSfcInterfaceG12::CommandsNumberOfAddresses::SFC_LOCK_CMD_NUMBER_OF_ADDRESSES;
}
}
}
}
else if (standard == CODECHAL_VP9) // VP9 Clear Decode
{
maxSize =
mhw_vdbox_vdenc_g12_X::VD_PIPELINE_FLUSH_CMD::byteSize +
mhw_mi_g12_X::MI_FLUSH_DW_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_PIPE_MODE_SELECT_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_SURFACE_STATE_CMD::byteSize * 4 +
mhw_vdbox_hcp_g12_X::HCP_PIPE_BUF_ADDR_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_IND_OBJ_BASE_ADDR_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_VP9_SEGMENT_STATE_CMD::byteSize * 8 +
mhw_vdbox_hcp_g12_X::HCP_BSD_OBJECT_CMD::byteSize +
mhw_mi_g12_X::MI_LOAD_REGISTER_REG_CMD::byteSize * 8;
patchListMaxSize =
PATCH_LIST_COMMAND(VD_PIPELINE_FLUSH_CMD) +
PATCH_LIST_COMMAND(MI_FLUSH_DW_CMD) +
PATCH_LIST_COMMAND(HCP_PIPE_MODE_SELECT_CMD) +
PATCH_LIST_COMMAND(HCP_SURFACE_STATE_CMD) * 4 +
PATCH_LIST_COMMAND(HCP_PIPE_BUF_ADDR_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_IND_OBJ_BASE_ADDR_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_VP9_SEGMENT_STATE_CMD) * 8 +
PATCH_LIST_COMMAND(HCP_BSD_OBJECT_CMD);
if (mode == CODECHAL_ENCODE_MODE_VP9)
{
maxSize +=
mhw_vdbox_hcp_g12_X::HCP_VP9_PIC_STATE_CMD::byteSize +
mhw_mi_g12_X::MI_FLUSH_DW_CMD::byteSize * 2 +
mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize * 4 +
mhw_mi_g12_X::MI_STORE_REGISTER_MEM_CMD::byteSize * 11 +
mhw_mi_g12_X::MI_COPY_MEM_MEM_CMD::byteSize * 4 +
mhw_mi_g12_X::MI_BATCH_BUFFER_START_CMD::byteSize * 3 +
mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize * 2 + // Slice level commands
mhw_mi_g12_X::MI_LOAD_REGISTER_MEM_CMD::byteSize * 2 +
mhw_vdbox_hcp_g12_X::HCP_PAK_INSERT_OBJECT_CMD::byteSize * 2 +
mhw_vdbox_hcp_g12_X::HCP_TILE_CODING_CMD::byteSize +
mhw_mi_g12_X::MI_BATCH_BUFFER_START_CMD::byteSize +
mhw_mi_g12_X::MI_SEMAPHORE_WAIT_CMD::byteSize + // Use HW wait command for each VDBOX
mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize * 3; // One is for reset and another one for set per VDBOX, one for wait
maxSize += 3 * mhw_mi_g12_X::VD_CONTROL_STATE_CMD::byteSize; // VD_CONTROL_STATE Hcp init + flush + vdenc init
patchListMaxSize +=
PATCH_LIST_COMMAND(HCP_VP9_PIC_STATE_CMD) +
PATCH_LIST_COMMAND(MI_FLUSH_DW_CMD) * 2 +
PATCH_LIST_COMMAND(MI_STORE_DATA_IMM_CMD) * 4 +
PATCH_LIST_COMMAND(MI_STORE_REGISTER_MEM_CMD) * 11 +
PATCH_LIST_COMMAND(MI_COPY_MEM_MEM_CMD) * 4 +
PATCH_LIST_COMMAND(MI_BATCH_BUFFER_START_CMD) * 3 +
PATCH_LIST_COMMAND(MI_STORE_DATA_IMM_CMD) * 2 +
PATCH_LIST_COMMAND(HCP_PAK_INSERT_OBJECT_CMD) * 2 +
PATCH_LIST_COMMAND(HCP_TILE_CODING_COMMAND) +
PATCH_LIST_COMMAND(MI_BATCH_BUFFER_START_CMD) +
PATCH_LIST_COMMAND(MI_STORE_DATA_IMM_CMD) * 2;
}
else
{
maxSize += mhw_vdbox_hcp_g12_X::HCP_VP9_PIC_STATE_CMD::byteSize;
// VD_CONTROL_STATE Hcp init and flush
maxSize += 2 * mhw_mi_g12_X::VD_CONTROL_STATE_CMD::byteSize;
patchListMaxSize += PATCH_LIST_COMMAND(HCP_VP9_PIC_STATE_CMD);
if (params->bSfcInUse)
{
maxSize +=
mhw_sfc_g12_X::SFC_LOCK_CMD::byteSize +
2 * mhw_mi_g12_X::VD_CONTROL_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_AVS_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_AVS_LUMA_Coeff_Table_CMD::byteSize +
mhw_sfc_g12_X::SFC_AVS_CHROMA_Coeff_Table_CMD::byteSize +
mhw_sfc_g12_X::SFC_IEF_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_FRAME_START_CMD::byteSize;
}
if (paramsG12->bScalableMode)
{
// VD_CONTROL_STATE Hcp lock and unlock
maxSize += 2 * mhw_mi_g12_X::VD_CONTROL_STATE_CMD::byteSize;
maxSize +=
mhw_vdbox_hcp_g12_X::HCP_TILE_CODING_CMD::byteSize +
2 * mhw_mi_g12_X::VD_CONTROL_STATE_CMD::byteSize +
mhw_mi_g12_X::MI_ATOMIC_CMD::byteSize * 4 + // used to reset semaphore in BEs
mhw_mi_g12_X::MI_CONDITIONAL_BATCH_BUFFER_END_CMD::byteSize + // for streamout buffer writing over allocated size
mhw_mi_g12_X::MI_SEMAPHORE_WAIT_CMD::byteSize * 3 + // for FE & BE0, BEs sync
mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize * 15 + // for placeholder cmds to resolve the hazard between BEs sync
mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize + // for FE status set
mhw_mi_g12_X::MI_LOAD_REGISTER_IMM_CMD::byteSize * 3 + // for FE status set
mhw_mi_g12_X::MI_FLUSH_DW_CMD::byteSize + // for command flush in partition level
mhw_mi_g12_X::MI_STORE_REGISTER_MEM_CMD::byteSize * 2 + // store the carry flag of reported size in FE
4 * sizeof(MHW_MI_ALU_PARAMS) + // 4 ALU commands needed for substract opertaion in FE
mhw_mi_g12_X::MI_MATH_CMD::byteSize + // 1 needed for FE status set
mhw_mi_g12_X::MI_LOAD_REGISTER_REG_CMD::byteSize; // 1 needed for FE status set
mhw_mi_g12_X::MI_MATH_CMD::byteSize + // 1 needed for FE status set
mhw_mi_g12_X::MI_LOAD_REGISTER_REG_CMD::byteSize; // 1 needed for FE status set
patchListMaxSize +=
PATCH_LIST_COMMAND(HCP_TILE_CODING_COMMAND) +
PATCH_LIST_COMMAND(MI_ATOMIC_CMD) * 4 +
PATCH_LIST_COMMAND(MI_CONDITIONAL_BATCH_BUFFER_END_CMD) +
PATCH_LIST_COMMAND(MI_SEMAPHORE_WAIT_CMD) * 3 +
PATCH_LIST_COMMAND(MI_STORE_DATA_IMM_CMD) +
PATCH_LIST_COMMAND(MI_FLUSH_DW_CMD) +
PATCH_LIST_COMMAND(MI_STORE_REGISTER_MEM_CMD) * 2;
if (params->bSfcInUse)
{
maxSize +=
mhw_sfc_g12_X::SFC_LOCK_CMD::byteSize +
2 * mhw_mi_g12_X::VD_CONTROL_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_AVS_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_AVS_LUMA_Coeff_Table_CMD::byteSize +
mhw_sfc_g12_X::SFC_AVS_CHROMA_Coeff_Table_CMD::byteSize +
mhw_sfc_g12_X::SFC_IEF_STATE_CMD::byteSize +
mhw_sfc_g12_X::SFC_FRAME_START_CMD::byteSize;
}
}
}
}
else
{
MHW_ASSERTMESSAGE("Unsupported standard.");
eStatus = MOS_STATUS_UNKNOWN;
}
*commandsSize = maxSize;
*patchListSize = patchListMaxSize;
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::GetHcpPrimitiveCommandSize(
uint32_t mode,
uint32_t *commandsSize,
uint32_t *patchListSize,
bool modeSpecific)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
uint32_t standard = CodecHal_GetStandardFromMode(mode);
uint32_t maxSize = 0;
uint32_t patchListMaxSize = 0;
if (standard == CODECHAL_HEVC)
{
if (mode == CODECHAL_ENCODE_MODE_HEVC)
{
maxSize =
2 * mhw_vdbox_hcp_g12_X::HCP_REF_IDX_STATE_CMD::byteSize +
2 * mhw_vdbox_hcp_g12_X::HCP_WEIGHTOFFSET_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_SLICE_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_PAK_INSERT_OBJECT_CMD::byteSize +
2 * mhw_mi_g12_X::MI_BATCH_BUFFER_START_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_TILE_CODING_CMD::byteSize; // one slice cannot be with more than one tile
patchListMaxSize =
2 * PATCH_LIST_COMMAND(HCP_REF_IDX_STATE_CMD) +
2 * PATCH_LIST_COMMAND(HCP_WEIGHTOFFSET_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_SLICE_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_PAK_INSERT_OBJECT_CMD) +
2 * PATCH_LIST_COMMAND(MI_BATCH_BUFFER_START_CMD) + // One is for the PAK command and another one is for the BB when BRC and single task mode are on
PATCH_LIST_COMMAND(HCP_TILE_CODING_COMMAND); // HCP_TILE_CODING_STATE command
}
else
{
maxSize =
2 * mhw_vdbox_hcp_g12_X::HCP_REF_IDX_STATE_CMD::byteSize +
2 * mhw_vdbox_hcp_g12_X::HCP_WEIGHTOFFSET_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_SLICE_STATE_CMD::byteSize +
2 * mhw_mi_g12_X::VD_CONTROL_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_TILE_CODING_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_PALETTE_INITIALIZER_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_BSD_OBJECT_CMD::byteSize +
mhw_mi_g12_X::MI_BATCH_BUFFER_END_CMD::byteSize;
patchListMaxSize =
2 * PATCH_LIST_COMMAND(HCP_REF_IDX_STATE_CMD) +
2 * PATCH_LIST_COMMAND(HCP_WEIGHTOFFSET_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_SLICE_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_PALETTE_INITIALIZER_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_TILE_CODING_COMMAND) +
PATCH_LIST_COMMAND(HCP_BSD_OBJECT_CMD);
}
}
else if (standard == CODECHAL_VP9) // VP9 Clear decode does not require primitive level commands. VP9 DRM does.
{
if (modeSpecific) // VP9 DRM
{
maxSize +=
mhw_vdbox_hcp_g12_X::HCP_VP9_SEGMENT_STATE_CMD::byteSize * 8 +
mhw_vdbox_hcp_g12_X::HCP_VP9_PIC_STATE_CMD::byteSize +
mhw_vdbox_hcp_g12_X::HCP_BSD_OBJECT_CMD::byteSize +
mhw_mi_g12_X::MI_BATCH_BUFFER_END_CMD::byteSize;
patchListMaxSize =
PATCH_LIST_COMMAND(HCP_VP9_SEGMENT_STATE_CMD) * 8 +
PATCH_LIST_COMMAND(HCP_VP9_PIC_STATE_CMD) +
PATCH_LIST_COMMAND(HCP_BSD_OBJECT_CMD);
}
}
else
{
MHW_ASSERTMESSAGE("Unsupported standard.");
eStatus = MOS_STATUS_UNKNOWN;
}
*commandsSize = maxSize;
*patchListSize = patchListMaxSize;
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::GetHevcBufferSize(
MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE bufferType,
PMHW_VDBOX_HCP_BUFFER_SIZE_PARAMS hcpBufSizeParam)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(hcpBufSizeParam);
uint8_t bitDepthMultFactor = 0;
uint32_t mvtSize = 0;
uint32_t mvtbSize = 0;
uint32_t bufferSize = 0;
uint32_t rowStoreSzLCU = 0;
uint32_t colStoreSzLCU = 0;
double dbFormatMultFactor = 0;
uint8_t maxBitDepth = hcpBufSizeParam->ucMaxBitDepth;
uint32_t lcusize = 1 << hcpBufSizeParam->dwCtbLog2SizeY;
uint32_t maxFrameSize = hcpBufSizeParam->dwMaxFrameSize;
// HEVC decoder has WA here, change to lcusize when the WA is removed
uint32_t widthInCtb = MOS_ROUNDUP_DIVIDE(hcpBufSizeParam->dwPicWidth, 16);
uint32_t heightInCtb = MOS_ROUNDUP_DIVIDE(hcpBufSizeParam->dwPicHeight, 16);
uint32_t numBaseUnitsInLCU = 1 << (hcpBufSizeParam->dwCtbLog2SizeY - 2);//size in number of 4x4 in the LCU per column
HCP_CHROMA_FORMAT_IDC chromaFormat = (HCP_CHROMA_FORMAT_IDC)hcpBufSizeParam->ucChromaFormat;
switch (bufferType)
{
case MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_LINE:
dbFormatMultFactor = (chromaFormat == HCP_CHROMA_FORMAT_YUV444) ? 1.5 : 1;
bitDepthMultFactor = (maxBitDepth > 8) ? 2 : 1;
rowStoreSzLCU = (uint32_t)(((2 * numBaseUnitsInLCU * dbFormatMultFactor * 128 * bitDepthMultFactor) + 511) / 512);
bufferSize = rowStoreSzLCU * MHW_CACHELINE_SIZE * widthInCtb;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_TILE_LINE:
dbFormatMultFactor = (chromaFormat == HCP_CHROMA_FORMAT_YUV444) ? 1.5 : 1;
bitDepthMultFactor = (maxBitDepth > 8) ? 2 : 1;
rowStoreSzLCU = (uint32_t)(((2 * numBaseUnitsInLCU * dbFormatMultFactor * 128 * bitDepthMultFactor) + 511) / 512);
bufferSize = 2 * rowStoreSzLCU * MHW_CACHELINE_SIZE * widthInCtb;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_TILE_COL:
dbFormatMultFactor = (chromaFormat == HCP_CHROMA_FORMAT_YUV420) ? 1 : 1.5;
bitDepthMultFactor = (maxBitDepth > 8) ? 2 : 1;
colStoreSzLCU = (uint32_t)(((2 * numBaseUnitsInLCU * dbFormatMultFactor * 128 * bitDepthMultFactor + 3 * 128 * bitDepthMultFactor) + 511) / 512);
bufferSize = 2 * colStoreSzLCU * MHW_CACHELINE_SIZE * heightInCtb;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_MV_UP_RT_COL:
colStoreSzLCU = 1;
bufferSize = colStoreSzLCU * MHW_CACHELINE_SIZE * heightInCtb;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_META_LINE:
rowStoreSzLCU = (hcpBufSizeParam->dwCtbLog2SizeY == 6) ? 2 : 1;
bufferSize = rowStoreSzLCU * MHW_CACHELINE_SIZE * widthInCtb;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_META_TILE_LINE:
rowStoreSzLCU = (hcpBufSizeParam->dwCtbLog2SizeY == 6) ? 4 : 2;
bufferSize = rowStoreSzLCU * MHW_CACHELINE_SIZE * widthInCtb;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_META_TILE_COL:
colStoreSzLCU = (hcpBufSizeParam->dwCtbLog2SizeY == 6) ? 4 : 2;
bufferSize = colStoreSzLCU * MHW_CACHELINE_SIZE * heightInCtb;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_INTRA_PRED_UP_RIGHT_COL:
{
uint32_t colStoreSizeLCU[2][3]; //[bitdepth 8/10 or 12][LCU 16/32/64]
if (chromaFormat == HCP_CHROMA_FORMAT_YUV420)
{
colStoreSizeLCU[0][0] = 1; colStoreSizeLCU[0][1] = 1; colStoreSizeLCU[0][2] = 1;
colStoreSizeLCU[1][0] = 1; colStoreSizeLCU[1][1] = 2; colStoreSizeLCU[1][2] = 2;
}
else if (chromaFormat == HCP_CHROMA_FORMAT_YUV422)
{
colStoreSizeLCU[0][0] = 1; colStoreSizeLCU[0][1] = 1; colStoreSizeLCU[0][2] = 1;
colStoreSizeLCU[1][0] = 1; colStoreSizeLCU[1][1] = 2; colStoreSizeLCU[1][2] = 2;
}
else
{
colStoreSizeLCU[0][0] = 1; colStoreSizeLCU[0][1] = 2; colStoreSizeLCU[0][2] = 2;
colStoreSizeLCU[1][0] = 2; colStoreSizeLCU[1][1] = 3; colStoreSizeLCU[1][2] = 3;
}
colStoreSzLCU = colStoreSizeLCU[(maxBitDepth == 8) ? 0 : 1][hcpBufSizeParam->dwCtbLog2SizeY - 4];
bufferSize = colStoreSzLCU * MHW_CACHELINE_SIZE * heightInCtb;
break;
}
case MHW_VDBOX_HCP_INTERNAL_BUFFER_INTRA_PRED_LFT_RECON_COL:
{
uint32_t colStoreSizeLCU[2][3]; //[bitdepth 8/10 or 12][LCU 16/32/64]
if (chromaFormat == HCP_CHROMA_FORMAT_YUV420)
{
colStoreSizeLCU[0][0] = 1; colStoreSizeLCU[0][1] = 2; colStoreSizeLCU[0][2] = 2;
colStoreSizeLCU[1][0] = 1; colStoreSizeLCU[1][1] = 2; colStoreSizeLCU[1][2] = 4;
}
else if (chromaFormat == HCP_CHROMA_FORMAT_YUV422)
{
colStoreSizeLCU[0][0] = 1; colStoreSizeLCU[0][1] = 2; colStoreSizeLCU[0][2] = 3;
colStoreSizeLCU[1][0] = 2; colStoreSizeLCU[1][1] = 3; colStoreSizeLCU[1][2] = 6;
}
else
{
colStoreSizeLCU[0][0] = 1; colStoreSizeLCU[0][1] = 2; colStoreSizeLCU[0][2] = 3;
colStoreSizeLCU[1][0] = 2; colStoreSizeLCU[1][1] = 3; colStoreSizeLCU[1][2] = 6;
}
colStoreSzLCU = colStoreSizeLCU[(maxBitDepth == 8) ? 0 : 1][hcpBufSizeParam->dwCtbLog2SizeY - 4];
bufferSize = colStoreSzLCU * MHW_CACHELINE_SIZE * heightInCtb;
break;
}
case MHW_VDBOX_HCP_INTERNAL_BUFFER_SAO_LINE:
{
uint32_t uiRowStoreSizeLCU[2][3];//[bitdepth 8 or10/12][LCU 16/32/64]
if (chromaFormat == HCP_CHROMA_FORMAT_YUV420 || chromaFormat == HCP_CHROMA_FORMAT_YUV422)
{
uiRowStoreSizeLCU[0][0] = 2; uiRowStoreSizeLCU[0][1] = 3; uiRowStoreSizeLCU[0][2] = 5;
uiRowStoreSizeLCU[1][0] = 2; uiRowStoreSizeLCU[1][1] = 4; uiRowStoreSizeLCU[1][2] = 6;
}
else
{
uiRowStoreSizeLCU[0][0] = 3; uiRowStoreSizeLCU[0][1] = 4; uiRowStoreSizeLCU[0][2] = 7;
uiRowStoreSizeLCU[1][0] = 3; uiRowStoreSizeLCU[1][1] = 5; uiRowStoreSizeLCU[1][2] = 8;
}
rowStoreSzLCU = uiRowStoreSizeLCU[(maxBitDepth < 12) ? 0 : 1][hcpBufSizeParam->dwCtbLog2SizeY - 4];
bufferSize = rowStoreSzLCU * MHW_CACHELINE_SIZE * widthInCtb;
break;
}
case MHW_VDBOX_HCP_INTERNAL_BUFFER_SAO_TILE_LINE:
{
uint32_t uiRowStoreSizeLCU[2][3];//[bitdepth 8 or 10/12][LCU 16/32/64]
if (chromaFormat == HCP_CHROMA_FORMAT_YUV420 || chromaFormat == HCP_CHROMA_FORMAT_YUV422)
{
uiRowStoreSizeLCU[0][0] = 4; uiRowStoreSizeLCU[0][1] = 6; uiRowStoreSizeLCU[0][2] = 10;
uiRowStoreSizeLCU[1][0] = 4; uiRowStoreSizeLCU[1][1] = 8; uiRowStoreSizeLCU[1][2] = 12;
}
else
{
uiRowStoreSizeLCU[0][0] = 6; uiRowStoreSizeLCU[0][1] = 8; uiRowStoreSizeLCU[0][2] = 14;
uiRowStoreSizeLCU[1][0] = 6; uiRowStoreSizeLCU[1][1] = 10; uiRowStoreSizeLCU[1][2] = 16;
}
rowStoreSzLCU = uiRowStoreSizeLCU[(maxBitDepth < 12) ? 0 : 1][hcpBufSizeParam->dwCtbLog2SizeY - 4];
bufferSize = rowStoreSzLCU * MHW_CACHELINE_SIZE * widthInCtb;
break;
}
case MHW_VDBOX_HCP_INTERNAL_BUFFER_SAO_TILE_COL:
{
// [chroma_format_idc][lcu_size] = [420/422/444][lcu16/lcu32/lcu64]
uint32_t formatMultFactorTab[3][3] = { { 8,10,18 },{ 10,14,24 },{ 10,14,24 } };
uint32_t formatMultFactor;
if (chromaFormat == HCP_CHROMA_FORMAT_MONOCHROME)
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
MHW_ASSERTMESSAGE("invalid input chroma format.\n");
return eStatus;
}
formatMultFactor = formatMultFactorTab[chromaFormat - 1][hcpBufSizeParam->dwCtbLog2SizeY - 4];
colStoreSzLCU = formatMultFactor;
bufferSize = colStoreSzLCU * MHW_CACHELINE_SIZE * heightInCtb;
break;
}
case MHW_VDBOX_HCP_INTERNAL_BUFFER_HSAO_RS:
{
uint32_t maxTileColumn = MOS_ROUNDUP_DIVIDE(hcpBufSizeParam->dwPicWidth, 128);
bufferSize = MOS_ALIGN_CEIL(widthInCtb + 3 * maxTileColumn, 4) * 16;
break;
}
//Add HSSE here
case MHW_VDBOX_HCP_INTERNAL_BUFFER_CURR_MV_TEMPORAL:
mvtSize = ((((hcpBufSizeParam->dwPicWidth + 63) >> 6) * (((hcpBufSizeParam->dwPicHeight + 15) >> 4)) + 1)&(-2));
mvtbSize = ((((hcpBufSizeParam->dwPicWidth + 31) >> 5) * (((hcpBufSizeParam->dwPicHeight + 31) >> 5)) + 1)&(-2));
bufferSize = MOS_MAX(mvtSize, mvtbSize) * MHW_CACHELINE_SIZE;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_CABAC_STREAMOUT:
//From sas, cabac stream out buffer size =
//(#LCU) in picture * (Worst case LCU_CU_TU_info) + 1 byte aligned per LCU + Bitstream Size * 3
if ((chromaFormat == HCP_CHROMA_FORMAT_YUV420) && (maxBitDepth == 8))
{
bufferSize = widthInCtb * heightInCtb * MHW_HCP_WORST_CASE_CU_TU_INFO
+ widthInCtb * heightInCtb
+ maxFrameSize * 3;
}
else
{
bufferSize = widthInCtb * heightInCtb * MHW_HCP_WORST_CASE_CU_TU_INFO_REXT
+ widthInCtb * heightInCtb
+ maxFrameSize * 3;
}
bufferSize = MOS_ALIGN_CEIL(bufferSize, MHW_CACHELINE_SIZE);
break;
default:
eStatus = MOS_STATUS_INVALID_PARAMETER;
break;
}
hcpBufSizeParam->dwBufferSize = bufferSize;
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::GetVp9BufferSize(
MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE bufferType,
PMHW_VDBOX_HCP_BUFFER_SIZE_PARAMS hcpBufSizeParam)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(hcpBufSizeParam);
uint32_t bufferSize = 0;
uint32_t dblkRsbSizeMultiplier = 0;
uint32_t dblkCsbSizeMultiplier = 0;
uint32_t intraPredMultiplier = 0;
uint8_t maxBitDepth = hcpBufSizeParam->ucMaxBitDepth;
uint32_t widthInSb = hcpBufSizeParam->dwPicWidth;
uint32_t heightInSb = hcpBufSizeParam->dwPicHeight;
uint32_t widthInMinCb = widthInSb * 64 / 8; //using smallest cb to get max width
uint32_t heightInMinCb = heightInSb * 64 / 8;
HCP_CHROMA_FORMAT_IDC chromaFormat = (HCP_CHROMA_FORMAT_IDC)hcpBufSizeParam->ucChromaFormat;
uint32_t maxFrameSize = hcpBufSizeParam->dwMaxFrameSize;
if (chromaFormat == HCP_CHROMA_FORMAT_YUV420)
{
dblkRsbSizeMultiplier = (maxBitDepth > 8) ? 36 : 18;
dblkCsbSizeMultiplier = (maxBitDepth > 8) ? 34 : 17;
intraPredMultiplier = (maxBitDepth > 8) ? 4 : 2;
}
else if (chromaFormat == HCP_CHROMA_FORMAT_YUV444)
{
dblkRsbSizeMultiplier = (maxBitDepth > 8) ? 54 : 27;
dblkCsbSizeMultiplier = (maxBitDepth > 8) ? 50 : 25;
intraPredMultiplier = (maxBitDepth > 8) ? 6 : 3;
}
else
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
MHW_ASSERTMESSAGE("Format not supported.");
return eStatus;
}
switch (bufferType)
{
case MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_LINE:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_TILE_LINE:
bufferSize = widthInSb * dblkRsbSizeMultiplier * MHW_CACHELINE_SIZE;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_TILE_COL:
bufferSize = heightInSb * dblkCsbSizeMultiplier * MHW_CACHELINE_SIZE;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_META_LINE:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_META_TILE_LINE:
bufferSize = widthInSb * 5 * MHW_CACHELINE_SIZE;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_META_TILE_COL:
bufferSize = heightInSb * 5 * MHW_CACHELINE_SIZE;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_CURR_MV_TEMPORAL:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_COLL_MV_TEMPORAL:
bufferSize = widthInSb * heightInSb * 9 * MHW_CACHELINE_SIZE;
break;
case MHW_VDBOX_VP9_INTERNAL_BUFFER_SEGMENT_ID:
bufferSize = widthInSb * heightInSb * MHW_CACHELINE_SIZE;
break;
case MHW_VDBOX_VP9_INTERNAL_BUFFER_HVD_LINE:
case MHW_VDBOX_VP9_INTERNAL_BUFFER_HVD_TILE:
bufferSize = widthInSb * MHW_CACHELINE_SIZE;
break;
//scalable mode specific buffers
case MHW_VDBOX_HCP_INTERNAL_BUFFER_INTRA_PRED_UP_RIGHT_COL:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_INTRA_PRED_LFT_RECON_COL:
bufferSize = intraPredMultiplier * heightInSb * MHW_CACHELINE_SIZE;
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_CABAC_STREAMOUT:
//From sas, cabac stream out buffer size =
//(#LCU) in picture * (Worst case LCU_CU_TU_info) + 1 byte aligned per LCU + Bitstream Size * 3
if ((chromaFormat == HCP_CHROMA_FORMAT_YUV420) && (maxBitDepth == 8))
{
bufferSize = widthInMinCb * heightInMinCb * MHW_HCP_WORST_CASE_CU_TU_INFO
+ widthInMinCb * heightInMinCb
+ maxFrameSize * 3;
}
else
{
bufferSize = widthInMinCb * heightInMinCb * MHW_HCP_WORST_CASE_CU_TU_INFO_REXT
+ widthInMinCb * heightInMinCb
+ maxFrameSize * 3;
}
bufferSize = MOS_ALIGN_CEIL(bufferSize, MHW_CACHELINE_SIZE);
break;
default:
eStatus = MOS_STATUS_INVALID_PARAMETER;
break;
}
hcpBufSizeParam->dwBufferSize = bufferSize;
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::IsHevcBufferReallocNeeded(
MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE bufferType,
PMHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS reallocParam)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(reallocParam);
bool realloc = false;
uint32_t picWidth = reallocParam->dwPicWidth;
uint32_t picHeight = reallocParam->dwPicHeight;
uint32_t ctbLog2SizeY = reallocParam->dwCtbLog2SizeY;
uint8_t maxBitDepth = reallocParam->ucMaxBitDepth;
HCP_CHROMA_FORMAT_IDC chromaFormat = (HCP_CHROMA_FORMAT_IDC)reallocParam->ucChromaFormat;
uint32_t picWidthAlloced = reallocParam->dwPicWidthAlloced;
uint32_t picHeightAlloced = reallocParam->dwPicHeightAlloced;
uint32_t ctbLog2SizeYMax = reallocParam->dwCtbLog2SizeYMax;
uint32_t frameSize = reallocParam->dwFrameSize;
uint32_t frameSizeAlloced = reallocParam->dwFrameSizeAlloced;
switch (bufferType)
{
case MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_LINE:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_TILE_LINE:
realloc = (picWidth > picWidthAlloced || ctbLog2SizeY > ctbLog2SizeYMax);
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_TILE_COL:
realloc = (picHeight > picHeightAlloced || ctbLog2SizeY > ctbLog2SizeYMax);
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_META_LINE:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_META_TILE_LINE:
if ((ctbLog2SizeYMax < 6 && ctbLog2SizeY == 6) || (picWidth > picWidthAlloced))
{
realloc = true;
}
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_MV_UP_RT_COL:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_META_TILE_COL:
if ((ctbLog2SizeYMax < 6 && ctbLog2SizeY == 6) || (picHeight > picHeightAlloced))
{
realloc = true;
}
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_INTRA_PRED_UP_RIGHT_COL:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_INTRA_PRED_LFT_RECON_COL:
if (maxBitDepth == 8 && chromaFormat == HCP_CHROMA_FORMAT_YUV420)
{
realloc = ((ctbLog2SizeYMax < 6 && ctbLog2SizeY == 6) || (picHeight > picHeightAlloced));
}
else
{
realloc = (picHeight > picHeightAlloced || ctbLog2SizeY > ctbLog2SizeYMax);
}
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_SAO_LINE:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_SAO_TILE_LINE:
realloc = (picWidth > picWidthAlloced || ctbLog2SizeY > ctbLog2SizeYMax);
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_SAO_TILE_COL:
realloc = (picHeight > picHeightAlloced || ctbLog2SizeY > ctbLog2SizeYMax);
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_CURR_MV_TEMPORAL:
realloc = (picWidth > picWidthAlloced || picHeight > picHeightAlloced);
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_CABAC_STREAMOUT:
realloc = (frameSize > frameSizeAlloced);
break;
default:
eStatus = MOS_STATUS_INVALID_PARAMETER;
break;
}
reallocParam->bNeedBiggerSize = realloc;
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::IsVp9BufferReallocNeeded(
MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE bufferType,
PMHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS reallocParam)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
uint32_t widthInSb, heightInSb, picWidthInSbAlloced, picHeightInSbAlloced;
uint32_t frameSize, frameSizeAlloced;
bool realloc = false;
MHW_MI_CHK_NULL(reallocParam);
widthInSb = reallocParam->dwPicWidth;
heightInSb = reallocParam->dwPicHeight;
picWidthInSbAlloced = reallocParam->dwPicWidthAlloced;
picHeightInSbAlloced = reallocParam->dwPicHeightAlloced;
frameSize = reallocParam->dwFrameSize;
frameSizeAlloced = reallocParam->dwFrameSizeAlloced;
switch (bufferType)
{
case MHW_VDBOX_HCP_INTERNAL_BUFFER_META_LINE:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_META_TILE_LINE:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_LINE:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_TILE_LINE:
case MHW_VDBOX_VP9_INTERNAL_BUFFER_HVD_LINE:
case MHW_VDBOX_VP9_INTERNAL_BUFFER_HVD_TILE:
realloc = (widthInSb > picWidthInSbAlloced);
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_TILE_COL:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_META_TILE_COL:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_INTRA_PRED_UP_RIGHT_COL:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_INTRA_PRED_LFT_RECON_COL:
realloc = (heightInSb > picHeightInSbAlloced);
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_CURR_MV_TEMPORAL:
case MHW_VDBOX_HCP_INTERNAL_BUFFER_COLL_MV_TEMPORAL:
case MHW_VDBOX_VP9_INTERNAL_BUFFER_SEGMENT_ID:
realloc = (heightInSb > picHeightInSbAlloced || widthInSb > picWidthInSbAlloced);
break;
case MHW_VDBOX_HCP_INTERNAL_BUFFER_CABAC_STREAMOUT:
realloc = (frameSize > frameSizeAlloced);
break;
default:
eStatus = MOS_STATUS_INVALID_PARAMETER;
break;
}
reallocParam->bNeedBiggerSize = realloc;
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpPipeModeSelectCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
bool bTwoPassScalableEncode = false;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(params);
auto paramsG12 = dynamic_cast<PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS_G12>(params);
MHW_MI_CHK_NULL(paramsG12);
mhw_vdbox_hcp_g12_X::HCP_PIPE_MODE_SELECT_CMD cmd;
// for Gen11+, we need to add MFX wait for both KIN and VRT before and after HCP Pipemode select...
MHW_MI_CHK_STATUS(m_miInterface->AddMfxWaitCmd(cmdBuffer, nullptr, true));
// Secure scalable encode workloads requires special handling for Gen12
bTwoPassScalableEncode = paramsG12->MultiEngineMode != MHW_VDBOX_HCP_MULTI_ENGINE_MODE_FE_LEGACY && !m_decodeInUse && !paramsG12->bTileBasedReplayMode;
MHW_MI_CHK_STATUS(m_cpInterface->SetProtectionSettingsForHcpPipeModeSelect((uint32_t *)&cmd, bTwoPassScalableEncode));
cmd.DW1.AdvancedRateControlEnable = params->bAdvancedRateControlEnable;
cmd.DW1.CodecStandardSelect = CodecHal_GetStandardFromMode(params->Mode) - CODECHAL_HCP_BASE;
cmd.DW1.PakPipelineStreamoutEnable = params->bStreamOutEnabled || paramsG12->bBRCEnabled || params->pakPiplnStrmoutEnabled;
cmd.DW1.DeblockerStreamoutEnable = params->bDeblockerStreamOutEnable;
cmd.DW1.VdencMode = params->bVdencEnabled;
cmd.DW1.RdoqEnabledFlag = params->bRdoqEnable;
cmd.DW1.PakFrameLevelStreamoutEnable = params->bStreamOutEnabled || params->pakFrmLvlStrmoutEnable;
cmd.DW1.PipeWorkingMode = paramsG12->PipeWorkMode;
cmd.DW1.MultiEngineMode = paramsG12->MultiEngineMode;
cmd.DW1.TileBasedEngine = paramsG12->bTileBasedReplayMode;
cmd.DW1.Vp9DynamicScalingEnable = params->bDynamicScalingEnabled;
cmd.DW6.PhaseIndicator = paramsG12->ucPhaseIndicator;
cmd.DW6.HevcSeparateTileProgramming = paramsG12->bHEVCSeparateTileProgramming;
if (m_decodeInUse)
{
cmd.DW1.CodecSelect = cmd.CODEC_SELECT_DECODE;
// Disable it by default. Re-enable it after validation is done
cmd.DW2.MediaSoftResetCounterPer1000Clocks = cmd.MEDIA_SOFT_RESET_COUNTER_PER_1000_CLOCKS_DISABLE;
#if (_DEBUG || _RELEASE_INTERNAL)
if (m_osInterface->bSoftReset)
{
cmd.DW2.MediaSoftResetCounterPer1000Clocks = 500;
}
else
{
cmd.DW2.MediaSoftResetCounterPer1000Clocks = cmd.MEDIA_SOFT_RESET_COUNTER_PER_1000_CLOCKS_DISABLE;
}
#endif
}
else
{
cmd.DW1.CodecSelect = cmd.CODEC_SELECT_ENCODE;
}
if (m_disableTlbPrefetch)
{
cmd.DW1.PrefetchDisable = 1;
}
#if MOS_EVENT_TRACE_DUMP_SUPPORTED
if (m_decodeInUse)
{
if (cmd.DW1.PipeWorkingMode == MHW_VDBOX_HCP_PIPE_WORK_MODE_CABAC_FE ||
cmd.DW1.PipeWorkingMode == MHW_VDBOX_HCP_PIPE_WORK_MODE_CODEC_BE)
{
MOS_TraceEvent(EVENT_DECODE_FEATURE_VT_SCALABILITY, EVENT_TYPE_INFO, NULL, 0, NULL, 0);
}
else if (cmd.DW1.PipeWorkingMode == MHW_VDBOX_HCP_PIPE_WORK_MODE_CABAC_REAL_TILE)
{
MOS_TraceEvent(EVENT_DECODE_FEATURE_RT_SCALABILITY, EVENT_TYPE_INFO, NULL, 0, NULL, 0);
}
}
#endif
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, params->pBatchBuffer, &cmd, sizeof(cmd)));
// for Gen11+, we need to add MFX wait for both KIN and VRT before and after HCP Pipemode select...
MHW_MI_CHK_STATUS(m_miInterface->AddMfxWaitCmd(cmdBuffer, nullptr, true));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpDecodeSurfaceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_SURFACE_PARAMS params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
uint32_t uvPlaneAlignment = m_uvPlaneAlignmentLegacy;
MHW_MI_CHK_NULL(params);
mhw_vdbox_hcp_g12_X::HCP_SURFACE_STATE_CMD *cmd =
(mhw_vdbox_hcp_g12_X::HCP_SURFACE_STATE_CMD*)cmdBuffer->pCmdPtr;
MHW_MI_CHK_STATUS(MhwVdboxHcpInterfaceGeneric<mhw_vdbox_hcp_g12_X>::AddHcpDecodeSurfaceStateCmd(cmdBuffer, params));
if (params->ucBitDepthLumaMinus8 == 0 && params->ucBitDepthChromaMinus8 == 0)
{
if (params->ChromaType == HCP_CHROMA_FORMAT_YUV420 && params->psSurface->Format == Format_NV12)// 4:2:0 8bit surface
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_PLANAR4208;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV420 && params->psSurface->Format == Format_P010)// 4:2:0 10bit surface
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_P010;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV422 && params->psSurface->Format == Format_YUY2) // 4:2:2 8bit surface
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_YUY2FORMAT;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV422 && params->psSurface->Format == Format_Y210) // 4:2:2 10bit surface
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y216Y210FORMAT;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV444 && params->psSurface->Format == Format_AYUV) // 4:4:4 8bit surface
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_AYUV4444FORMAT;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV444 && params->psSurface->Format == Format_Y410) // 4:4:4 10bit surface
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y410FORMAT;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV420 && params->psSurface->Format == Format_P016) // 4:2:0 16bit surface
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_P016;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV422 && params->psSurface->Format == Format_Y216) // 4:2:2 16bit surface
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y216Y210FORMAT;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV444 && params->psSurface->Format == Format_Y416) // 4:4:4
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y416FORMAT;
}
else
{
return MOS_STATUS_INVALID_PARAMETER;
}
}
else if ((params->ucBitDepthLumaMinus8 <= 2) && (params->ucBitDepthChromaMinus8 <= 2)) // only support bitdepth <= 10bit
{
if (params->ChromaType == HCP_CHROMA_FORMAT_YUV420 && params->psSurface->Format == Format_P010)// 4:2:0
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_P010;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV420 && params->psSurface->Format == Format_P016) // 4:2:0
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_P016;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV422 && params->psSurface->Format == Format_Y210) // 4:2:2
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y216Y210FORMAT;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV422 && params->psSurface->Format == Format_Y216) // 4:2:2
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y216Y210FORMAT;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV444 && params->psSurface->Format == Format_Y410) // 4:4:4
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y410FORMAT;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV444 && params->psSurface->Format == Format_Y416) // 4:4:4
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y416FORMAT;
}
else
{
return MOS_STATUS_INVALID_PARAMETER;
}
}
else //12bit
{
if (params->ChromaType == HCP_CHROMA_FORMAT_YUV420 && params->psSurface->Format == Format_P016) // 4:2:0
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_P016;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV422 && params->psSurface->Format == Format_Y216) // 4:2:2
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y216Y210FORMAT;
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV444 && params->psSurface->Format == Format_Y416) // 4:4:4
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y416FORMAT;
}
else
{
return MOS_STATUS_INVALID_PARAMETER;
}
}
if (params->ucSurfaceStateId == CODECHAL_HCP_SRC_SURFACE_ID)
{
uvPlaneAlignment = params->dwUVPlaneAlignment ? params->dwUVPlaneAlignment : m_rawUVPlaneAlignment;
}
else
{
uvPlaneAlignment = params->dwUVPlaneAlignment ? params->dwUVPlaneAlignment : m_reconUVPlaneAlignment;
}
cmd->DW2.YOffsetForUCbInPixel =
MOS_ALIGN_CEIL((params->psSurface->UPlaneOffset.iSurfaceOffset - params->psSurface->dwOffset) / params->psSurface->dwPitch + params->psSurface->RenderOffset.YUV.U.YOffset, uvPlaneAlignment);
if ((params->ucBitDepthLumaMinus8 == 4) || (params->ucBitDepthChromaMinus8 == 4)) // 12 bit
cmd->DW3.DefaultAlphaValue = 0xfff0;
else
cmd->DW3.DefaultAlphaValue = 0xffff;
if (params->ucSurfaceStateId != CODECHAL_HCP_DECODED_SURFACE_ID) //MMC is not need in HCP_SURFACE_STATE for non reference surfaces
{
cmd->DW4.MemoryCompressionEnable = MmcEnable(params->mmcState) ? ((~params->mmcSkipMask) & 0xff) : 0;
cmd->DW4.CompressionType = MmcIsRc(params->mmcState) ? 0xff : 0;
}
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpEncodeSurfaceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_SURFACE_PARAMS params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_MI_CHK_NULL(params);
mhw_vdbox_hcp_g12_X::HCP_SURFACE_STATE_CMD *cmd =
(mhw_vdbox_hcp_g12_X::HCP_SURFACE_STATE_CMD*)cmdBuffer->pCmdPtr;
MHW_MI_CHK_STATUS(MhwVdboxHcpInterfaceGeneric<mhw_vdbox_hcp_g12_X>::AddHcpEncodeSurfaceStateCmd(cmdBuffer, params));
bool surf10bit = (params->psSurface->Format == Format_P010) ||
(params->psSurface->Format == Format_P210) ||
(params->psSurface->Format == Format_Y210) ||
(params->psSurface->Format == Format_Y410) ||
(params->psSurface->Format == Format_R10G10B10A2) ||
(params->psSurface->Format == Format_B10G10R10A2) ||
(params->psSurface->Format == Format_P016) ||
(params->psSurface->Format == Format_Y216);
if (params->ChromaType == HCP_CHROMA_FORMAT_YUV422)
{
if (params->ucBitDepthLumaMinus8 > 0)
{
if (params->ucSurfaceStateId == CODECHAL_HCP_SRC_SURFACE_ID)
{
cmd->DW2.SurfaceFormat = surf10bit ?
cmd->SURFACE_FORMAT_Y216Y210FORMAT : cmd->SURFACE_FORMAT_YUY2FORMAT;
}
else
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y216VARIANT;
}
}
else
{
cmd->DW2.SurfaceFormat = (params->ucSurfaceStateId == CODECHAL_HCP_SRC_SURFACE_ID) ?
cmd->SURFACE_FORMAT_YUY2FORMAT : cmd->SURFACE_FORMAT_YUY2VARIANT;
}
}
else if (params->ChromaType == HCP_CHROMA_FORMAT_YUV444)
{
if (params->ucBitDepthLumaMinus8 == 0)
{
cmd->DW2.SurfaceFormat = params->ucSurfaceStateId == CODECHAL_HCP_SRC_SURFACE_ID ?
cmd->SURFACE_FORMAT_AYUV4444FORMAT : cmd->SURFACE_FORMAT_AYUV4444VARIANT;
}
else if (params->ucBitDepthLumaMinus8 <= 2)
{
if (params->ucSurfaceStateId == CODECHAL_HCP_SRC_SURFACE_ID)
{
cmd->DW2.SurfaceFormat = surf10bit ?
cmd->SURFACE_FORMAT_Y410FORMAT : cmd->SURFACE_FORMAT_AYUV4444FORMAT;
}
else
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y416VARIANT;
}
}
else
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_Y416FORMAT;
}
}
else //params->ChromaType == HCP_CHROMA_FORMAT_YUV420
{
if (params->ucBitDepthLumaMinus8 > 0)
{
if (params->ucSurfaceStateId == CODECHAL_HCP_SRC_SURFACE_ID)
{
cmd->DW2.SurfaceFormat = surf10bit ?
cmd->SURFACE_FORMAT_P010 : cmd->SURFACE_FORMAT_PLANAR4208;
}
else
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_P010VARIANT;
}
}
else
{
cmd->DW2.SurfaceFormat = cmd->SURFACE_FORMAT_PLANAR4208;
}
}
cmd->DW2.YOffsetForUCbInPixel = cmd->DW3.YOffsetForVCr =
(params->psSurface->UPlaneOffset.iSurfaceOffset - params->psSurface->dwOffset)/params->psSurface->dwPitch + params->psSurface->RenderOffset.YUV.U.YOffset;
//Set U/V offsets for Variant surfaces
if (cmd->DW2.SurfaceFormat == cmd->SURFACE_FORMAT_Y416VARIANT ||
cmd->DW2.SurfaceFormat == cmd->SURFACE_FORMAT_AYUV4444VARIANT)
{
cmd->DW2.YOffsetForUCbInPixel = params->dwReconSurfHeight;
cmd->DW3.YOffsetForVCr = params->dwReconSurfHeight << 1;
}
else if (cmd->DW2.SurfaceFormat == cmd->SURFACE_FORMAT_Y216VARIANT ||
cmd->DW2.SurfaceFormat == cmd->SURFACE_FORMAT_YUY2VARIANT)
{
cmd->DW2.YOffsetForUCbInPixel =
cmd->DW3.YOffsetForVCr = params->dwReconSurfHeight;
}
cmd->DW4.MemoryCompressionEnable = MmcEnable(params->mmcState) ? ((~params->mmcSkipMask) & 0xff) : 0;
cmd->DW4.CompressionType = MmcIsRc(params->mmcState) ? 0xff : 0;
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpPipeBufAddrCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(cmdBuffer);
MHW_MI_CHK_NULL(params);
MHW_RESOURCE_PARAMS resourceParams;
MOS_SURFACE details;
mhw_vdbox_hcp_g12_X::HCP_PIPE_BUF_ADDR_STATE_CMD cmd;
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_USER_FEATURE_VALUE_WRITE_DATA UserFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__;
UserFeatureWriteData.ValueID = __MEDIA_USER_FEATURE_VALUE_IS_CODEC_ROW_STORE_CACHE_ENABLED_ID;
if (m_hevcDatRowStoreCache.bEnabled ||
m_hevcDfRowStoreCache.bEnabled ||
m_hevcSaoRowStoreCache.bEnabled ||
m_hevcHSaoRowStoreCache.bEnabled ||
m_vp9HvdRowStoreCache.bEnabled ||
m_vp9DatRowStoreCache.bEnabled ||
m_vp9DfRowStoreCache.bEnabled)
{
UserFeatureWriteData.Value.i32Data = 1;
}
MOS_UserFeature_WriteValues_ID(nullptr, &UserFeatureWriteData, 1, m_osInterface->pOsContext);
#endif
MOS_ZeroMemory(&resourceParams, sizeof(resourceParams));
// 1. MHW_VDBOX_HCP_GENERAL_STATE_SHIFT(6) may not work with DecodedPicture
// since it needs to be 4k aligned
resourceParams.dwLsbNum = MHW_VDBOX_HCP_GENERAL_STATE_SHIFT;
resourceParams.HwCommandType = MOS_MFX_PIPE_BUF_ADDR;
//Decoded Picture
cmd.DecodedPictureMemoryAddressAttributes.DW0.Value |= m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_PRE_DEBLOCKING_CODEC].Value;
cmd.DecodedPictureMemoryAddressAttributes.DW0.BaseAddressMemoryCompressionEnable = MmcEnable(params->PreDeblockSurfMmcState) ? 1 : 0;
cmd.DecodedPictureMemoryAddressAttributes.DW0.CompressionType = MmcIsRc(params->PreDeblockSurfMmcState) ? 1 : 0;
cmd.DecodedPictureMemoryAddressAttributes.DW0.BaseAddressTiledResourceMode = Mhw_ConvertToTRMode(params->psPreDeblockSurface->TileType);
resourceParams.presResource = &(params->psPreDeblockSurface->OsResource);
resourceParams.dwOffset = params->psPreDeblockSurface->dwOffset;
resourceParams.pdwCmd = (cmd.DecodedPicture.DW0_1.Value);
resourceParams.dwLocationInCmd = 1;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
// Deblocking Filter Line Buffer
if (m_hevcDfRowStoreCache.bEnabled)
{
cmd.DeblockingFilterLineBufferMemoryAddressAttributes.DW0.BaseAddressRowStoreScratchBufferCacheSelect = cmd.DeblockingFilterLineBufferMemoryAddressAttributes.BASE_ADDRESS_ROW_STORE_SCRATCH_BUFFER_CACHE_SELECT_UNNAMED1;
cmd.DeblockingFilterLineBuffer.DW0_1.Graphicsaddress476 = m_hevcDfRowStoreCache.dwAddress;
}
else if (m_vp9DfRowStoreCache.bEnabled)
{
cmd.DeblockingFilterLineBufferMemoryAddressAttributes.DW0.BaseAddressRowStoreScratchBufferCacheSelect = cmd.DeblockingFilterLineBufferMemoryAddressAttributes.BASE_ADDRESS_ROW_STORE_SCRATCH_BUFFER_CACHE_SELECT_UNNAMED1;
cmd.DeblockingFilterLineBuffer.DW0_1.Graphicsaddress476 = m_vp9DfRowStoreCache.dwAddress;
}
else if (params->presMfdDeblockingFilterRowStoreScratchBuffer != nullptr)
{
cmd.DeblockingFilterLineBufferMemoryAddressAttributes.DW0.Value |= m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_DEBLOCKINGFILTER_ROWSTORE_SCRATCH_BUFFER_CODEC].Value;
resourceParams.presResource = params->presMfdDeblockingFilterRowStoreScratchBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.DeblockingFilterLineBuffer.DW0_1.Value);
resourceParams.dwLocationInCmd = 4;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Deblocking Filter Tile Line Buffer
if (params->presDeblockingFilterTileRowStoreScratchBuffer != nullptr)
{
cmd.DeblockingFilterTileLineBufferMemoryAddressAttributes.DW0.Value |= m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_DEBLOCKINGFILTER_ROWSTORE_SCRATCH_BUFFER_CODEC].Value;
resourceParams.presResource = params->presDeblockingFilterTileRowStoreScratchBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.DeblockingFilterTileLineBuffer.DW0_1.Value);
resourceParams.dwLocationInCmd = 7;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Deblocking Filter Tile Column Buffer
if (params->presDeblockingFilterColumnRowStoreScratchBuffer != nullptr)
{
cmd.DeblockingFilterTileColumnBufferMemoryAddressAttributes.DW0.Value |= m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_DEBLOCKINGFILTER_ROWSTORE_SCRATCH_BUFFER_CODEC].Value;
resourceParams.presResource = params->presDeblockingFilterColumnRowStoreScratchBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.DeblockingFilterTileColumnBuffer.DW0_1.Value);
resourceParams.dwLocationInCmd = 10;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Metadata Line Buffer
if (m_hevcDatRowStoreCache.bEnabled)
{
cmd.MetadataLineBufferMemoryAddressAttributes.DW0.BaseAddressRowStoreScratchBufferCacheSelect = cmd.MetadataLineBufferMemoryAddressAttributes.BASE_ADDRESS_ROW_STORE_SCRATCH_BUFFER_CACHE_SELECT_UNNAMED1;
cmd.MetadataLineBuffer.DW0_1.Graphicsaddress476 = m_hevcDatRowStoreCache.dwAddress;
}
else if (m_vp9DatRowStoreCache.bEnabled)
{
cmd.MetadataLineBufferMemoryAddressAttributes.DW0.BaseAddressRowStoreScratchBufferCacheSelect = cmd.MetadataLineBufferMemoryAddressAttributes.BASE_ADDRESS_ROW_STORE_SCRATCH_BUFFER_CACHE_SELECT_UNNAMED1;
cmd.MetadataLineBuffer.DW0_1.Graphicsaddress476 = m_vp9DatRowStoreCache.dwAddress;
}
else if (params->presMetadataLineBuffer != nullptr)
{
cmd.MetadataLineBufferMemoryAddressAttributes.DW0.Value |= m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_HCP_MD_CODEC].Value;
resourceParams.presResource = params->presMetadataLineBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.MetadataLineBuffer.DW0_1.Value);
resourceParams.dwLocationInCmd = 13;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Metadata Tile Line Buffer
if (params->presMetadataTileLineBuffer != nullptr)
{
cmd.MetadataTileLineBufferMemoryAddressAttributes.DW0.Value |= m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_HCP_MD_CODEC].Value;
resourceParams.presResource = params->presMetadataTileLineBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.MetadataTileLineBuffer.DW0_1.Value);
resourceParams.dwLocationInCmd = 16;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Metadata Tile Column Buffer
if (params->presMetadataTileColumnBuffer != nullptr)
{
cmd.MetadataTileColumnBufferMemoryAddressAttributes.DW0.Value |= m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_HCP_MD_CODEC].Value;
resourceParams.presResource = params->presMetadataTileColumnBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.MetadataTileColumnBuffer.DW0_1.Value);
resourceParams.dwLocationInCmd = 19;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// SAO Line Buffer
if (m_hevcSaoRowStoreCache.bEnabled)
{
cmd.SaoLineBufferMemoryAddressAttributes.DW0.BaseAddressRowStoreScratchBufferCacheSelect = cmd.SaoLineBufferMemoryAddressAttributes.BASE_ADDRESS_ROW_STORE_SCRATCH_BUFFER_CACHE_SELECT_UNNAMED1;
cmd.SaoLineBuffer.DW0_1.Graphicsaddress476 = m_hevcSaoRowStoreCache.dwAddress;
}
else if (params->presSaoLineBuffer != nullptr)
{
cmd.SaoLineBufferMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_HCP_SAO_CODEC].Value;
resourceParams.presResource = params->presSaoLineBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.SaoLineBuffer.DW0_1.Value);
resourceParams.dwLocationInCmd = 22;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// SAO Tile Line Buffer
if (params->presSaoTileLineBuffer != nullptr)
{
cmd.SaoTileLineBufferMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_HCP_SAO_CODEC].Value;
resourceParams.presResource = params->presSaoTileLineBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.SaoTileLineBuffer.DW0_1.Value);
resourceParams.dwLocationInCmd = 25;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// SAO Tile Column Buffer
if (params->presSaoTileColumnBuffer != nullptr)
{
cmd.SaoTileColumnBufferMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_HCP_SAO_CODEC].Value;
resourceParams.presResource = params->presSaoTileColumnBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.SaoTileColumnBuffer.DW0_1.Value);
resourceParams.dwLocationInCmd = 28;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Current Motion Vector Temporal Buffer
if (params->presCurMvTempBuffer != nullptr)
{
cmd.CurrentMotionVectorTemporalBufferMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_HCP_MV_CODEC].Value;
resourceParams.presResource = params->presCurMvTempBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.CurrentMotionVectorTemporalBuffer.DW0_1.Value);
resourceParams.dwLocationInCmd = 31;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Only one control DW53 for all references
cmd.ReferencePictureBaseAddressMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_REFERENCE_PICTURE_CODEC].Value;
bool firstRefPic = true;
MOS_MEMCOMP_STATE mmcMode = MOS_MEMCOMP_DISABLED;
// NOTE: for both HEVC and VP9, set all the 8 ref pic addresses in HCP_PIPE_BUF_ADDR_STATE command to valid addresses for error concealment purpose
for (uint32_t i = 0; i < CODECHAL_MAX_CUR_NUM_REF_FRAME_HEVC; i++)
{
// Reference Picture Buffer
if (params->presReferences[i] != nullptr)
{
MOS_ZeroMemory(&details, sizeof(details));
details.Format = Format_Invalid;
MHW_MI_CHK_STATUS(m_osInterface->pfnGetResourceInfo(m_osInterface, params->presReferences[i], &details));
if (firstRefPic)
{
cmd.ReferencePictureBaseAddressMemoryAddressAttributes.DW0.BaseAddressTiledResourceMode = Mhw_ConvertToTRMode(details.TileType);
firstRefPic = false;
}
resourceParams.presResource = params->presReferences[i];
resourceParams.pdwCmd = (cmd.ReferencePictureBaseAddressRefaddr07[i].DW0_1.Value);
resourceParams.dwOffset = details.RenderOffset.YUV.Y.BaseOffset;
resourceParams.dwLocationInCmd = (i * 2) + 37; // * 2 to account for QW rather than DW
if (params->IBCRefIdxMask & (1 << i))
{
// Motion Compensation will use this picture to write and read IBC data
resourceParams.bIsWritable = true;
}
else
{
resourceParams.bIsWritable = false;
}
resourceParams.dwSharedMocsOffset = 53 - resourceParams.dwLocationInCmd; // Common Prodected Data bit is in DW53
MOS_GPU_CONTEXT gpuContext = m_osInterface->pfnGetGpuContext(m_osInterface);
m_osInterface->pfnSyncOnResource(
m_osInterface,
params->presReferences[i],
gpuContext,
false);
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
}
auto paramsG12 = dynamic_cast<PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS_G12>(params);
MHW_CHK_NULL_RETURN(paramsG12);
if (paramsG12->bSpecificReferencedMmcRequired)
{
cmd.ReferencePictureBaseAddressMemoryAddressAttributes.DW0.BaseAddressMemoryCompressionEnable = MmcEnable(paramsG12->ReferencesMmcState) ? 1 : 0;
cmd.ReferencePictureBaseAddressMemoryAddressAttributes.DW0.CompressionType = MmcIsRc(paramsG12->ReferencesMmcState) ? 1 : 0;;
}
else
{
// Same MMC status for deblock and ref surfaces
cmd.ReferencePictureBaseAddressMemoryAddressAttributes.DW0.BaseAddressMemoryCompressionEnable = cmd.DecodedPictureMemoryAddressAttributes.DW0.BaseAddressMemoryCompressionEnable;
cmd.ReferencePictureBaseAddressMemoryAddressAttributes.DW0.CompressionType = cmd.DecodedPictureMemoryAddressAttributes.DW0.CompressionType;
}
// Reset dwSharedMocsOffset
resourceParams.dwSharedMocsOffset = 0;
// Original Uncompressed Picture Source, Encoder only
if (params->psRawSurface != nullptr)
{
cmd.OriginalUncompressedPictureSourceMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_ORIGINAL_UNCOMPRESSED_PICTURE_ENCODE].Value;
cmd.OriginalUncompressedPictureSourceMemoryAddressAttributes.DW0.BaseAddressMemoryCompressionEnable = MmcEnable(params->RawSurfMmcState) ? 1 : 0;
cmd.OriginalUncompressedPictureSourceMemoryAddressAttributes.DW0.CompressionType = MmcIsRc(params->RawSurfMmcState) ? 1 : 0;
cmd.OriginalUncompressedPictureSourceMemoryAddressAttributes.DW0.BaseAddressTiledResourceMode = Mhw_ConvertToTRMode(params->psRawSurface->TileType);
resourceParams.presResource = &params->psRawSurface->OsResource;
resourceParams.dwOffset = params->psRawSurface->dwOffset;
resourceParams.pdwCmd = (cmd.OriginalUncompressedPictureSource.DW0_1.Value);
resourceParams.dwLocationInCmd = 54;
resourceParams.bIsWritable = false;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// StreamOut Data Destination, Decoder only
if (params->presStreamOutBuffer != nullptr)
{
cmd.StreamoutDataDestinationMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_STREAMOUT_DATA_CODEC].Value;
resourceParams.presResource = params->presStreamOutBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.StreamoutDataDestination.DW0_1.Value);
resourceParams.dwLocationInCmd = 57;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Pak Cu Level Streamout Data
if (params->presPakCuLevelStreamoutBuffer != nullptr)
{
cmd.StreamoutDataDestinationMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_STREAMOUT_DATA_CODEC].Value;
resourceParams.presResource = params->presPakCuLevelStreamoutBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.StreamoutDataDestination.DW0_1.Value);
resourceParams.dwLocationInCmd = 57;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Decoded Picture Status / Error Buffer Base Address
if (params->presLcuBaseAddressBuffer != nullptr)
{
cmd.DecodedPictureStatusErrorBufferBaseAddressMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_HCP_STATUS_ERROR_CODEC].Value;
resourceParams.presResource = params->presLcuBaseAddressBuffer;
resourceParams.dwOffset = params->dwLcuStreamOutOffset;
resourceParams.pdwCmd = (cmd.DecodedPictureStatusErrorBufferBaseAddressOrEncodedSliceSizeStreamoutBaseAddress.DW0_1.Value);
resourceParams.dwLocationInCmd = 60;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// LCU ILDB StreamOut Buffer
if (params->presLcuILDBStreamOutBuffer != nullptr)
{
cmd.LcuIldbStreamoutBufferMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_HCP_LCU_ILDB_STREAMOUT_CODEC].Value;
resourceParams.presResource = params->presLcuILDBStreamOutBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.LcuIldbStreamoutBuffer.DW0_1.Value);
resourceParams.dwLocationInCmd = 63;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
cmd.CollocatedMotionVectorTemporalBuffer07MemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_HCP_MV_CODEC].Value;
for (uint32_t i = 0; i < CODECHAL_MAX_CUR_NUM_REF_FRAME_HEVC; i++)
{
// Collocated Motion vector Temporal Buffer
if (params->presColMvTempBuffer[i] != nullptr)
{
resourceParams.presResource = params->presColMvTempBuffer[i];
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.CollocatedMotionVectorTemporalBuffer07[i].DW0_1.Value);
resourceParams.dwLocationInCmd = (i * 2) + 66;
resourceParams.bIsWritable = false;
resourceParams.dwSharedMocsOffset = 82 - resourceParams.dwLocationInCmd; // Common Prodected Data bit is in DW82
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
}
// Reset dwSharedMocsOffset
resourceParams.dwSharedMocsOffset = 0;
// VP9 Probability Buffer
if (params->presVp9ProbBuffer != nullptr)
{
cmd.Vp9ProbabilityBufferReadWriteMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_VP9_PROBABILITY_BUFFER_CODEC].Value;
resourceParams.presResource = params->presVp9ProbBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.Vp9ProbabilityBufferReadWrite.DW0_1.Value);
resourceParams.dwLocationInCmd = 83;
resourceParams.bIsWritable = true;
resourceParams.dwSharedMocsOffset = 85 - resourceParams.dwLocationInCmd; // Common Prodected Data bit is in DW88
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Reset dwSharedMocsOffset
resourceParams.dwSharedMocsOffset = 0;
// VP9 Segment Id Buffer
if (params->presVp9SegmentIdBuffer != nullptr)
{
cmd.Vp9SegmentIdBufferReadWriteMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_VP9_SEGMENT_ID_BUFFER_CODEC].Value;
resourceParams.presResource = params->presVp9SegmentIdBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.DW86_87.Value);
resourceParams.dwLocationInCmd = 86;
resourceParams.bIsWritable = true;
resourceParams.dwSharedMocsOffset = 88 - resourceParams.dwLocationInCmd; // Common Prodected Data bit is in DW88
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Reset dwSharedMocsOffset
resourceParams.dwSharedMocsOffset = 0;
// HVD Line Row Store Buffer
if (m_vp9HvdRowStoreCache.bEnabled)
{
cmd.Vp9HvdLineRowstoreBufferReadWriteMemoryAddressAttributes.DW0.BaseAddressRowStoreScratchBufferCacheSelect = cmd.Vp9HvdLineRowstoreBufferReadWriteMemoryAddressAttributes.BASE_ADDRESS_ROW_STORE_SCRATCH_BUFFER_CACHE_SELECT_UNNAMED1;
cmd.Vp9HvdLineRowstoreBufferReadWrite.DW0_1.Graphicsaddress476 = m_vp9HvdRowStoreCache.dwAddress;
}
else if (params->presHvdLineRowStoreBuffer != nullptr)
{
cmd.Vp9HvdLineRowstoreBufferReadWriteMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_VP9_HVD_ROWSTORE_BUFFER_CODEC].Value;
resourceParams.presResource = params->presHvdLineRowStoreBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.Vp9HvdLineRowstoreBufferReadWrite.DW0_1.Value);
resourceParams.dwLocationInCmd = 89;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// HVC Tile Row Store Buffer
if (params->presHvdTileRowStoreBuffer != nullptr)
{
cmd.Vp9HvdTileRowstoreBufferReadWriteMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_VP9_HVD_ROWSTORE_BUFFER_CODEC].Value;
resourceParams.presResource = params->presHvdTileRowStoreBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.Vp9HvdTileRowstoreBufferReadWrite.DW0_1.Value);
resourceParams.dwLocationInCmd = 92;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// HEVC SAO row store buffer, HSAO
if (m_hevcHSaoRowStoreCache.bEnabled)
{
cmd.SaoRowstoreBufferReadWriteMemoryAddressAttributes.DW0.BaseAddressRowStoreScratchBufferCacheSelect = cmd.SaoRowstoreBufferReadWriteMemoryAddressAttributes.BASE_ADDRESS_ROW_STORE_SCRATCH_BUFFER_CACHE_SELECT_UNNAMED1;
cmd.DW95_96.SaoRowstoreBufferBaseAddress = (uint64_t)(m_hevcHSaoRowStoreCache.dwAddress) << 6;
}
else if (params->presSaoRowStoreBuffer != nullptr)
{
cmd.SaoRowstoreBufferReadWriteMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_STREAMOUT_DATA_CODEC].Value;
resourceParams.presResource = params->presSaoRowStoreBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.DW95_96.Value);
resourceParams.dwLocationInCmd = 95;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Frame Statistics Streamout Data Destination Buffer
if (params->presFrameStatStreamOutBuffer != nullptr)
{
cmd.FrameStatisticsStreamoutDataDestinationBufferAttributesReadWrite.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_STREAMOUT_DATA_CODEC].Value;
resourceParams.presResource = params->presFrameStatStreamOutBuffer;
resourceParams.dwOffset = params->dwFrameStatStreamOutOffset;;
resourceParams.pdwCmd = (cmd.FrameStatisticsStreamoutDataDestinationBufferBaseAddress.DW0_1.Value);
resourceParams.dwLocationInCmd = 98;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// SSE Source Pixel Row Store Buffer
if (params->presSseSrcPixelRowStoreBuffer != nullptr)
{
cmd.SseSourcePixelRowstoreBufferAttributesReadWrite.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_SSE_SRC_PIXEL_ROW_STORE_BUFFER_CODEC].Value;
resourceParams.presResource = params->presSseSrcPixelRowStoreBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.SseSourcePixelRowstoreBufferBaseAddress.DW0_1.Value);
resourceParams.dwLocationInCmd = 101;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// Gen12 new added buffer
// Slice state stream out buffer
if (paramsG12->presSliceStateStreamOutBuffer != nullptr)
{
cmd.HcpScalabilitySliceStateBufferAttributesReadWrite.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_SLICE_STATE_STREAM_OUT_BUFFER_CODEC].Value;
resourceParams.presResource = paramsG12->presSliceStateStreamOutBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.HcpScalabilitySliceStateBufferBaseAddress.DW0_1.Value);
resourceParams.dwLocationInCmd = 104;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// CABAC Syntax stream out buffer
if (paramsG12->presCABACSyntaxStreamOutBuffer != nullptr)
{
cmd.HcpScalabilityCabacDecodedSyntaxElementsBufferAttributesReadWrite.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_CABAC_SYNTAX_STREAM_OUT_BUFFER_CODEC].Value;
resourceParams.presResource = paramsG12->presCABACSyntaxStreamOutBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.HcpScalabilityCabacDecodedSyntaxElementsBufferBaseAddress.DW0_1.Value);
resourceParams.dwLocationInCmd = 107;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// MV Upper Right Col Store
if (paramsG12->presMvUpRightColStoreBuffer != nullptr)
{
cmd.MotionVectorUpperRightColumnStoreBufferAttributesReadWrite.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_PRED_COL_STORE_BUFFER_CODEC].Value;
resourceParams.presResource = paramsG12->presMvUpRightColStoreBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.MotionVectorUpperRightColumnStoreBufferBaseAddress.DW0_1.Value);
resourceParams.dwLocationInCmd = 110;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// IntraPred Upper Right Col Store
if (paramsG12->presIntraPredUpRightColStoreBuffer != nullptr)
{
cmd.IntraPredictionUpperRightColumnStoreBufferAttributesReadWrite.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_PRED_COL_STORE_BUFFER_CODEC].Value;
resourceParams.presResource = paramsG12->presIntraPredUpRightColStoreBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.IntraPredictionUpperRightColumnStoreBufferBaseAddress.DW0_1.Value);
resourceParams.dwLocationInCmd = 113;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// IntraPred Left Recon Col Store
if (paramsG12->presIntraPredLeftReconColStoreBuffer != nullptr)
{
cmd.IntraPredictionLeftReconColumnStoreBufferAttributesReadWrite.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_PRED_COL_STORE_BUFFER_CODEC].Value;
resourceParams.presResource = paramsG12->presIntraPredLeftReconColStoreBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.IntraPredictionLeftReconColumnStoreBufferBaseAddress.DW0_1.Value);
resourceParams.dwLocationInCmd = 116;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
// CABAC Syntax Stream Out Buffer Max Address
if (paramsG12->presCABACSyntaxStreamOutMaxAddr != nullptr)
{
resourceParams.presResource = paramsG12->presCABACSyntaxStreamOutMaxAddr;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.HcpScalabilityCabacDecodedSyntaxElementsBufferMaxAddress.DW0_1.Value);
resourceParams.dwLocationInCmd = 119;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
#if MOS_EVENT_TRACE_DUMP_SUPPORTED
if (m_decodeInUse)
{
if (cmd.DecodedPictureMemoryAddressAttributes.DW0.BaseAddressMemoryCompressionEnable && !bMMCReported)
{
MOS_TraceEvent(EVENT_DECODE_FEATURE_MMC, EVENT_TYPE_INFO, NULL, 0, NULL, 0);
bMMCReported = true;
}
}
#endif
MHW_MI_CHK_STATUS(Mos_AddCommand(cmdBuffer, &cmd, sizeof(cmd)));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpIndObjBaseAddrCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(params);
MHW_RESOURCE_PARAMS resourceParams;
mhw_vdbox_hcp_g12_X::HCP_IND_OBJ_BASE_ADDR_STATE_CMD cmd;
PMOS_CONTEXT pOsContext = m_osInterface->pOsContext;
MHW_MI_CHK_NULL(pOsContext);
MOS_ZeroMemory(&resourceParams, sizeof(resourceParams));
resourceParams.dwLsbNum = MHW_VDBOX_HCP_UPPER_BOUND_STATE_SHIFT;
resourceParams.HwCommandType = MOS_MFX_INDIRECT_OBJ_BASE_ADDR;
// mode specific settings
if (CodecHalIsDecodeModeVLD(params->Mode))
{
MHW_MI_CHK_NULL(params->presDataBuffer);
cmd.HcpIndirectBitstreamObjectMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_MFX_INDIRECT_BITSTREAM_OBJECT_DECODE].Value;
resourceParams.presResource = params->presDataBuffer;
resourceParams.dwOffset = params->dwDataOffset;
resourceParams.pdwCmd = (cmd.HcpIndirectBitstreamObjectBaseAddress.DW0_1.Value);
resourceParams.dwLocationInCmd = 1;
resourceParams.dwSize = params->dwDataSize;
resourceParams.bIsWritable = false;
// upper bound of the allocated resource will be set at 3 DW apart from address location
resourceParams.dwUpperBoundLocationOffsetFromCmd = 3;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
if(HalOcaInterface::IsLargeResouceDumpSupported())
{
HalOcaInterface::OnIndirectState(*cmdBuffer, *pOsContext, resourceParams.presResource, 0, true, 0);
}
resourceParams.dwUpperBoundLocationOffsetFromCmd = 0;
}
// following is for encoder
if (!m_decodeInUse)
{
if (params->presMvObjectBuffer)
{
cmd.HcpIndirectCuObjectObjectMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_MFX_INDIRECT_MV_OBJECT_CODEC].Value;
resourceParams.presResource = params->presMvObjectBuffer;
resourceParams.dwOffset = params->dwMvObjectOffset;
resourceParams.pdwCmd = (cmd.DW6_7.Value);
resourceParams.dwLocationInCmd = 6;
resourceParams.dwSize = MOS_ALIGN_CEIL(params->dwMvObjectSize, 0x1000);
resourceParams.bIsWritable = false;
// no upper bound for indirect CU object
resourceParams.dwUpperBoundLocationOffsetFromCmd = 0;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
if (params->presPakBaseObjectBuffer)
{
cmd.HcpPakBseObjectAddressMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_MFC_INDIRECT_PAKBASE_OBJECT_CODEC].Value;
resourceParams.presResource = params->presPakBaseObjectBuffer;
resourceParams.dwOffset = params->presPakBaseObjectBuffer->dwResourceOffset;
resourceParams.pdwCmd = (cmd.DW9_10.Value);
resourceParams.dwLocationInCmd = 9;
resourceParams.dwSize = MOS_ALIGN_FLOOR(params->dwPakBaseObjectSize, 0x1000);
resourceParams.bIsWritable = true;
// upper bound of the allocated resource will be set at 3 DW apart from address location
resourceParams.dwUpperBoundLocationOffsetFromCmd = 3;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
resourceParams.dwUpperBoundLocationOffsetFromCmd = 0;
}
if (params->presCompressedHeaderBuffer)
{
cmd.HcpVp9PakCompressedHeaderSyntaxStreaminMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_COMPRESSED_HEADER_BUFFER_CODEC].Value;
resourceParams.presResource = params->presCompressedHeaderBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.DW14_15.Value);
resourceParams.dwLocationInCmd = 14;
resourceParams.dwSize = params->dwCompressedHeaderSize;
resourceParams.bIsWritable = false;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
if (params->presProbabilityCounterBuffer)
{
cmd.HcpVp9PakProbabilityCounterStreamoutMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_VP9_PROBABILITY_COUNTER_BUFFER_CODEC].Value;
resourceParams.presResource = params->presProbabilityCounterBuffer;
resourceParams.dwOffset = params->dwProbabilityCounterOffset;
resourceParams.pdwCmd = (cmd.DW17_18.Value);
resourceParams.dwLocationInCmd = 17;
resourceParams.dwSize = params->dwProbabilityCounterSize;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
if (params->presProbabilityDeltaBuffer)
{
cmd.HcpVp9PakProbabilityDeltasStreaminMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_PROBABILITY_DELTA_BUFFER_CODEC].Value;
resourceParams.presResource = params->presProbabilityDeltaBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.DW20_21.Value);
resourceParams.dwLocationInCmd = 20;
resourceParams.dwSize = params->dwProbabilityDeltaSize;
resourceParams.bIsWritable = false;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
//Following 2 blocks try to program "cmd.DW23_24.Value"
//So only one of presTileRecordBuffer and presPakTileSizeStasBuffer has to be used!
if (params->presTileRecordBuffer)
{
cmd.HcpVp9PakTileRecordStreamoutMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_TILE_RECORD_BUFFER_CODEC].Value;
resourceParams.presResource = params->presTileRecordBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.DW23_24.Value);
resourceParams.dwLocationInCmd = 23;
resourceParams.dwSize = params->dwTileRecordSize;
resourceParams.bIsWritable = true;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
else if (params->presPakTileSizeStasBuffer)
{
cmd.HcpVp9PakTileRecordStreamoutMemoryAddressAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_TILE_SIZE_STAS_BUFFER_CODEC].Value;
resourceParams.presResource = params->presPakTileSizeStasBuffer;
resourceParams.dwOffset = params->dwPakTileSizeRecordOffset;
resourceParams.pdwCmd = (cmd.DW23_24.Value);
resourceParams.dwLocationInCmd = 23;
resourceParams.dwSize = params->dwPakTileSizeStasBufferSize;
resourceParams.bIsWritable = WRITE_WA;
MHW_MI_CHK_STATUS(pfnAddResourceToCmd(
m_osInterface,
cmdBuffer,
&resourceParams));
}
}
MHW_MI_CHK_STATUS(Mos_AddCommand(cmdBuffer, &cmd, cmd.byteSize));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpDecodePicStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_PIC_STATE params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(params);
MHW_MI_CHK_NULL(params->pHevcPicParams);
auto paramsG12 = dynamic_cast<PMHW_VDBOX_HEVC_PIC_STATE_G12>(params);
MHW_MI_CHK_NULL(paramsG12);
auto hevcPicParams = paramsG12->pHevcPicParams;
auto hevcExtPicParams = paramsG12->pHevcExtPicParams;
auto hevcSccPicParams = paramsG12->pHevcSccPicParams;
if (hevcExtPicParams && hevcExtPicParams->PicRangeExtensionFlags.fields.cabac_bypass_alignment_enabled_flag == 1)
{
MHW_ASSERTMESSAGE("HW decoder doesn't support HEVC High Throughput profile so far.");
MHW_ASSERTMESSAGE("So cabac_bypass_alignment_enabled_flag cannot equal to 1.");
return MOS_STATUS_INVALID_PARAMETER;
}
mhw_vdbox_hcp_g12_X::HCP_PIC_STATE_CMD *cmd =
(mhw_vdbox_hcp_g12_X::HCP_PIC_STATE_CMD*)cmdBuffer->pCmdPtr;
MHW_MI_CHK_STATUS(MhwVdboxHcpInterfaceGeneric<mhw_vdbox_hcp_g12_X>::AddHcpDecodePicStateCmd(cmdBuffer, params));
// RExt fields
cmd->DW2.ChromaSubsampling = hevcPicParams->chroma_format_idc;
cmd->DW3.Log2Maxtransformskipsize = 0x2;
if (hevcExtPicParams)
{
cmd->DW3.Log2Maxtransformskipsize = hevcExtPicParams->log2_max_transform_skip_block_size_minus2 + 2;
cmd->DW3.CrossComponentPredictionEnabledFlag = hevcExtPicParams->PicRangeExtensionFlags.fields.cross_component_prediction_enabled_flag;
cmd->DW3.CabacBypassAlignmentEnabledFlag = hevcExtPicParams->PicRangeExtensionFlags.fields.cabac_bypass_alignment_enabled_flag;
cmd->DW3.PersistentRiceAdaptationEnabledFlag = hevcExtPicParams->PicRangeExtensionFlags.fields.persistent_rice_adaptation_enabled_flag;
cmd->DW3.IntraSmoothingDisabledFlag = hevcExtPicParams->PicRangeExtensionFlags.fields.intra_smoothing_disabled_flag;
cmd->DW3.ExplicitRdpcmEnabledFlag = hevcExtPicParams->PicRangeExtensionFlags.fields.explicit_rdpcm_enabled_flag;
cmd->DW3.ImplicitRdpcmEnabledFlag = hevcExtPicParams->PicRangeExtensionFlags.fields.implicit_rdpcm_enabled_flag;
cmd->DW3.TransformSkipContextEnabledFlag = hevcExtPicParams->PicRangeExtensionFlags.fields.transform_skip_context_enabled_flag;
cmd->DW3.TransformSkipRotationEnabledFlag = hevcExtPicParams->PicRangeExtensionFlags.fields.transform_skip_rotation_enabled_flag;
cmd->DW3.HighPrecisionOffsetsEnableFlag = hevcExtPicParams->PicRangeExtensionFlags.fields.high_precision_offsets_enabled_flag;
cmd->DW2.ChromaQpOffsetListEnabledFlag = hevcExtPicParams->PicRangeExtensionFlags.fields.chroma_qp_offset_list_enabled_flag;
cmd->DW2.DiffCuChromaQpOffsetDepth = hevcExtPicParams->diff_cu_chroma_qp_offset_depth;
cmd->DW2.ChromaQpOffsetListLenMinus1 = hevcExtPicParams->chroma_qp_offset_list_len_minus1;
cmd->DW2.Log2SaoOffsetScaleLuma = hevcExtPicParams->log2_sao_offset_scale_luma;
cmd->DW2.Log2SaoOffsetScaleChroma = hevcExtPicParams->log2_sao_offset_scale_chroma;
cmd->DW32.CbQpOffsetList0 = hevcExtPicParams->cb_qp_offset_list[0];
cmd->DW32.CbQpOffsetList1 = hevcExtPicParams->cb_qp_offset_list[1];
cmd->DW32.CbQpOffsetList2 = hevcExtPicParams->cb_qp_offset_list[2];
cmd->DW32.CbQpOffsetList3 = hevcExtPicParams->cb_qp_offset_list[3];
cmd->DW32.CbQpOffsetList4 = hevcExtPicParams->cb_qp_offset_list[4];
cmd->DW32.CbQpOffsetList5 = hevcExtPicParams->cb_qp_offset_list[5];
cmd->DW33.CrQpOffsetList0 = hevcExtPicParams->cr_qp_offset_list[0];
cmd->DW33.CrQpOffsetList1 = hevcExtPicParams->cr_qp_offset_list[1];
cmd->DW33.CrQpOffsetList2 = hevcExtPicParams->cr_qp_offset_list[2];
cmd->DW33.CrQpOffsetList3 = hevcExtPicParams->cr_qp_offset_list[3];
cmd->DW33.CrQpOffsetList4 = hevcExtPicParams->cr_qp_offset_list[4];
cmd->DW33.CrQpOffsetList5 = hevcExtPicParams->cr_qp_offset_list[5];
}
cmd->DW5.BitDepthChromaMinus8 = hevcPicParams->bit_depth_chroma_minus8;
cmd->DW5.BitDepthLumaMinus8 = hevcPicParams->bit_depth_luma_minus8;
if (hevcSccPicParams)
{
// DWORD 34
cmd->DW34.IbcMotionCompensationBufferReferenceIdc = paramsG12->ucRecNotFilteredID;
cmd->DW34.PpsActCrQpOffsetPlus3 = hevcSccPicParams->pps_act_cr_qp_offset_plus3;
cmd->DW34.PpsActCbQpOffsetPlus5 = hevcSccPicParams->pps_act_cb_qp_offset_plus5;
cmd->DW34.PpsActYOffsetPlus5 = hevcSccPicParams->pps_act_y_qp_offset_plus5;
cmd->DW34.PpsSliceActQpOffsetsPresentFlag = hevcSccPicParams->PicSCCExtensionFlags.fields.pps_slice_act_qp_offsets_present_flag;
cmd->DW34.ResidualAdaptiveColourTransformEnabledFlag = hevcSccPicParams->PicSCCExtensionFlags.fields.residual_adaptive_colour_transform_enabled_flag;
cmd->DW34.PpsCurrPicRefEnabledFlag = hevcSccPicParams->PicSCCExtensionFlags.fields.pps_curr_pic_ref_enabled_flag;
cmd->DW34.MotionVectorResolutionControlIdc = hevcSccPicParams->PicSCCExtensionFlags.fields.motion_vector_resolution_control_idc;
cmd->DW34.IntraBoundaryFilteringDisabledFlag = hevcSccPicParams->PicSCCExtensionFlags.fields.intra_boundary_filtering_disabled_flag;
cmd->DW34.DeblockingFilterOverrideEnabledFlag = hevcPicParams->deblocking_filter_override_enabled_flag;
cmd->DW34.PpsDeblockingFilterDisabledFlag = hevcPicParams->pps_deblocking_filter_disabled_flag;
// DWORD 35
cmd->DW35.PaletteMaxSize = hevcSccPicParams->palette_max_size;
cmd->DW35.DeltaPaletteMaxPredictorSize = hevcSccPicParams->delta_palette_max_predictor_size;
cmd->DW35.IbcMotionVectorErrorHandlingDisable = 0;
cmd->DW35.ChromaBitDepthEntryMinus8 = hevcPicParams->bit_depth_chroma_minus8;
cmd->DW35.LumaBitDepthEntryMinus8 = hevcPicParams->bit_depth_luma_minus8;
cmd->DW35.IbcConfiguration = hevcSccPicParams->PicSCCExtensionFlags.fields.pps_curr_pic_ref_enabled_flag ? 2 : 0;
cmd->DW35.MonochromePaletteFlag = 0;
cmd->DW35.PaletteModeEnabledFlag = hevcSccPicParams->PicSCCExtensionFlags.fields.palette_mode_enabled_flag;
}
if (hevcPicParams->RequestCRC)
{
cmd->DW36.FrameCrcEnable = 1;
cmd->DW36.FrameCrcType = 0;
}
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpEncodePicStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_PIC_STATE params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(params);
MHW_MI_CHK_NULL(params->pHevcEncSeqParams);
MHW_MI_CHK_NULL(params->pHevcEncPicParams);
auto paramsG12 = dynamic_cast<PMHW_VDBOX_HEVC_PIC_STATE_G12>(params);
MHW_MI_CHK_NULL(paramsG12);
PMHW_BATCH_BUFFER batchBuffer = nullptr;
mhw_vdbox_hcp_g12_X::HCP_PIC_STATE_CMD cmd;
auto hevcSeqParams = params->pHevcEncSeqParams;
auto hevcPicParams = params->pHevcEncPicParams;
if (params->bBatchBufferInUse)
{
MHW_MI_CHK_NULL(params->pBatchBuffer);
batchBuffer = params->pBatchBuffer;
}
cmd.DW1.Framewidthinmincbminus1 = hevcSeqParams->wFrameWidthInMinCbMinus1;
cmd.DW1.PakTransformSkipEnable = cmd.DW4.TransformSkipEnabledFlag = params->bTransformSkipEnable;
cmd.DW1.Frameheightinmincbminus1 = hevcSeqParams->wFrameHeightInMinCbMinus1;
cmd.DW2.Mincusize = hevcSeqParams->log2_min_coding_block_size_minus3;
cmd.DW2.CtbsizeLcusize = hevcSeqParams->log2_max_coding_block_size_minus3;
cmd.DW2.Maxtusize = hevcSeqParams->log2_max_transform_block_size_minus2;
cmd.DW2.Mintusize = hevcSeqParams->log2_min_transform_block_size_minus2;
cmd.DW2.Minpcmsize = 0;
cmd.DW2.Maxpcmsize = 0;
cmd.DW3.Colpicisi = 0;
cmd.DW3.Curpicisi = 0;
cmd.DW4.SampleAdaptiveOffsetEnabledFlag = params->bSAOEnable;
cmd.DW4.PcmEnabledFlag = 0; // Not supported in CNL
cmd.DW4.CuQpDeltaEnabledFlag = hevcPicParams->cu_qp_delta_enabled_flag; // In VDENC mode, this field should always be set to 1.
cmd.DW4.DiffCuQpDeltaDepthOrNamedAsMaxDqpDepth = hevcPicParams->diff_cu_qp_delta_depth;
cmd.DW4.PcmLoopFilterDisableFlag = hevcSeqParams->pcm_loop_filter_disable_flag;
cmd.DW4.ConstrainedIntraPredFlag = 0;
cmd.DW4.Log2ParallelMergeLevelMinus2 = 0;
cmd.DW4.SignDataHidingFlag = 0; // currently not supported in encoder
cmd.DW4.LoopFilterAcrossTilesEnabledFlag = 0;
cmd.DW4.EntropyCodingSyncEnabledFlag = 0; // not supported as per Dimas notes. PAK restriction
cmd.DW4.TilesEnabledFlag = 0; // not supported in encoder
cmd.DW4.WeightedPredFlag = hevcPicParams->weighted_pred_flag;
cmd.DW4.WeightedBipredFlag = hevcPicParams->weighted_bipred_flag;
cmd.DW4.Fieldpic = 0;
cmd.DW4.Bottomfield = 0;
cmd.DW4.AmpEnabledFlag = hevcSeqParams->amp_enabled_flag;
cmd.DW4.TransquantBypassEnableFlag = hevcPicParams->transquant_bypass_enabled_flag;
cmd.DW4.StrongIntraSmoothingEnableFlag = hevcSeqParams->strong_intra_smoothing_enable_flag;
cmd.DW4.CuPacketStructure = 0; // output from HW VME, 1/2 CL per CU
cmd.DW4.ConstrainedIntraPredFlag = hevcPicParams->constrained_intra_pred_flag;
cmd.DW5.PicCbQpOffset = hevcPicParams->pps_cb_qp_offset & 0x1f;
cmd.DW5.PicCrQpOffset = hevcPicParams->pps_cr_qp_offset & 0x1f;
cmd.DW5.MaxTransformHierarchyDepthIntraOrNamedAsTuMaxDepthIntra = hevcSeqParams->max_transform_hierarchy_depth_intra;
cmd.DW5.MaxTransformHierarchyDepthInterOrNamedAsTuMaxDepthInter = hevcSeqParams->max_transform_hierarchy_depth_inter;
cmd.DW5.PcmSampleBitDepthChromaMinus1 = hevcSeqParams->pcm_sample_bit_depth_chroma_minus1;
cmd.DW5.PcmSampleBitDepthLumaMinus1 = hevcSeqParams->pcm_sample_bit_depth_luma_minus1;
cmd.DW5.BitDepthChromaMinus8 = hevcSeqParams->bit_depth_chroma_minus8;
cmd.DW5.BitDepthLumaMinus8 = hevcSeqParams->bit_depth_luma_minus8;
cmd.DW6.LcuMaxBitsizeAllowed = hevcPicParams->LcuMaxBitsizeAllowed;
cmd.DW6.Nonfirstpassflag = 0; // needs to be updated for HEVC VDEnc
cmd.DW6.LcumaxbitstatusenLcumaxsizereportmask = 0;
cmd.DW6.FrameszoverstatusenFramebitratemaxreportmask = 0;
cmd.DW6.FrameszunderstatusenFramebitrateminreportmask = 0;
cmd.DW6.LoadSlicePointerFlag = 0; // must be set to 0 for encoder
cmd.DW19.RdoqEnable = params->bHevcRdoqEnabled;
//only 420 format support SSE in DP encode
cmd.DW19.SseEnable = params->bUseVDEnc || params->sseEnabledInVmeEncode;
// only for VDEnc
cmd.DW19.RhodomainRateControlEnable = params->bUseVDEnc || params->rhodomainRCEnable; // DW19[6]
// RhoDomainFrameLevelQP: This QP is used for RhoDomain Frame level statistics.
cmd.DW19.Rhodomainframelevelqp = cmd.DW19.RhodomainRateControlEnable ? hevcPicParams->QpY : 0; // DW19[13:8]
cmd.DW19.FractionalQpAdjustmentEnable = params->bUseVDEnc; // DW19[17]
cmd.DW19.FirstSliceSegmentInPicFlag = 1;
cmd.DW19.Nalunittypeflag = 0;
// For HEVC VDEnc Dynamic Slice Control
if (hevcSeqParams->SliceSizeControl == 1)
{
cmd.DW19.PakDynamicSliceModeEnable = 1;
cmd.DW19.SlicePicParameterSetId = hevcPicParams->slice_pic_parameter_set_id;
cmd.DW19.Nalunittypeflag = (hevcPicParams->nal_unit_type >= HEVC_NAL_UT_BLA_W_LP) &&
(hevcPicParams->nal_unit_type <= HEVC_NAL_UT_RSV_IRAP_VCL23);
cmd.DW19.FirstSliceSegmentInPicFlag = 1;
cmd.DW19.NoOutputOfPriorPicsFlag = hevcPicParams->no_output_of_prior_pics_flag;
cmd.DW21.SliceSizeThresholdInBytes = hevcPicParams->MaxSliceSizeInBytes; // HuC FW is expected to update this
cmd.DW22.TargetSliceSizeInBytes = hevcPicParams->MaxSliceSizeInBytes;
}
cmd.DW4.TilesEnabledFlag = hevcPicParams->tiles_enabled_flag;
cmd.DW2.ChromaSubsampling = hevcSeqParams->chroma_format_idc;
cmd.DW4.LoopFilterAcrossTilesEnabledFlag = hevcPicParams->loop_filter_across_tiles_flag;
// Disable HEVC RDOQ for Intra blocks
cmd.DW20.Intratucountbasedrdoqdisable = params->bRDOQIntraTUDisable;
//cmd.DW37.Rdoqintratuthreshold = params->wRDOQIntraTUThreshold;
// new command for GEN12 to enable SCC
// DW34
cmd.DW34.IntraBoundaryFilteringDisabledFlag = hevcSeqParams->intra_boundary_filtering_disabled_flag;
cmd.DW34.MotionVectorResolutionControlIdc = hevcSeqParams->motion_vector_resolution_control_idc;
cmd.DW34.PpsCurrPicRefEnabledFlag = hevcPicParams->pps_curr_pic_ref_enabled_flag;
cmd.DW34.IbcMotionCompensationBufferReferenceIdc = paramsG12->ucRecNotFilteredID;
// DW35
// Enable both TBC and LBC by default, refine later
cmd.DW35.IbcConfiguration = hevcPicParams->pps_curr_pic_ref_enabled_flag ?
paramsG12->IBCControl :
HCP_PIC_STATE_IBC_CONFIGURATION_IN_VDENC_MODE_UNNAMED0;
// Enable palette mode
cmd.DW35.PaletteModeEnabledFlag = hevcSeqParams->palette_mode_enabled_flag;
cmd.DW35.MonochromePaletteFlag = 0; //Encoder does not support this
cmd.DW35.PaletteMaxSize = hevcSeqParams->palette_mode_enabled_flag ? 64 : 0; // Encoder only supports default value
cmd.DW35.DeltaPaletteMaxPredictorSize = hevcSeqParams->palette_mode_enabled_flag ? 32 : 0; // Encoder only supports default value
cmd.DW35.LumaBitDepthEntryMinus8 = hevcSeqParams->bit_depth_luma_minus8;
cmd.DW35.ChromaBitDepthEntryMinus8 = hevcSeqParams->bit_depth_chroma_minus8;
// Enable Partial Frame Update
cmd.DW19.PartialFrameUpdateMode = paramsG12->PartialFrameUpdateEnable ? 1 : 0;
cmd.DW19.TemporalMvPredDisable = !hevcSeqParams->sps_temporal_mvp_enable_flag;
if (cmd.DW19.PartialFrameUpdateMode)
{
cmd.DW19.TemporalMvPredDisable = 1;
}
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, batchBuffer, &cmd, sizeof(cmd)));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpTileStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_TILE_STATE params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(params);
MHW_MI_CHK_NULL(params->pTileColWidth);
MHW_MI_CHK_NULL(params->pTileRowHeight);
mhw_vdbox_hcp_g12_X::HCP_TILE_STATE_CMD cmd;
auto hevcPicParams = params->pHevcPicParams;
MHW_CHK_COND(hevcPicParams->num_tile_rows_minus1 >= HEVC_NUM_MAX_TILE_ROW, "num_tile_rows_minus1 is out of range!");
MHW_CHK_COND(hevcPicParams->num_tile_columns_minus1 >= HEVC_NUM_MAX_TILE_COLUMN, "num_tile_columns_minus1 is out of range!");
cmd.DW1.Numtilecolumnsminus1 = hevcPicParams->num_tile_columns_minus1;
cmd.DW1.Numtilerowsminus1 = hevcPicParams->num_tile_rows_minus1;
uint32_t column = hevcPicParams->num_tile_columns_minus1 + 1;
uint32_t lastDwEleNum = column % 4;
uint32_t count = column / 4;
for (uint8_t i = 0; i < 5; i++)
{
cmd.CtbColumnPositionOfTileColumn[i].DW0.Value = 0;
}
for (uint8_t i = 0; i < 6; i++)
{
cmd.CtbRowPositionOfTileRow[i].DW0.Value = 0;
}
cmd.CtbColumnPositionMsb.DW0.Value = 0;
cmd.CtbColumnPositionMsb.DW1.Value = 0;
cmd.CtbRowPositionMsb.DW0.Value = 0;
cmd.CtbRowPositionMsb.DW1.Value = 0;
uint32_t colCumulativeValue = 0;
uint32_t rowCumulativeValue = 0;
// Column Position
for (uint32_t i = 0; i < count; i++)
{
uint32_t &CtbColumnMsbValue = ((i << 3) >> 5) == 0 ? cmd.CtbColumnPositionMsb.DW0.Value : cmd.CtbColumnPositionMsb.DW1.Value;
cmd.CtbColumnPositionOfTileColumn[i].DW0.Ctbpos0I = colCumulativeValue & 0xFF;//lower 8bits
CtbColumnMsbValue = CtbColumnMsbValue |
(((colCumulativeValue >> 8) & 0x3) << ((i * 8) + 0));//MSB 2bits
colCumulativeValue += params->pTileColWidth[4 * i];
cmd.CtbColumnPositionOfTileColumn[i].DW0.Ctbpos1I = colCumulativeValue & 0xFF;//lower 8bits
CtbColumnMsbValue = CtbColumnMsbValue |
(((colCumulativeValue >> 8) & 0x3) << ((i * 8) + 2));//MSB 2bits
colCumulativeValue += params->pTileColWidth[4 * i + 1];
cmd.CtbColumnPositionOfTileColumn[i].DW0.Ctbpos2I = colCumulativeValue & 0xFF;//lower 8bits
CtbColumnMsbValue = CtbColumnMsbValue |
(((colCumulativeValue >> 8) & 0x3) << ((i * 8) + 4));//MSB 2bits
colCumulativeValue += params->pTileColWidth[4 * i + 2];
cmd.CtbColumnPositionOfTileColumn[i].DW0.Ctbpos3I = colCumulativeValue & 0xFF;//lower 8bits
CtbColumnMsbValue = CtbColumnMsbValue |
(((colCumulativeValue >> 8) & 0x3) << ((i * 8) + 6));//MSB 2bits
colCumulativeValue += params->pTileColWidth[4 * i + 3];
}
if (lastDwEleNum)
{
uint32_t i = count;
uint32_t &CtbColumnMsbValue = ((i << 3) >> 5) == 0 ? cmd.CtbColumnPositionMsb.DW0.Value : cmd.CtbColumnPositionMsb.DW1.Value;
if(i < 5)
{
cmd.CtbColumnPositionOfTileColumn[i].DW0.Ctbpos0I = colCumulativeValue & 0xFF;//lower 8bits
CtbColumnMsbValue = CtbColumnMsbValue |
(((colCumulativeValue >> 8) & 0x3) << ((i * 8) + 0));//MSB 2bits
if (lastDwEleNum > 1)
{
colCumulativeValue += params->pTileColWidth[4 * i];
cmd.CtbColumnPositionOfTileColumn[i].DW0.Ctbpos1I = colCumulativeValue & 0xFF;//lower 8bits
CtbColumnMsbValue = CtbColumnMsbValue |
(((colCumulativeValue >> 8) & 0x3) << ((i * 8) + 2));//MSB 2bits
if (lastDwEleNum > 2)
{
colCumulativeValue += params->pTileColWidth[4 * i + 1];
cmd.CtbColumnPositionOfTileColumn[i].DW0.Ctbpos2I = colCumulativeValue & 0xFF;//lower 8bits
CtbColumnMsbValue = CtbColumnMsbValue |
(((colCumulativeValue >> 8) & 0x3) << ((i * 8) + 4));//MSB 2bits
}
}
}
}
// Row Postion
uint32_t row = hevcPicParams->num_tile_rows_minus1 + 1;
lastDwEleNum = row % 4;
count = row / 4;
for (uint32_t i = 0; i < count; i++)
{
uint32_t &CtbRowMsbValue = ((i << 3) >> 5) == 0 ? cmd.CtbRowPositionMsb.DW0.Value : cmd.CtbRowPositionMsb.DW1.Value;
cmd.CtbRowPositionOfTileRow[i].DW0.Ctbpos0I = rowCumulativeValue & 0xFF;//lower 8bits
CtbRowMsbValue = CtbRowMsbValue |
(((rowCumulativeValue >> 8) & 0x3) << ((i * 8) + 0));//MSB 2bits
rowCumulativeValue += params->pTileRowHeight[4 * i];
cmd.CtbRowPositionOfTileRow[i].DW0.Ctbpos1I = rowCumulativeValue & 0xFF;//lower 8bits
CtbRowMsbValue = CtbRowMsbValue |
(((rowCumulativeValue >> 8) & 0x3) << ((i * 8) + 2));//MSB 2bits
rowCumulativeValue += params->pTileRowHeight[4 * i + 1];
cmd.CtbRowPositionOfTileRow[i].DW0.Ctbpos2I = rowCumulativeValue & 0xFF;//lower 8bits
CtbRowMsbValue = CtbRowMsbValue |
(((rowCumulativeValue >> 8) & 0x3) << ((i * 8) + 4));//MSB 2bits
rowCumulativeValue += params->pTileRowHeight[4 * i + 2];
cmd.CtbRowPositionOfTileRow[i].DW0.Ctbpos3I = rowCumulativeValue & 0xFF;//lower 8bits
CtbRowMsbValue = CtbRowMsbValue |
(((rowCumulativeValue >> 8) & 0x3) << ((i * 8) + 6));//MSB 2bits
rowCumulativeValue += params->pTileRowHeight[4 * i + 3];
}
if (lastDwEleNum)
{
uint32_t i = count;
uint32_t &CtbRowMsbValue = ((i << 3) >> 5) == 0 ? cmd.CtbRowPositionMsb.DW0.Value : cmd.CtbRowPositionMsb.DW1.Value;
if(i < 6)
{
cmd.CtbRowPositionOfTileRow[i].DW0.Ctbpos0I = rowCumulativeValue & 0xFF;//lower 8bits
CtbRowMsbValue = CtbRowMsbValue |
(((rowCumulativeValue >> 8) & 0x3) << ((i * 8) + 0));//MSB 2bits
if (lastDwEleNum > 1)
{
rowCumulativeValue += params->pTileRowHeight[4 * i];
cmd.CtbRowPositionOfTileRow[i].DW0.Ctbpos1I = rowCumulativeValue & 0xFF;//lower 8bits
CtbRowMsbValue = CtbRowMsbValue |
(((rowCumulativeValue >> 8) & 0x3) << ((i * 8) + 2));//MSB 2bits
if (lastDwEleNum > 2)
{
rowCumulativeValue += params->pTileRowHeight[4 * i + 1];
cmd.CtbRowPositionOfTileRow[i].DW0.Ctbpos2I = rowCumulativeValue & 0xFF;//lower 8bits
CtbRowMsbValue = CtbRowMsbValue |
(((rowCumulativeValue >> 8) & 0x3) << ((i * 8) + 4));//MSB 2bits
}
}
}
}
MHW_MI_CHK_STATUS(Mos_AddCommand(cmdBuffer, &cmd, sizeof(cmd)));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpRefIdxStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_HEVC_REF_IDX_PARAMS params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(params);
mhw_vdbox_hcp_g12_X::HCP_REF_IDX_STATE_CMD *cmd = nullptr;
if (cmdBuffer)
{
cmd = (mhw_vdbox_hcp_g12_X::HCP_REF_IDX_STATE_CMD*)cmdBuffer->pCmdPtr;
}
MHW_MI_CHK_STATUS(MhwVdboxHcpInterfaceGeneric<mhw_vdbox_hcp_g12_X>::AddHcpRefIdxStateCmd(cmdBuffer, batchBuffer, params));
if (!m_decodeInUse)
{
// For SCC
auto paramsG12 = dynamic_cast<PMHW_VDBOX_HEVC_REF_IDX_PARAMS_G12>(params);
MHW_MI_CHK_NULL(paramsG12);
if (paramsG12->bIBCEnabled && (0 == params->ucList) && (cmd != nullptr))
{
MHW_ASSERT(paramsG12->ucRecNotFilteredID < CODECHAL_MAX_CUR_NUM_REF_FRAME_HEVC);
cmd->DW1.NumRefIdxLRefpiclistnumActiveMinus1++;
cmd->Entries[params->ucNumRefForList].DW0.ListEntryLxReferencePictureFrameIdRefaddr07 = paramsG12->ucRecNotFilteredID;
cmd->Entries[params->ucNumRefForList].DW0.ReferencePictureTbValue = 0;
cmd->Entries[params->ucNumRefForList].DW0.Longtermreference = true;
cmd->Entries[params->ucNumRefForList].DW0.FieldPicFlag = 0;
cmd->Entries[params->ucNumRefForList].DW0.BottomFieldFlag = 0;
}
}
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpWeightOffsetStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_HEVC_WEIGHTOFFSET_PARAMS params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(params);
mhw_vdbox_hcp_g12_X::HCP_WEIGHTOFFSET_STATE_CMD cmd;
uint8_t i = 0;
uint8_t refIdx = 0;
cmd.DW1.Refpiclistnum = i = params->ucList;
// Luma
for (refIdx = 0; refIdx < CODEC_MAX_NUM_REF_FRAME_HEVC; refIdx++)
{
cmd.Lumaoffsets[refIdx].DW0.DeltaLumaWeightLxI = params->LumaWeights[i][refIdx];
cmd.Lumaoffsets[refIdx].DW0.LumaOffsetLxI = (char)(params->LumaOffsets[i][refIdx] & 0xFF);//lower 8bits
cmd.Lumaoffsets[refIdx].DW0.LumaOffsetLxIMsbyte = (char)((params->LumaOffsets[i][refIdx] >> 8) & 0xFF);//MSB 8bits
}
// Chroma
for (refIdx = 0; refIdx < CODEC_MAX_NUM_REF_FRAME_HEVC; refIdx++)
{
//Cb
cmd.Chromaoffsets[refIdx].DW0.DeltaChromaWeightLxI0 = params->ChromaWeights[i][refIdx][0];
cmd.Chromaoffsets[refIdx].DW0.ChromaoffsetlxI0 = (char)(params->ChromaOffsets[i][refIdx][0] & 0xFF);//lower 8bits
//Cr
cmd.Chromaoffsets[refIdx].DW0.DeltaChromaWeightLxI1 = params->ChromaWeights[i][refIdx][1];
cmd.Chromaoffsets[refIdx].DW0.ChromaoffsetlxI1 = (char)(params->ChromaOffsets[i][refIdx][1] & 0xFF);//lower 8bits
}
for (refIdx = 0; refIdx < CODEC_MAX_NUM_REF_FRAME_HEVC - 1; refIdx += 2)//MSB 8bits
{
cmd.Chromaoffsetsext[refIdx >> 1].DW0.ChromaoffsetlxI0Msbyte = (char)((params->ChromaOffsets[i][refIdx][0] >> 8) & 0xFF);
cmd.Chromaoffsetsext[refIdx >> 1].DW0.ChromaoffsetlxI10Msbyte = (char)((params->ChromaOffsets[i][refIdx + 1][0] >> 8) & 0xFF);
cmd.Chromaoffsetsext[refIdx >> 1].DW0.ChromaoffsetlxI1Msbyte = (char)((params->ChromaOffsets[i][refIdx][1] >> 8) & 0xFF);
cmd.Chromaoffsetsext[refIdx >> 1].DW0.ChromaoffsetlxI11Msbyte = (char)((params->ChromaOffsets[i][refIdx + 1][1] >> 8) & 0xFF);
}
//last one
cmd.Chromaoffsetsext[refIdx >> 1].DW0.ChromaoffsetlxI0Msbyte = (char)((params->ChromaOffsets[i][refIdx][0] >> 8) & 0xFF);//MSB 8bits
cmd.Chromaoffsetsext[refIdx >> 1].DW0.ChromaoffsetlxI1Msbyte = (char)((params->ChromaOffsets[i][refIdx][1] >> 8) & 0xFF);//MSB 8bits
if (cmdBuffer == nullptr && batchBuffer == nullptr)
{
MHW_ASSERTMESSAGE("There was no valid buffer to add the HW command to.");
}
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, batchBuffer, &cmd, sizeof(cmd)));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpFqmStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_QM_PARAMS params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(cmdBuffer);
MHW_MI_CHK_NULL(params);
mhw_vdbox_hcp_g12_X::HCP_FQM_STATE_CMD cmd;
if (params->Standard == CODECHAL_HEVC)
{
MHW_MI_CHK_NULL(params->pHevcIqMatrix);
auto iqMatrix = params->pHevcIqMatrix;
uint16_t *fqMatrix = (uint16_t*)cmd.Quantizermatrix;
/* 4x4 */
for (uint8_t i = 0; i < 32; i++)
{
cmd.Quantizermatrix[i] = 0;
}
for (uint8_t intraInter = 0; intraInter <= 1; intraInter++)
{
cmd.DW1.IntraInter = intraInter;
cmd.DW1.Sizeid = 0;
cmd.DW1.ColorComponent = 0;
for (uint8_t i = 0; i < 16; i++)
{
fqMatrix[i] =
GetReciprocalScalingValue(iqMatrix->List4x4[3 * intraInter][i]);
}
MHW_MI_CHK_STATUS(Mos_AddCommand(cmdBuffer, &cmd, cmd.byteSize));
}
/* 8x8, 16x16 and 32x32 */
for (uint8_t i = 0; i < 32; i++)
{
cmd.Quantizermatrix[i] = 0;
}
for (uint8_t intraInter = 0; intraInter <= 1; intraInter++)
{
cmd.DW1.IntraInter = intraInter;
cmd.DW1.Sizeid = 1;
cmd.DW1.ColorComponent = 0;
for (uint8_t i = 0; i < 64; i++)
{
fqMatrix[i] =
GetReciprocalScalingValue(iqMatrix->List8x8[3 * intraInter][i]);
}
MHW_MI_CHK_STATUS(Mos_AddCommand(cmdBuffer, &cmd, cmd.byteSize));
}
/* 16x16 DC */
for (uint8_t i = 0; i < 32; i++)
{
cmd.Quantizermatrix[i] = 0;
}
for (uint8_t intraInter = 0; intraInter <= 1; intraInter++)
{
cmd.DW1.IntraInter = intraInter;
cmd.DW1.Sizeid = 2;
cmd.DW1.ColorComponent = 0;
cmd.DW1.FqmDcValue1Dc = GetReciprocalScalingValue(iqMatrix->ListDC16x16[3 * intraInter]);
for (uint8_t i = 0; i < 64; i++)
{
fqMatrix[i] =
GetReciprocalScalingValue(iqMatrix->List16x16[3 * intraInter][i]);
}
MHW_MI_CHK_STATUS(Mos_AddCommand(cmdBuffer, &cmd, cmd.byteSize));
}
/* 32x32 DC */
for (uint8_t i = 0; i < 32; i++)
{
cmd.Quantizermatrix[i] = 0;
}
for (uint8_t intraInter = 0; intraInter <= 1; intraInter++)
{
cmd.DW1.IntraInter = intraInter;
cmd.DW1.Sizeid = 3;
cmd.DW1.ColorComponent = 0;
cmd.DW1.FqmDcValue1Dc = GetReciprocalScalingValue(iqMatrix->ListDC32x32[intraInter]);
for (uint8_t i = 0; i < 64; i++)
{
fqMatrix[i] =
GetReciprocalScalingValue(iqMatrix->List32x32[intraInter][i]);
}
MHW_MI_CHK_STATUS(Mos_AddCommand(cmdBuffer, &cmd, cmd.byteSize));
}
}
else
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
}
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpDecodeSliceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(hevcSliceState);
auto hevcSliceStateG12 = dynamic_cast<PMHW_VDBOX_HEVC_SLICE_STATE_G12>(hevcSliceState);
MHW_MI_CHK_NULL(hevcSliceStateG12);
MHW_MI_CHK_NULL(hevcSliceStateG12->pHevcPicParams);
MHW_MI_CHK_NULL(hevcSliceStateG12->pHevcSliceParams);
auto hevcSliceParams = hevcSliceStateG12->pHevcSliceParams;
auto hevcExtSliceParams = hevcSliceStateG12->pHevcExtSliceParams;
auto hevcPicParams = hevcSliceStateG12->pHevcPicParams;
auto hevcExtPicParams = hevcSliceStateG12->pHevcExtPicParam;
auto hevcSccPicParams = hevcSliceStateG12->pHevcSccPicParam;
uint32_t ctbSize = 1 << (hevcPicParams->log2_diff_max_min_luma_coding_block_size +
hevcPicParams->log2_min_luma_coding_block_size_minus3 + 3);
uint32_t widthInPix = (1 << (hevcPicParams->log2_min_luma_coding_block_size_minus3 + 3)) *
(hevcPicParams->PicWidthInMinCbsY);
uint32_t widthInCtb = MOS_ROUNDUP_DIVIDE(widthInPix, ctbSize);
mhw_vdbox_hcp_g12_X::HCP_SLICE_STATE_CMD *cmd =
(mhw_vdbox_hcp_g12_X::HCP_SLICE_STATE_CMD*)cmdBuffer->pCmdPtr;
MHW_MI_CHK_STATUS(MhwVdboxHcpInterfaceGeneric<mhw_vdbox_hcp_g12_X>::AddHcpDecodeSliceStateCmd(cmdBuffer, hevcSliceStateG12));
int32_t sliceQP = hevcSliceParams->slice_qp_delta + hevcPicParams->init_qp_minus26 + 26;
cmd->DW3.SliceqpSignFlag = (sliceQP >= 0) ? 0 : 1;
cmd->DW3.Sliceqp = ABS(sliceQP);
if (hevcSliceStateG12->bTileInSlice)
{
cmd->DW1.SlicestartctbxOrSliceStartLcuXEncoder = hevcSliceStateG12->u16TileCtbX;
cmd->DW1.SlicestartctbyOrSliceStartLcuYEncoder = hevcSliceStateG12->u16TileCtbY;
if (hevcSliceState->bLastSlice)
{
cmd->DW2.NextslicestartctbxOrNextSliceStartLcuXEncoder = 0;
cmd->DW2.NextslicestartctbyOrNextSliceStartLcuYEncoder = 0;
}
else
{
cmd->DW2.NextslicestartctbxOrNextSliceStartLcuXEncoder = hevcSliceStateG12->u16NextTileCtbX;
cmd->DW2.NextslicestartctbyOrNextSliceStartLcuYEncoder = hevcSliceStateG12->u16NextTileCtbY;
}
}
else
{
cmd->DW1.SlicestartctbxOrSliceStartLcuXEncoder = hevcSliceParams->slice_segment_address % widthInCtb;
cmd->DW1.SlicestartctbyOrSliceStartLcuYEncoder = hevcSliceParams->slice_segment_address / widthInCtb;
}
if (hevcExtPicParams && hevcExtSliceParams)
{
// DW3[23]
if (hevcExtPicParams->PicRangeExtensionFlags.fields.chroma_qp_offset_list_enabled_flag)
{
cmd->DW3.CuChromaQpOffsetEnabledFlag = hevcExtSliceParams->cu_chroma_qp_offset_enabled_flag;
}
}
// DW3[24:25]
cmd->DW3.Lastsliceoftile = hevcSliceStateG12->bLastSliceInTile;
cmd->DW3.Lastsliceoftilecolumn = hevcSliceStateG12->bLastSliceInTileColumn;
if (hevcSliceStateG12->bTileInSlice)
{
cmd->DW5.Sliceheaderlength = hevcSliceStateG12->u16SliceHeaderLength;
cmd->DW7.DependentSliceDueToTileSplit = hevcSliceStateG12->bIsNotFirstTile;
}
else
{
cmd->DW5.Sliceheaderlength = hevcSliceParams->ByteOffsetToSliceData;
}
// Rounding control is not used for decode
cmd->DW6.Value = 0;
if ((hevcSliceState->dwSliceIndex == 0) || !cmd->DW3.DependentSliceFlag)
{
cmd->DW11.Originalslicestartctbx = hevcSliceParams->slice_segment_address % widthInCtb;
cmd->DW11.Originalslicestartctby = hevcSliceParams->slice_segment_address / widthInCtb;
}
else
{
cmd->DW11.Originalslicestartctbx = hevcSliceStateG12->u16OrigCtbX;
cmd->DW11.Originalslicestartctby = hevcSliceStateG12->u16OrigCtbY;
}
if (hevcSccPicParams && hevcExtSliceParams)
{
if (hevcSccPicParams->PicSCCExtensionFlags.fields.pps_slice_act_qp_offsets_present_flag)
{
// DW12
cmd->DW12.SliceActYQpOffset = hevcExtSliceParams->slice_act_y_qp_offset;
cmd->DW12.SliceActCbQpOffset = hevcExtSliceParams->slice_act_cb_qp_offset;
cmd->DW12.SliceActCrQpOffset = hevcExtSliceParams->slice_act_cr_qp_offset;
}
cmd->DW12.UseIntegerMvFlag = hevcExtSliceParams->use_integer_mv_flag;
}
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpEncodeSliceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(hevcSliceState);
MHW_MI_CHK_NULL(hevcSliceState->pEncodeHevcSliceParams);
MHW_MI_CHK_NULL(hevcSliceState->pEncodeHevcPicParams);
MHW_MI_CHK_NULL(hevcSliceState->pEncodeHevcSeqParams);
mhw_vdbox_hcp_g12_X::HCP_SLICE_STATE_CMD cmd;
MOS_COMMAND_BUFFER constructedCmdBuf;
auto hevcSliceParams = hevcSliceState->pEncodeHevcSliceParams;
auto hevcPicParams = hevcSliceState->pEncodeHevcPicParams;
auto hevcSeqParams = hevcSliceState->pEncodeHevcSeqParams;
uint32_t ctbSize = 1 << (hevcSeqParams->log2_max_coding_block_size_minus3 + 3);
uint32_t widthInPix = (1 << (hevcSeqParams->log2_min_coding_block_size_minus3 + 3)) *
(hevcSeqParams->wFrameWidthInMinCbMinus1 + 1);
uint32_t widthInCtb = (widthInPix / ctbSize) +
((widthInPix % ctbSize) ? 1 : 0); // round up
uint32_t ctbAddr = hevcSliceParams->slice_segment_address;
cmd.DW1.SlicestartctbxOrSliceStartLcuXEncoder = ctbAddr % widthInCtb;
cmd.DW1.SlicestartctbyOrSliceStartLcuYEncoder = ctbAddr / widthInCtb;
if (hevcSliceState->bLastSlice)
{
cmd.DW2.NextslicestartctbxOrNextSliceStartLcuXEncoder = 0;
cmd.DW2.NextslicestartctbyOrNextSliceStartLcuYEncoder = 0;
}
else
{
ctbAddr = hevcSliceParams->slice_segment_address + hevcSliceParams->NumLCUsInSlice;
cmd.DW2.NextslicestartctbxOrNextSliceStartLcuXEncoder = ctbAddr % widthInCtb;
cmd.DW2.NextslicestartctbyOrNextSliceStartLcuYEncoder = ctbAddr / widthInCtb;
}
cmd.DW3.SliceType = hevcSliceParams->slice_type;
cmd.DW3.Lastsliceofpic = hevcSliceState->bLastSlice;
cmd.DW3.SliceqpSignFlag = ((hevcSliceParams->slice_qp_delta + hevcPicParams->QpY) >= 0)
? 0 : 1; //8 bit will have 0 as sign bit adn 10 bit might have 1 as sign bit depending on Qp
cmd.DW3.DependentSliceFlag = 0; // Not supported on encoder
cmd.DW3.SliceTemporalMvpEnableFlag = hevcSliceParams->slice_temporal_mvp_enable_flag;
if (hevcPicParams->CodingType == I_TYPE)
{
cmd.DW3.SliceTemporalMvpEnableFlag = 0;
}
cmd.DW3.Sliceqp = abs(hevcSliceParams->slice_qp_delta + hevcPicParams->QpY);
cmd.DW3.SliceCbQpOffset = hevcSliceParams->slice_cb_qp_offset;
cmd.DW3.SliceCbQpOffset = hevcSliceParams->slice_cr_qp_offset;
cmd.DW3.Intrareffetchdisable = hevcSliceState->bIntraRefFetchDisable;
cmd.DW4.SliceHeaderDisableDeblockingFilterFlag = hevcSliceState->DeblockingFilterDisable;//hevcSliceParams->slice_deblocking_filter_disable_flag;
cmd.DW4.SliceTcOffsetDiv2OrFinalTcOffsetDiv2Encoder = hevcSliceState->TcOffsetDiv2;//hevcSliceParams->tc_offset_div2;
cmd.DW4.SliceBetaOffsetDiv2OrFinalBetaOffsetDiv2Encoder = hevcSliceState->BetaOffsetDiv2;//hevcSliceParams->beta_offset_div2;
cmd.DW4.SliceLoopFilterAcrossSlicesEnabledFlag = 0;
cmd.DW4.SliceSaoChromaFlag = hevcSliceState->bSaoChromaFlag;
cmd.DW4.SliceSaoLumaFlag = hevcSliceState->bSaoLumaFlag;
cmd.DW4.MvdL1ZeroFlag = 0; // Decoder only - set to 0 for encoder
cmd.DW4.Islowdelay = hevcSliceState->bIsLowDelay;
cmd.DW4.CollocatedFromL0Flag = hevcSliceParams->collocated_from_l0_flag;
cmd.DW4.Chromalog2Weightdenom = (hevcPicParams->weighted_pred_flag || hevcPicParams->weighted_bipred_flag) ?
(hevcPicParams->bEnableGPUWeightedPrediction ? 6 : hevcSliceParams->luma_log2_weight_denom + hevcSliceParams->delta_chroma_log2_weight_denom) : 0;
cmd.DW4.LumaLog2WeightDenom = (hevcPicParams->weighted_pred_flag || hevcPicParams->weighted_bipred_flag) ?
(hevcPicParams->bEnableGPUWeightedPrediction ? 6 : hevcSliceParams->luma_log2_weight_denom) : 0;
cmd.DW4.CabacInitFlag = hevcSliceParams->cabac_init_flag;
cmd.DW4.Maxmergeidx = hevcSliceParams->MaxNumMergeCand - 1;
if (cmd.DW3.SliceTemporalMvpEnableFlag)
{
if (cmd.DW3.SliceType == cmd.SLICE_TYPE_I_SLICE)
{
cmd.DW4.Collocatedrefidx = 0;
}
else
{
// need to check with Ce for DDI issues
uint8_t collocatedFromL0Flag = cmd.DW4.CollocatedFromL0Flag;
uint8_t collocatedRefIndex = hevcPicParams->CollocatedRefPicIndex;
MHW_ASSERT(collocatedRefIndex < CODEC_MAX_NUM_REF_FRAME_HEVC);
uint8_t collocatedFrameIdx = hevcSliceState->pRefIdxMapping[collocatedRefIndex];
MHW_ASSERT(collocatedRefIndex < CODEC_MAX_NUM_REF_FRAME_HEVC);
cmd.DW4.Collocatedrefidx = collocatedFrameIdx;
}
}
else
{
cmd.DW4.Collocatedrefidx = 0;
}
cmd.DW5.Sliceheaderlength = 0; // Decoder only, setting to 0 for Encoder
// For VDENC, cabac zero word insertion is handled by HUC kernel
cmd.DW7.Cabaczerowordinsertionenable = hevcSliceState->bVdencInUse ? 0 : 1;
cmd.DW7.Emulationbytesliceinsertenable = 1;
cmd.DW7.TailInsertionEnable = hevcSliceState->bVdencInUse ? 0 :
((hevcPicParams->bLastPicInSeq || hevcPicParams->bLastPicInStream) && hevcSliceState->bLastSlice);
cmd.DW7.SlicedataEnable = 1;
cmd.DW7.HeaderInsertionEnable = 1;
cmd.DW8.IndirectPakBseDataStartOffsetWrite = hevcSliceState->dwHeaderBytesInserted;
// Transform skip related parameters
if (hevcSliceState->EncodeHevcTransformSkipParams.Transformskip_enabled)
{
cmd.DW9.TransformskipLambda = hevcSliceState->EncodeHevcTransformSkipParams.Transformskip_lambda;
cmd.DW10.TransformskipNumzerocoeffsFactor0 = hevcSliceState->EncodeHevcTransformSkipParams.Transformskip_Numzerocoeffs_Factor0;
cmd.DW10.TransformskipNumnonzerocoeffsFactor0 = hevcSliceState->EncodeHevcTransformSkipParams.Transformskip_Numnonzerocoeffs_Factor0;
cmd.DW10.TransformskipNumzerocoeffsFactor1 = hevcSliceState->EncodeHevcTransformSkipParams.Transformskip_Numzerocoeffs_Factor1;
cmd.DW10.TransformskipNumnonzerocoeffsFactor1 = hevcSliceState->EncodeHevcTransformSkipParams.Transformskip_Numnonzerocoeffs_Factor1;
}
if (hevcSliceState->bLastSlice)
{
cmd.DW2.NextslicestartctbxOrNextSliceStartLcuXEncoder = 0;
cmd.DW2.NextslicestartctbyOrNextSliceStartLcuYEncoder = 0;
}
else
{
if(hevcPicParams->tiles_enabled_flag)
{
// when tile is enabled, need to consider if slice is within one tile
cmd.DW2.NextslicestartctbxOrNextSliceStartLcuXEncoder = hevcSliceParams[1].slice_segment_address % widthInCtb;
cmd.DW2.NextslicestartctbyOrNextSliceStartLcuYEncoder = hevcSliceParams[1].slice_segment_address / widthInCtb;
}
else
{
ctbAddr = hevcSliceParams->slice_segment_address + hevcSliceParams->NumLCUsInSlice;
cmd.DW2.NextslicestartctbxOrNextSliceStartLcuXEncoder = ctbAddr % widthInCtb;
cmd.DW2.NextslicestartctbyOrNextSliceStartLcuYEncoder = ctbAddr / widthInCtb;
}
}
cmd.DW4.SliceLoopFilterAcrossSlicesEnabledFlag = hevcPicParams->loop_filter_across_slices_flag;
cmd.DW3.Lastsliceoftile = hevcSliceState->bLastSliceInTile;
cmd.DW3.Lastsliceoftilecolumn = hevcSliceState->bLastSliceInTileColumn;
if (hevcSliceState->bVdencInUse)
{
// Currently setting to defaults used in prototype
cmd.DW6.Roundinter = 4;
cmd.DW6.Roundintra = 10;
}
else
{
cmd.DW6.Roundinter = hevcSliceState->RoundingInter;
cmd.DW6.Roundintra = hevcSliceState->RoundingIntra;
}
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, hevcSliceState->pBatchBufferForPakSlices, &cmd, sizeof(cmd)));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpPakInsertObject(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_PAK_INSERT_PARAMS params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(params);
mhw_vdbox_hcp_g12_X::HCP_PAK_INSERT_OBJECT_CMD cmd;
uint32_t dwordsUsed = cmd.dwSize;
if (params->bLastPicInSeq && params->bLastPicInStream)
{
uint32_t dwPadding[3];
dwordsUsed += sizeof(dwPadding) / sizeof(dwPadding[0]);
cmd.DW0.DwordLength = OP_LENGTH(dwordsUsed);
cmd.DW1.Headerlengthexcludefrmsize = 0;
cmd.DW1.EndofsliceflagLastdstdatainsertcommandflag = 1;
cmd.DW1.LastheaderflagLastsrcheaderdatainsertcommandflag = 1;
cmd.DW1.EmulationflagEmulationbytebitsinsertenable = 0;
cmd.DW1.SkipemulbytecntSkipEmulationByteCount = 0;
cmd.DW1.DatabitsinlastdwSrcdataendingbitinclusion50 = 16;
cmd.DW1.DatabyteoffsetSrcdatastartingbyteoffset10 = 0;
cmd.DW1.IndirectPayloadEnable = 0;
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, params->pBatchBufferForPakSlices, &cmd, cmd.byteSize));
dwPadding[0] = (uint32_t)((1 << 16) | ((HEVC_NAL_UT_EOS << 1) << 24));
dwPadding[1] = (1L | (1L << 24));
dwPadding[2] = (HEVC_NAL_UT_EOB << 1) | (1L << 8);
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, params->pBatchBufferForPakSlices, &dwPadding[0], sizeof(dwPadding)));
}
else
if (params->bLastPicInSeq || params->bLastPicInStream)
{
uint32_t dwLastPicInSeqData[2], dwLastPicInStreamData[2];
dwordsUsed += params->bLastPicInSeq * 2 + params->bLastPicInStream * 2;
cmd.DW0.DwordLength = OP_LENGTH(dwordsUsed);
cmd.DW1.Headerlengthexcludefrmsize = 0;
cmd.DW1.EndofsliceflagLastdstdatainsertcommandflag = 1;
cmd.DW1.LastheaderflagLastsrcheaderdatainsertcommandflag = 1;
cmd.DW1.EmulationflagEmulationbytebitsinsertenable = 0;
cmd.DW1.SkipemulbytecntSkipEmulationByteCount = 0;
cmd.DW1.DatabitsinlastdwSrcdataendingbitinclusion50 = 8;
cmd.DW1.DatabyteoffsetSrcdatastartingbyteoffset10 = 0;
cmd.DW1.IndirectPayloadEnable = 0;
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, params->pBatchBufferForPakSlices, &cmd, cmd.byteSize));
if (params->bLastPicInSeq)
{
dwLastPicInSeqData[0] = (uint32_t)((1 << 16) | ((HEVC_NAL_UT_EOS << 1) << 24));
dwLastPicInSeqData[1] = 1; // nuh_temporal_id_plus1
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, params->pBatchBufferForPakSlices, &dwLastPicInSeqData[0], sizeof(dwLastPicInSeqData)));
}
if (params->bLastPicInStream)
{
dwLastPicInStreamData[0] = (uint32_t)((1 << 16) | ((HEVC_NAL_UT_EOB << 1) << 24));
dwLastPicInStreamData[1] = 1; // nuh_temporal_id_plus1
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, params->pBatchBufferForPakSlices, &dwLastPicInStreamData[0], sizeof(dwLastPicInStreamData)));
}
}
else
{
uint32_t byteSize = (params->dwBitSize + 7) >> 3;
uint32_t dataBitsInLastDw = params->dwBitSize % 32;
if (dataBitsInLastDw == 0)
{
dataBitsInLastDw = 32;
}
dwordsUsed += (MOS_ALIGN_CEIL(byteSize, sizeof(uint32_t))) / sizeof(uint32_t);
cmd.DW0.DwordLength = OP_LENGTH(dwordsUsed);
cmd.DW1.Headerlengthexcludefrmsize = 0;
cmd.DW1.EndofsliceflagLastdstdatainsertcommandflag = params->bEndOfSlice;
cmd.DW1.LastheaderflagLastsrcheaderdatainsertcommandflag = params->bLastHeader;
cmd.DW1.EmulationflagEmulationbytebitsinsertenable = params->bEmulationByteBitsInsert;
cmd.DW1.SkipemulbytecntSkipEmulationByteCount = params->uiSkipEmulationCheckCount;
cmd.DW1.SliceHeaderIndicator = params->bResetBitstreamStartingPos;
cmd.DW1.DatabitsinlastdwSrcdataendingbitinclusion50 = dataBitsInLastDw;
cmd.DW1.DatabyteoffsetSrcdatastartingbyteoffset10 = 0;
cmd.DW1.IndirectPayloadEnable = 0;
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, params->pBatchBufferForPakSlices, &cmd, cmd.byteSize));
if (byteSize)
{
MHW_MI_CHK_NULL(params->pBsBuffer);
MHW_MI_CHK_NULL(params->pBsBuffer->pBase);
uint8_t *data = (uint8_t*)(params->pBsBuffer->pBase + params->dwOffset);
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, params->pBatchBufferForPakSlices, data, byteSize));
}
}
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpVp9PicStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_VP9_PIC_STATE params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_MI_CHK_NULL(params);
MHW_MI_CHK_NULL(params->pVp9PicParams);
mhw_vdbox_hcp_g12_X::HCP_VP9_PIC_STATE_CMD cmd;
auto vp9PicParams = params->pVp9PicParams;
auto vp9RefList = params->ppVp9RefList;
cmd.DW0.DwordLength = mhw_vdbox_hcp_g12_X::GetOpLength(12); //VP9_PIC_STATE command is common for both Decoder and Encoder. Decoder uses only 12 DWORDS of the generated 33 DWORDS
uint32_t curFrameWidth = vp9PicParams->FrameWidthMinus1 + 1;
uint32_t curFrameHeight = vp9PicParams->FrameHeightMinus1 + 1;
bool isScaling = (curFrameWidth == params->dwPrevFrmWidth) && (curFrameHeight == params->dwPrevFrmHeight) ? false : true;
cmd.DW1.FrameWidthInPixelsMinus1 = MOS_ALIGN_CEIL(curFrameWidth, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
cmd.DW1.FrameHeightInPixelsMinus1 = MOS_ALIGN_CEIL(curFrameHeight, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
cmd.DW2.FrameType = vp9PicParams->PicFlags.fields.frame_type;
cmd.DW2.AdaptProbabilitiesFlag = !vp9PicParams->PicFlags.fields.error_resilient_mode && !vp9PicParams->PicFlags.fields.frame_parallel_decoding_mode;
cmd.DW2.IntraonlyFlag = vp9PicParams->PicFlags.fields.intra_only;
cmd.DW2.RefreshFrameContext = vp9PicParams->PicFlags.fields.refresh_frame_context;
cmd.DW2.ErrorResilientMode = vp9PicParams->PicFlags.fields.error_resilient_mode;
cmd.DW2.FrameParallelDecodingMode = vp9PicParams->PicFlags.fields.frame_parallel_decoding_mode;
cmd.DW2.FilterLevel = vp9PicParams->filter_level;
cmd.DW2.SharpnessLevel = vp9PicParams->sharpness_level;
cmd.DW2.SegmentationEnabled = vp9PicParams->PicFlags.fields.segmentation_enabled;
cmd.DW2.SegmentationUpdateMap = cmd.DW2.SegmentationEnabled && vp9PicParams->PicFlags.fields.segmentation_update_map;
cmd.DW2.LosslessMode = vp9PicParams->PicFlags.fields.LosslessFlag;
cmd.DW2.SegmentIdStreamoutEnable = cmd.DW2.SegmentationUpdateMap;
uint8_t segmentIDStreaminEnable = 0;
if (vp9PicParams->PicFlags.fields.intra_only ||
(vp9PicParams->PicFlags.fields.frame_type == CODEC_VP9_KEY_FRAME)) {
segmentIDStreaminEnable = 1;
} else if (vp9PicParams->PicFlags.fields.segmentation_enabled) {
if (!vp9PicParams->PicFlags.fields.segmentation_update_map)
segmentIDStreaminEnable = 1;
else if (vp9PicParams->PicFlags.fields.segmentation_temporal_update)
segmentIDStreaminEnable = 1;
}
if (vp9PicParams->PicFlags.fields.error_resilient_mode) {
segmentIDStreaminEnable = 1;
}
// Resolution change will reset the segment ID buffer
if (isScaling)
{
segmentIDStreaminEnable = 1;
}
cmd.DW2.SegmentIdStreaminEnable = segmentIDStreaminEnable;
cmd.DW3.Log2TileRow = vp9PicParams->log2_tile_rows; // No need to minus 1 here.
cmd.DW3.Log2TileColumn = vp9PicParams->log2_tile_columns; // No need to minus 1 here.
if (vp9PicParams->subsampling_x == 1 && vp9PicParams->subsampling_y == 1)
{
//4:2:0
cmd.DW3.ChromaSamplingFormat = 0;
}
else if (vp9PicParams->subsampling_x == 1 && vp9PicParams->subsampling_y == 0)
{
//4:2:2
cmd.DW3.ChromaSamplingFormat = 1;
}
else if (vp9PicParams->subsampling_x == 0 && vp9PicParams->subsampling_y == 0)
{
//4:4:4
cmd.DW3.ChromaSamplingFormat = 2;
}
cmd.DW3.Bitdepthminus8 = vp9PicParams->BitDepthMinus8;
cmd.DW3.ProfileLevel = vp9PicParams->profile;
cmd.DW10.UncompressedHeaderLengthInBytes70 = vp9PicParams->UncompressedHeaderLengthInBytes;
cmd.DW10.FirstPartitionSizeInBytes150 = vp9PicParams->FirstPartitionSize;
if (vp9PicParams->PicFlags.fields.frame_type && !vp9PicParams->PicFlags.fields.intra_only)
{
PCODEC_PICTURE refFrameList = &(vp9PicParams->RefFrameList[0]);
uint8_t lastRefPicIndex = refFrameList[vp9PicParams->PicFlags.fields.LastRefIdx].FrameIdx;
uint32_t lastRefFrameWidth = vp9RefList[lastRefPicIndex]->dwFrameWidth;
uint32_t lastRefFrameHeight = vp9RefList[lastRefPicIndex]->dwFrameHeight;
uint8_t goldenRefPicIndex = refFrameList[vp9PicParams->PicFlags.fields.GoldenRefIdx].FrameIdx;
uint32_t goldenRefFrameWidth = vp9RefList[goldenRefPicIndex]->dwFrameWidth;
uint32_t goldenRefFrameHeight = vp9RefList[goldenRefPicIndex]->dwFrameHeight;
uint8_t altRefPicIndex = refFrameList[vp9PicParams->PicFlags.fields.AltRefIdx].FrameIdx;
uint32_t altRefFrameWidth = vp9RefList[altRefPicIndex]->dwFrameWidth;
uint32_t altRefFrameHeight = vp9RefList[altRefPicIndex]->dwFrameHeight;
cmd.DW2.AllowHiPrecisionMv = vp9PicParams->PicFlags.fields.allow_high_precision_mv;
cmd.DW2.McompFilterType = vp9PicParams->PicFlags.fields.mcomp_filter_type;
cmd.DW2.SegmentationTemporalUpdate = cmd.DW2.SegmentationUpdateMap && vp9PicParams->PicFlags.fields.segmentation_temporal_update;
cmd.DW2.RefFrameSignBias02 = vp9PicParams->PicFlags.fields.LastRefSignBias |
(vp9PicParams->PicFlags.fields.GoldenRefSignBias << 1) |
(vp9PicParams->PicFlags.fields.AltRefSignBias << 2);
cmd.DW2.LastFrameType = !params->PrevFrameParams.fields.KeyFrame;
// Reset UsePrevInFindMvReferences to zero if last picture has a different size,
// Current picture is error-resilient mode, Last picture was intra_only or keyframe,
// Last picture was not a displayed picture.
cmd.DW2.UsePrevInFindMvReferences =
!(vp9PicParams->PicFlags.fields.error_resilient_mode ||
params->PrevFrameParams.fields.KeyFrame ||
params->PrevFrameParams.fields.IntraOnly ||
!params->PrevFrameParams.fields.Display);
// Reset UsePrevInFindMvReferences in case of resolution change on inter frames
if (isScaling) {
cmd.DW2.UsePrevInFindMvReferences = 0;
}
cmd.DW4.HorizontalScaleFactorForLast = (lastRefFrameWidth * m_vp9ScalingFactor) / curFrameWidth;
cmd.DW4.VerticalScaleFactorForLast = (lastRefFrameHeight * m_vp9ScalingFactor) / curFrameHeight;
cmd.DW5.HorizontalScaleFactorForGolden = (goldenRefFrameWidth * m_vp9ScalingFactor) / curFrameWidth;
cmd.DW5.VerticalScaleFactorForGolden = (goldenRefFrameHeight * m_vp9ScalingFactor) / curFrameHeight;
cmd.DW6.HorizontalScaleFactorForAltref = (altRefFrameWidth * m_vp9ScalingFactor) / curFrameWidth;
cmd.DW6.VerticalScaleFactorForAltref = (altRefFrameHeight * m_vp9ScalingFactor) / curFrameHeight;
cmd.DW7.LastFrameWidthInPixelsMinus1 = lastRefFrameWidth - 1;
cmd.DW7.LastFrameHieghtInPixelsMinus1 = lastRefFrameHeight - 1;
cmd.DW8.GoldenFrameWidthInPixelsMinus1 = goldenRefFrameWidth - 1;
cmd.DW8.GoldenFrameHieghtInPixelsMinus1 = goldenRefFrameHeight - 1;
cmd.DW9.AltrefFrameWidthInPixelsMinus1 = altRefFrameWidth - 1;
cmd.DW9.AltrefFrameHieghtInPixelsMinus1 = altRefFrameHeight - 1;
}
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, batchBuffer, &cmd, cmd.byteSize));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpVp9PicStateEncCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_VP9_ENCODE_PIC_STATE params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(params);
MHW_MI_CHK_NULL(params->pVp9PicParams);
MHW_MI_CHK_NULL(params->pVp9SeqParams);
MHW_MI_CHK_NULL(params->ppVp9RefList);
mhw_vdbox_hcp_g12_X::HCP_VP9_PIC_STATE_CMD cmd;
auto vp9PicParams = params->pVp9PicParams;
auto vp9RefList = params->ppVp9RefList;
auto vp9SeqParams = params->pVp9SeqParams;
cmd.DW1.FrameWidthInPixelsMinus1 = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameWidthMinus1 + 1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
cmd.DW1.FrameHeightInPixelsMinus1 = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameHeightMinus1 + 1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
cmd.DW2.FrameType = vp9PicParams->PicFlags.fields.frame_type;
cmd.DW2.AdaptProbabilitiesFlag = !vp9PicParams->PicFlags.fields.error_resilient_mode && !vp9PicParams->PicFlags.fields.frame_parallel_decoding_mode;
cmd.DW2.IntraonlyFlag = vp9PicParams->PicFlags.fields.intra_only;
cmd.DW2.AllowHiPrecisionMv = vp9PicParams->PicFlags.fields.allow_high_precision_mv;
cmd.DW2.McompFilterType = vp9PicParams->PicFlags.fields.mcomp_filter_type;
cmd.DW2.RefFrameSignBias02 = vp9PicParams->RefFlags.fields.LastRefSignBias |
(vp9PicParams->RefFlags.fields.GoldenRefSignBias << 1) |
(vp9PicParams->RefFlags.fields.AltRefSignBias << 2);
cmd.DW2.HybridPredictionMode = vp9PicParams->PicFlags.fields.comp_prediction_mode == 2;
cmd.DW2.SelectableTxMode = params->ucTxMode == 4;
cmd.DW2.RefreshFrameContext = vp9PicParams->PicFlags.fields.refresh_frame_context;
cmd.DW2.ErrorResilientMode = vp9PicParams->PicFlags.fields.error_resilient_mode;
cmd.DW2.FrameParallelDecodingMode = vp9PicParams->PicFlags.fields.frame_parallel_decoding_mode;
cmd.DW2.FilterLevel = vp9PicParams->filter_level;
cmd.DW2.SharpnessLevel = vp9PicParams->sharpness_level;
cmd.DW2.SegmentationEnabled = vp9PicParams->PicFlags.fields.segmentation_enabled;
cmd.DW2.SegmentationUpdateMap = vp9PicParams->PicFlags.fields.segmentation_update_map;
cmd.DW2.SegmentationTemporalUpdate = vp9PicParams->PicFlags.fields.segmentation_temporal_update;
cmd.DW2.LosslessMode = vp9PicParams->PicFlags.fields.LosslessFlag;
cmd.DW3.Log2TileColumn = vp9PicParams->log2_tile_columns;
cmd.DW3.Log2TileRow = vp9PicParams->log2_tile_rows;
cmd.DW3.SseEnable = params->bSSEEnable;
// Gen 11 REXT inputs for chroma formats and bit depth
cmd.DW3.ChromaSamplingFormat = vp9SeqParams->SeqFlags.fields.EncodedFormat;
switch (vp9SeqParams->SeqFlags.fields.EncodedBitDepth)
{
case VP9_ENCODED_BIT_DEPTH_8:
cmd.DW3.Bitdepthminus8 = 0;
break;
case VP9_ENCODED_BIT_DEPTH_10:
cmd.DW3.Bitdepthminus8 = 2;
break;
default:
cmd.DW3.Bitdepthminus8 = 0;
break;
}
if (vp9PicParams->PicFlags.fields.frame_type && !vp9PicParams->PicFlags.fields.intra_only)
{
uint32_t curFrameWidth = vp9PicParams->SrcFrameWidthMinus1 + 1;
uint32_t curFrameHeight = vp9PicParams->SrcFrameHeightMinus1 + 1;
PCODEC_PICTURE refFrameList = &(vp9PicParams->RefFrameList[0]);
cmd.DW2.LastFrameType = !params->PrevFrameParams.fields.KeyFrame;
cmd.DW2.UsePrevInFindMvReferences = vp9PicParams->PicFlags.fields.error_resilient_mode ||
params->PrevFrameParams.fields.KeyFrame ||
params->PrevFrameParams.fields.IntraOnly ||
!params->PrevFrameParams.fields.Display ||
(curFrameWidth != params->dwPrevFrmWidth) ||
(curFrameHeight != params->dwPrevFrmHeight) ? 0 : 1;
if ((vp9PicParams->RefFlags.fields.ref_frame_ctrl_l0 & 0x01) || (vp9PicParams->RefFlags.fields.ref_frame_ctrl_l1 & 0x01))
{
MHW_ASSERT(!CodecHal_PictureIsInvalid(refFrameList[vp9PicParams->RefFlags.fields.LastRefIdx]));
uint8_t lastRefPicIndex = refFrameList[vp9PicParams->RefFlags.fields.LastRefIdx].FrameIdx;
uint32_t lastRefFrameWidth = 0;
uint32_t lastRefFrameHeight = 0;
if (!params->bUseDysRefSurface)
{
lastRefFrameWidth = vp9RefList[lastRefPicIndex]->dwFrameWidth;
lastRefFrameHeight = vp9RefList[lastRefPicIndex]->dwFrameHeight;
}
else
{
lastRefFrameWidth = curFrameWidth;
lastRefFrameHeight = curFrameHeight;
}
cmd.DW4.HorizontalScaleFactorForLast = (lastRefFrameWidth * m_vp9ScalingFactor) / curFrameWidth;
cmd.DW4.VerticalScaleFactorForLast = (lastRefFrameHeight * m_vp9ScalingFactor) / curFrameHeight;
cmd.DW7.LastFrameWidthInPixelsMinus1 = lastRefFrameWidth - 1;
cmd.DW7.LastFrameHieghtInPixelsMinus1 = lastRefFrameHeight - 1;
}
if ((vp9PicParams->RefFlags.fields.ref_frame_ctrl_l0 & 0x02) || (vp9PicParams->RefFlags.fields.ref_frame_ctrl_l1 & 0x02))
{
MHW_ASSERT(!CodecHal_PictureIsInvalid(refFrameList[vp9PicParams->RefFlags.fields.GoldenRefIdx]));
uint8_t goldenRefPicIndex = refFrameList[vp9PicParams->RefFlags.fields.GoldenRefIdx].FrameIdx;
uint32_t goldenRefFrameWidth = 0;
uint32_t goldenRefFrameHeight = 0;
if (!params->bUseDysRefSurface)
{
goldenRefFrameWidth = vp9RefList[goldenRefPicIndex]->dwFrameWidth;
goldenRefFrameHeight = vp9RefList[goldenRefPicIndex]->dwFrameHeight;
}
else
{
goldenRefFrameWidth = curFrameWidth;
goldenRefFrameHeight = curFrameHeight;
}
cmd.DW5.HorizontalScaleFactorForGolden = (goldenRefFrameWidth * m_vp9ScalingFactor) / curFrameWidth;
cmd.DW5.VerticalScaleFactorForGolden = (goldenRefFrameHeight * m_vp9ScalingFactor) / curFrameHeight;
cmd.DW8.GoldenFrameWidthInPixelsMinus1 = goldenRefFrameWidth - 1;
cmd.DW8.GoldenFrameHieghtInPixelsMinus1 = goldenRefFrameHeight - 1;
}
if ((vp9PicParams->RefFlags.fields.ref_frame_ctrl_l0 & 0x04) || (vp9PicParams->RefFlags.fields.ref_frame_ctrl_l1 & 0x04))
{
MHW_ASSERT(!CodecHal_PictureIsInvalid(refFrameList[vp9PicParams->RefFlags.fields.AltRefIdx]));
uint8_t altRefPicIndex = refFrameList[vp9PicParams->RefFlags.fields.AltRefIdx].FrameIdx;
uint32_t altRefFrameWidth = 0;
uint32_t altRefFrameHeight = 0;
if (!params->bUseDysRefSurface)
{
altRefFrameWidth = vp9RefList[altRefPicIndex]->dwFrameWidth;
altRefFrameHeight = vp9RefList[altRefPicIndex]->dwFrameHeight;
}
else
{
altRefFrameWidth = curFrameWidth;
altRefFrameHeight = curFrameHeight;
}
cmd.DW6.HorizontalScaleFactorForAltref = (altRefFrameWidth * m_vp9ScalingFactor) / curFrameWidth;
cmd.DW6.VerticalScaleFactorForAltref = (altRefFrameHeight * m_vp9ScalingFactor) / curFrameHeight;
cmd.DW9.AltrefFrameWidthInPixelsMinus1 = altRefFrameWidth - 1;
cmd.DW9.AltrefFrameHieghtInPixelsMinus1 = altRefFrameHeight - 1;
}
}
cmd.DW13.BaseQIndexSameAsLumaAc = vp9PicParams->LumaACQIndex;
cmd.DW13.HeaderInsertionEnable = 1;
cmd.DW14.ChromaacQindexdelta = Convert2SignMagnitude(vp9PicParams->ChromaACQIndexDelta, 5);
cmd.DW14.ChromadcQindexdelta = Convert2SignMagnitude(vp9PicParams->ChromaDCQIndexDelta, 5);
cmd.DW14.LumaDcQIndexDelta = Convert2SignMagnitude(vp9PicParams->LumaDCQIndexDelta, 5);
cmd.DW15.LfRefDelta0 = Convert2SignMagnitude(vp9PicParams->LFRefDelta[0], 7);
cmd.DW15.LfRefDelta1 = Convert2SignMagnitude(vp9PicParams->LFRefDelta[1], 7);
cmd.DW15.LfRefDelta2 = Convert2SignMagnitude(vp9PicParams->LFRefDelta[2], 7);
cmd.DW15.LfRefDelta3 = Convert2SignMagnitude(vp9PicParams->LFRefDelta[3], 7);
cmd.DW16.LfModeDelta0 = Convert2SignMagnitude(vp9PicParams->LFModeDelta[0], 7);
cmd.DW16.LfModeDelta1 = Convert2SignMagnitude(vp9PicParams->LFModeDelta[1], 7);
cmd.DW17.Bitoffsetforlfrefdelta = vp9PicParams->BitOffsetForLFRefDelta;
cmd.DW17.Bitoffsetforlfmodedelta = vp9PicParams->BitOffsetForLFModeDelta;
cmd.DW18.Bitoffsetforlflevel = vp9PicParams->BitOffsetForLFLevel;
cmd.DW18.Bitoffsetforqindex = vp9PicParams->BitOffsetForQIndex;
cmd.DW32.Bitoffsetforfirstpartitionsize = vp9PicParams->BitOffsetForFirstPartitionSize;
cmd.DW19.VdencPakOnlyPass = params->bVdencPakOnlyPassFlag;
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, batchBuffer, &cmd, sizeof(cmd)));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpVp9SegmentStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_VP9_SEGMENT_STATE params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_MI_CHK_NULL(params);
mhw_vdbox_hcp_g12_X::HCP_VP9_SEGMENT_STATE_CMD cmd;
cmd.DW1.SegmentId = params->ucCurrentSegmentId;
if (!m_decodeInUse)
{
CODEC_VP9_ENCODE_SEG_PARAMS vp9SegData;
vp9SegData = params->pVp9EncodeSegmentParams->SegData[params->ucCurrentSegmentId];
cmd.DW2.SegmentSkipped = vp9SegData.SegmentFlags.fields.SegmentSkipped;
cmd.DW2.SegmentReference = vp9SegData.SegmentFlags.fields.SegmentReference;
cmd.DW2.SegmentReferenceEnabled = vp9SegData.SegmentFlags.fields.SegmentReferenceEnabled;
cmd.DW7.SegmentLfLevelDeltaEncodeModeOnly = Convert2SignMagnitude(vp9SegData.SegmentLFLevelDelta, 7);
cmd.DW7.SegmentQindexDeltaEncodeModeOnly = Convert2SignMagnitude(vp9SegData.SegmentQIndexDelta, 9);
}
else
{
CODEC_VP9_SEG_PARAMS vp9SegData;
vp9SegData = params->pVp9SegmentParams->SegData[params->ucCurrentSegmentId];
cmd.DW2.SegmentSkipped = vp9SegData.SegmentFlags.fields.SegmentReferenceSkipped;
cmd.DW2.SegmentReference = vp9SegData.SegmentFlags.fields.SegmentReference;
cmd.DW2.SegmentReferenceEnabled = vp9SegData.SegmentFlags.fields.SegmentReferenceEnabled;
cmd.DW3.Filterlevelref0Mode0 = vp9SegData.FilterLevel[0][0];
cmd.DW3.Filterlevelref0Mode1 = vp9SegData.FilterLevel[0][1];
cmd.DW3.Filterlevelref1Mode0 = vp9SegData.FilterLevel[1][0];
cmd.DW3.Filterlevelref1Mode1 = vp9SegData.FilterLevel[1][1];
cmd.DW4.Filterlevelref2Mode0 = vp9SegData.FilterLevel[2][0];
cmd.DW4.Filterlevelref2Mode1 = vp9SegData.FilterLevel[2][1];
cmd.DW4.Filterlevelref3Mode0 = vp9SegData.FilterLevel[3][0];
cmd.DW4.Filterlevelref3Mode1 = vp9SegData.FilterLevel[3][1];
cmd.DW5.LumaDcQuantScaleDecodeModeOnly = vp9SegData.LumaDCQuantScale;
cmd.DW5.LumaAcQuantScaleDecodeModeOnly = vp9SegData.LumaACQuantScale;
cmd.DW6.ChromaDcQuantScaleDecodeModeOnly = vp9SegData.ChromaDCQuantScale;
cmd.DW6.ChromaAcQuantScaleDecodeModeOnly = vp9SegData.ChromaACQuantScale;
}
MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, batchBuffer, &cmd, cmd.byteSize));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpHevcVp9RdoqStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_PIC_STATE params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_MI_CHK_NULL(params);
MHW_MI_CHK_NULL(params->pHevcEncSeqParams);
mhw_vdbox_hcp_g12_X::HEVC_VP9_RDOQ_STATE_CMD cmd;
uint16_t lambdaTab[2][2][76];
MHW_MI_CHK_NULL(params->pHevcEncPicParams);
if (params->pHevcEncSeqParams->bit_depth_luma_minus8 < 8)
{
uint32_t sliceTypeIdx = (params->pHevcEncPicParams->CodingType == I_TYPE) ? 0 : 1;
//Intra lambda
MOS_ZeroMemory(lambdaTab, sizeof(lambdaTab));
if (params->pHevcEncSeqParams->bit_depth_luma_minus8 == 0)
{
MHW_MI_CHK_STATUS(MOS_SecureMemcpy(
lambdaTab[0][0],
sizeof(RDOQLamdas8bits[sliceTypeIdx][0][0]),
RDOQLamdas8bits[sliceTypeIdx][0][0],
sizeof(RDOQLamdas8bits[sliceTypeIdx][0][0])));
MHW_MI_CHK_STATUS(MOS_SecureMemcpy(
lambdaTab[0][1],
sizeof(RDOQLamdas8bits[sliceTypeIdx][0][1]),
RDOQLamdas8bits[sliceTypeIdx][0][1],
sizeof(RDOQLamdas8bits[sliceTypeIdx][0][1])));
MHW_MI_CHK_STATUS(MOS_SecureMemcpy(
lambdaTab[1][0],
sizeof(RDOQLamdas8bits[sliceTypeIdx][1][0]),
RDOQLamdas8bits[sliceTypeIdx][1][0],
sizeof(RDOQLamdas8bits[sliceTypeIdx][1][0])));
MHW_MI_CHK_STATUS(MOS_SecureMemcpy(
lambdaTab[1][1],
sizeof(RDOQLamdas8bits[sliceTypeIdx][1][1]),
RDOQLamdas8bits[sliceTypeIdx][1][1],
sizeof(RDOQLamdas8bits[sliceTypeIdx][1][1])));
}
else if (params->pHevcEncSeqParams->bit_depth_luma_minus8 == 2)
{
MHW_MI_CHK_STATUS(MOS_SecureMemcpy(
lambdaTab[0][0],
sizeof(RDOQLamdas10bits[sliceTypeIdx][0][0]),
RDOQLamdas10bits[sliceTypeIdx][0][0],
sizeof(RDOQLamdas10bits[sliceTypeIdx][0][0])));
MHW_MI_CHK_STATUS(MOS_SecureMemcpy(
lambdaTab[0][1],
sizeof(RDOQLamdas10bits[sliceTypeIdx][0][1]),
RDOQLamdas10bits[sliceTypeIdx][0][1],
sizeof(RDOQLamdas10bits[sliceTypeIdx][0][1])));
MHW_MI_CHK_STATUS(MOS_SecureMemcpy(
lambdaTab[1][0],
sizeof(RDOQLamdas10bits[sliceTypeIdx][1][0]),
RDOQLamdas10bits[sliceTypeIdx][1][0],
sizeof(RDOQLamdas10bits[sliceTypeIdx][1][0])));
MHW_MI_CHK_STATUS(MOS_SecureMemcpy(
lambdaTab[1][1],
sizeof(RDOQLamdas10bits[sliceTypeIdx][1][1]),
RDOQLamdas10bits[sliceTypeIdx][1][1],
sizeof(RDOQLamdas10bits[sliceTypeIdx][1][1])));
}
else if (params->pHevcEncSeqParams->bit_depth_luma_minus8 == 4)
{
MHW_MI_CHK_STATUS(MOS_SecureMemcpy(
lambdaTab[0][0],
sizeof(RDOQLamdas12bits[sliceTypeIdx][0][0]),
RDOQLamdas12bits[sliceTypeIdx][0][0],
sizeof(RDOQLamdas12bits[sliceTypeIdx][0][0])));
MHW_MI_CHK_STATUS(MOS_SecureMemcpy(
lambdaTab[0][1],
sizeof(RDOQLamdas12bits[sliceTypeIdx][0][1]),
RDOQLamdas12bits[sliceTypeIdx][0][1],
sizeof(RDOQLamdas12bits[sliceTypeIdx][0][1])));
MHW_MI_CHK_STATUS(MOS_SecureMemcpy(
lambdaTab[1][0],
sizeof(RDOQLamdas12bits[sliceTypeIdx][1][0]),
RDOQLamdas12bits[sliceTypeIdx][1][0],
sizeof(RDOQLamdas12bits[sliceTypeIdx][1][0])));
MHW_MI_CHK_STATUS(MOS_SecureMemcpy(
lambdaTab[1][1],
sizeof(RDOQLamdas12bits[sliceTypeIdx][1][1]),
RDOQLamdas12bits[sliceTypeIdx][1][1],
sizeof(RDOQLamdas12bits[sliceTypeIdx][1][1])));
}
}
else
{
int32_t shiftQP = 12;
#if INTRACONF
double lambdaScale = 1.8; //Intra
#else
double lambdaScale = 1.0 - 0.35; //LD or RA
#endif
double qpTemp = 0;
double lambdaDouble = 0;
uint32_t lambda = 0;
double qpFactor = 0.55;
MOS_ZeroMemory(lambdaTab, sizeof(lambdaTab));
int32_t bitdepthLumaQpScaleLuma = 6 * params->pHevcEncSeqParams->bit_depth_luma_minus8;
int32_t bitdepthLumaQpScaleChroma = 6 * params->pHevcEncSeqParams->bit_depth_chroma_minus8;
//Intra lambda
qpFactor = 0.25*lambdaScale;
for (uint8_t qp = 0; qp < 52 + bitdepthLumaQpScaleLuma; qp++)
{
qpTemp = (double)qp - bitdepthLumaQpScaleLuma - shiftQP;
lambdaDouble = qpFactor * pow(2.0, qpTemp / 3.0);
lambdaDouble = lambdaDouble * 16 + 0.5;
lambdaDouble = (lambdaDouble > 65535) ? 65535 : lambdaDouble;
lambda = (uint32_t)floor(lambdaDouble);
lambdaTab[0][0][qp] = (uint16_t)lambda;
}
for (uint8_t qp = 0; qp < 52 + bitdepthLumaQpScaleChroma; qp++)
{
qpTemp = (double)qp - bitdepthLumaQpScaleChroma - shiftQP;
lambdaDouble = qpFactor * pow(2.0, qpTemp / 3.0);
lambdaDouble = lambdaDouble * 16 + 0.5;
lambdaDouble = (lambdaDouble > 65535) ? 65535 : lambdaDouble;
lambda = (uint32_t)floor(lambdaDouble);
lambdaTab[0][1][qp] = (uint16_t)lambda;
}
////Inter lambda
qpFactor = 0.55;
for (uint8_t qp = 0; qp < 52 + bitdepthLumaQpScaleLuma; qp++)
{
qpTemp = (double)qp - bitdepthLumaQpScaleLuma - shiftQP;
lambdaDouble = qpFactor * pow(2.0, qpTemp / 3.0);
lambdaDouble *= MOS_MAX(1.00, MOS_MIN(1.6, 1.0 + 0.6 / 12.0*(qpTemp - 10.0)));
lambdaDouble = lambdaDouble * 16 + 0.5;
lambda = (uint32_t)floor(lambdaDouble);
lambdaDouble = (lambdaDouble > 65535) ? 65535 : lambdaDouble;
lambda = CodecHal_Clip3(0, 0xffff, lambda);
lambdaTab[1][0][qp] = (uint16_t)lambda;
}
for (uint8_t qp = 0; qp < 52 + bitdepthLumaQpScaleChroma; qp++)
{
qpTemp = (double)qp - bitdepthLumaQpScaleChroma - shiftQP;
lambdaDouble = qpFactor * pow(2.0, qpTemp / 3.0);
lambdaDouble *= MOS_MAX(0.95, MOS_MIN(1.20, 0.25 / 12.0*(qpTemp - 10.0) + 0.95));
lambdaDouble = lambdaDouble * 16 + 0.5;
lambda = (uint32_t)floor(lambdaDouble);
lambdaDouble = (lambdaDouble > 65535) ? 65535 : lambdaDouble;
lambda = CodecHal_Clip3(0, 0xffff, lambda);
lambdaTab[1][1][qp] = (uint16_t)lambda;
}
}
for (uint8_t i = 0; i < 32; i++)
{
cmd.Intralumalambda[i].DW0.Lambdavalue0 = lambdaTab[0][0][i * 2];
cmd.Intralumalambda[i].DW0.Lambdavalue1 = lambdaTab[0][0][i * 2 + 1];
cmd.Intrachromalambda[i].DW0.Lambdavalue0 = lambdaTab[0][1][i * 2];
cmd.Intrachromalambda[i].DW0.Lambdavalue1 = lambdaTab[0][1][i * 2 + 1];
cmd.Interlumalambda[i].DW0.Lambdavalue0 = lambdaTab[1][0][i * 2];
cmd.Interlumalambda[i].DW0.Lambdavalue1 = lambdaTab[1][0][i * 2 + 1];
cmd.Interchromalambda[i].DW0.Lambdavalue0 = lambdaTab[1][1][i * 2];
cmd.Interchromalambda[i].DW0.Lambdavalue1 = lambdaTab[1][1][i * 2 + 1];
}
for (uint8_t i = 0; i < 6; i++)
{
cmd.Intralumalambda12bit[i].DW0.Lambdavalue0 = lambdaTab[0][0][i * 2 + 64];
cmd.Intralumalambda12bit[i].DW0.Lambdavalue1 = lambdaTab[0][0][i * 2 + 1 + 64];
cmd.Intrachromalambda12bit[i].DW0.Lambdavalue0 = lambdaTab[0][1][i * 2 + 64];
cmd.Intrachromalambda12bit[i].DW0.Lambdavalue1 = lambdaTab[0][1][i * 2 + 1 + 64];
cmd.Interlumalambda12bit[i].DW0.Lambdavalue0 = lambdaTab[1][0][i * 2 + 64];
cmd.Interlumalambda12bit[i].DW0.Lambdavalue1 = lambdaTab[1][0][i * 2 + 1 + 64];
cmd.Interchromalambda12bit[i].DW0.Lambdavalue0 = lambdaTab[1][1][i * 2 + 64];
cmd.Interchromalambda12bit[i].DW0.Lambdavalue1 = lambdaTab[1][1][i * 2 + 1 + 64];
}
if (m_hevcRDOQPerfDisabled)
{
cmd.DW1.DisableHtqPerformanceFix0 = true;
cmd.DW1.DisableHtqPerformanceFix1 = true;
}
MHW_MI_CHK_STATUS(Mos_AddCommand(cmdBuffer, &cmd, sizeof(cmd)));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpDecodeTileCodingCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(params);
mhw_vdbox_hcp_g12_X::HCP_TILE_CODING_CMD cmd;
MEDIA_SYSTEM_INFO *gtSystemInfo = m_osInterface->pfnGetGtSystemInfo(m_osInterface);
uint8_t numVdbox = (uint8_t)gtSystemInfo->VDBoxInfo.NumberOfVDBoxEnabled;
MHW_ASSERT(params->ucNumDecodePipes <= numVdbox);
MHW_ASSERT(params->ucPipeIdx < params->ucNumDecodePipes);
cmd.DW1.NumberOfActiveBePipes = params->ucNumDecodePipes;
cmd.DW1.NumOfTileColumnsInAFrame = params->ucNumDecodePipes;
cmd.DW2.TileRowPosition = params->TileStartLCUY;
cmd.DW2.TileColumnPosition = params->TileStartLCUX;
cmd.DW2.Islasttileofcolumn = params->IsLastTileofColumn;
cmd.DW2.Islasttileofrow = params->IsLastTileofRow;
cmd.DW3.Tileheightinmincbminus1 = params->TileHeightInMinCbMinus1;
cmd.DW3.Tilewidthinmincbminus1 = params->TileWidthInMinCbMinus1;
MHW_MI_CHK_STATUS(Mos_AddCommand(cmdBuffer, &cmd, sizeof(cmd)));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpEncodeTileCodingCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
mhw_vdbox_hcp_g12_X::HCP_TILE_CODING_CMD cmd;
MHW_CHK_NULL(params);
cmd.DW1.NumberOfActiveBePipes = params->NumberOfActiveBePipes;
cmd.DW1.NumOfTileColumnsInAFrame = params->NumOfTileColumnsInFrame; // This field is not used by HW. This field should be same as "Number of Active BE Pipes".
cmd.DW1.TileRowStoreSelect = params->TileRowStoreSelect;
cmd.DW1.TileColumnStoreSelect = params->TileColumnStoreSelect;
cmd.DW2.TileColumnPosition = params->TileStartLCUX;
cmd.DW2.TileRowPosition = params->TileStartLCUY;
cmd.DW2.Islasttileofcolumn = params->IsLastTileofColumn;
cmd.DW2.Islasttileofrow = params->IsLastTileofRow;
cmd.DW3.Tileheightinmincbminus1 = params->TileHeightInMinCbMinus1;
cmd.DW3.Tilewidthinmincbminus1 = params->TileWidthInMinCbMinus1;
cmd.DW8.CuRecordOffset = params->CuRecordOffset;
cmd.DW4.BitstreamByteOffset = params->BitstreamByteOffset;
cmd.DW5.PakFrameStatisticsOffset = params->PakTileStatisticsOffset;
cmd.DW6.CuLevelStreamoutOffset = params->CuLevelStreamoutOffset;
cmd.DW7.SliceSizeStreamoutOffset = params->SliceSizeStreamoutOffset;
cmd.DW9.SseRowstoreOffset = params->SseRowstoreOffset;
cmd.DW10.SaoRowstoreOffset = params->SaoRowstoreOffset;
cmd.DW11.TileSizeStreamoutOffset = params->TileSizeStreamoutOffset;
cmd.DW12.Vp9ProbabilityCounterStreamoutOffset = params->Vp9ProbabilityCounterStreamoutOffset;
// for Tile Replay
cmd.DW2.NonFirstPassTile = params->bTileReplayEnable && (!params->IsFirstPass);
// By default enable bit stream offset when tile replay is enabled with multiple pipes;
// for single pipe case, by default set to 1, simulation currently can not support 0 for single pipe;
// To be followed and clarified
cmd.DW4.BitstreamByteOffsetEnable = params->bTileReplayEnable && ((params->NumberOfActiveBePipes > 1) ? 1 : 1);
if (params->presHcpSyncBuffer) // this buffer is not used in HEVC/VP9 decode or encode
{
PMOS_INTERFACE osInterface;
MHW_RESOURCE_PARAMS resourceParams;
osInterface = m_osInterface;
cmd.HcpScalabilitySynchronizeBufferAttributes.DW0.Value |=
m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_HCP_SAO_CODEC].Value;
MOS_ZeroMemory(&resourceParams, sizeof(resourceParams));
resourceParams.dwLsbNum = MHW_VDBOX_HCP_GENERAL_STATE_SHIFT;
resourceParams.HwCommandType = MOS_MFX_PIPE_BUF_ADDR;
resourceParams.presResource = params->presHcpSyncBuffer;
resourceParams.dwOffset = 0;
resourceParams.pdwCmd = (cmd.HcpScalabilitySynchronizeBufferBaseAddress.DW0_1.Value);
resourceParams.dwLocationInCmd = 13;
resourceParams.bIsWritable = true;
MHW_CHK_STATUS(pfnAddResourceToCmd(
osInterface,
cmdBuffer,
&resourceParams));
}
MHW_CHK_STATUS(Mos_AddCommand(cmdBuffer, &cmd, sizeof(cmd)));
finish:
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpHevcPicBrcBuffer(
PMOS_RESOURCE hcpImgStates,
PMHW_VDBOX_HEVC_PIC_STATE hevcPicState)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(hcpImgStates);
MOS_COMMAND_BUFFER constructedCmdBuf;
mhw_vdbox_hcp_g12_X::HCP_PIC_STATE_CMD cmd;
uint32_t* insertion = nullptr;
MOS_LOCK_PARAMS lockFlags;
m_brcNumPakPasses = hevcPicState->brcNumPakPasses;
MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
lockFlags.WriteOnly = 1;
uint8_t *data = (uint8_t*)m_osInterface->pfnLockResource(m_osInterface, hcpImgStates, &lockFlags);
MHW_MI_CHK_NULL(data);
constructedCmdBuf.pCmdBase = (uint32_t *)data;
constructedCmdBuf.pCmdPtr = (uint32_t *)data;
constructedCmdBuf.iOffset = 0;
constructedCmdBuf.iRemaining = BRC_IMG_STATE_SIZE_PER_PASS_G11 * (m_brcNumPakPasses);
MHW_MI_CHK_STATUS(AddHcpPicStateCmd(&constructedCmdBuf, hevcPicState));
cmd = *(mhw_vdbox_hcp_g12_X::HCP_PIC_STATE_CMD *)data;
for (uint32_t i = 0; i < m_brcNumPakPasses; i++)
{
if (i == 0)
{
cmd.DW6.Nonfirstpassflag = false;
}
else
{
cmd.DW6.Nonfirstpassflag = true;
}
cmd.DW6.FrameszoverstatusenFramebitratemaxreportmask = true;
cmd.DW6.FrameszunderstatusenFramebitrateminreportmask = true;
cmd.DW6.LcumaxbitstatusenLcumaxsizereportmask = false; // BRC update kernel does not consider if there is any LCU whose size is too big
*(mhw_vdbox_hcp_g12_X::HCP_PIC_STATE_CMD *)data = cmd;
/* add batch buffer end insertion flag */
insertion = (uint32_t*)(data + mhw_vdbox_hcp_g12_X::HCP_PIC_STATE_CMD::byteSize);
*insertion = 0x05000000;
data += BRC_IMG_STATE_SIZE_PER_PASS_G11;
}
MHW_MI_CHK_STATUS(m_osInterface->pfnUnlockResource(m_osInterface, hcpImgStates));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpPaletteInitializerStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PCODEC_HEVC_SCC_PIC_PARAMS params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_MI_CHK_NULL(params);
mhw_vdbox_hcp_g12_X::HCP_PALETTE_INITIALIZER_STATE_CMD cmd;
uint32_t yentryIdx = 0;
uint32_t yentry = 0, cbEntry = 0, crEntry = 0;
cmd.DW1.ActivePaletteInitializerTableEntries = params->PredictorPaletteSize;
for (uint32_t i = 0; i < m_HevcSccPaletteSize; i += 3)
{
// First 64 color entries
yentryIdx = i * 2 / 3;
cmd.First64ColorEntries[i] = params->PredictorPaletteEntries[0][yentryIdx]; // Y
cbEntry = (uint32_t)params->PredictorPaletteEntries[1][yentryIdx];
cmd.First64ColorEntries[i] |= (cbEntry << 16); // Cb
cmd.First64ColorEntries[i + 1] = params->PredictorPaletteEntries[2][yentryIdx]; // Cr
yentry = (uint32_t)params->PredictorPaletteEntries[0][yentryIdx + 1];
cmd.First64ColorEntries[i + 1] |= (yentry << 16); // Y
cmd.First64ColorEntries[i + 2] = params->PredictorPaletteEntries[1][yentryIdx + 1]; // Cb
crEntry = (uint32_t)params->PredictorPaletteEntries[2][yentryIdx + 1];
cmd.First64ColorEntries[i + 2] |= (crEntry << 16); // Cr
// Second 64 color entries
yentryIdx += 64;
cmd.Second64ColorEntries[i] = params->PredictorPaletteEntries[0][yentryIdx]; // Y
cbEntry = (uint32_t)params->PredictorPaletteEntries[1][yentryIdx];
cmd.Second64ColorEntries[i] |= (cbEntry << 16); // Cb
cmd.Second64ColorEntries[i + 1] = params->PredictorPaletteEntries[2][yentryIdx]; // Cr
yentry = (uint32_t)params->PredictorPaletteEntries[0][yentryIdx + 1];
cmd.Second64ColorEntries[i + 1] |= (yentry << 16); // Y
cmd.Second64ColorEntries[i + 2] = params->PredictorPaletteEntries[1][yentryIdx + 1]; // Cb
crEntry = (uint32_t)params->PredictorPaletteEntries[2][yentryIdx + 1];
cmd.Second64ColorEntries[i + 2] |= (crEntry << 16); // Cr
}
MHW_MI_CHK_STATUS(Mos_AddCommand(cmdBuffer, &cmd, sizeof(cmd)));
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::GetOsResLaceOrAceOrRgbHistogramBufferSize(
uint32_t width,
uint32_t height,
uint32_t *size)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
*size = m_veboxRgbHistogramSize;
*size += m_veboxRgbAceHistogramSizeReserved;
uint32_t dwSizeLace = MOS_ROUNDUP_DIVIDE(height, 64) *
MOS_ROUNDUP_DIVIDE(width, 64) *
m_veboxLaceHistogram256BinPerBlock;
uint32_t dwSizeNoLace = m_veboxAceHistogramSizePerFramePerSlice *
m_veboxNumFramePreviousCurrent *
m_veboxMaxSlices;
*size += MOS_MAX(dwSizeLace, dwSizeNoLace);
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::GetOsResStatisticsOutputBufferSize(
uint32_t width,
uint32_t height,
uint32_t *size)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
width = MOS_ALIGN_CEIL(width, 64);
height = MOS_ROUNDUP_DIVIDE(height, 4) + MOS_ROUNDUP_DIVIDE(m_veboxStatisticsSize * sizeof(uint32_t), width);
*size = width * height;
return eStatus;
}
MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpTileCodingCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 params)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
if (m_decodeInUse)
{
MHW_MI_CHK_STATUS(AddHcpDecodeTileCodingCmd(cmdBuffer, params));
}
else
{
MHW_MI_CHK_STATUS(AddHcpEncodeTileCodingCmd(cmdBuffer, params));
}
return eStatus;
}