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