1 /*
2 * Copyright (c) 2020, 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       render_copy_next.h
24 //! \brief      header file of render copy base functions
25 //! \details    define render copy basic API
26 //!
27 #ifndef __MEDIA_RENDER_COPY_NEXT_H__
28 #define __MEDIA_RENDER_COPY_NEXT_H__
29 
30 #include "media_copy.h"
31 #include "media_copy_common.h"
32 #include "renderhal.h"
33 #include "hal_kerneldll_next.h"
34 
35 // Kernel Params ---------------------------------------------------------------
36 const RENDERHAL_KERNEL_PARAM g_rendercopy_KernelParam[RENDER_COPY_NUM] =
37 {
38     ///*  GRF_Count
39     //    |  BT_Count
40     //    |  |    Sampler_Count
41     //    |  |    |  Thread_Count
42     //    |  |    |  |                             GRF_Start_Register
43     //    |  |    |  |                             |   CURBE_Length
44     //    |  |    |  |                             |   |   block_width
45     //    |  |    |  |                             |   |   |    block_height
46     //    |  |    |  |                             |   |   |    |   blocks_x
47     //    |  |    |  |                             |   |   |    |   |   blocks_y
48     //    |  |    |  |                             |   |   |    |   |   |*/
49     {4, 34, 0, RENDER_COPY_THREADS_MAX, 0, 0, 64, 8, 1, 1},    // CopyKernel_1D_to_2D_NV12
50     {4, 34, 0, RENDER_COPY_THREADS_MAX, 0, 0, 64, 8, 1, 1},    // CopyKernel_2D_to_1D_NV12
51     {4, 34, 0, RENDER_COPY_THREADS_MAX, 0, 0, 64, 8, 1, 1},    // CopyKernel_2D_to_2D_NV12
52     {4, 34, 0, RENDER_COPY_THREADS_MAX, 0, 0, 64, 8, 1, 1},    // CopyKernel_1D_to_2D_Planar
53     {4, 34, 0, RENDER_COPY_THREADS_MAX, 0, 0, 64, 8, 1, 1},    // CopyKernel_2D_to_1D_Planar
54     {4, 34, 0, RENDER_COPY_THREADS_MAX, 0, 0, 64, 8, 1, 1},    // CopyKernel_2D_to_2D_Planar
55     {4, 34, 0, RENDER_COPY_THREADS_MAX, 0, 0, 64, 8, 1, 1},    // CopyKernel_1D_to_2D_Packed
56     {4, 34, 0, RENDER_COPY_THREADS_MAX, 0, 0, 64, 8, 1, 1},    // CopyKernel_2D_to_1D_Packed
57     {4, 34, 0, RENDER_COPY_THREADS_MAX, 0, 0, 64, 8, 1, 1},    // CopyKernel_2D_to_2D_Packed
58 };
59 
60 typedef struct _RENDER_COPY_CACHE_CNTL
61 {
62     bool                           bL3CachingEnabled;
63     uint32_t                       SourceSurfMemObjCtl;
64     uint32_t                       TargetSurfMemObjCtl;
65 
66 }RENDER_COPY_CACHE_CNTL, *PRENDER_COPY_CACHE_CNTL;
67 
68 typedef struct _MEDIACOPY_RENDER_DATA
69 {
70     int32_t                             iBlocksX;
71     int32_t                             iBlocksY;
72     int32_t                             iBindingTable;
73     int32_t                             iMediaID;;
74     PRENDERHAL_MEDIA_STATE              pMediaState;
75 
76     // Kernel Information
77     PRENDERHAL_KERNEL_PARAM             pKernelParam;                           //!< Kernel Parameter
78     Kdll_CacheEntry                     KernelEntry;                            //!< Kernel Entry
79     int32_t                             iCurbeLength;
80     int32_t                             iInlineLength;
81 
82     // Perf
83     VPHAL_PERFTAG                       PerfTag;
84     RENDER_COPY_CACHE_CNTL              SurfMemObjCtl;
85 
86     // Debug parameters
87     char*                               pKernelName;                            //!< Kernel Used for current rendering
88     int32_t                             iCurbeOffset;                           //!< The offset of curbe data
89 } MEDIACOPY_RENDER_DATA, *PMEDIACOPY_RENDER_DATA;
90 
91 class MhwInterfacesNext;
92 class RenderCopyStateNext
93 {
94 public:
95     RenderCopyStateNext(PMOS_INTERFACE  osInterface, MhwInterfacesNext *mhwInterfaces);
96 
97     virtual ~RenderCopyStateNext();
98 
99     //!
100     //! \brief    RenderCopyStateNext initialize
101     //! \details  Initialize the RenderCopyStateNext, create BLT context.
102     //! \return   MOS_STATUS
103     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
104     //!
105     virtual MOS_STATUS Initialize();
106 
107     //!
108     //! \brief    GetBytesPerPixel
109     //! \details  Get Bytes Per each pixel for different format
110     //! \param    Formate
111     //!           [in] Surface's Format
112     //! \return   int32_t
113     //!           Return the numb for Byte
114     //!
115     int32_t GetBytesPerPixelPerPlane(MOS_FORMAT   Format);
116 
117     //!
118     //! \brief    Get kernel ID
119     //! \details  choose the kernel ID for each loop.
120     //! \return   MOS_STATUS
121     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
122     //!
123     MOS_STATUS GetCurentKernelID();
124 
125     //!
126 //! \brief    Render copy omputer walker setup
127 //! \details  Computer walker setup for render copy
128 //! \param    PMHW_WALKER_PARAMS pWalkerParams
129 //!           [in/out] Pointer to Walker params
130 //! \return   MOS_STATUS
131 //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
132 //!
133     MOS_STATUS RenderCopyComputerWalker(
134      PMHW_GPGPU_WALKER_PARAMS    pWalkerParams);
135 
136     //!
137     //! \brief    setup surface states
138     //! \details  Setup surface states for fast 1toN
139 
140     //! \return   MOS_STATUS
141     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
142     //!
143     MOS_STATUS SetupSurfaceStates();
144 
145     MOS_STATUS LoadStaticData(int32_t  *piCurbeOffset);
146 
147     //!
148     //! \brief    Copy input surface to Output surface
149     //! \details  Copy 2D surface to 2D surface
150     //! \param    src
151     //!           [in] Pointer to source resource
152     //! \param    dst
153     //!           [in] Pointer to destination resource
154     //! \return   MOS_STATUS
155     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
156     //!
157     virtual MOS_STATUS CopySurface(
158         PMOS_RESOURCE src,
159         PMOS_RESOURCE dst);
160 protected:
161 
162     //!
163     //! \brief    Submit command
164     //! \details  Submit render command
165     //! \return   MOS_STATUS
166     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
167     //!
168     virtual MOS_STATUS SubmitCMD( );
169     MOS_STATUS SetupKernel(int32_t iKDTIndex);
170 
171 public:
172     PMOS_INTERFACE               m_osInterface     = nullptr;
173     MhwInterfacesNext           *m_mhwInterfaces   = nullptr;
174     RENDERHAL_INTERFACE         *m_renderHal       = nullptr;
175     MhwCpInterface              *m_cpInterface     = nullptr;
176     void                        *m_pKernelBin      = nullptr;
177     Kdll_State                  *m_pKernelDllState = nullptr;//!< Kernel DLL state
178 
179     RENDERCOPY_KERNELID          m_currKernelId = KERNEL_CopyKernel_1D_to_2D_NV12;
180     MEDIACOPY_RENDER_DATA        m_RenderData = {};
181     MOS_SURFACE                  m_Source = {};
182     MOS_SURFACE                  m_Target = {};
183     bool                         m_bNullHwRenderCopy = false;
184 
185     uint32_t                     m_WalkerWidthBlockSize = 128;
186     uint32_t                     m_WalkerHeightBlockSize = 8;
187     const void*                  m_KernelBin = nullptr;
188     uint32_t                     m_KernelBinSize = 0;
189     MEDIA_CLASS_DEFINE_END(RenderCopyStateNext)
190 };
191 
192 #endif // __MEDIA_RENDER_COPY_NEXT_H__
193