1 /*
2 * Copyright (c) 2018, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file     codechal_encode_scalability.h
24 //! \brief    Defines the encode interface extension for scalability.
25 //! \details  Defines all types, macros, and functions required by CodecHal for virtual engine encode supporting both single pipe and scalable mode. Definitions are not externally facing.
26 //!
27 
28 #ifndef __CODECHAL_ENCODER_SCALABILITY_H__
29 #define __CODECHAL_ENCODER_SCALABILITY_H__
30 
31 #include "codechal_encoder_base.h"
32 #include "mos_os_virtualengine_scalability.h"
33 
34 typedef struct _CODECHAL_ENCODE_SCALABILITY_SETHINT_PARMS
35 {
36     bool                bSameEngineAsLastSubmission;
37     bool                bNeedSyncWithPrevious;
38     MOS_RESOURCE        veBatchBuffer[MOS_MAX_ENGINE_INSTANCE_PER_CLASS];    // Remove once Encode moves to using secondary command buffers in MOS VE interface
39 }CODECHAL_ENCODE_SCALABILITY_SETHINT_PARMS, *PCODECHAL_ENCODE_SCALABILITY_SETHINT_PARMS;
40 
41 typedef struct _CODECHAL_ENCODE_SCALABILITY_STATE
42 {
43     CodechalHwInterface            *pHwInterface;
44     uint8_t                         ucScalablePipeNum;
45     MOS_GPU_CONTEXT                 VideoContextScalable;   // Remove once legacy/ new GPU context class support context re-use
46     MOS_GPU_CONTEXT                 VideoContextSinglePipe; // Remove once legacy/ new GPU context class support context re-use
47 
48     //Virtual Engine related
49     PMOS_VIRTUALENGINE_INTERFACE    pVEInterface;
50     PMOS_VIRTUALENGINE_HINT_PARAMS  pScalHintParms;
51     PMOS_VIRTUALENGINE_HINT_PARAMS  pSingleHintParms;
52 
53 }CODECHAL_ENCODE_SCALABILITY_STATE, *PCODECHAL_ENCODE_SCALABILITY_STATE;
54 
55 //!
56 //! \brief    switch gpu context in scalability encode mode
57 //! \param    [in] pScalabilityState
58 //!                Scalability encode state
59 //! \return   MOS_STATUS
60 //!           MOS_STATUS_SUCCESS if success, else fail reason
61 //!
62 MOS_STATUS CodecHalEncodeScalability_SwitchGpuContext(
63     PCODECHAL_ENCODE_SCALABILITY_STATE  pScalabilityState);
64 
65 //!
66 //! \brief    State initialization for virtual engine encode supporting scalable and single pipe mode
67 //! \param    [in]  pScalabilityState
68 //!                Scalability encode state
69 //! \return   MOS_STATUS
70 //!           MOS_STATUS_SUCCESS if success, else fail reason
71 //!
72 MOS_STATUS CodecHalEncodeScalability_InitializeState(
73     PCODECHAL_ENCODE_SCALABILITY_STATE  pScalabilityState,
74     CodechalHwInterface                 *hwInterface);
75 
76 //!
77 //! \brief    Initiliaze Encode Parameters for virtual engine encode
78 //! \details  Initiliaze encode parameters for virtual engine encode. this is for encoder supporting scalability but not necessarily always running in scalable mode
79 //! \param    [in]  pScalabilityState
80 //!                Scalability encode state
81 //! \param    [in] pucDecPassNum
82 //!                pointer to encode pass number
83 //! \return   MOS_STATUS
84 //!           MOS_STATUS_SUCCESS if success, else fail reason
85 //!
86 MOS_STATUS CodecHalEncodeScalability_InitScalableParams(
87     PCODECHAL_ENCODE_SCALABILITY_STATE         pScalabilityState,
88     uint8_t                                   *pucDecPassNum);
89 
90 //!
91 //! \brief     Set virtual engine hint parameters for scalable encode
92 //! \param    [in]  pScalabilityState
93 //!                Scalability encode state
94 //! \param    [in] pSetHintParms
95 //!                pointer to set hint parameter
96 //! \return   MOS_STATUS
97 //!           MOS_STATUS_SUCCESS if success, else fail reason
98 //!
99 MOS_STATUS CodecHalEncodeScalability_SetHintParams(
100     CodechalEncoderState                       *pEncoder,
101     PCODECHAL_ENCODE_SCALABILITY_STATE         pScalabilityState,
102     PCODECHAL_ENCODE_SCALABILITY_SETHINT_PARMS pSetHintParms);
103 
104 //!
105 //! \brief     Populate virtual engine hint parameters
106 //! \details  Populate virtual engine hint parameters. Support both scalable and single pipe encode mode.
107 //! \param    [in]  pScalabilityState
108 //!                Scalability encode state
109 //! \param    [in] pPrimCmdBuf
110 //!                pointer to primary cmd buffer
111 //! \return   MOS_STATUS
112 //!           MOS_STATUS_SUCCESS if success, else fail reason
113 //!
114 MOS_STATUS CodecHalEncodeScalability_PopulateHintParams(
115     PCODECHAL_ENCODE_SCALABILITY_STATE  pScalabilityState,
116     PMOS_COMMAND_BUFFER                 pPrimCmdBuf);
117 
118 //! \brief    construct gpu context creation options when scalability supported
119 //! \param    [in]  scalabilityState
120 //!                Scalability encode state
121 //! \param    [in]  gpuCtxCreatOptions
122 //!                pointer to gpu context creation options
123 //! \return   MOS_STATUS
124 //!           MOS_STATUS_SUCCESS if success, else fail reason
125 //!
126 MOS_STATUS CodechalEncodeScalability_ConstructParmsForGpuCtxCreation(
127     PCODECHAL_ENCODE_SCALABILITY_STATE         pScalState,
128     PMOS_GPUCTX_CREATOPTIONS_ENHANCED          gpuCtxCreatOpts);
129 
130 //! \brief    Check if need to recreate gpu context and if yes, do it.
131 //! \param    [in]  scalabilityState
132 //!                Scalability encode state
133 //! \param    [in]  gpuCtxCreatOptions
134 //!                pointer to gpu context creation options
135 //! \return   MOS_STATUS
136 //!           MOS_STATUS_SUCCESS if success, else fail reason
137 //!
138 MOS_STATUS CodechalEncodeScalability_ChkGpuCtxReCreation(
139     CodechalEncoderState                       *pEncoder,
140     PCODECHAL_ENCODE_SCALABILITY_STATE         pScalabilityState,
141     PMOS_GPUCTX_CREATOPTIONS_ENHANCED          CurgpuCtxCreatOpts);
142 
143 //!
144 //! \brief    Convert Encode Phase to Batch Buffer Submission Type
145 //! \param    [in]  isFirstPipe
146 //!                Is it the fist pipe?
147 //! \param    [in] pCmdBuffer
148 //!                Pointer to command buffer
149 //! \return   void
150 //!           void
151 //!
152 void CodecHalEncodeScalability_EncodePhaseToSubmissionType(
153     bool isFirstPipe,
154     PMOS_COMMAND_BUFFER pCmdBuffer);
155 #endif //__CODECHAL_ENCODER_SCALABILITY_H__