blob: 2faf77e5446f0710503bc83643393979f197ddb6 [file] [log] [blame]
#pragma once
/*
* 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.
*/
//!
//! \file codechal_encode_wp_mdf_g12.h
//! \brief Gen12 class for weighted prediction.
//!
#ifndef __CODECHAL_ENCODE_WP_MDF_G12_H__
#define __CODECHAL_ENCODE_WP_MDF_G12_H__
#include "codechal_encode_wp.h"
class CodechalEncodeWPMdfG12 : public CodechalEncodeWP
{
public:
//!
//! \brief Constructor
//!
CodechalEncodeWPMdfG12(CodechalEncoderState* encoder):
CodechalEncodeWP(encoder) {}
//!
//! \brief Destructor
//!
virtual ~CodechalEncodeWPMdfG12() { ReleaseResources(); };
//!
//! \brief Initialize weighted prediction kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelStateIsa(void *kernelIsa, uint32_t kernelIsaSize);
//!
//! \brief SW scoreboard init kernel function
//!
//! \param [in] params
//! Pointer to KernelParams
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Execute(KernelParams *params)override;
protected:
//!
//! \brief SW scoreboard init kernel Curbe data
//!
struct CurbeData
{
// DW0
union
{
struct
{
uint32_t defaultWeight : MOS_BITFIELD_RANGE(0, 15);
uint32_t defaultOffset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW0;
// DW1
union
{
struct
{
uint32_t roi0XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi0YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW1;
// DW2
union
{
struct
{
uint32_t roi0XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi0YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW2;
// DW3
union
{
struct
{
uint32_t roi0Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi0Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW3;
// DW4
union
{
struct
{
uint32_t roi1XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi1YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW4;
// DW5
union
{
struct
{
uint32_t roi1XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi1YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW5;
// DW6
union
{
struct
{
uint32_t roi1Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi1Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW6;
// DW7
union
{
struct
{
uint32_t roi2XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi2YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW7;
// DW8
union
{
struct
{
uint32_t roi2XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi2YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW8;
// DW9
union
{
struct
{
uint32_t roi2Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi2Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW9;
// DW10
union
{
struct
{
uint32_t roi3XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi3YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW10;
// DW11
union
{
struct
{
uint32_t roi3XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi3YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW11;
// DW12
union
{
struct
{
uint32_t roi3Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi3Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW12;
// DW13
union
{
struct
{
uint32_t roi4XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi4YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW13;
// DW14
union
{
struct
{
uint32_t roi4XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi4YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW14;
// DW15
union
{
struct
{
uint32_t roi4Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi4Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW15;
// DW16
union
{
struct
{
uint32_t roi5XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi5YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW16;
// DW17
union
{
struct
{
uint32_t roi5XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi5YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW17;
// DW18
union
{
struct
{
uint32_t roi5Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi5Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW18;
// DW19
union
{
struct
{
uint32_t roi6XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi6YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW19;
// DW20
union
{
struct
{
uint32_t roi6XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi6YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW20;
// DW21
union
{
struct
{
uint32_t roi6Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi6Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW21;
// DW22
union
{
struct
{
uint32_t roi7XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi7YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW22;
// DW23
union
{
struct
{
uint32_t roi7XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi7YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW23;
// DW24
union
{
struct
{
uint32_t roi7Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi7Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW24;
// DW25
union
{
struct
{
uint32_t roi8XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi8YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW25;
// DW26
union
{
struct
{
uint32_t roi8XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi8YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW26;
// DW27
union
{
struct
{
uint32_t roi8Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi8Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW27;
// DW28
union
{
struct
{
uint32_t roi9XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi9YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW28;
// DW29
union
{
struct
{
uint32_t roi9XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi9YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW29;
// DW30
union
{
struct
{
uint32_t roi9Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi9Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW30;
// DW31
union
{
struct
{
uint32_t roi10XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi10YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW31;
// DW32
union
{
struct
{
uint32_t roi10XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi10YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW32;
// DW33
union
{
struct
{
uint32_t roi10Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi10Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW33;
// DW34
union
{
struct
{
uint32_t roi11XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi11YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW34;
// DW35
union
{
struct
{
uint32_t roi11XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi11YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW35;
// DW36
union
{
struct
{
uint32_t roi11Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi11Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW36;
// DW37
union
{
struct
{
uint32_t roi12XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi12YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW37;
// DW38
union
{
struct
{
uint32_t roi12XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi12YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW38;
// DW39
union
{
struct
{
uint32_t roi12Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi12Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW39;
// DW40
union
{
struct
{
uint32_t roi13XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi13YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW40;
// DW41
union
{
struct
{
uint32_t roi13XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi13YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW41;
// DW42
union
{
struct
{
uint32_t roi13Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi13Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW42;
// DW43
union
{
struct
{
uint32_t roi14XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi14YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW43;
// DW44
union
{
struct
{
uint32_t roi14XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi14YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW44;
// DW45
union
{
struct
{
uint32_t roi14Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi14Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW45;
// DW46
union
{
struct
{
uint32_t roi15XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi15YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW46;
// DW47
union
{
struct
{
uint32_t roi15XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi15YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW47;
// DW48
union
{
struct
{
uint32_t roi15Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi15Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW48;
// DW49
union
{
struct
{
uint32_t lumaLog2WeightDenom : MOS_BITFIELD_RANGE(0, 2);
uint32_t reserved1 : MOS_BITFIELD_RANGE(3, 7);
uint32_t roiEnableFlag : MOS_BITFIELD_RANGE(8, 8);
uint32_t reserved2 : MOS_BITFIELD_RANGE(9, 31);
};
struct
{
uint32_t value;
};
} DW49;
};
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CurbeData)) == 50);
CmThreadSpace *m_threadSpace = nullptr;
CmProgram *m_cmProgram = nullptr;
// every reference frame has own CmKernel and input/output surfaces
// for L0 references - [0, CODEC_WP_OUTPUT_L1_START - 1], for L1 references - [CODEC_WP_OUTPUT_L1_START, CODEC_NUM_WP_FRAME - 1]
CmKernel *m_cmKrn[CODEC_NUM_WP_FRAME] = { nullptr };
CmSurface2D *m_wpInputSurface[CODEC_NUM_WP_FRAME] = { nullptr };
CmSurface2D *m_wpOutputSurface[CODEC_NUM_WP_FRAME] = { nullptr };
//!
//! \brief Set Curbe
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetCurbe(CurbeData& curbe);
MOS_STATUS SetupSurfaces(uint8_t wpKrnIdx);
virtual MOS_STATUS SetupKernelArgs(uint8_t wpKrnIdx);
MOS_STATUS ReleaseResources();
};
#endif // __CODECHAL_ENCODE_WP_MDF_G12_H__