1 /*
2 * Copyright (c) 2021, 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     media_interfaces_mhw_next.h
24 //! \brief    Gen-specific factory creation of the mhw interfaces
25 //!
26 
27 #ifndef __MEDIA_INTERFACES_MHW_NEXT_H__
28 #define __MEDIA_INTERFACES_MHW_NEXT_H__
29 
30 #include "media_factory.h"
31 #include "igfxfmid.h"
32 #include "mos_utilities.h"
33 #include "mos_os.h"
34 #include "mhw_vdbox_avp_itf.h"
35 #include "mhw_vdbox_vdenc_itf.h"
36 #include "mhw_vdbox_huc_itf.h"
37 #include "mhw_mi_itf.h"
38 #include "mhw_vdbox_hcp_itf.h"
39 
40 // forward declarations
41 class MhwCpInterface;
42 class MhwMiInterface;
43 class MhwRenderInterface;
44 class MhwSfcInterface;
45 class XMHW_STATE_HEAP_INTERFACE;
46 class MhwVeboxInterface;
47 class MhwVdboxMfxInterface;
48 class MhwVdboxHcpInterface;
49 class MhwVdboxHucInterface;
50 class MhwVdboxVdencInterface;
51 class MhwBltInterface;
52 class MhwVdboxAvpInterface;
53 
54 //!
55 //! \class    MhwInterfacesNext
56 //! \brief    MHW interfacesNext
57 //!
58 class MhwInterfacesNext
59 {
60 public:
~MhwInterfacesNext()61     virtual ~MhwInterfacesNext() {}
62 
63     //! \brief Determines which interfaces are created
64     struct CreateParams
65     {
CreateParamsCreateParams66         CreateParams()
67         {
68             Flags.m_value = 0;
69         }
70 
71         union
72         {
73             struct
74             {
75                 uint32_t m_render : 1;
76                 uint32_t m_sfc : 1;
77                 uint32_t m_stateHeap : 1;
78                 uint32_t m_vebox : 1;
79                 uint32_t m_vdboxAll : 1;
80                 uint32_t m_mfx : 1;
81                 uint32_t m_hcp : 1;
82                 uint32_t m_huc : 1;
83                 uint32_t m_vdenc : 1;
84                 uint32_t m_blt : 1;
85                 uint32_t m_avp : 1;
86                 uint32_t m_reserved : 21;
87             };
88             uint32_t m_value;
89         } Flags;
90 
91         uint8_t m_heapMode = 0; //!< To be deprecated when heap management unified
92         bool m_isDecode = false; //!< Whether or not decode is in use, only valid for VDBOX creation
93         bool m_isCp     = false; //!< Whether or not CP is in use, CP only need mi and cp interface.
94     };
95 
96     /* Below legacy interfaces are kept temporarily for backward compatibility */
97 
98     //! \brief These interfaces are responsible for constructing instructions,
99      //!           structures, and registers for hardware.
100     MhwCpInterface *m_cpInterface = nullptr;
101     MhwMiInterface *m_miInterface = nullptr;
102     MhwRenderInterface *m_renderInterface = nullptr;
103     MhwSfcInterface *m_sfcInterface = nullptr;
104     XMHW_STATE_HEAP_INTERFACE *m_stateHeapInterface = nullptr;
105     MhwVeboxInterface *m_veboxInterface = nullptr;
106     MhwVdboxMfxInterface *m_mfxInterface = nullptr;
107     MhwVdboxHcpInterface *m_hcpInterface = nullptr;
108     MhwVdboxHucInterface *m_hucInterface = nullptr;
109     MhwVdboxVdencInterface *m_vdencInterface = nullptr;
110     MhwBltInterface *m_bltInterface = nullptr;
111 
112     /* New mhw sub interfaces*/
113     std::shared_ptr<mhw::vdbox::avp::Itf>   m_avpItf   = nullptr;
114     std::shared_ptr<mhw::vdbox::vdenc::Itf> m_vdencItf = nullptr;
115     std::shared_ptr<mhw::vdbox::huc::Itf>   m_hucItf   = nullptr;
116     std::shared_ptr<mhw::mi::Itf>           m_miItf    = nullptr;
117     std::shared_ptr<mhw::vdbox::hcp::Itf>   m_hcpItf   = nullptr;
118 
119     //!
120     //! \brief    Calls the factory function to initialize all requested interfaces.
121     //! \param    [in] params
122     //!           Configuration flags for the creation of MHW interfaces.
123     //! \param    [in] osInterface
124     //!           OS interface
125     //! \return   MhwInterfaces*
126     //!           returns a valid pointer if successful and nullptr if failed.
127     //!
128     static MhwInterfacesNext* CreateFactory(
129         CreateParams params,
130         PMOS_INTERFACE osInterface);
131 
132     //!
133     //! \brief    Creates requested MHW interfaces.
134     //! \param    [in] params
135     //!           Configuration flags for the creation of MHW interfaces.
136     //! \param    [in] osInterface
137     //!           OS interface
138     //! \return   MOS_STATUS_SUCCESS if succeeded, else error code.
139     //!
140     virtual MOS_STATUS Initialize(
141         CreateParams params,
142         PMOS_INTERFACE osInterface) = 0;
143 
144     //!
145     //! \brief    Destroys all created MHW interfaces
146     //! \details  If the HAL creation fails, this is used for cleanup
147     //!
148     virtual void Destroy();
149 
150     //!
151     //! \brief    Set Interfaces Destroy State
152     //! \details  If the interfaces has destroyed, set this state value on
153     //!
SetDestroyState(bool destorystate)154     void SetDestroyState(bool destorystate) { m_isDestroyed = destorystate; };
GetDestroyState()155     bool GetDestroyState() { return m_isDestroyed; };
156 
157 private:
158     bool m_isDestroyed = false;
159 };
160 
161 extern template class MediaFactory<uint32_t, MhwInterfacesNext>;
162 
163 #endif // __MEDIA_INTERFACES_MHW_NEXT_H__
164