1 /*
2 * Copyright (c) 2018-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 //!
24 //! \file media_mem_compression.cpp
25 //! \brief Defines the common interface for media memory compression
26 //! \details The mmc is to handle mmc operations,
27 //!
28
29 #include "media_mem_compression.h"
30 #include "mos_interface.h"
31
MediaMemComp(PMOS_INTERFACE osInterface)32 MediaMemComp::MediaMemComp(PMOS_INTERFACE osInterface) :
33 m_osInterface(osInterface),
34 m_mmcEnabled(false)
35 {
36 if (nullptr == m_osInterface)
37 {
38 return;
39 }
40 MEDIA_FEATURE_TABLE *skuTable = m_osInterface->pfnGetSkuTable(m_osInterface);
41 m_isCompSurfAllocable = m_osInterface->pfnIsCompressibelSurfaceSupported(skuTable);
42 m_userSettingPtr = m_osInterface->pfnGetUserSettingInstance(m_osInterface);
43 }
44
InitMmcEnabled()45 MOS_STATUS MediaMemComp::InitMmcEnabled()
46 {
47 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, m_osInterface);
48
49 if (MEDIA_IS_SKU(m_osInterface->pfnGetSkuTable(m_osInterface), FtrE2ECompression))
50 {
51 m_mmcEnabled = IsMmcFeatureEnabled();
52 UpdateMmcInUseFeature();
53 }
54 return MOS_STATUS_SUCCESS;
55 }
56
DecompressResource(PMOS_RESOURCE resource)57 MOS_STATUS MediaMemComp::DecompressResource(PMOS_RESOURCE resource)
58 {
59 MOS_STATUS status = MOS_STATUS_SUCCESS;
60
61 if (resource)
62 {
63 status = m_osInterface->pfnDecompResource(m_osInterface, resource);
64 }
65
66 return status;
67 }
68
69
IsMmcFeatureEnabled()70 bool MediaMemComp::IsMmcFeatureEnabled()
71 {
72 if (m_userSettingPtr != nullptr)
73 {
74 ReadUserSetting(
75 m_userSettingPtr,
76 m_mmcEnabled,
77 m_mmcEnabledKey,
78 MediaUserSetting::Group::Device,
79 m_bComponentMmcEnabled,
80 true);
81 }
82 else
83 {
84 m_mmcEnabled = m_bComponentMmcEnabled;
85 }
86
87 if (m_osInterface && m_osInterface->bNullHwIsEnabled)
88 {
89 m_mmcEnabled = false;
90 }
91
92 return m_mmcEnabled;
93 }
94
95 // For VP, there is no such feature id, if need to add 1?
UpdateMmcInUseFeature()96 MOS_STATUS MediaMemComp::UpdateMmcInUseFeature()
97 {
98 return ReportUserSetting(
99 m_userSettingPtr,
100 m_mmcInUseKey,
101 m_mmcEnabled,
102 MediaUserSetting::Group::Device);
103 }
104
IsMmcEnabled()105 bool MediaMemComp::IsMmcEnabled()
106 {
107 return m_mmcEnabled;
108 }
109
DisableMmc()110 void MediaMemComp::DisableMmc()
111 {
112 m_mmcEnabled = false;
113 }
114
IsCompressibelSurfaceSupported()115 bool MediaMemComp::IsCompressibelSurfaceSupported()
116 {
117 return m_isCompSurfAllocable;
118 }
119
SetSurfaceMmcMode(PMOS_SURFACE surface)120 MOS_STATUS MediaMemComp::SetSurfaceMmcMode(
121 PMOS_SURFACE surface)
122 {
123 MOS_STATUS status = MOS_STATUS_SUCCESS;
124
125 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, surface);
126 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, m_osInterface);
127
128 if(m_mmcEnabled)
129 status = m_osInterface->pfnGetMemoryCompressionMode(m_osInterface, &surface->OsResource, (PMOS_MEMCOMP_STATE)&surface->CompressionMode);
130 else
131 surface->CompressionMode = MOS_MMC_DISABLED;
132
133 return status;
134 }
135
SetSurfaceMmcState(PMOS_SURFACE surface)136 MOS_STATUS MediaMemComp::SetSurfaceMmcState(
137 PMOS_SURFACE surface)
138 {
139 MOS_STATUS status = MOS_STATUS_SUCCESS;
140
141 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, surface);
142 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, m_osInterface);
143
144 if(m_mmcEnabled)
145 status = m_osInterface->pfnGetMemoryCompressionMode(m_osInterface, &surface->OsResource, &surface->MmcState);
146 else
147 surface->MmcState = MOS_MEMCOMP_DISABLED;
148
149 return status;
150 }
151
GetSurfaceMmcState(PMOS_SURFACE surface,MOS_MEMCOMP_STATE * mmcState)152 MOS_STATUS MediaMemComp::GetSurfaceMmcState(
153 PMOS_SURFACE surface,
154 MOS_MEMCOMP_STATE *mmcState)
155 {
156 MOS_STATUS status = MOS_STATUS_SUCCESS;
157
158 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, surface);
159 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, mmcState);
160 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, m_osInterface);
161
162 if (m_mmcEnabled)
163 status = m_osInterface->pfnGetMemoryCompressionMode(m_osInterface, &surface->OsResource, mmcState);
164 else
165 *mmcState = MOS_MEMCOMP_DISABLED;
166
167 return status;
168 }
169
GetSurfaceMmcFormat(PMOS_SURFACE surface,uint32_t * mmcFormat)170 MOS_STATUS MediaMemComp::GetSurfaceMmcFormat(
171 PMOS_SURFACE surface,
172 uint32_t *mmcFormat)
173 {
174 MOS_STATUS status = MOS_STATUS_SUCCESS;
175
176 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, surface);
177 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, mmcFormat);
178 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, m_osInterface);
179
180 if (m_mmcEnabled)
181 status = m_osInterface->pfnGetMemoryCompressionFormat(m_osInterface, &surface->OsResource, mmcFormat);
182 else
183 *mmcFormat = 0;
184
185 return status;
186 }
187
GetResourceMmcFormat(PMOS_RESOURCE resource,uint32_t & mmcFormat)188 MOS_STATUS MediaMemComp::GetResourceMmcFormat(
189 PMOS_RESOURCE resource,
190 uint32_t &mmcFormat)
191 {
192 MOS_STATUS status = MOS_STATUS_SUCCESS;
193 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, resource);
194 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, m_osInterface);
195
196 if (m_mmcEnabled)
197 status = m_osInterface->pfnGetMemoryCompressionFormat(m_osInterface, resource, &mmcFormat);
198 else
199 mmcFormat = 0;
200
201 return status;
202 }
203
SetSurfaceMmcFormat(PMOS_SURFACE surface)204 MOS_STATUS MediaMemComp::SetSurfaceMmcFormat(
205 PMOS_SURFACE surface)
206 {
207 MOS_STATUS status = MOS_STATUS_SUCCESS;
208
209 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, surface);
210 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, m_osInterface);
211
212 if(m_mmcEnabled)
213 status = m_osInterface->pfnGetMemoryCompressionFormat(m_osInterface, &surface->OsResource, &surface->CompressionFormat);
214 else
215 surface->CompressionFormat = 0;
216
217 return status;
218 }
219
GetResourceMmcState(PMOS_RESOURCE resource,MOS_MEMCOMP_STATE & mmcMode)220 MOS_STATUS MediaMemComp::GetResourceMmcState(
221 PMOS_RESOURCE resource,
222 MOS_MEMCOMP_STATE &mmcMode)
223 {
224 MOS_STATUS status = MOS_STATUS_SUCCESS;
225
226 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, resource);
227 MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, m_osInterface);
228 //Need to Check its default value m_mmcEnable
229 if (m_mmcEnabled)
230 status = m_osInterface->pfnGetMemoryCompressionMode(m_osInterface, resource, &mmcMode);
231 else
232 mmcMode = MOS_MEMCOMP_DISABLED;
233
234 return status;
235 }