/* * Copyright (C) 2017-2019 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "runtime/helpers/aligned_memory.h" #include "runtime/helpers/surface_formats.h" #include "unit_tests/mocks/mock_gmm_resource_info.h" using namespace ::testing; namespace OCLRT { GmmResourceInfo *GmmResourceInfo::create(GMM_RESCREATE_PARAMS *resourceCreateParams) { return new ::testing::NiceMock(resourceCreateParams); } GmmResourceInfo *GmmResourceInfo::create(GMM_RESOURCE_INFO *inputGmmResourceInfo) { return new ::testing::NiceMock(inputGmmResourceInfo); } MockGmmResourceInfo::MockGmmResourceInfo(GMM_RESCREATE_PARAMS *resourceCreateParams) { mockResourceCreateParams = *resourceCreateParams; setupDefaultActions(); } MockGmmResourceInfo::MockGmmResourceInfo(GMM_RESOURCE_INFO *inputGmmResourceInfo) { mockResourceCreateParams = reinterpret_cast(inputGmmResourceInfo)->mockResourceCreateParams; setupDefaultActions(); }; // Simulate GMM behaviour. We dont want to test 3rd party lib void MockGmmResourceInfo::setupDefaultActions() { setSurfaceFormat(); computeRowPitch(); size = rowPitch; size *= static_cast(mockResourceCreateParams.BaseHeight); qPitch = alignUp((uint32_t)size, 64); size *= mockResourceCreateParams.Depth ? static_cast(mockResourceCreateParams.Depth) : 1; size *= mockResourceCreateParams.ArraySize ? static_cast(mockResourceCreateParams.ArraySize) : 1; size = alignUp(size, MemoryConstants::pageSize); } GMM_STATUS MockGmmResourceInfo::getOffset(GMM_REQ_OFFSET_INFO &reqOffsetInfo) { arrayIndexPassedToGetOffset = reqOffsetInfo.ArrayIndex; getOffsetCalled++; reqOffsetInfo.Lock.Offset = 16; reqOffsetInfo.Lock.Pitch = 2; reqOffsetInfo.Render.YOffset = 1; if (mockResourceCreateParams.Format == GMM_RESOURCE_FORMAT::GMM_FORMAT_NV12) { reqOffsetInfo.Render.XOffset = 32; reqOffsetInfo.Render.Offset = 64; } if (reqOffsetInfo.Slice == 1) { reqOffsetInfo.Render.YOffset = mockResourceCreateParams.BaseHeight; } if (reqOffsetInfo.MipLevel > 0) { reqOffsetInfo.Lock.Offset = 32; } return GMM_SUCCESS; } void MockGmmResourceInfo::computeRowPitch() { if (mockResourceCreateParams.OverridePitch) { rowPitch = mockResourceCreateParams.OverridePitch; } else { rowPitch = static_cast(mockResourceCreateParams.BaseWidth64 * (surfaceFormatInfo->PerChannelSizeInBytes * surfaceFormatInfo->NumChannels)); rowPitch = alignUp(rowPitch, 64); } } void MockGmmResourceInfo::setSurfaceFormat() { auto iterate = [&](ArrayRef formats) { if (!surfaceFormatInfo) { for (auto &format : formats) { if (mockResourceCreateParams.Format == format.GMMSurfaceFormat) { surfaceFormatInfo = &format; break; } } } }; if (mockResourceCreateParams.Format == GMM_RESOURCE_FORMAT::GMM_FORMAT_P010) { tempSurface.GMMSurfaceFormat = GMM_RESOURCE_FORMAT::GMM_FORMAT_P010; surfaceFormatInfo = &tempSurface; } iterate(SurfaceFormats::readOnly()); iterate(SurfaceFormats::writeOnly()); iterate(SurfaceFormats::readWrite()); iterate(SurfaceFormats::packedYuv()); iterate(SurfaceFormats::planarYuv()); iterate(SurfaceFormats::readOnlyDepth()); iterate(SurfaceFormats::readWriteDepth()); ASSERT_NE(nullptr, surfaceFormatInfo); } uint32_t MockGmmResourceInfo::getBitsPerPixel() { return (surfaceFormatInfo->PerChannelSizeInBytes << 3) * surfaceFormatInfo->NumChannels; } void MockGmmResourceInfo::setUnifiedAuxTranslationCapable() { mockResourceCreateParams.Flags.Gpu.CCS = 1; mockResourceCreateParams.Flags.Gpu.UnifiedAuxSurface = 1; mockResourceCreateParams.Flags.Info.RenderCompressed = 1; } void MockGmmResourceInfo::setMultisampleControlSurface() { mockResourceCreateParams.Flags.Gpu.MCS = 1; } void MockGmmResourceInfo::setUnifiedAuxPitchTiles(uint32_t value) { this->unifiedAuxPitch = value; } void MockGmmResourceInfo::setAuxQPitch(uint32_t value) { this->auxQPitch = value; } uint32_t MockGmmResourceInfo::getTileModeSurfaceState() { if (mockResourceCreateParams.Type == GMM_RESOURCE_TYPE::RESOURCE_2D || mockResourceCreateParams.Type == GMM_RESOURCE_TYPE::RESOURCE_3D) { return 3; } else { return 0; } } MockGmmResourceInfo::MockGmmResourceInfo() {} MockGmmResourceInfo::~MockGmmResourceInfo() {} } // namespace OCLRT