blob: f071541df93a9878a1337423791057f8968c40a8 [file] [log] [blame]
/*
* Copyright (c) 2008-2017, 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 hal_kerneldll.h
//! \brief Fast Compositing dynamic kernel linking/loading definitions
//!
#ifndef __HAL_KERNELDLL_H__
#define __HAL_KERNELDLL_H__
#include "mos_defs.h"
#include "cm_fc_ld.h"
// Kernel IDs and Kernel Names
#include "vpkrnheader.h" // IDR_VP_TOTAL_NUM_KERNELS
#if EMUL
#include "support.h"
// Search callback codes
#define CB_REASON_SEARCH_FAILED -1
#define CB_REASON_UPDATE_FAILED -2
#define CB_REASON_BEGIN_SEARCH 0
#define CB_REASON_BEGIN_UPDATE 1
#define CB_REASON_END_SEARCH 2
#else // EMUL
#endif // EMUL
#include "vphal_common.h"
#define ROUND_FLOAT(n, factor) ( (n) * (factor) + (((n) > 0.0f) ? 0.5f : -0.5f) )
#define MIN_SHORT -32768.0f
#define MAX_SHORT 32767.0f
#define FLOAT_TO_SHORT(n) (short)(MOS_MIN(MOS_MAX(MIN_SHORT, n), MAX_SHORT))
#define DL_MAX_SEARCH_FILTER_SIZE 10 // max number of entries to describe a compositing filter
#define DL_MAX_KERNELS 150 // Max component kernels to combine
#define DL_MAX_PATCH_DATA_SIZE 64 // Max size of a patch block
#define DL_MAX_PATCH_BLOCKS 8 // Max number of blocks to patch per patch data
#define DL_MAX_PATCHES 4 // Max patches to use
#define DL_MAX_SEARCH_NODES_PER_KERNEL 6 // max number of search nodes for a component kernel (max tree depth)
#define DL_MAX_COMPONENT_KERNELS 25 // max number of component kernels that can be combined
#define DL_MAX_EXPORT_COUNT 64 // size of the symbol export table
#define DL_DEFAULT_COMBINED_KERNELS 4 // Default number of kernels in cache
#define DL_MAX_COMBINED_KERNELS 64 // Max number of kernels in cache
#define DL_NEW_COMBINED_KERNELS 4 // The increased number of kernels in cache each time
#define DL_MAX_SYMBOLS 100 // max number of import/export symbols in a combined kernels
#define DL_CACHE_BLOCK_SIZE (128*1024) // Kernel allocation block size
#define DL_MAX_KERNEL_SIZE (128*1024) // max output kernel size
#define DL_COMBINED_KERNEL_CACHE_SIZE (DL_CACHE_BLOCK_SIZE*DL_NEW_COMBINED_KERNELS) // Combined kernel size
#define DL_PROCAMP_DISABLED -1 // procamp is disabled
#define DL_PROCAMP_MAX 1 // 1 Procamp entry
#define DL_CSC_DISABLED -1 // CSC is disabled
#define DL_CSC_MAX 6 // 6 CSC matrices max
#define DL_CSC_MAX_G5 2 // 2 CSC matrices max for Gen5
#define DL_CHROMASITING_DISABLE -1 // Chromasiting is disabled
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
typedef enum _MOS_FORMAT Kdll_Format;
typedef enum _MEDIA_CSPACE Kdll_CSpace;
// Layer definition
typedef enum _KDLL_LAYER
{
Layer_Invalid = -2, // Invalid
Layer_None = -1, // None
Layer_Background = 0, // Background (0)
Layer_MainVideo = 1, // Main video (1)
Layer_SubVideo = 2, // Secondary video (2)
Layer_SubPicture1 = 3, // Sub-picture 1 (3)
Layer_SubPicture2 = 4, // Sub-picture 2 (4)
Layer_SubPicture3 = 5, // Sub-picture 3 (5) [Gen6]
Layer_SubPicture4 = 6, // Sub-picture 4 (6) [Gen6]
Layer_Graphics = 14, // Graphics (7)
Layer_RenderTarget = 15 // Render Target
} Kdll_Layer;
// Sampling mode
// Please don't change the order in the enum is setup
typedef enum tagKdll_Sampling
{
Sample_None = -2,
Sample_Source = -1, // Current source sampling
Sample_Any = 0,
Sample_Scaling_Any , // Scaling (any scaling factor)
Sample_Scaling , // Scaling (above or equal 0.34x)
Sample_Scaling_034x , // Scaling 0.34x (below 0.34x)
Sample_iScaling , // Scaling (above or equal 0.34x)
Sample_iScaling_034x , // Scaling 0.34x (below 0.34x)
Sample_iScaling_AVS , //AVS Interlace Scaling on g75+
Sample_Scaling_AVS , // AVS Scaling on g575+
} Kdll_Sampling;
// scaling ratio mode
typedef enum tagKdll_scalingratio
{
Scalingratio_Any = 0, // By default, or scaling ratio <=1/8
Scalingratio_over1 , // Scaling ratio > 1 +1/6;
Scalingratio_b1p2to1 , // Scaling ratio (1/2, 1+1/6]; //NV12 need 1+1/6 support by kernel
Scalingratio_b1p4to1p2 , // Scaling ratio (1/4, 1/2];
Scalingratio_b1p8to1p4 , // Scaling ratio (1/8, 1/4]
} Kdll_Scalingratio;
// Rotation Mode
typedef enum tagKdll_Rotation
{
Rotate_Source
} Kdll_Rotation;
// Gen7+ : Shuffle data returned by Sample_8x8 message
typedef enum tagKdll_Shuffling
{
Shuffle_None = -1,
Shuffle_Any = 0,
Shuffle_All_8x8_Layer , // Mix of Sample_8x8 and others. Shuffle all 8x8 layer.
Shuffle_RenderTarget // All layers are Sample_8x8. Shuffle only in RenderTarget
} Kdll_Shuffling;
// Gen7+ : Rendering method
typedef enum tagKdll_RenderMethod
{
RenderMethod_MediaObject = 0,
RenderMethod_MediaObjectWalker = 1
} Kdll_RenderMethod;
// Gen7+ : Set CSC Coefficients method
typedef enum tagKdll_SetCSCCoeffMethod
{
SetCSCCoeffMethod_Curbe = 0,
SetCSCCoeffMethod_Patch = 1
} Kdll_SetCSCCoeffMethod;
#define ColorFill_Source -1
#define ColorFill_False 0
#define ColorFill_True 1
#define LumaKey_Source -1
#define LumaKey_False 0
#define LumaKey_True 1
#define Procamp_Source -1
// Processing mode
typedef enum tagKdll_Processing
{
Process_None = -2,
Process_Source = -1, // Current source processing
Process_Any = 0,
Process_Composite , // Composite 2 layers
Process_XORComposite, // XOR mono composite.
Process_PBlend , // Partial Blend 2 layers - 8-bits alpha
Process_CBlend , // Constant Blend 2 layers - 8-bits alpha
Process_SBlend , // Source Blend 2 layers - 8-bits alpha
Process_SBlend_4bits, // Source Blend 2 layers - 4-bits alpha
Process_CSBlend , // Constant multiply Source Blend 2 layers - 8-bits alpha (Source is NOT premultiplied)
Process_CPBlend , // Constant multiply Source Blend 2 layers - 8-bits alpha (Source is Premultiplied)
Process_DI , // Deinterlacing
Process_DN , // Denoise
Process_DNDI // DNDI
} Kdll_Processing;
typedef enum tagKdll_CSCType
{
CSC_YUV_RGB = 0, // YUV to RGB color space conversion
CSC_RGB_YUV = 1, // RGB to YUV color space conversion
CSC_YUV_YUV = 2, // YUV to YUV color space conversion
CSC_RGB_RGB = 3 // RGB to RGB color space conversion
} Kdll_CSCType;
// CSC Coefficients ID
// Worst case we could have any many CSCs are there are number of layers (xvYcc case). So, 6 CoeffIDs defined to support 6 layers max
typedef enum tagKdll_CoeffID
{
CoeffID_Src0 = -5, // Src0 coefficients
CoeffID_Src1 = -4, // Src1 coefficients
CoeffID_Source = -3, // Current source coefficients
CoeffID_Any = -2, // Any matrix
CoeffID_None = -1, // No matrix -> no CSC
CoeffID_0 = 0,
CoeffID_1 = 1,
CoeffID_2 = 2,
CoeffID_3 = 3,
CoeffID_4 = 4,
CoeffID_5 = 5
} Kdll_CoeffID;
// DL Parser State
typedef enum tagKdll_ParserState
{
Parser_Invalid = -1, // invalid state
Parser_Begin = 0, // start dynamic linking
Parser_SetRenderMethod, // MEDIA_OBJECT or MEDIA_OBJECT_WALKER rendering
Parser_SetupLayer0 , // setup layer 0
Parser_SetupLayer1 , // setup layer 1
Parser_SetParamsLayer0 , // setup parameters for layer 0
Parser_SetParamsLayer1 , // setup parameters for layer 1
Parser_SetParamsTarget , // setup parameters for render target
Parser_SampleLayer0 , // sample layer 0
Parser_SampleLayer0Mix , // sample layer 0 need inter mix (interlaced scaling)
Parser_SampleLayer0ColorFill, // sample layer 0 colorfill
Parser_RotateLayer0Check, // check if layer 0 needs preComp rotation
Parser_RotateLayer0 , // PreComp layer 0 rotate
Parser_SampleLayer0Done, // sample layer 0 is complete
Parser_ShuffleLayer0 , // shuffle layer 0
Parser_SampleLayer1 , // sample layer 1
Parser_SampleLayer1Done, // sample layer 1 is complete
Parser_ShuffleLayer1 , // shuffle layer 1
Parser_SampleLayer0SelectCSC, // decided whether CSC be selected for Mix or jump to Parser_SampleLayer0Mix directly
Parser_SetupCSC0 , // CSC parameters setup for layer 0
Parser_ExecuteCSC0 , // CSC on layer 0
Parser_ExecuteCSC0Done , // CSC on layer 0 is complete
Parser_SetupCSC1 , // CSC parameter setup for layer 1
Parser_ExecuteCSC1 , // CSC on layer 1
Parser_ExecuteCSC1Done , // CSC on layer 1 is complete
Parser_Lumakey , // lumakey
Parser_ProcessLayer , // process layer 0 + layer 1
Parser_ProcessLayerDone, // processing is complete
Parser_DualOutput , // dual output
Parser_Rotation , // apply post composition rotation
Parser_DestSurfIndex , // destination surface index
Parser_Colorfill , // applying colorfill
Parser_WriteOutput , // write output
Parser_End , // end dynamic linking
// This is used for custom states
Parser_Custom , // Custom state
// Number of states - keep this at the end
Parser_Count
} Kdll_ParserState;
// Dynamic Linking rule definitions
#define RID_IS_MATCH(rid) ((rid & 0xFE00) == 0x0000)
#define RID_IS_SET(rid) ((rid & 0xFE00) == 0x0200)
#define RID_IS_EXTENDED(rid) ((rid & 0xFD00) == 0x0100)
typedef enum tagKdll_RuleID
{
// Parser/Patch Control
RID_Op_EOF = -2, // End of search table
RID_Op_NewEntry = -1, // New search entry
// Simple Match Rules - 0x0000 to 0x0100
RID_IsTargetCspace = 0, // Match target color space
RID_IsLayerID , // Match Layer ID
RID_IsLayerFormat , // Match Layer Format
RID_IsParserState , // Match Parser State
RID_IsRenderMethod , // Match rendering mode, media object or media walker
RID_IsShuffling , // Match Shuffling
RID_IsDualOutput , // Match Dual Output
RID_IsLayerRotation , // Match Rotation
RID_IsRTRotate , // Match if RT rotates
RID_IsSrc0Format , // Current Src0 source (surface) format
RID_IsSrc0Sampling , // Current Src0 sampling mode
RID_IsSrc0Rotation , // Match Layer0 Rotation
RID_IsSrc0ColorFill , // Current Src0 Colorfill flag
RID_IsSrc0LumaKey , // Current Src0 LumaKey flag
RID_IsSrc0Procamp , // Match Src0 Procamp flag
RID_IsSrc0Coeff , // Current Src0 CSC coefficients
RID_IsSrc0Processing , // Current Src0 processing mode
RID_IsSrc0Chromasiting, // Current Src0 Chromasiting mode
RID_IsSrc1Format , // Current Src1 source (surface) format
RID_IsSrc1Sampling , // Current Src1 sampling mode
RID_IsSrc1LumaKey , // Current Src1 LumaKey flag
RID_IsSrc1SamplerLumaKey, // Current Src1 Samper LumaKey flag
RID_IsSrc1Procamp , // Match Src1 Procamp flag
RID_IsSrc1Coeff , // Current Src1 CSC coefficients
RID_IsSrc1Processing , // Current Src1 processing mode
RID_IsSrc1Chromasiting, // Current Src1 Chromasiting mode
RID_IsLayerNumber , // Current Layer number
RID_IsQuadrant , // Current Quadrant
RID_IsCSCBeforeMix , // CSC needed before Mix
RID_IsTargetFormat , // Render Target Format
RID_Is64BSaveEnabled , // Indicate whether 64B save kernel could be used
RID_IsTargetTileType , // Render Target Tile Type
RID_IsProcampEnabled , // Match Procamp
RID_IsSetCoeffMode , // Set CSC coefficients mode
RID_IsConstOutAlpha , // Match alpha fill mode
RID_IsDitherNeeded , // Whether dithering needed
RID_IsScalingRatio , // Current scaling ratio
// Extended Match Rules - 0x0100 to 0x01ff
// Simple Set Rules - 0x0200 to 0x02ff
RID_SetTargetCspace = 512, // Set target color space
RID_SetParserState , // Set Parser State
RID_SetSrc0Format , // Set Src0 source format
RID_SetSrc0Sampling , // Set Src0 sampling mode
RID_SetSrc0Rotation , // Set Src0 rotation
RID_SetSrc0ColorFill , // Set Src0 Colorfill
RID_SetSrc0LumaKey , // Set Src0 LumaKey
RID_SetSrc0Procamp , // Set Src0 Procamp flag
RID_SetSrc0Coeff , // Set Src0 CSC coefficients
RID_SetSrc0Processing, // Set Src0 Processing mode
RID_SetSrc1Format , // Set Src1 source format
RID_SetSrc1Sampling , // Set Src1 sampling mode
RID_SetSrc1Rotation , // Set Src1 rotation
RID_SetSrc1LumaKey , // Set Src1 LumaKey
RID_SetSrc1SamplerLumaKey, // Set Src1 Sampler LumaKey
RID_SetSrc1Procamp , // Set Src1 Procamp flag
RID_SetSrc1Coeff , // Set Src1 CSC coefficients
RID_SetSrc1Processing, // Set Src1 Processing mode
RID_SetKernel , // Set Kernel
RID_SetNextLayer , // Set Next Layer
RID_SetPatchData , // Set Patch Data to use
RID_SetQuadrant , // Set Quadrant
RID_SetCSCBeforeMix , // Set CSC flag before Mix
// Extended Set Rules - 0x0300 to 0x03ff
RID_SetPatch = 768, // Set Patch block
} Kdll_RuleID;
typedef enum tagKdll_Logic
{
Kdll_None,
Kdll_Or,
Kdll_Not,
} Kdll_Logic;
// Parameters for RID_Op_NewEntry
#define RULE_DEFAULT 0
#define RULE_CUSTOM 1
#define RULE_NO_OVERRIDE 255
#define GROUP_DEFAULT RULE_DEFAULT
#define GROUP_CUSTOM RULE_CUSTOM
#define GROUP_NO_OVERRIDE RULE_NO_OVERRIDE
//--------------------------------------------------------------
// Kernel DLL structures
//--------------------------------------------------------------
// Dynamic linking rule entry
typedef struct tagKdll_RuleEntry
{
Kdll_RuleID id : 16; // LSB
int value : 16; // MSB
Kdll_Logic logic;
} Kdll_RuleEntry;
typedef struct tagKdll_RuleEntrySet
{
const Kdll_RuleEntry *pRuleEntry; // Pointer to the first meaningful rule of the set
uint32_t iGroup : 8; // Group (default, custom, non-overridable)
uint32_t iMatchCount : 12; // Size of Match Rules (including variable length rules)
uint32_t iSetCount : 12; // Size of Set Rules (including variable length rules)
} Kdll_RuleEntrySet;
// Structure that defines a set of procamp parameters
typedef struct tagKdll_Procamp
{
bool bEnabled; // Procamp Enabled/Disabled
int iProcampVersion; // Procamp parameters version
float fBrightness; // Brightness : range = -100.0 - 100.0; default = 0.0; step = 0.1
float fContrast; // Contrast : range = 0.0 - 10.0; default = 1.0; step = 0.01
float fHue; // Hue : range = -180.0 - 180.0; default = 0.0; step = 0.1
float fSaturation; // Saturation : range = 0.0 - 10.0; default = 1.0; step = 0.01
} Kdll_Procamp;
// Structure that defines CSC+PA conversion matrix
typedef struct tagKdll_CSC_Matrix
{
int bInUse : 1; // Matrix is in use and valid (LSB)
int : 3;
Kdll_CoeffID iCoeffID : 4; // Coeffient set
VPHAL_CSPACE SrcSpace : 8; // Source Color Space
VPHAL_CSPACE DstSpace : 8; // Destionation Color Space
int iProcampID : 8; // Procamp parameter set (-1 if no Procamp) (MSB)
int iProcampVersion; // Last procamp version (to recalculate matrix)
short Coeff[12]; // CSC kernel coeff: [Y'/R'] [0 1 2] [Y/R] [ 3]
// [U'/G'] = [4 5 6] * [U/G] + [ 7]
// [V'/B'] [8 9 10] [V/B] [11]
} Kdll_CSC_Matrix;
// Structure that defines a full set of CSC or CSC+PA parameters to be used by a combined kernel
typedef struct tagKdll_CSC_Params
{
VPHAL_CSPACE ColorSpace; // Selected Color Space
Kdll_CSC_Matrix Matrix [DL_CSC_MAX]; // CSC conversion matrix (3x3 + 1x3)
uint8_t MatrixID[DL_CSC_MAX]; // Coefficient allocation array
uint8_t PatchMatrixID[DL_CSC_MAX]; // CSC Matrix ID
uint8_t PatchMatrixNum; // CSC Matrix Number
} Kdll_CSC_Params;
// Structure that defines a compositing layer
typedef struct tagKdll_FilterEntry
{
// Current layer
Kdll_Layer layer; // source layer (Layer identification - Bg, Main, Sub, Gfx, ...)
MOS_FORMAT format; // source format (Pixel/Sampling Format - ARBG, NV12, YUY2, ...)
VPHAL_CSPACE cspace; // source color space (BT709, BT601, xvYCC709, xvYCC601, sRGB, ...)
Kdll_Sampling sampler; // sampling mode (AVS, Scaling, ColorFill, Luma Keying, ...)
int32_t colorfill : 16; // colorfill (true/false)
int32_t lumakey : 16; // Luma key (true/false)
int32_t samplerlumakey; // Sampler Lumakey (true/false)
Kdll_Processing process; // processing mode (Compositing, Constant Blending, Source Blending, ...)
int procamp; // index to procamp parameters (-1 of Procamp disabled)
int matrix; // index to CSC matrix entry (-1 if CSC not required)
VPHAL_ROTATION rotation; // rotation angle
MOS_TILE_TYPE tiletype; // Tiling Type
bool dualout; // dual output mode
bool bWaEnableDscale; // enable DScale kernels for sampler-unrom issue
bool bEnableDscale; // always enable DScale Kernels
int32_t chromasiting; // chromasiting (-1 if Chromasiting is disabled)
// This flag is used to select between kernels:
// Save_RGB or Save_ARGB
// Save_R10G10B10 or Save_R10G10B10A2
// Save_VUYA or Save_SrcVUYA
bool bFillOutputAlphaWithConstant;
bool bIsDitherNeeded;
Kdll_Scalingratio ScalingRatio;
Kdll_RenderMethod RenderMethod;
Kdll_SetCSCCoeffMethod SetCSCCoeffMode;
} Kdll_FilterEntry, *PKdll_FilterEntry;
// Structure that defines a compositing filter
typedef Kdll_FilterEntry Kdll_FilterDesc[DL_MAX_SEARCH_FILTER_SIZE];
//------------------------------------------------------------
// Component kernel descriptors (equivalent to KDT)
//------------------------------------------------------------
// Component kernel linking information
typedef struct tagKdll_Linking
{
int iKUID; // Component Kernel Unique ID
uint32_t bExport : 1; // Export (1) / Import (0)
uint32_t bInline : 1; // Inline(1) / Function (0)
uint32_t : 2; // - (MBZ)
uint32_t iLabelID : 12; // Label ID
uint32_t dwOffset : 16; // Instruction offset
} Kdll_Linking, *pKdll_Linking;
// Kernel patches
typedef enum tagKdll_PatchKind
{
PatchKind_None = 0,
PatchKind_CSC_Coeff_Src0 = 1,
PatchKind_CSC_Coeff_Src1 = 2,
} Kdll_PatchKind;
typedef struct tagKdll_PatchBlock
{
uint32_t DstOffset : 16;
uint32_t SrcOffset : 8;
uint32_t BlockSize : 8;
} Kdll_PatchBlock;
// Kernel Patching data
typedef struct tagKdll_PatchData
{
// Data for patching
int iPatchDataSize; // Size of Patch data block
uint8_t Data[DL_MAX_PATCH_DATA_SIZE]; // Patch data
// Patches
int nPatches;
Kdll_PatchBlock Patch[DL_MAX_PATCH_BLOCKS];
} Kdll_PatchData;
// Patch rule entry (rule extension)
typedef struct tagKdll_PatchRuleEntry
{
uint32_t Dest : 16 ; // Patch destination in bytes (LSB)
uint32_t Source : 8 ; // Patch data source in bytes
uint32_t Size : 8 ; // Patch size in bytes (MSB)
} Kdll_PatchRuleEntry;
extern const char *g_cInit_ComponentNames[];
//------------------------------------------------------------
// KERNEL CACHE / LINK
//------------------------------------------------------------
// Import/export structure from kernel binary file
#pragma pack(4)
typedef struct tagKdll_LinkFileHeader
{
uint32_t dwVersion;
uint32_t dwSize;
uint32_t dwImports;
uint32_t dwExports;
} Kdll_LinkFileHeader;
typedef struct tagKdll_LinkData
{
uint32_t iKUID : 16; // Kernel Unique ID
uint32_t iLabelID : 16; // Label ID
uint32_t bExport : 1; // 0 - import; 1 - export;
uint32_t bResolved : 1; // 0 - unresolved; 1 - resolved;
uint32_t dwOffset : 20; // Offset in DWORDs
uint32_t bInline : 1; // 0 - function; 1 - inline;
uint32_t : 9; // MBZ
} Kdll_LinkData;
#pragma pack()
typedef struct tagKdll_Symbol
{
uint32_t dwSize;
uint32_t dwCount;
Kdll_LinkData *pLink;
} Kdll_Symbol;
typedef struct tagKdll_CacheEntry
{
// Kernel binary
uint8_t *pBinary; // kernel binary
int iSize; // kernel size
// Component kernel information
int iKUID; // kernel unique id (static kernel)
const char *szName; // kernel name
int nLink; // Number of imports/exports
Kdll_LinkData *pLink; // Kernel imports/exports
// Combined kernel information
uint16_t wHashEntry; // hash table entry
int iFilterSize; // kernel filter size
Kdll_FilterEntry *pFilter; // kernel filter description
Kdll_CSC_Params *pCscParams; // kernel CSC parameters
VPHAL_CSPACE colorfill_cspace; // intermediate color space for colorfill
// Cache control
int iKCID; // kernel cache id (dynamically linked kernel)
uint32_t dwLoaded; // kernel loaded flag
uint32_t dwRefresh; // refresh counter (for expiration control)
struct tagKdll_CacheEntry *pNextEntry; // Next cache entry;
} Kdll_CacheEntry;
typedef struct tagKdll_KernelCache
{
int iCacheMaxEntries; // Max number of entries
int iCacheEntries; // Current number of cache entries
int iCacheSize; // Cache buffer size
int iCacheFree; // Cache buffer free
int iCacheID; // Next kernel cache ID
Kdll_CacheEntry *pCacheEntries; // Array of kernel cache entries
uint8_t *pCache; // Cache (binary data)
int nExports; // Exports count
Kdll_LinkData *pExports; // Exports table
} Kdll_KernelCache;
//--------------------------------------------------------------
// Kernel Hash table
//--------------------------------------------------------------
typedef struct tagKdll_KernelHashEntry
{
uint16_t next; // Next entry with same 8-bit hash + 1 (0 is null)
uint32_t dwHash; // 32-bit hash value (FNV-1a hash)
int iFilter; // Filter size
Kdll_FilterEntry *pFilter; // Filter for matching
Kdll_CacheEntry *pCacheEntry; // Pointer to kernel cache entry
} Kdll_KernelHashEntry;
typedef struct tagKdll_KernelHashTable
{
uint16_t wHashTable[256]; // 256 hashes (1 based index)
uint16_t pool; // first in pool (1 based index)
uint16_t last; // last in pool (for releasing)
Kdll_KernelHashEntry HashEntry[DL_MAX_COMBINED_KERNELS]; // Hash table entries
} Kdll_KernelHashTable;
//--------------------------------------------------------------
// Dynamic linking state
//--------------------------------------------------------------
typedef struct tagKdll_State *PKdll_State;
typedef struct tagKdll_SearchState *PKdll_SearchState;
typedef struct tagKdll_State
{
int iSize; // Size of DL buffer
uint32_t dwRefresh; // Refresh counter (for garbage collection)
bool bEnableCMFC; // Flag to enable CMFC
// Default kernel component cache and rule table
Kdll_KernelCache ComponentKernelCache; // Component kernels cache
const Kdll_RuleEntry *pRuleTableDefault; // Default Dll rules (internal)
// CMFC kernel fcpatch cache
Kdll_KernelCache CmFcPatchCache; // CMFC kernel fcpatch cache
// Custom kernel component cache and rule table
Kdll_KernelCache *pCustomKernelCache; // Custom kernel cache
const Kdll_RuleEntry *pRuleTableCustom; // Custom Dll rules (external)
// Combined rule lookup table
Kdll_RuleEntrySet *pSortedRules; // Sorted rule table
Kdll_RuleEntrySet *pDllRuleTable[Parser_Count]; // Rule acceleration table (one entry for each Parser State)
int iDllRuleCount[Parser_Count]; // Rule count (number of entries for each Parser State)
// Combined kernel cache and hash table
Kdll_KernelCache KernelCache; // Output kernel cache
Kdll_KernelHashTable KernelHashTable; // Hash table for resulting kernels
Kdll_Procamp *pProcamp; // Array of Procamp parameters
int32_t iProcampSize; // Size of the array of Procamp parameters
// Colorfill
VPHAL_CSPACE colorfill_cspace; // Selected colorfill Color Space by Kdll
// Start kernel search
void (* pfnStartKernelSearch)(PKdll_State pState,
PKdll_SearchState pSearchState,
Kdll_FilterEntry *pFilter,
int32_t iFilterSize,
uint32_t uiIs64BInstrEnabled);
// Find best ColorSpace to use internally, allocate/calculate CSC matrices and arguments
bool (* pfnSetupCSC) (PKdll_State pState,
PKdll_SearchState pSearchState);
// Find rule that matches the current search state
bool (* pfnFindRule) (PKdll_State pState,
PKdll_SearchState pSearchState);
// Update state based on rule
bool (* pfnUpdateState) (PKdll_State pState,
PKdll_SearchState pSearchState);
// Search Kernel based for a given
bool (* pfnSearchKernel) (PKdll_State pState,
PKdll_SearchState pSearchState);
// Build current best match kernel
bool (* pfnBuildKernel) (PKdll_State pState,
PKdll_SearchState pSearchState);
// Map matrix to kernel CSC
bool (* pfnMapCSCMatrix) (Kdll_CSCType type,
const float *matrix,
short *coeff);
#if EMUL
// Token to be passed back in Callbacks
void *pToken;
// Print Component Kernel
void (* pfnCbListKernel) (void *token,
const char *szKernel);
// State update
void (* pfnCbSearchSate) (void *token,
int32_t reason,
PKdll_SearchState pSearchState);
#endif
} Kdll_State;
typedef struct tagKdll_SearchState
{
// Kernel DLL state
Kdll_State *pKdllState; // Kernel DLL State
// Filter and CSC parameters
Kdll_FilterDesc Filter; // Output Filter, with CSC data
int iFilterSize; // Size of the filter
Kdll_CSC_Params CscParams; // CSC parameters
bool bCscBeforeMix; // flag to identify if CSC needed before Mix
Kdll_Shuffling ShuffleSamplerData; // Gen7+ Shuffle sampler output
// RT Rotate
bool bRTRotate;
// Procamp
bool bProcamp;
// Search output
Kdll_RuleEntrySet *pMatchingRuleSet; // Pointer to the matching rule set
// Kernels
int KernelCount; // # of kernels
int KernelID[DL_MAX_KERNELS]; // Array of kernel ids
int KernelGrp[DL_MAX_KERNELS]; // Array of kernel groups
int PatchID [DL_MAX_KERNELS]; // Array of patches
// Kernel patches
int PatchCount; // Number of patches
Kdll_PatchData Patches[DL_MAX_PATCHES]; // Kernel patches
// Current state
Kdll_FilterEntry *pFilter; // Current filter entry
Kdll_ParserState state; // Parser state
VPHAL_CSPACE cspace; // Destination color space
int quadrant; // Current quadrant
int layer_number; // Current layer number
// Src0 state
MOS_FORMAT src0_format; // Src0 source format
Kdll_Sampling src0_sampling; // Src0 sampling mode
int32_t src0_colorfill; // Src0 colorfill flag
int32_t src0_lumakey; // Src0 luma key
int32_t src0_procamp; // Src0 procamp
Kdll_CoeffID src0_coeff; // Src0 CSC coefficiants
Kdll_Processing src0_process; // Src0 processing mode
VPHAL_ROTATION src0_rotation; // Src0 Rotate
// Src1 state
MOS_FORMAT src1_format; // Src1 source format
Kdll_Sampling src1_sampling; // Src1 sampling mode
int32_t src1_lumakey; // Src1 luma key
int32_t src1_samplerlumakey; // Src1 sampler luma key
int32_t src1_procamp; // Src1 procamp
Kdll_CoeffID src1_coeff; // Src1 CSC coefficients
Kdll_Processing src1_process; // Src1 processing mode
VPHAL_ROTATION src1_rotation; // Src1 Rotate
// Render Target Format
MOS_FORMAT target_format; // Render Target format
bool b64BSaveEnabled; // Whether to use 64B save kernel
MOS_TILE_TYPE target_tiletype; // Render Target Tile Type
// Dynamic linking
int KernelSize; // Kernel Size
int KernelLeft; // Remaining size
Kdll_Symbol KernelLink; // DL symbols for linking
Kdll_LinkData LinkArray[DL_MAX_SYMBOLS]; // Import/Export symbols for dynamic linking
uint8_t Kernel[DL_MAX_KERNEL_SIZE];// Output Kernel
} Kdll_SearchState;
//---------------------------------
// Kernel DLL function prototypes
//---------------------------------
bool KernelDll_IsYUVFormat(MOS_FORMAT format);
bool KernelDll_IsFormat(
MOS_FORMAT format,
VPHAL_CSPACE cspace,
MOS_FORMAT match);
bool KernelDll_IsCspace(
VPHAL_CSPACE cspace,
VPHAL_CSPACE match);
VPHAL_CSPACE KernelDll_TranslateCspace(VPHAL_CSPACE cspace);
void KernelDll_GetCSCMatrix(
Kdll_CSpace src,
Kdll_CSpace dst,
float *pCSC_Matrix);
bool KernelDll_MapCSCMatrix(
Kdll_CSCType type,
const float *matrix,
short *coeff);
// Kernel Rule Search / State Update
bool KernelDll_FindRule(
Kdll_State *pState,
Kdll_SearchState *pSearchState);
bool KernelDll_UpdateState(
Kdll_State *pState,
Kdll_SearchState *pSearchState);
// Simple Hash function
uint32_t KernelDll_SimpleHash(
void *pData,
int iSize);
//---------------------------------------------------------------------------------------
// KernelDll_SetupFunctionPointers - Setup Function pointers based on platform
//
// Parameters:
// char *pState - [in] Kernel Dll state
// platform - [in] platform
//
// Output: true - Function pointers are set
// false - Failed to setup function pointers (invalid platform)
//-----------------------------------------------------------------------------------------
static bool KernelDll_SetupFunctionPointers(
Kdll_State *pState,
void(*ModifyFunctionPointers)(PKdll_State));
// Allocate Kernel Dll State
Kdll_State *KernelDll_AllocateStates(
void *pKernelCache,
uint32_t uKernelCacheSize,
void *pFcPatchCache,
uint32_t uFcPatchCacheSize,
const Kdll_RuleEntry *pInternalRules,
void(*ModifyFunctionPointers)(PKdll_State));
// Release Kernel Dll State
void KernelDll_ReleaseStates(Kdll_State *pState);
// Setup Kernel Dll Procamp Parameters
void KernelDll_SetupProcampParameters(Kdll_State *pState,
Kdll_Procamp *pProcamp,
int iProcampSize);
// Update CSC coefficients
void KernelDll_UpdateCscCoefficients(Kdll_State *pState,
Kdll_CSC_Matrix *pMatrix);
// Find Kernel in hash table
Kdll_CacheEntry *
KernelDll_GetCombinedKernel(Kdll_State *pState,
Kdll_FilterEntry *iFilter,
int iFilterSize,
uint32_t dwHash);
// Get component/static kernel
Kdll_CacheEntry *
KernelDll_GetComponentKernel(Kdll_State *pState,
int iKUID);
// Allocate cache entry for a given size
Kdll_CacheEntry *
KernelDll_AllocateCacheEntry(Kdll_KernelCache *pCache,
int32_t iSize);
// Allocate more kernel cache entries
Kdll_CacheEntry *
KernelDll_AllocateAdditionalCacheEntries(Kdll_KernelCache *pCache);
//Release the additional kernel cache entries
void KernelDll_ReleaseAdditionalCacheEntries(Kdll_KernelCache *pCache);
// Add kernel to cache and hash table
Kdll_CacheEntry *
KernelDll_AddKernel(Kdll_State *pState,
Kdll_SearchState *pSearchState,
Kdll_FilterEntry *pFilter,
int iFilterSize,
uint32_t dwHash);
// Search kernel, output is in pSearchState
bool KernelDll_SearchKernel(
Kdll_State *pState,
Kdll_SearchState *pSearchState);
// Build kernel in SearchState
bool KernelDll_BuildKernel(Kdll_State *pState, Kdll_SearchState *pSearchState);
bool KernelDll_SetupCSC(
Kdll_State *pState,
Kdll_SearchState *pSearchState);
bool KernelDll_IsSameFormatType(MOS_FORMAT format1, MOS_FORMAT format2);
void KernelDll_ReleaseHashEntry(Kdll_KernelHashTable *pHashTable, uint16_t entry);
void KernelDll_ReleaseCacheEntry(Kdll_KernelCache *pCache, Kdll_CacheEntry *pEntry);
//---------------------------------------------------------------------------------------
// KernelDll_SetupFunctionPointers_Ext - Setup Extension Function pointers
//
// Parameters:
// KdllState *pState - [in/out] Kernel Dll state
//
// Output: true - Function pointers are set
// false - Failed to setup function pointers (invalid platform)
//-----------------------------------------------------------------------------------------
bool KernelDll_SetupFunctionPointers_Ext(
Kdll_State *pState);
#if _DEBUG || EMUL
// Debugging strings for standalone application or debug driver
const char *KernelDll_GetLayerString (Kdll_Layer layer);
const char *KernelDll_GetFormatString (MOS_FORMAT format);
const char *KernelDll_GetCSpaceString (VPHAL_CSPACE cspace);
const char *KernelDll_GetSamplingString (Kdll_Sampling sampling);
const char *KernelDll_GetRotationString (VPHAL_ROTATION rotation);
const char *KernelDll_GetProcessString (Kdll_Processing process);
const char *KernelDll_GetParserStateString (Kdll_ParserState state);
const char *KernelDll_GetRuleIDString (Kdll_RuleID RID);
const char *KernelDll_GetCoeffIDString (Kdll_CoeffID CID);
int32_t KernelDll_PrintRule(
char *szOut,
int iSize,
const Kdll_RuleEntry *pEntry,
Kdll_KernelCache *pCache);
#endif // _DEBUG || EMUL
#ifdef __cplusplus
}
#endif
#endif // __HAL_KERNELDLL_H__