xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/ULT/GmmAuxTableULT.h (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2019 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker 
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker 
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker 
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
22*35ffd701SAndroid Build Coastguard Worker 
23*35ffd701SAndroid Build Coastguard Worker #pragma once
24*35ffd701SAndroid Build Coastguard Worker 
25*35ffd701SAndroid Build Coastguard Worker #if defined (__linux__) && !defined(__i386__)
26*35ffd701SAndroid Build Coastguard Worker 
27*35ffd701SAndroid Build Coastguard Worker #ifndef _ISOC11_SOURCE
28*35ffd701SAndroid Build Coastguard Worker #define _ISOC11_SOURCE 1
29*35ffd701SAndroid Build Coastguard Worker #endif
30*35ffd701SAndroid Build Coastguard Worker 
31*35ffd701SAndroid Build Coastguard Worker #include "GmmGen10ResourceULT.h"
32*35ffd701SAndroid Build Coastguard Worker #include <stdlib.h>
33*35ffd701SAndroid Build Coastguard Worker #include <malloc.h>
34*35ffd701SAndroid Build Coastguard Worker 
35*35ffd701SAndroid Build Coastguard Worker #ifndef ALIGN
36*35ffd701SAndroid Build Coastguard Worker #define ALIGN(v, a) (((v) + ((a)-1)) & ~((a)-1))
37*35ffd701SAndroid Build Coastguard Worker #endif
38*35ffd701SAndroid Build Coastguard Worker 
39*35ffd701SAndroid Build Coastguard Worker class CTestAuxTable : public CTestGen10Resource
40*35ffd701SAndroid Build Coastguard Worker {
41*35ffd701SAndroid Build Coastguard Worker 
42*35ffd701SAndroid Build Coastguard Worker public:
43*35ffd701SAndroid Build Coastguard Worker     static void SetUpTestCase();
44*35ffd701SAndroid Build Coastguard Worker     static void TearDownTestCase();
45*35ffd701SAndroid Build Coastguard Worker 
46*35ffd701SAndroid Build Coastguard Worker     CTestAuxTable();
47*35ffd701SAndroid Build Coastguard Worker     ~CTestAuxTable();
48*35ffd701SAndroid Build Coastguard Worker 
49*35ffd701SAndroid Build Coastguard Worker     static int  allocCB(void *bufMgr, size_t size, size_t alignment, void **bo, void **cpuAddr, uint64_t *gpuAddr);
50*35ffd701SAndroid Build Coastguard Worker     static void freeCB(void *bo);
51*35ffd701SAndroid Build Coastguard Worker     static void waitFromCpuCB(void *bo);
52*35ffd701SAndroid Build Coastguard Worker 
53*35ffd701SAndroid Build Coastguard Worker     class Surface
54*35ffd701SAndroid Build Coastguard Worker     {
55*35ffd701SAndroid Build Coastguard Worker     public:
56*35ffd701SAndroid Build Coastguard Worker         Surface(unsigned int width, unsigned int height, bool mmc = true)
mWidth(width)57*35ffd701SAndroid Build Coastguard Worker             : mWidth(width), mHeight(height), mMMC(mmc), mResInfo(0), mBuf(0)
58*35ffd701SAndroid Build Coastguard Worker         {
59*35ffd701SAndroid Build Coastguard Worker         }
60*35ffd701SAndroid Build Coastguard Worker 
~Surface()61*35ffd701SAndroid Build Coastguard Worker         ~Surface()
62*35ffd701SAndroid Build Coastguard Worker         {
63*35ffd701SAndroid Build Coastguard Worker             deinit();
64*35ffd701SAndroid Build Coastguard Worker         }
65*35ffd701SAndroid Build Coastguard Worker 
init()66*35ffd701SAndroid Build Coastguard Worker         bool init()
67*35ffd701SAndroid Build Coastguard Worker         {
68*35ffd701SAndroid Build Coastguard Worker             size_t size;
69*35ffd701SAndroid Build Coastguard Worker             size_t alignment;
70*35ffd701SAndroid Build Coastguard Worker 
71*35ffd701SAndroid Build Coastguard Worker             GMM_RESCREATE_PARAMS gmmParams       = {};
72*35ffd701SAndroid Build Coastguard Worker             gmmParams.Type                       = RESOURCE_2D;
73*35ffd701SAndroid Build Coastguard Worker             gmmParams.Format                     = GMM_FORMAT_NV12;
74*35ffd701SAndroid Build Coastguard Worker             gmmParams.BaseWidth                  = mWidth;
75*35ffd701SAndroid Build Coastguard Worker             gmmParams.BaseHeight                 = mHeight;
76*35ffd701SAndroid Build Coastguard Worker             gmmParams.Depth                      = 0x1;
77*35ffd701SAndroid Build Coastguard Worker             gmmParams.ArraySize                  = 1;
78*35ffd701SAndroid Build Coastguard Worker             gmmParams.Flags.Info.TiledY          = 1;
79*35ffd701SAndroid Build Coastguard Worker             gmmParams.Flags.Info.MediaCompressed = mMMC ? 1 : 0;
80*35ffd701SAndroid Build Coastguard Worker             //gmmParams.Flags.Gpu.CCS               = mmc ? 1 : 0;
81*35ffd701SAndroid Build Coastguard Worker             gmmParams.Flags.Gpu.MMC               = mMMC ? 1 : 0;
82*35ffd701SAndroid Build Coastguard Worker             gmmParams.Flags.Gpu.Texture           = 1;
83*35ffd701SAndroid Build Coastguard Worker             gmmParams.Flags.Gpu.RenderTarget      = 1;
84*35ffd701SAndroid Build Coastguard Worker             gmmParams.Flags.Gpu.UnifiedAuxSurface = mMMC ? 1 : 0;
85*35ffd701SAndroid Build Coastguard Worker             //gmmParams.Flags.Gpu.Depth             = 1;
86*35ffd701SAndroid Build Coastguard Worker             gmmParams.Flags.Gpu.Video = true;
87*35ffd701SAndroid Build Coastguard Worker 
88*35ffd701SAndroid Build Coastguard Worker             mResInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
89*35ffd701SAndroid Build Coastguard Worker 
90*35ffd701SAndroid Build Coastguard Worker             size = mResInfo->GetSizeSurface();
91*35ffd701SAndroid Build Coastguard Worker 
92*35ffd701SAndroid Build Coastguard Worker             alignment = mResInfo->GetResFlags().Info.TiledYf ? GMM_KBYTE(16) : GMM_KBYTE(64);
93*35ffd701SAndroid Build Coastguard Worker 
94*35ffd701SAndroid Build Coastguard Worker             mBuf = aligned_alloc(alignment, ALIGN(size, alignment));
95*35ffd701SAndroid Build Coastguard Worker 
96*35ffd701SAndroid Build Coastguard Worker             if(!mResInfo || !mBuf)
97*35ffd701SAndroid Build Coastguard Worker                 return false;
98*35ffd701SAndroid Build Coastguard Worker 
99*35ffd701SAndroid Build Coastguard Worker             mYBase      = (GMM_GFX_ADDRESS)mBuf;
100*35ffd701SAndroid Build Coastguard Worker             mUVBase     = 0;
101*35ffd701SAndroid Build Coastguard Worker             mAuxYBase   = mYBase + mResInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS);
102*35ffd701SAndroid Build Coastguard Worker             mAuxUVBase  = 0;
103*35ffd701SAndroid Build Coastguard Worker             mYPlaneSize = mResInfo->GetSizeMainSurface();
104*35ffd701SAndroid Build Coastguard Worker 
105*35ffd701SAndroid Build Coastguard Worker             if(pGmmULTClientContext->IsPlanar(mResInfo->GetResourceFormat()))
106*35ffd701SAndroid Build Coastguard Worker             {
107*35ffd701SAndroid Build Coastguard Worker                 GMM_REQ_OFFSET_INFO ReqInfo = {0};
108*35ffd701SAndroid Build Coastguard Worker                 ReqInfo.Plane               = GMM_PLANE_U;
109*35ffd701SAndroid Build Coastguard Worker                 ReqInfo.ReqRender           = 1;
110*35ffd701SAndroid Build Coastguard Worker 
111*35ffd701SAndroid Build Coastguard Worker                 mResInfo->GetOffset(ReqInfo);
112*35ffd701SAndroid Build Coastguard Worker                 mYPlaneSize = ReqInfo.Render.Offset64;
113*35ffd701SAndroid Build Coastguard Worker 
114*35ffd701SAndroid Build Coastguard Worker                 mUVBase    = mYBase + mYPlaneSize;
115*35ffd701SAndroid Build Coastguard Worker                 mAuxUVBase = mYBase + mResInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_UV_CCS);
116*35ffd701SAndroid Build Coastguard Worker             }
117*35ffd701SAndroid Build Coastguard Worker 
118*35ffd701SAndroid Build Coastguard Worker             mUVPlaneSize = mResInfo->GetSizeMainSurface() - mYPlaneSize;
119*35ffd701SAndroid Build Coastguard Worker 
120*35ffd701SAndroid Build Coastguard Worker             return true;
121*35ffd701SAndroid Build Coastguard Worker         }
122*35ffd701SAndroid Build Coastguard Worker 
deinit()123*35ffd701SAndroid Build Coastguard Worker         void deinit()
124*35ffd701SAndroid Build Coastguard Worker         {
125*35ffd701SAndroid Build Coastguard Worker             if(mBuf)
126*35ffd701SAndroid Build Coastguard Worker             {
127*35ffd701SAndroid Build Coastguard Worker                 free(mBuf);
128*35ffd701SAndroid Build Coastguard Worker                 mBuf = NULL;
129*35ffd701SAndroid Build Coastguard Worker             }
130*35ffd701SAndroid Build Coastguard Worker 
131*35ffd701SAndroid Build Coastguard Worker             if(mResInfo)
132*35ffd701SAndroid Build Coastguard Worker             {
133*35ffd701SAndroid Build Coastguard Worker                 pGmmULTClientContext->DestroyResInfoObject(mResInfo);
134*35ffd701SAndroid Build Coastguard Worker                 mResInfo = NULL;
135*35ffd701SAndroid Build Coastguard Worker             }
136*35ffd701SAndroid Build Coastguard Worker         }
137*35ffd701SAndroid Build Coastguard Worker 
getGfxAddress(GMM_YUV_PLANE plane)138*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_ADDRESS getGfxAddress(GMM_YUV_PLANE plane)
139*35ffd701SAndroid Build Coastguard Worker         {
140*35ffd701SAndroid Build Coastguard Worker             switch(plane)
141*35ffd701SAndroid Build Coastguard Worker             {
142*35ffd701SAndroid Build Coastguard Worker                 case GMM_PLANE_Y:
143*35ffd701SAndroid Build Coastguard Worker                     return mYBase;
144*35ffd701SAndroid Build Coastguard Worker                 case GMM_PLANE_U:
145*35ffd701SAndroid Build Coastguard Worker                 case GMM_PLANE_V:
146*35ffd701SAndroid Build Coastguard Worker                     return mUVBase;
147*35ffd701SAndroid Build Coastguard Worker                 default:
148*35ffd701SAndroid Build Coastguard Worker                     throw;
149*35ffd701SAndroid Build Coastguard Worker             }
150*35ffd701SAndroid Build Coastguard Worker         }
151*35ffd701SAndroid Build Coastguard Worker 
getAuxGfxAddress(GMM_UNIFIED_AUX_TYPE auxType)152*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_ADDRESS getAuxGfxAddress(GMM_UNIFIED_AUX_TYPE auxType)
153*35ffd701SAndroid Build Coastguard Worker         {
154*35ffd701SAndroid Build Coastguard Worker             switch(auxType)
155*35ffd701SAndroid Build Coastguard Worker             {
156*35ffd701SAndroid Build Coastguard Worker                 case GMM_AUX_CCS:
157*35ffd701SAndroid Build Coastguard Worker                 case GMM_AUX_Y_CCS:
158*35ffd701SAndroid Build Coastguard Worker                     return mAuxYBase;
159*35ffd701SAndroid Build Coastguard Worker                 case GMM_AUX_UV_CCS:
160*35ffd701SAndroid Build Coastguard Worker                     return mAuxUVBase;
161*35ffd701SAndroid Build Coastguard Worker                 default:
162*35ffd701SAndroid Build Coastguard Worker                     throw;
163*35ffd701SAndroid Build Coastguard Worker             }
164*35ffd701SAndroid Build Coastguard Worker         }
165*35ffd701SAndroid Build Coastguard Worker 
getGMMResourceInfo()166*35ffd701SAndroid Build Coastguard Worker         GMM_RESOURCE_INFO *getGMMResourceInfo()
167*35ffd701SAndroid Build Coastguard Worker         {
168*35ffd701SAndroid Build Coastguard Worker             return mResInfo;
169*35ffd701SAndroid Build Coastguard Worker         }
170*35ffd701SAndroid Build Coastguard Worker 
getSurfaceSize(GMM_YUV_PLANE plane)171*35ffd701SAndroid Build Coastguard Worker         size_t getSurfaceSize(GMM_YUV_PLANE plane)
172*35ffd701SAndroid Build Coastguard Worker         {
173*35ffd701SAndroid Build Coastguard Worker             switch(plane)
174*35ffd701SAndroid Build Coastguard Worker             {
175*35ffd701SAndroid Build Coastguard Worker                 case GMM_PLANE_Y:
176*35ffd701SAndroid Build Coastguard Worker                     return mYPlaneSize;
177*35ffd701SAndroid Build Coastguard Worker                 case GMM_PLANE_U:
178*35ffd701SAndroid Build Coastguard Worker                 case GMM_PLANE_V:
179*35ffd701SAndroid Build Coastguard Worker                     return mUVPlaneSize;
180*35ffd701SAndroid Build Coastguard Worker                 default:
181*35ffd701SAndroid Build Coastguard Worker                     throw;
182*35ffd701SAndroid Build Coastguard Worker             }
183*35ffd701SAndroid Build Coastguard Worker         }
184*35ffd701SAndroid Build Coastguard Worker 
185*35ffd701SAndroid Build Coastguard Worker     private:
186*35ffd701SAndroid Build Coastguard Worker         unsigned int       mWidth;
187*35ffd701SAndroid Build Coastguard Worker         unsigned int       mHeight;
188*35ffd701SAndroid Build Coastguard Worker         bool               mMMC;
189*35ffd701SAndroid Build Coastguard Worker         GMM_RESOURCE_INFO *mResInfo;
190*35ffd701SAndroid Build Coastguard Worker         void *             mBuf;
191*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_ADDRESS    mYBase;
192*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_ADDRESS    mUVBase;
193*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_ADDRESS    mAuxYBase;
194*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_ADDRESS    mAuxUVBase;
195*35ffd701SAndroid Build Coastguard Worker         size_t             mYPlaneSize;
196*35ffd701SAndroid Build Coastguard Worker         size_t             mUVPlaneSize;
197*35ffd701SAndroid Build Coastguard Worker     };
198*35ffd701SAndroid Build Coastguard Worker 
199*35ffd701SAndroid Build Coastguard Worker     class Walker
200*35ffd701SAndroid Build Coastguard Worker     {
201*35ffd701SAndroid Build Coastguard Worker     public:
Walker(GMM_GFX_ADDRESS mainBase,GMM_GFX_ADDRESS auxBase,GMM_GFX_ADDRESS l3Base)202*35ffd701SAndroid Build Coastguard Worker         Walker(GMM_GFX_ADDRESS mainBase, GMM_GFX_ADDRESS auxBase,
203*35ffd701SAndroid Build Coastguard Worker                GMM_GFX_ADDRESS l3Base)
204*35ffd701SAndroid Build Coastguard Worker         {
205*35ffd701SAndroid Build Coastguard Worker             mMainBase = mainBase;
206*35ffd701SAndroid Build Coastguard Worker             mAuxBase  = (auxBase >> 6) << 6;
207*35ffd701SAndroid Build Coastguard Worker             mL3Base   = (uint64_t *)l3Base;
208*35ffd701SAndroid Build Coastguard Worker         }
209*35ffd701SAndroid Build Coastguard Worker 
expected(GMM_GFX_ADDRESS addr)210*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_ADDRESS expected(GMM_GFX_ADDRESS addr)
211*35ffd701SAndroid Build Coastguard Worker         {
212*35ffd701SAndroid Build Coastguard Worker             uint8_t  Is64KChunk = (const_cast<WA_TABLE &>(pGfxAdapterInfo->WaTable).WaAuxTable16KGranular) ? 0 : 1;
213*35ffd701SAndroid Build Coastguard Worker             uint32_t count      = (addr - mMainBase) / (Is64KChunk ? GMM_KBYTE(64) : GMM_KBYTE(16));
214*35ffd701SAndroid Build Coastguard Worker             return mAuxBase + (Is64KChunk ? 256 : 64) * count;
215*35ffd701SAndroid Build Coastguard Worker         }
216*35ffd701SAndroid Build Coastguard Worker 
walk(GMM_GFX_ADDRESS addr)217*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_ADDRESS walk(GMM_GFX_ADDRESS addr)
218*35ffd701SAndroid Build Coastguard Worker         {
219*35ffd701SAndroid Build Coastguard Worker             uint64_t  mask   = (const_cast<WA_TABLE &>(pGfxAdapterInfo->WaTable).WaAuxTable16KGranular) ? 0x0000ffffffffffc0 : 0x0000ffffffffff00;
220*35ffd701SAndroid Build Coastguard Worker             uint32_t  idx    = l3Index(addr);
221*35ffd701SAndroid Build Coastguard Worker             uint64_t *l2Base = (uint64_t *)((mL3Base[idx] >> 15) << 15);
222*35ffd701SAndroid Build Coastguard Worker             idx              = l2Index(addr);
223*35ffd701SAndroid Build Coastguard Worker             uint64_t *l1Base = (uint64_t *)((l2Base[idx] >> 13) << 13);
224*35ffd701SAndroid Build Coastguard Worker             idx              = l1Index(addr);
225*35ffd701SAndroid Build Coastguard Worker             uint64_t auxAddr = (uint64_t)(l1Base[idx] & mask);
226*35ffd701SAndroid Build Coastguard Worker             return auxAddr;
227*35ffd701SAndroid Build Coastguard Worker         }
228*35ffd701SAndroid Build Coastguard Worker 
229*35ffd701SAndroid Build Coastguard Worker     public:
l3Index(GMM_GFX_ADDRESS addr)230*35ffd701SAndroid Build Coastguard Worker         static inline uint32_t l3Index(GMM_GFX_ADDRESS addr)
231*35ffd701SAndroid Build Coastguard Worker         {
232*35ffd701SAndroid Build Coastguard Worker             return GMM_AUX_L3_ENTRY_IDX(addr);
233*35ffd701SAndroid Build Coastguard Worker         }
234*35ffd701SAndroid Build Coastguard Worker 
l2Index(GMM_GFX_ADDRESS addr)235*35ffd701SAndroid Build Coastguard Worker         static inline uint32_t l2Index(GMM_GFX_ADDRESS addr)
236*35ffd701SAndroid Build Coastguard Worker         {
237*35ffd701SAndroid Build Coastguard Worker             return GMM_AUX_L2_ENTRY_IDX(addr);
238*35ffd701SAndroid Build Coastguard Worker         }
239*35ffd701SAndroid Build Coastguard Worker 
l1Index(GMM_GFX_ADDRESS addr)240*35ffd701SAndroid Build Coastguard Worker         static inline uint32_t l1Index(GMM_GFX_ADDRESS addr)
241*35ffd701SAndroid Build Coastguard Worker         {
242*35ffd701SAndroid Build Coastguard Worker             return GMM_AUX_L1_ENTRY_IDX_EXPORTED_2(addr, (const_cast<WA_TABLE &>(pGfxAdapterInfo->WaTable).WaAuxTable64KGranular), (const_cast<WA_TABLE &>(pGfxAdapterInfo->WaTable).WaAuxTable16KGranular));
243*35ffd701SAndroid Build Coastguard Worker         }
244*35ffd701SAndroid Build Coastguard Worker 
245*35ffd701SAndroid Build Coastguard Worker     private:
246*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_ADDRESS mMainBase;
247*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_ADDRESS mAuxBase;
248*35ffd701SAndroid Build Coastguard Worker         uint64_t *      mL3Base;
249*35ffd701SAndroid Build Coastguard Worker     };
250*35ffd701SAndroid Build Coastguard Worker };
251*35ffd701SAndroid Build Coastguard Worker 
252*35ffd701SAndroid Build Coastguard Worker #endif /* __linux__ */
253