1 /*
2 * Copyright (c) 2020-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_debug_interface.h
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 #ifndef __MEDIA_DEBUG_INTERFACE_H__
28 #define __MEDIA_DEBUG_INTERFACE_H__
29 
30 #if ((_DEBUG || _RELEASE_INTERNAL))
31 #define USE_MEDIA_DEBUG_TOOL 1
32 #define MEDIA_DEBUG_TOOL(expr) expr;
33 
34 #include "mhw_utilities.h"
35 #include "mhw_state_heap.h"
36 #include "mhw_cp_interface.h"
37 #include "media_debug_config_manager.h"
38 #include "media_debug_utils.h"
39 #include "media_copy_wrapper.h"
40 #include <sstream>
41 #include <fstream>
42 #include <functional>
43 
44 using GoldenReferences = std::vector<std::vector<uint32_t>>;
45 class MediaDebugInterface
46 {
47 public:
48     MediaDebugInterface();
49     virtual ~MediaDebugInterface();
50 
51     MOS_STATUS InitDumpLocation();
52 
53     MOS_STATUS SetOutputFilePath();
54 
55     virtual MOS_STATUS DumpUncompressedYUVSurface(
56         PMOS_SURFACE           surface);
57 
58     MOS_STATUS DumpMosSpecificResourceInfoToOfs(
59         PMOS_RESOURCE  pOsResource,
60         std::ofstream &ofs);
61 
62     MOS_STATUS DumpBufferInHexDwords(
63         uint8_t *data,
64         uint32_t size);
65 
66     virtual MOS_STATUS DumpBltOutput(
67         PMOS_SURFACE surface,
68         const char * attrName);
69 
70     MOS_STATUS DeleteCfgLinkNode(uint32_t frameIdx);
71 
72     virtual MOS_STATUS InitCRCTable(uint32_t crcTable[256]);
73 
74     virtual uint32_t CalculateCRC(
75         const void *buf,
76         size_t      len,
77         uint32_t    initial=0 );
78 
79     virtual MOS_STATUS CaptureGoldenReference(uint8_t *buf, uint32_t size, uint32_t hwCrcValue=0);
80 
81     virtual MOS_STATUS DumpGoldenReference();
82 
83     virtual MOS_STATUS LoadGoldenReference();
84 
85     MOS_STATUS SetSWCrcMode(bool swCrc);
86 
87     MOS_STATUS SubmitDummyWorkload(MOS_COMMAND_BUFFER *pcmdBuffer, int32_t bNullRendering);
88 
89     MOS_STATUS LockResource(uint32_t *semaData, PMOS_RESOURCE reSemaphore);
90 
91     MOS_STATUS DumpToFile(const GoldenReferences &goldenReferences);
92 
IsHwDebugHooksEnable()93     bool       IsHwDebugHooksEnable() { return m_enableHwDebugHooks; }
94 
95     void       PackGoldenReferences(std::initializer_list<std::vector<uint32_t>> goldenReferences);
96 
97     MOS_STATUS FillSemaResource(std::vector<uint32_t *> &vResource, std::vector<uint32_t> &data);
98 
99     MOS_STATUS LockSemaResource(std::vector<uint32_t *> &vSemaData, std::vector<MOS_RESOURCE> &vResource);
100 
GetStopFrameNumber()101     int32_t GetStopFrameNumber() { return m_stopFrameNumber; }
102 
GetCrcGoldenReference()103     std::vector<uint32_t> GetCrcGoldenReference() {return m_crcGoldenReference; }
104     std::string m_ddiFileName;
105     std::string m_outputFilePath;
106     std::string m_crcGoldenRefFileName;
107 
108     MOS_SURFACE       m_temp2DSurfForCopy = {};
109     PMOS_INTERFACE    m_osInterface       = nullptr;
110     MhwCpInterface   *m_cpInterface       = nullptr;
111     void             *m_miInterface       = nullptr;
112 
113     MediaDbgFunction  m_mediafunction     = MEDIA_FUNCTION_DEFAULT;
114     uint32_t          m_scaledBottomFieldOffset = 0;
115     uint16_t          m_frameType               = 0;
116     uint32_t          m_sliceId                 = 0;  // used for constructing debug file name
117     char              m_fileName[MOS_MAX_PATH_LENGTH + 1];
118     char              m_path[MOS_MAX_PATH_LENGTH + 1];
119     bool              m_secondField              = false;
120     bool              m_hybridPakP1              = false;
121     bool              m_hybridVp8EncodeBrcEnable = false;
122     bool              m_hybridVp9EncodeEnable    = false;
123     bool              m_vdboxContextCreated      = false;
124     bool              m_enableHwDebugHooks       = false;
125     bool              m_goldenReferenceExist     = false;
126     bool              m_swCRC = false;
127     uint16_t          m_preIndex                 = 0;
128     uint16_t          m_refIndex                 = 0;
129     size_t            m_DumpInputNum             = 0;
130     size_t            m_bufferDumpFrameNum       = 0;
131     uint32_t          m_decodeSurfDumpFrameNum   = 0;
132     uint32_t          m_streamId                 = 0;
133     uint32_t          m_crcTable[256]            ={0};
134     int32_t           m_stopFrameNumber          = -1;
135     std::vector<uint32_t> m_crcGoldenReference   = {};
136     GoldenReferences      m_goldenReferences     = {};
137     uint32_t*         m_semaData                 = nullptr;
138     MediaUserSettingSharedPtr m_userSettingPtr   = nullptr;
139 
140 protected:
141     MOS_STATUS ReAllocateSurface(
142         PMOS_SURFACE    pSurface,
143         PMOS_SURFACE    pSrcSurf,
144         PCCHAR          pSurfaceName,
145         MOS_GFXRES_TYPE DefaultResType,
146         bool            useLinearResource = false);
147 
148     MOS_STATUS CopySurfaceData_Vdbox(
149         uint32_t      dwDataSize,
150         PMOS_RESOURCE presSourceSurface,
151         PMOS_RESOURCE presCopiedSurface);
152 
153     MOS_STATUS DumpBufferInBinary(
154         uint8_t *data,
155         uint32_t size);
156 
157     MOS_STATUS Dump2DBufferInBinary(
158         uint8_t *data,
159         uint32_t width,
160         uint32_t height,
161         uint32_t pitch);
162 
InitializeUserSetting()163     virtual MOS_STATUS InitializeUserSetting() { return MOS_STATUS_SUCCESS; };
164 
165     virtual std::string SetOutputPathKey()  = 0;
166     virtual std::string InitDefaultOutput() = 0;
167 
168     std::string          m_outputFileName;
169     MediaDebugConfigMgr *m_configMgr = nullptr;
170 
171     MEDIA_CLASS_DEFINE_END(MediaDebugInterface)
172 };
173 
174 #else
175 #define USE_MEDIA_DEBUG_TOOL 0
176 #define MEDIA_DEBUG_TOOL(expr) ;
177 
178 #endif  // (_DEBUG || _RELEASE_INTERNAL)
179 #endif /* __MEDIA_DEBUG_INTERFACE_H__ */