blob: 23ee662ec06d3480f16398b255ab353e576cf979 [file] [log] [blame]
/*
* Copyright (c) 2014-2018, 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 mhw_utilities.h
//! \brief This modules implements utilities which are shared by both the HW interface and the state heap interface.
//!
#ifndef __MHW_UTILITIES_H__
#define __MHW_UTILITIES_H__
#include "mos_os.h"
#include <math.h>
#include "mos_util_debug.h"
#include "mhw_mmio.h"
typedef struct _MHW_RCS_SURFACE_PARAMS MHW_RCS_SURFACE_PARAMS, *PMHW_RCS_SURFACE_PARAMS;
typedef struct _MHW_BATCH_BUFFER MHW_BATCH_BUFFER, *PMHW_BATCH_BUFFER;
#define MHW_CACHELINE_SIZE 64
#define MHW_PAGE_SIZE 0x1000
#define MHW_TIMEOUT_MS_DEFAULT 1000
#define MHW_EVENT_TIMEOUT_MS 5
#define MHW_WIDTH_IN_DW(w) ((w + 0x3) >> 2)
#define MHW_AVS_TBL_COEF_PREC 6 //!< Table coef precision (after decimal point
#define MHW_TABLE_PHASE_PREC 5
#define MHW_TABLE_PHASE_COUNT (1 << MHW_TABLE_PHASE_PREC)
#define MHW_SCALER_UV_WIN_SIZE 4
#define MHW_TBL_COEF_PREC 6
#define NUM_HW_POLYPHASE_TABLES 32 //!< must be the same as NUM_HW_POLYPHASE_TABLES_G9
#define NUM_POLYPHASE_TABLES 32
#define NUM_POLYPHASE_Y_ENTRIES 8
#define NUM_POLYPHASE_5x5_Y_ENTRIES 5
#define NUM_POLYPHASE_UV_ENTRIES 4
#define NUM_HW_POLYPHASE_TABLES_G8 17
#define POLYPHASE_Y_COEFFICIENT_TABLE_SIZE_G8 (NUM_POLYPHASE_Y_ENTRIES * NUM_HW_POLYPHASE_TABLES_G8 * sizeof(int32_t))
#define POLYPHASE_UV_COEFFICIENT_TABLE_SIZE_G8 (NUM_POLYPHASE_UV_ENTRIES * NUM_HW_POLYPHASE_TABLES_G8 * sizeof(int32_t))
#define NUM_HW_POLYPHASE_TABLES_G9 32
#define POLYPHASE_Y_COEFFICIENT_TABLE_SIZE_G9 (NUM_POLYPHASE_Y_ENTRIES * NUM_HW_POLYPHASE_TABLES_G9 * sizeof(int32_t))
#define POLYPHASE_UV_COEFFICIENT_TABLE_SIZE_G9 (NUM_POLYPHASE_UV_ENTRIES * NUM_HW_POLYPHASE_TABLES_G9 * sizeof(int32_t))
#define NUM_HW_POLYPHASE_TABLES_G10 32
#define POLYPHASE_Y_COEFFICIENT_TABLE_SIZE_G10 (NUM_POLYPHASE_Y_ENTRIES * NUM_HW_POLYPHASE_TABLES_G10 * sizeof(int32_t))
#define POLYPHASE_UV_COEFFICIENT_TABLE_SIZE_G10 (NUM_POLYPHASE_UV_ENTRIES * NUM_HW_POLYPHASE_TABLES_G10 * sizeof(int32_t))
// Calculates the number of bits between the startbit and the endbit (0 based).
#ifndef MHW_BITFIELD_RANGE
#define MHW_BITFIELD_RANGE( startbit, endbit ) ((endbit)-(startbit)+1)
#endif
#define _NAME_MERGE_(x, y) x ## y
#define _NAME_LABEL_(name, id) _NAME_MERGE_(name, id)
#define __CODEGEN_UNIQUE(name) _NAME_LABEL_(name, __LINE__)
#ifndef SIZE32
#define SIZE32( x ) ((uint32_t)( sizeof(x) / sizeof(uint32_t) ))
#endif // SIZE32
#ifndef OP_LENGTH
#define OP_LENGTH( x ) ((uint32_t)(x) - 2 )
#endif // OP_LENGTH
// Calculates the number of bits between the startbit and the endbit (0 based).
#ifndef BITFIELD_RANGE
#define BITFIELD_RANGE( startbit, endbit ) ((endbit)-(startbit)+1)
#endif
// Definition declared for clarity when creating structs.
#ifndef BITFIELD_BIT
#define BITFIELD_BIT( bit ) 1
#endif
#define MHW_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
//------------------------------------------------------------------------------
// Macros specific to MOS_CODEC_SUBCOMP_HW sub-comp
//------------------------------------------------------------------------------
#define MHW_ASSERT(_expr) \
MOS_ASSERT(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _expr)
#define MHW_ASSERTMESSAGE(_message, ...) \
MOS_ASSERTMESSAGE(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _message, ##__VA_ARGS__)
#define MHW_NORMALMESSAGE(_message, ...) \
MOS_NORMALMESSAGE(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _message, ##__VA_ARGS__)
#define MHW_VERBOSEMESSAGE(_message, ...) \
MOS_VERBOSEMESSAGE(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _message, ##__VA_ARGS__)
#define MHW_FUNCTION_ENTER \
MOS_FUNCTION_ENTER(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL)
#define MHW_FUNCTION_EXIT \
MOS_FUNCTION_EXIT(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, eStatus)
#define MHW_CHK_STATUS(_stmt) \
MOS_CHK_STATUS(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _stmt)
#define MHW_CHK_STATUS_RETURN(_stmt) \
MOS_CHK_STATUS_RETURN(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _stmt)
#define MHW_CHK_STATUS_MESSAGE(_stmt, _message, ...) \
MOS_CHK_STATUS_MESSAGE(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _stmt, _message, ##__VA_ARGS__)
#define MHW_CHK_NULL(_ptr) \
MOS_CHK_NULL(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _ptr)
#define MHW_CHK_NULL_NO_STATUS(_ptr) \
MOS_CHK_NULL_NO_STATUS(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _ptr)
#define MHW_CHK_NULL_NO_STATUS_RETURN(_ptr) \
MOS_CHK_NULL_NO_STATUS_RETURN(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _ptr)
#define MHW_CHK_COND(_condition, _message, ...) \
MOS_CHK_COND_RETURN(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, (_condition), (_message), ##__VA_ARGS__)
#define MHW_CHK_NULL_RETURN(_ptr) \
MOS_CHK_NULL_RETURN(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _ptr)
#define MHW_CHK_STATUS_RETURN(_stmt) \
MOS_CHK_STATUS_RETURN(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _stmt)
#define MHW_MI_CHK_STATUS(_stmt) \
MOS_CHK_STATUS_RETURN(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _stmt)
#define MHW_MI_CHK_STATUS_MESSAGE(_stmt, _message, ...) \
MOS_CHK_STATUS_MESSAGE_RETURN(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _stmt, _message, ##__VA_ARGS__)
#define MHW_MI_CHK_NULL(_ptr) \
MOS_CHK_NULL_RETURN(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _ptr)
enum GFX_OPCODE
{
GFXOP_PIPELINED = 0x0,
GFXOP_VEBOX = 0x4,
GFXOP_MFX_VEBOX_SFC = 0xA // Media MFX/VEBOX+SFC Mode
};
enum INSTRUCTION_PIPELINE
{
PIPE_COMMON = 0x0,
PIPE_SINGLE_DWORD = 0x1,
PIPE_COMMON_CTG = 0x1,
PIPE_MEDIA = 0x2,
PIPE_3D = 0x3
};
enum INSTRUCTION_TYPE
{
INSTRUCTION_MI = 0x0,
INSTRUCTION_2D = 0x2,
INSTRUCTION_GFX = 0x3
};
enum MHW_GFX3DSTATE_SURFACEFORMAT
{
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32A32_FLOAT = 0x000,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32A32_SINT = 0x001,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32A32_UINT = 0x002,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32A32_UNORM = 0x003,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32A32_SNORM = 0x004,
MHW_GFX3DSTATE_SURFACEFORMAT_R64G64_FLOAT = 0x005,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32X32_FLOAT = 0x006,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32A32_SSCALED = 0x007,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32A32_USCALED = 0x008,
MHW_GFX3DSTATE_SURFACEFORMAT_R16B16_UNORM_SAMPLE_8X8 = 0x017,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32_FLOAT = 0x040,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32_SINT = 0x041,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32_UINT = 0x042,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32_UNORM = 0x043,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32_SNORM = 0x044,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32_SSCALED = 0x045,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32_USCALED = 0x046,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_UNORM = 0x080,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_SNORM = 0x081,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_SINT = 0x082,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_UINT = 0x083,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_FLOAT = 0x084,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32_FLOAT = 0x085,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32_SINT = 0x086,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32_UINT = 0x087,
MHW_GFX3DSTATE_SURFACEFORMAT_R32_FLOAT_X8X24_TYPELESS = 0x088,
MHW_GFX3DSTATE_SURFACEFORMAT_X32_TYPELESS_G8X24_UINT = 0x089,
MHW_GFX3DSTATE_SURFACEFORMAT_L32A32_FLOAT = 0x08A,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32_UNORM = 0x08B,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32_SNORM = 0x08C,
MHW_GFX3DSTATE_SURFACEFORMAT_R64_FLOAT = 0x08D,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16X16_UNORM = 0x08E,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16X16_FLOAT = 0x08F,
MHW_GFX3DSTATE_SURFACEFORMAT_A32X32_FLOAT = 0x090,
MHW_GFX3DSTATE_SURFACEFORMAT_L32X32_FLOAT = 0x091,
MHW_GFX3DSTATE_SURFACEFORMAT_I32X32_FLOAT = 0x092,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_SSCALED = 0x093,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_USCALED = 0x094,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32_SSCALED = 0x095,
MHW_GFX3DSTATE_SURFACEFORMAT_R32G32_USCALED = 0x096,
MHW_GFX3DSTATE_SURFACEFORMAT_B8G8R8A8_UNORM = 0x0C0,
MHW_GFX3DSTATE_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB = 0x0C1,
MHW_GFX3DSTATE_SURFACEFORMAT_R10G10B10A2_UNORM = 0x0C2,
MHW_GFX3DSTATE_SURFACEFORMAT_R10G10B10A2_UNORM_SRGB = 0x0C3,
MHW_GFX3DSTATE_SURFACEFORMAT_R10G10B10A2_UINT = 0x0C4,
MHW_GFX3DSTATE_SURFACEFORMAT_R10G10B10_SNORM_A2_UNORM = 0x0C5,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM = 0x0C7,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM_SRGB = 0x0C8,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_SNORM = 0x0C9,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_SINT = 0x0CA,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UINT = 0x0CB,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_UNORM = 0x0CC,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_SNORM = 0x0CD,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_SINT = 0x0CE,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_UINT = 0x0CF,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_FLOAT = 0x0D0,
MHW_GFX3DSTATE_SURFACEFORMAT_B10G10R10A2_UNORM = 0x0D1,
MHW_GFX3DSTATE_SURFACEFORMAT_B10G10R10A2_UNORM_SRGB = 0x0D2,
MHW_GFX3DSTATE_SURFACEFORMAT_R11G11B10_FLOAT = 0x0D3,
MHW_GFX3DSTATE_SURFACEFORMAT_R32_SINT = 0x0D6,
MHW_GFX3DSTATE_SURFACEFORMAT_R32_UINT = 0x0D7,
MHW_GFX3DSTATE_SURFACEFORMAT_R32_FLOAT = 0x0D8,
MHW_GFX3DSTATE_SURFACEFORMAT_R24_UNORM_X8_TYPELESS = 0x0D9,
MHW_GFX3DSTATE_SURFACEFORMAT_X24_TYPELESS_G8_UINT = 0x0DA,
MHW_GFX3DSTATE_SURFACEFORMAT_L16A16_UNORM = 0x0DF,
MHW_GFX3DSTATE_SURFACEFORMAT_I24X8_UNORM = 0x0E0,
MHW_GFX3DSTATE_SURFACEFORMAT_L24X8_UNORM = 0x0E1,
MHW_GFX3DSTATE_SURFACEFORMAT_A24X8_UNORM = 0x0E2,
MHW_GFX3DSTATE_SURFACEFORMAT_I32_FLOAT = 0x0E3,
MHW_GFX3DSTATE_SURFACEFORMAT_L32_FLOAT = 0x0E4,
MHW_GFX3DSTATE_SURFACEFORMAT_A32_FLOAT = 0x0E5,
MHW_GFX3DSTATE_SURFACEFORMAT_B8G8R8X8_UNORM = 0x0E9,
MHW_GFX3DSTATE_SURFACEFORMAT_B8G8R8X8_UNORM_SRGB = 0x0EA,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8X8_UNORM = 0x0EB,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8X8_UNORM_SRGB = 0x0EC,
MHW_GFX3DSTATE_SURFACEFORMAT_R9G9B9E5_SHAREDEXP = 0x0ED,
MHW_GFX3DSTATE_SURFACEFORMAT_B10G10R10X2_UNORM = 0x0EE,
MHW_GFX3DSTATE_SURFACEFORMAT_L16A16_FLOAT = 0x0F0,
MHW_GFX3DSTATE_SURFACEFORMAT_R32_UNORM = 0x0F1,
MHW_GFX3DSTATE_SURFACEFORMAT_R32_SNORM = 0x0F2,
MHW_GFX3DSTATE_SURFACEFORMAT_R10G10B10X2_USCALED = 0x0F3,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_SSCALED = 0x0F4,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_USCALED = 0x0F5,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_SSCALED = 0x0F6,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_USCALED = 0x0F7,
MHW_GFX3DSTATE_SURFACEFORMAT_R32_SSCALED = 0x0F8,
MHW_GFX3DSTATE_SURFACEFORMAT_R32_USCALED = 0x0F9,
MHW_GFX3DSTATE_SURFACEFORMAT_R8B8G8A8_UNORM = 0x0FA,
MHW_GFX3DSTATE_SURFACEFORMAT_B5G6R5_UNORM = 0x100,
MHW_GFX3DSTATE_SURFACEFORMAT_B5G6R5_UNORM_SRGB = 0x101,
MHW_GFX3DSTATE_SURFACEFORMAT_B5G5R5A1_UNORM = 0x102,
MHW_GFX3DSTATE_SURFACEFORMAT_B5G5R5A1_UNORM_SRGB = 0x103,
MHW_GFX3DSTATE_SURFACEFORMAT_B4G4R4A4_UNORM = 0x104,
MHW_GFX3DSTATE_SURFACEFORMAT_B4G4R4A4_UNORM_SRGB = 0x105,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_UNORM = 0x106,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_SNORM = 0x107,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_SINT = 0x108,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_UINT = 0x109,
MHW_GFX3DSTATE_SURFACEFORMAT_R16_UNORM = 0x10A,
MHW_GFX3DSTATE_SURFACEFORMAT_R16_SNORM = 0x10B,
MHW_GFX3DSTATE_SURFACEFORMAT_R16_SINT = 0x10C,
MHW_GFX3DSTATE_SURFACEFORMAT_R16_UINT = 0x10D,
MHW_GFX3DSTATE_SURFACEFORMAT_R16_FLOAT = 0x10E,
MHW_GFX3DSTATE_SURFACEFORMAT_I16_UNORM = 0x111,
MHW_GFX3DSTATE_SURFACEFORMAT_L16_UNORM = 0x112,
MHW_GFX3DSTATE_SURFACEFORMAT_A16_UNORM = 0x113,
MHW_GFX3DSTATE_SURFACEFORMAT_L8A8_UNORM = 0x114,
MHW_GFX3DSTATE_SURFACEFORMAT_I16_FLOAT = 0x115,
MHW_GFX3DSTATE_SURFACEFORMAT_L16_FLOAT = 0x116,
MHW_GFX3DSTATE_SURFACEFORMAT_A16_FLOAT = 0x117,
MHW_GFX3DSTATE_SURFACEFORMAT_L8A8_UNORM_SRGB = 0x118,
MHW_GFX3DSTATE_SURFACEFORMAT_R5G5_SNORM_B6_UNORM = 0x119,
MHW_GFX3DSTATE_SURFACEFORMAT_B5G5R5X1_UNORM = 0x11A,
MHW_GFX3DSTATE_SURFACEFORMAT_B5G5R5X1_UNORM_SRGB = 0x11B,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_SSCALED = 0x11C,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_USCALED = 0x11D,
MHW_GFX3DSTATE_SURFACEFORMAT_R16_SSCALED = 0x11E,
MHW_GFX3DSTATE_SURFACEFORMAT_R16_USCALED = 0x11F,
MHW_GFX3DSTATE_SURFACEFORMAT_P8A8_UNORM_PALETTE_0 = 0x122,
MHW_GFX3DSTATE_SURFACEFORMAT_P8A8_UNORM_PALETTE_1 = 0x123,
MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM = 0x140,
MHW_GFX3DSTATE_SURFACEFORMAT_R8_SNORM = 0x141,
MHW_GFX3DSTATE_SURFACEFORMAT_R8_SINT = 0x142,
MHW_GFX3DSTATE_SURFACEFORMAT_R8_UINT = 0x143,
MHW_GFX3DSTATE_SURFACEFORMAT_A8_UNORM = 0x144,
MHW_GFX3DSTATE_SURFACEFORMAT_I8_UNORM = 0x145,
MHW_GFX3DSTATE_SURFACEFORMAT_L8_UNORM = 0x146,
MHW_GFX3DSTATE_SURFACEFORMAT_P4A4_UNORM_PALETTE_0 = 0x147,
MHW_GFX3DSTATE_SURFACEFORMAT_A4P4_UNORM_PALETTE_0 = 0x148,
MHW_GFX3DSTATE_SURFACEFORMAT_R8_SSCALED = 0x149,
MHW_GFX3DSTATE_SURFACEFORMAT_R8_USCALED = 0x14A,
MHW_GFX3DSTATE_SURFACEFORMAT_P8_UNORM_PALETTE_0 = 0x14B,
MHW_GFX3DSTATE_SURFACEFORMAT_L8_UNORM_SRGB = 0x14C,
MHW_GFX3DSTATE_SURFACEFORMAT_P8_UNORM_PALETTE_1 = 0x14D,
MHW_GFX3DSTATE_SURFACEFORMAT_P4A4_UNORM_PALETTE_1 = 0x14E,
MHW_GFX3DSTATE_SURFACEFORMAT_A4P4_UNORM_PALETTE_1 = 0x14F,
MHW_GFX3DSTATE_SURFACEFORMAT_DXT1_RGB_SRGB = 0x180,
MHW_GFX3DSTATE_SURFACEFORMAT_R1_UINT = 0x181,
MHW_GFX3DSTATE_SURFACEFORMAT_YCRCB_NORMAL = 0x182,
MHW_GFX3DSTATE_SURFACEFORMAT_YCRCB_SWAPUVY = 0x183,
MHW_GFX3DSTATE_SURFACEFORMAT_P2_UNORM_PALETTE_0 = 0x184,
MHW_GFX3DSTATE_SURFACEFORMAT_P2_UNORM_PALETTE_1 = 0x185,
MHW_GFX3DSTATE_SURFACEFORMAT_BC1_UNORM = 0x186,
MHW_GFX3DSTATE_SURFACEFORMAT_BC2_UNORM = 0x187,
MHW_GFX3DSTATE_SURFACEFORMAT_BC3_UNORM = 0x188,
MHW_GFX3DSTATE_SURFACEFORMAT_BC4_UNORM = 0x189,
MHW_GFX3DSTATE_SURFACEFORMAT_BC5_UNORM = 0x18A,
MHW_GFX3DSTATE_SURFACEFORMAT_BC1_UNORM_SRGB = 0x18B,
MHW_GFX3DSTATE_SURFACEFORMAT_BC2_UNORM_SRGB = 0x18C,
MHW_GFX3DSTATE_SURFACEFORMAT_BC3_UNORM_SRGB = 0x18D,
MHW_GFX3DSTATE_SURFACEFORMAT_MONO8 = 0x18E,
MHW_GFX3DSTATE_SURFACEFORMAT_YCRCB_SWAPUV = 0x18F,
MHW_GFX3DSTATE_SURFACEFORMAT_YCRCB_SWAPY = 0x190,
MHW_GFX3DSTATE_SURFACEFORMAT_DXT1_RGB = 0x191,
MHW_GFX3DSTATE_SURFACEFORMAT_FXT1 = 0x192,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8_UNORM = 0x193,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8_SNORM = 0x194,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8_SSCALED = 0x195,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8_USCALED = 0x196,
MHW_GFX3DSTATE_SURFACEFORMAT_R64G64B64A64_FLOAT = 0x197,
MHW_GFX3DSTATE_SURFACEFORMAT_R64G64B64_FLOAT = 0x198,
MHW_GFX3DSTATE_SURFACEFORMAT_BC4_SNORM = 0x199,
MHW_GFX3DSTATE_SURFACEFORMAT_BC5_SNORM = 0x19A,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16_UNORM = 0x19C,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16_SNORM = 0x19D,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16_SSCALED = 0x19E,
MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16_USCALED = 0x19F,
MHW_GFX3DSTATE_SURFACEFORMAT_PLANAR_420_8 = 0x1A5,
MHW_GFX3DSTATE_SURFACEFORMAT_PLANAR_420_16 = 0x1A6,
MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8_UNORM_SRGB = 0x1A8,
MHW_GFX3DSTATE_SURFACEFORMAT_RAW = 0x1FF,
NUM_MHW_GFX3DSTATE_SURFACEFORMATS
};
enum MHW_MEDIASTATE_SURFACEFORMAT
{
MHW_MEDIASTATE_SURFACEFORMAT_YCRCB_NORMAL = 0,
MHW_MEDIASTATE_SURFACEFORMAT_YCRCB_SWAPUVY = 1,
MHW_MEDIASTATE_SURFACEFORMAT_YCRCB_SWAPUV = 2,
MHW_MEDIASTATE_SURFACEFORMAT_YCRCB_SWAPY = 3,
MHW_MEDIASTATE_SURFACEFORMAT_PLANAR_420_8 = 4,
MHW_MEDIASTATE_SURFACEFORMAT_PLANAR_411_8 = 5, // deinterlace only
MHW_MEDIASTATE_SURFACEFORMAT_PLANAR_422_8 = 6, // deinterlace only
MHW_MEDIASTATE_SURFACEFORMAT_STMM_DN_STATISTICS = 7, // deinterlace only
MHW_MEDIASTATE_SURFACEFORMAT_R10G10B10A2_UNORM = 8, // sample_8x8 only
MHW_MEDIASTATE_SURFACEFORMAT_R8G8B8A8_UNORM = 9, // sample_8x8 only
MHW_MEDIASTATE_SURFACEFORMAT_R8B8_UNORM = 10, // CrCb, sample_8x8 only
MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM = 11, // Cr/Cb, sample_8x8 only
MHW_MEDIASTATE_SURFACEFORMAT_Y8_UNORM = 12, // sample_8x8 only
MHW_MEDIASTATE_SURFACEFORMAT_A8Y8U8V8_UNORM = 13, // sample_8x8 only
MHW_MEDIASTATE_SURFACEFORMAT_B8G8R8A8_UNORM = 14, // sample_8x8 only
MHW_MEDIASTATE_SURFACEFORMAT_R16G16B16A16 = 15, // Sample_8x8 only
MHW_MEDIASTATE_SURFACEFORMAT_PLANAR_420_16 = 23, // Sample_8x8 only
MHW_MEDIASTATE_SURFACEFORMAT_R16B16_UNORM = 24, // Sample_8x8 only
MHW_MEDIASTATE_SURFACEFORMAT_R16_UNORM = 25, // Sample_8x8 only
MHW_MEDIASTATE_SURFACEFORMAT_Y16_UNORM = 26 // Sample_8x8 only
};
enum GFX3DSTATE_SURFACETYPE
{
GFX3DSTATE_SURFACETYPE_1D = 0,
GFX3DSTATE_SURFACETYPE_2D = 1,
GFX3DSTATE_SURFACETYPE_3D = 2,
GFX3DSTATE_SURFACETYPE_CUBE = 3,
GFX3DSTATE_SURFACETYPE_BUFFER = 4,
GFX3DSTATE_SURFACETYPE_SREBUF = 5, // Structured buffer surface.
GFX3DSTATE_SURFACETYPE_SCRATCH = 6, // Scratch space buffer.
GFX3DSTATE_SURFACETYPE_NULL = 7
};
enum SurfaceCacheabilityControl
{
surfaceCacheabilityControlBitsFromGtt = 0x0,
surfaceCacheabilityControlL3Cache = 0x1,
surfaceCacheabilityControlLLCCache = 0x2
};
enum GFX3DSTATE_MEDIA_BOUNDARY_PIXEL_MODE
{
GFX3DSTATE_BOUNDARY_NORMAL = 0x0,
GFX3DSTATE_BOUNDARY_PROGRESSIVE_FRAME = 0x2,
GFX3DSTATE_BOUNDARY_INTERLACED_FRAME = 0x3
};
enum TILED_RESOURCE_MODE_LEGACY
{
TRMODE_NONE = 0,
TRMODE_TILEYF = 1,
TRMODE_TILEYS = 2,
};
enum MEDIASTATE_SFC_PIPE_MODE
{
MEDIASTATE_SFC_PIPE_VD_TO_SFC = 0,
MEDIASTATE_SFC_PIPE_VE_TO_SFC = 1,
MEDIASTATE_SFC_PIPE_VE_TO_SFC_INTEGRAL = 4
};
enum MEDIASTATE_SFC_AVS_FILTER_MODE
{
MEDIASTATE_SFC_AVS_FILTER_5x5 = 0,
MEDIASTATE_SFC_AVS_FILTER_8x8 = 1,
MEDIASTATE_SFC_AVS_FILTER_BILINEAR = 2
};
enum MEDIASTATE_SFC_CHROMA_SUBSAMPLING_MODE
{
MEDIASTATE_SFC_CHROMA_SUBSAMPLING_400 = 0,
MEDIASTATE_SFC_CHROMA_SUBSAMPLING_420 = 1,
MEDIASTATE_SFC_CHROMA_SUBSAMPLING_422H = 2,
MEDIASTATE_SFC_CHROMA_SUBSAMPLING_444 = 4,
MEDIASTATE_SFC_CHROMA_SUBSAMPLING_411 = 5
};
enum MEDIASTATE_SFC_INPUT_ORDERING_MODE
{
MEDIASTATE_SFC_INPUT_ORDERING_VE_4x8 = 0,
MEDIASTATE_SFC_INPUT_ORDERING_VE_4x4 = 1,
MEDIASTATE_SFC_INPUT_ORDERING_VE_4x8_128pixel = 2,
MEDIASTATE_SFC_INPUT_ORDERING_VE_4x4_128pixel = 3,
MEDIASTATE_SFC_INPUT_ORDERING_VD_16x16_NOSHIFT = 0,
MEDIASTATE_SFC_INPUT_ORDERING_VD_16x16_SHIFT = 1,
MEDIASTATE_SFC_INPUT_ORDERING_VD_8x8_JPEG = 2,
MEDIASTATE_SFC_INPUT_ORDERING_VD_16x16_JPEG = 3,
MEDIASTATE_SFC_INPUT_ORDERING_VD_16x16_VP8 = 4
};
// SFC Pre-AVS Chroma Downsampling Mode
enum MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_MODE
{
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_DISABLED = 0x0,
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_444TO420 = 0x1,
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_444TO422 = 0x2,
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_422TO420 = 0x3
};
// SFC Pre-AVS Chroma Downsampling Coefficient -- Fractional Position of the Bilinear Filter
enum MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_COEF
{
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_COEF_0_OVER_8 = 0x0,
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_COEF_1_OVER_8 = 0x1,
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_COEF_2_OVER_8 = 0x2,
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_COEF_3_OVER_8 = 0x3,
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_COEF_4_OVER_8 = 0x4,
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_COEF_5_OVER_8 = 0x5,
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_COEF_6_OVER_8 = 0x6,
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_COEF_7_OVER_8 = 0x7,
MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_COEF_8_OVER_8 = 0x8
};
enum MEDIASTATE_VDIRECTION
{
MEDIASTATE_VDIRECTION_TOP_FIELD = 1,
MEDIASTATE_VDIRECTION_FULL_FRAME = 2,
MEDIASTATE_VDIRECTION_BOTTOM_FIELD = 3
};
typedef union _MHW_MEMORY_OBJECT_CONTROL_PARAMS
{
struct
{
uint32_t L3 : 1 ;
uint32_t CacheControl : 1 ;
uint32_t GFDT : 1 ;
uint32_t : 1 ;
uint32_t : 28;
} Gen7;
struct
{
uint32_t L3 : 1 ;
uint32_t CacheControl : 2 ;
uint32_t : 1 ;
uint32_t : 28;
} Gen7_5;
struct
{
uint32_t Age : 2 ;
uint32_t : 1 ;
uint32_t TargetCache : 2 ;
uint32_t CacheControl : 2 ;
uint32_t : 25;
} Gen8;
struct
{
uint32_t : 1 ;
uint32_t Index : 6 ;
uint32_t : 25;
} Gen9;
uint32_t Value;
} MHW_MEMORY_OBJECT_CONTROL_PARAMS, *PMHW_MEMORY_OBJECT_CONTROL_PARAMS;
typedef struct _MHW_RENDER_PWR_CLK_STATE_PARAMS
{
union
{
struct
{
// 0010: 2 EUs
// 0100: 4 EUs
// 0110: 6 EUs
// 1000: 8 EUs
uint32_t EUmin : BITFIELD_RANGE(0, 3); // Minimum number of EUs to power (per subslice if multiple subslices enabled)
uint32_t EUmax : BITFIELD_RANGE(4, 7); // Maximum number of EUs to power (per subslice if multiple subslices enabled)
// To specify an exact number of subslices, set EUmax equal to EUmin
uint32_t SubSliceCount : BITFIELD_RANGE(8, 10);
uint32_t SSCountEn : BITFIELD_RANGE(11, 11);
uint32_t SliceCount : BITFIELD_RANGE(12, 17);
uint32_t SCountEn : BITFIELD_RANGE(18, 18);
uint32_t Reserved1 : BITFIELD_RANGE(19, 30);
// Main trigger: Power Clock State Enable
// 0: No specific power state set, no message/wait with PMunit
// 1: CSunit sends the contents of this register to PMunit each time it is written, Send contents of this register to PMunit, wait for Ack.
uint32_t PowerClkStateEn : BITFIELD_RANGE(31, 31);
};
uint32_t Data;
};
}MHW_RENDER_PWR_CLK_STATE_PARAMS;
struct _MHW_BATCH_BUFFER
{
MOS_RESOURCE OsResource;
int32_t iRemaining; //!< Remaining space in the BB
int32_t iSize; //!< Command buffer size
uint32_t count; //!< Actual batch count in this resource. If larger than 1, multiple buffer has equal size and resource size count * size.
int32_t iCurrent; //!< Current offset in CB
bool bLocked; //!< True if locked in memory (pData must be valid)
uint8_t *pData; //!< Pointer to BB data
#if (_DEBUG || _RELEASE_INTERNAL)
int32_t iLastCurrent; //!< Save offset in CB (for debug plug-in/out)
#endif
// User defined
bool bSecondLevel; // REMOVE REMOVE
uint32_t dwOffset; //!< Offset to the data in the OS resource
// Batch Buffer synchronization logic
bool bBusy; //!< Busy flag (clear when Sync Tag is reached)
uint32_t dwCmdBufId; //!< Command Buffer ID for the workload
PMHW_BATCH_BUFFER pNext; //!< Next BB in the sync list
PMHW_BATCH_BUFFER pPrev; //!< Prev BB in the sync list
// Batch Buffer Client Private Data
uint32_t dwSyncTag;
bool bMatch;
int32_t iPrivateType; //!< Indicates the BB client
int32_t iPrivateSize; //!< Size of the current render args
void *pPrivateData; //!< Pointer to private BB data
};
typedef struct _MHW_BATCH_BUFFER_LIST
{
PMHW_BATCH_BUFFER pHead; //!< First element in the list
PMHW_BATCH_BUFFER pTail; //!< Last element in the list
int32_t iCount; //!< Number of BBs in this list
uint32_t dwSize; //!< Total BB memory in this list
} MHW_BATCH_BUFFER_LIST,*PMHW_BATCH_BUFFER_LIST;
enum WRITE_FLAG
{
WRITE = 0x1,
WRITE_WA = 0x2,
};
typedef struct _MHW_RESOURCE_PARAMS
{
PMOS_RESOURCE presResource;
uint32_t dwOffset;
uint32_t *pdwCmd;
uint32_t dwLocationInCmd;
uint32_t dwLsbNum;
uint32_t dwOffsetInSSH;
// Location of upper bound value relative to
// allocated resource address. The upper bound
// value will be set if this parameter is > zero
uint32_t dwUpperBoundLocationOffsetFromCmd;
uint32_t dwSize;
MOS_HW_COMMAND HwCommandType;
uint32_t dwSharedMocsOffset;
uint32_t bIsWritable;
// If the patching location does not start at bit 0 then the value to be patched needs to be shifted
uint32_t shiftAmount;
uint32_t shiftDirection;
MOS_PATCH_TYPE patchType;
}MHW_RESOURCE_PARAMS, *PMHW_RESOURCE_PARAMS;
typedef struct _MHW_GENERIC_PROLOG_PARAMS
{
PMOS_INTERFACE pOsInterface;
void *pvMiInterface;
bool bMmcEnabled;
PMOS_RESOURCE presStoreData;
uint32_t dwStoreDataOffset;
uint32_t dwStoreDataValue;
} MHW_GENERIC_PROLOG_PARAMS, *PMHW_GENERIC_PROLOG_PARAMS;
MOS_STATUS Mhw_AddResourceToCmd_GfxAddress(
PMOS_INTERFACE pOsInterface,
PMOS_COMMAND_BUFFER pCmdBuffer,
PMHW_RESOURCE_PARAMS pParams);
MOS_STATUS Mhw_AddResourceToCmd_PatchList(
PMOS_INTERFACE pOsInterface,
PMOS_COMMAND_BUFFER pCmdBuffer,
PMHW_RESOURCE_PARAMS pParams);
MOS_STATUS Mhw_SurfaceFormatToType(
uint32_t dwForceSurfaceFormat,
PMOS_SURFACE psSurface,
uint32_t *pdwSurfaceType);
MOS_STATUS Mhw_SendGenericPrologCmd(
PMOS_COMMAND_BUFFER pCmdBuffer,
PMHW_GENERIC_PROLOG_PARAMS pParams,
MHW_MI_MMIOREGISTERS *pMmioReg = nullptr);
MOS_STATUS Mhw_SetNearestModeTable(
int32_t *iCoefs,
uint32_t dwPlane,
bool bBalancedFilter);
MOS_STATUS Mhw_CalcPolyphaseTablesY(
int32_t *iCoefs,
float fScaleFactor,
uint32_t dwPlane,
MOS_FORMAT srcFmt,
float fHPStrength,
bool bUse8x8Filter,
uint32_t dwHwPhase,
float fLanczosT);
MOS_STATUS Mhw_CalcPolyphaseTablesUV(
int32_t *piCoefs,
float fLanczosT,
float fInverseScaleFactor);
MOS_STATUS Mhw_CalcPolyphaseTablesUVOffset(
int32_t *piCoefs,
float fLanczosT,
float fInverseScaleFactor,
int32_t iUvPhaseOffset);
MOS_STATUS Mhw_AllocateBb(
PMOS_INTERFACE pOsInterface,
PMHW_BATCH_BUFFER pBatchBuffer,
PMHW_BATCH_BUFFER pBatchBufferList,
uint32_t dwSize,
uint32_t batchCount=1);
MOS_STATUS Mhw_FreeBb(
PMOS_INTERFACE pOsInterface,
PMHW_BATCH_BUFFER pBatchBuffer,
PMHW_BATCH_BUFFER pBatchBufferList);
MOS_STATUS Mhw_LockBb(
PMOS_INTERFACE pOsInterface,
PMHW_BATCH_BUFFER pBatchBuffer);
MOS_STATUS Mhw_UnlockBb(
PMOS_INTERFACE pOsInterface,
PMHW_BATCH_BUFFER pBatchBuffer,
bool bResetBuffer);
uint32_t Mhw_ConvertToTRMode(
MOS_TILE_TYPE Type);
//*-----------------------------------------------------------------------------
//| Purpose: Function to add command to batch buffer
//| Also used to skip commands if pCmd provided is nullptr
//| Return: MOS_STATUS_SUCCESS if call succeeds
//*-----------------------------------------------------------------------------
static __inline MOS_STATUS Mhw_AddCommandBB(
PMHW_BATCH_BUFFER pBatchBuffer, // [in] Pointer to Batch Buffer
const void *pCmd, // [in] Command Pointer
uint32_t dwCmdSize) // [in] Size of command in bytes
{
uint8_t *pbBatchPtr;
uint32_t dwCmdSizeDwAligned;
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
//---------------------------------------------
MHW_CHK_NULL(pBatchBuffer);
MHW_CHK_NULL(pBatchBuffer->pData);
//---------------------------------------------
pbBatchPtr = pBatchBuffer->pData + pBatchBuffer->iCurrent;
dwCmdSizeDwAligned = MOS_ALIGN_CEIL(dwCmdSize, sizeof(uint32_t));
pBatchBuffer->iCurrent += dwCmdSizeDwAligned;
if (pCmd)
{
pBatchBuffer->iRemaining -= dwCmdSizeDwAligned;
if (pBatchBuffer->iRemaining < 0)
{
MHW_ASSERTMESSAGE("Unable to add command (no space).");
return MOS_STATUS_UNKNOWN;
}
eStatus = MOS_SecureMemcpy(pbBatchPtr, dwCmdSize, pCmd, dwCmdSize);
if(eStatus != MOS_STATUS_SUCCESS)
{
MHW_ASSERTMESSAGE("Failed to copy memory.");
return eStatus;
}
}
finish:
return eStatus;
}
//*-----------------------------------------------------------------------------
//| Purpose: Function to add command to batch buffer
//| Return: MOS_STATUS_SUCCESS if call succeeds
//*-----------------------------------------------------------------------------
static __inline MOS_STATUS Mhw_AddCommandCmdOrBB(
void *pCmdBuffer, // [in] Pointer to Command Buffer
void *pBatchBuffer, // [in] Pointer to Batch Buffer
const void *pCmd, // [in] Command Pointer
uint32_t dwCmdSize) // [in] Size of command in bytes
{
if (pCmdBuffer)
{
return ((MOS_STATUS)Mos_AddCommand((PMOS_COMMAND_BUFFER)pCmdBuffer, pCmd, dwCmdSize));
}
else if (pBatchBuffer)
{
return (Mhw_AddCommandBB((PMHW_BATCH_BUFFER)pBatchBuffer, pCmd, dwCmdSize));
}
else
{
MHW_ASSERTMESSAGE("There is no valid command buffer or batch buffer.");
return MOS_STATUS_NULL_POINTER;
}
}
#endif // __MHW_UTILITIES_H__