1 /*
2 * Copyright (c) 2020-2022, 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_debug_interface_misc.cpp
24 //! \brief    Defines the debug interface shared by all of Media.
25 //! \details  The debug interface dumps output from Media based on input config file.
26 //!
27 #include "media_debug_interface.h"
28 #if USE_MEDIA_DEBUG_TOOL
SubmitDummyWorkload(MOS_COMMAND_BUFFER * pCmdBuffer,int32_t bNullRendering)29 MOS_STATUS MediaDebugInterface::SubmitDummyWorkload(MOS_COMMAND_BUFFER *pCmdBuffer, int32_t bNullRendering)
30 {
31     MHW_MI_FLUSH_DW_PARAMS flushDwParams{};
32     MEDIA_DEBUG_CHK_STATUS(((MhwMiInterface*)m_miInterface)->AddMiFlushDwCmd(
33         pCmdBuffer,
34         &flushDwParams));
35     MEDIA_DEBUG_CHK_STATUS(((MhwMiInterface*)m_miInterface)->AddMiBatchBufferEnd(
36         pCmdBuffer,
37         nullptr));
38     m_osInterface->pfnReturnCommandBuffer(m_osInterface, pCmdBuffer, 0);
39     MEDIA_DEBUG_CHK_STATUS(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, pCmdBuffer, bNullRendering));
40     return MOS_STATUS_SUCCESS;
41 }
42 
CopySurfaceData_Vdbox(uint32_t dwDataSize,PMOS_RESOURCE presSourceSurface,PMOS_RESOURCE presCopiedSurface)43 MOS_STATUS MediaDebugInterface::CopySurfaceData_Vdbox(
44     uint32_t      dwDataSize,
45     PMOS_RESOURCE presSourceSurface,
46     PMOS_RESOURCE presCopiedSurface)
47 {
48     MOS_COMMAND_BUFFER        CmdBuffer{};
49     MHW_MI_FLUSH_DW_PARAMS    FlushDwParams{};
50     MHW_GENERIC_PROLOG_PARAMS genericPrologParams{};
51     MHW_CP_COPY_PARAMS        cpCopyParams{};
52     MOS_NULL_RENDERING_FLAGS  NullRenderingFlags{};
53     MOS_GPU_CONTEXT           orgGpuContext{};
54 
55     if (!m_vdboxContextCreated)
56     {
57         MOS_GPUCTX_CREATOPTIONS_ENHANCED createOption = {};
58 
59         MEDIA_DEBUG_CHK_STATUS(m_osInterface->pfnCreateGpuContext(
60             m_osInterface,
61             MOS_GPU_CONTEXT_VIDEO,
62             MOS_GPU_NODE_VIDEO,
63             &createOption));
64 
65         // Register VDbox GPU context with the Batch Buffer completion event
66         MEDIA_DEBUG_CHK_STATUS(m_osInterface->pfnRegisterBBCompleteNotifyEvent(
67             m_osInterface,
68             MOS_GPU_CONTEXT_VIDEO));
69 
70         m_vdboxContextCreated = true;
71     }
72 
73     MEDIA_DEBUG_CHK_NULL(m_cpInterface);
74     MEDIA_DEBUG_CHK_NULL(m_osInterface);
75     MEDIA_DEBUG_CHK_NULL(m_miInterface);
76     MEDIA_DEBUG_CHK_NULL(m_osInterface->pfnGetWaTable(m_osInterface));
77 
78     orgGpuContext = m_osInterface->CurrentGpuContextOrdinal;
79 
80     // Due to VDBOX cryto copy limitation, the size must be Cache line aligned
81     if (!MOS_IS_ALIGNED(dwDataSize, MHW_CACHELINE_SIZE))
82     {
83         MEDIA_DEBUG_ASSERTMESSAGE("Size is not CACHE line aligned, cannot use VDBOX to copy.");
84         return MOS_STATUS_INVALID_PARAMETER;
85     }
86 
87     MEDIA_DEBUG_CHK_STATUS(m_osInterface->pfnSetGpuContext(m_osInterface, MOS_GPU_CONTEXT_VIDEO));
88     m_osInterface->pfnResetOsStates(m_osInterface);
89 
90     // Register the target resource
91     MEDIA_DEBUG_CHK_STATUS(m_osInterface->pfnRegisterResource(
92         m_osInterface,
93         presCopiedSurface,
94         true,
95         true));
96 
97     // Register the source resource
98     MEDIA_DEBUG_CHK_STATUS(m_osInterface->pfnRegisterResource(
99         m_osInterface,
100         presSourceSurface,
101         false,
102         true));
103 
104     MEDIA_DEBUG_CHK_STATUS(m_osInterface->pfnGetCommandBuffer(m_osInterface, &CmdBuffer, 0));
105 
106     genericPrologParams.pOsInterface  = m_osInterface;
107     genericPrologParams.pvMiInterface = (MhwMiInterface*)m_miInterface;
108     genericPrologParams.bMmcEnabled   = false;
109     MEDIA_DEBUG_CHK_STATUS(Mhw_SendGenericPrologCmd(&CmdBuffer, &genericPrologParams));
110 
111     cpCopyParams.size          = dwDataSize;
112     cpCopyParams.presSrc       = presSourceSurface;
113     cpCopyParams.presDst       = presCopiedSurface;
114     cpCopyParams.isEncodeInUse = false;
115 
116     MEDIA_DEBUG_CHK_STATUS(m_cpInterface->SetCpCopy(m_osInterface, &CmdBuffer, &cpCopyParams));
117 
118     // MI_FLUSH
119     MEDIA_DEBUG_CHK_STATUS(((MhwMiInterface*)m_miInterface)->AddMiFlushDwCmd(
120         &CmdBuffer,
121         &FlushDwParams));
122 
123     MEDIA_DEBUG_CHK_STATUS(((MhwMiInterface*)m_miInterface)->AddMiBatchBufferEnd(
124         &CmdBuffer,
125         nullptr));
126 
127     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &CmdBuffer, 0);
128 
129     NullRenderingFlags = m_osInterface->pfnGetNullHWRenderFlags(m_osInterface);
130 
131     MEDIA_DEBUG_CHK_STATUS(m_osInterface->pfnSubmitCommandBuffer(
132         m_osInterface,
133         &CmdBuffer,
134         NullRenderingFlags.CtxVideo || NullRenderingFlags.CodecGlobal || NullRenderingFlags.CtxVideo || NullRenderingFlags.VPGobal));
135 
136     MEDIA_DEBUG_CHK_STATUS(m_osInterface->pfnSetGpuContext(m_osInterface, orgGpuContext));
137     return MOS_STATUS_SUCCESS;
138 }
139 
140 #endif  // USE_MEDIA_DEBUG_TOOL
141