/* * Copyright (C) 2018-2021 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "opencl/source/accelerators/intel_accelerator.h" #include "opencl/source/accelerators/intel_motion_estimation.h" #include "opencl/source/context/context.h" #include "opencl/test/unit_test/api/cl_api_tests.h" using namespace NEO; namespace ULT { struct IntelMotionEstimationTest : public api_tests { public: IntelMotionEstimationTest() {} void SetUp() override { api_tests::SetUp(); desc.mb_block_type = CL_ME_MB_TYPE_16x16_INTEL; desc.subpixel_mode = CL_ME_SUBPIXEL_MODE_QPEL_INTEL; desc.sad_adjust_mode = CL_ME_SAD_ADJUST_MODE_HAAR_INTEL; desc.search_path_type = CL_ME_SEARCH_PATH_RADIUS_2_2_INTEL; } void TearDown() override { api_tests::TearDown(); } protected: cl_accelerator_intel accelerator = nullptr; cl_motion_estimation_desc_intel desc; cl_int retVal = 0xEEEEEEEEu; cl_int result = -1; }; typedef IntelMotionEstimationTest IntelMotionEstimationNegativeTest; TEST_F(IntelMotionEstimationNegativeTest, GivenNullDescriptorWhenCreatingAcceleratorThenClInvalidAcceleratorDescriptorIntelErrorIsReturned) { accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), nullptr, &retVal); EXPECT_EQ(CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL, retVal); ASSERT_EQ(static_cast(nullptr), accelerator); } TEST_F(IntelMotionEstimationNegativeTest, GivenDescriptorSizeLongerThanActualWhenCreatingAcceleratorThenClInvalidAcceleratorDescriptorIntelErrorIsReturned) { accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel) + 1, &desc, &retVal); EXPECT_EQ(CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL, retVal); ASSERT_EQ(static_cast(nullptr), accelerator); } TEST_F(IntelMotionEstimationNegativeTest, GivenDescriptorSizeShorterThanActualWhenCreatingAcceleratorThenClInvalidAcceleratorDescriptorIntelErrorIsReturned) { accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel) - 1, &desc, &retVal); EXPECT_EQ(CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL, retVal); ASSERT_EQ(static_cast(nullptr), accelerator); } TEST_F(IntelMotionEstimationNegativeTest, GivenInvalidMacroBlockTypeWhenCreatingAcceleratorThenClInvalidAcceleratorDescriptorIntelErrorIsReturned) { desc.mb_block_type = 0xEEEEEEEE; accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), nullptr, &retVal); EXPECT_EQ(CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL, retVal); ASSERT_EQ(static_cast(nullptr), accelerator); } TEST_F(IntelMotionEstimationNegativeTest, GivenInvalidSubPixelModeWhenCreatingAcceleratorThenClInvalidAcceleratorDescriptorIntelErrorIsReturned) { desc.subpixel_mode = 0xEEEEEEEE; accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), nullptr, &retVal); EXPECT_EQ(CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL, retVal); ASSERT_EQ(static_cast(nullptr), accelerator); } TEST_F(IntelMotionEstimationNegativeTest, GivenInvalidSadAdjustModeWhenCreatingAcceleratorThenClInvalidAcceleratorDescriptorIntelErrorIsReturned) { desc.sad_adjust_mode = 0xEEEEEEEE; accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), nullptr, &retVal); EXPECT_EQ(CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL, retVal); ASSERT_EQ(static_cast(nullptr), accelerator); } TEST_F(IntelMotionEstimationNegativeTest, GivenInvalidSearchPathTypeWhenCreatingAcceleratorThenClInvalidAcceleratorDescriptorIntelErrorIsReturned) { desc.search_path_type = 0xEEEEEEEE; accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), nullptr, &retVal); EXPECT_EQ(CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL, retVal); ASSERT_EQ(static_cast(nullptr), accelerator); } TEST_F(IntelMotionEstimationTest, GivenValidArgumentsWhenCreatingAcceleratorThenAcceleratorIsCreated) { accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), &desc, &retVal); ASSERT_NE(nullptr, accelerator); EXPECT_EQ(CL_SUCCESS, retVal); auto acc = static_cast(accelerator); delete acc; } TEST_F(IntelMotionEstimationTest, GivenNullReturnWhenCreatingAcceleratorThenAcceleratorIsCreated) { accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), &desc, nullptr); ASSERT_NE(nullptr, accelerator); auto acc = static_cast(accelerator); delete acc; } TEST_F(IntelMotionEstimationTest, GivenValidAcceleratorWhenReleasingAcceleratorThenSuccessIsReturned) { accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), &desc, &retVal); ASSERT_NE(nullptr, accelerator); ASSERT_EQ(CL_SUCCESS, retVal); result = clReleaseAcceleratorINTEL(accelerator); EXPECT_EQ(CL_SUCCESS, result); } TEST_F(IntelMotionEstimationTest, GivenValidAcceleratorWhenRetainingAndReleasingAcceleratorThenReferenceCountIsAdjustedCorrectly) { accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), &desc, &retVal); ASSERT_NE(nullptr, accelerator); ASSERT_EQ(CL_SUCCESS, retVal); auto pAccelerator = static_cast(accelerator); ASSERT_EQ(1, pAccelerator->getReference()); result = clRetainAcceleratorINTEL(accelerator); ASSERT_EQ(CL_SUCCESS, result); ASSERT_EQ(2, pAccelerator->getReference()); result = clReleaseAcceleratorINTEL(accelerator); EXPECT_EQ(CL_SUCCESS, result); EXPECT_EQ(1, pAccelerator->getReference()); result = clReleaseAcceleratorINTEL(accelerator); EXPECT_EQ(CL_SUCCESS, result); } struct IntelMotionEstimationGetInfoTest : public IntelMotionEstimationTest { public: IntelMotionEstimationGetInfoTest() : type_returned(static_cast(-1)), param_value_size_ret(static_cast(-1)) {} void SetUp() override { IntelMotionEstimationTest::SetUp(); descReturn.mb_block_type = static_cast(-1); descReturn.subpixel_mode = static_cast(-1); descReturn.sad_adjust_mode = static_cast(-1); descReturn.search_path_type = static_cast(-1); accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), &desc, &retVal); ASSERT_NE(nullptr, accelerator); ASSERT_EQ(CL_SUCCESS, retVal); } void TearDown() override { result = clReleaseAcceleratorINTEL(accelerator); EXPECT_EQ(CL_SUCCESS, result); IntelMotionEstimationTest::TearDown(); } protected: cl_motion_estimation_desc_intel descReturn; cl_accelerator_type_intel type_returned; size_t param_value_size_ret; }; TEST_F(IntelMotionEstimationGetInfoTest, GivenValidParamsWhenGettingAcceleratorInfoThenDescriptorContainsCorrectInformation) { result = clGetAcceleratorInfoINTEL( accelerator, CL_ACCELERATOR_DESCRIPTOR_INTEL, sizeof(cl_motion_estimation_desc_intel), // exact &descReturn, ¶m_value_size_ret); EXPECT_EQ(CL_SUCCESS, result); EXPECT_EQ(sizeof(cl_motion_estimation_desc_intel), param_value_size_ret); EXPECT_EQ(static_cast(CL_ME_MB_TYPE_16x16_INTEL), descReturn.mb_block_type); EXPECT_EQ(static_cast(CL_ME_SUBPIXEL_MODE_QPEL_INTEL), descReturn.subpixel_mode); EXPECT_EQ(static_cast(CL_ME_SAD_ADJUST_MODE_HAAR_INTEL), descReturn.sad_adjust_mode); EXPECT_EQ(static_cast(CL_ME_SEARCH_PATH_RADIUS_2_2_INTEL), descReturn.search_path_type); } TEST_F(IntelMotionEstimationGetInfoTest, GivenTooShortDescriptorLengthWhenGettingAcceleratorInfoThenClInvalidValueErrorIsReturned) { result = clGetAcceleratorInfoINTEL( accelerator, CL_ACCELERATOR_DESCRIPTOR_INTEL, sizeof(cl_motion_estimation_desc_intel) - 1, // short &descReturn, ¶m_value_size_ret); EXPECT_EQ(CL_INVALID_VALUE, result); } TEST_F(IntelMotionEstimationGetInfoTest, GivenDescriptorLengthZeroWhenGettingAcceleratorInfoThenClInvalidValueErrorIsReturned) { result = clGetAcceleratorInfoINTEL( accelerator, CL_ACCELERATOR_DESCRIPTOR_INTEL, 0, &descReturn, ¶m_value_size_ret); EXPECT_EQ(CL_INVALID_VALUE, result); } TEST_F(IntelMotionEstimationGetInfoTest, GivenInvalidParametersWhenGettingAcceleratorInfoThenValueSizeRetIsNotUpdated) { param_value_size_ret = 0x1234; result = clGetAcceleratorInfoINTEL( accelerator, CL_ACCELERATOR_DESCRIPTOR_INTEL, 0, &descReturn, ¶m_value_size_ret); EXPECT_EQ(CL_INVALID_VALUE, result); EXPECT_EQ(0x1234u, param_value_size_ret); } TEST_F(IntelMotionEstimationGetInfoTest, GivenLongerDescriptorLengthWhenGettingAcceleratorInfoThenCorrectDescriptorLengthIsReturned) { result = clGetAcceleratorInfoINTEL( accelerator, CL_ACCELERATOR_DESCRIPTOR_INTEL, sizeof(cl_motion_estimation_desc_intel) + 1, // long &descReturn, ¶m_value_size_ret); EXPECT_EQ(CL_SUCCESS, result); EXPECT_EQ(sizeof(cl_motion_estimation_desc_intel), param_value_size_ret); } TEST_F(IntelMotionEstimationGetInfoTest, GivenDescriptorLengthZeroAndDescriptorNullWhenGettingAcceleratorInfoThenCorrectDescriptorLengthIsReturned) { result = clGetAcceleratorInfoINTEL( accelerator, CL_ACCELERATOR_DESCRIPTOR_INTEL, 0, // query required size w/nullptr return nullptr, ¶m_value_size_ret); EXPECT_EQ(CL_SUCCESS, result); EXPECT_EQ(sizeof(cl_motion_estimation_desc_intel), param_value_size_ret); } TEST_F(IntelMotionEstimationGetInfoTest, GivenAcceleratorTypeWhenGettingAcceleratorInfoThenAcceleratorTypeMotionEstimationIntelIsReturned) { ASSERT_EQ(sizeof(cl_accelerator_type_intel), sizeof(cl_uint)); result = clGetAcceleratorInfoINTEL( accelerator, CL_ACCELERATOR_TYPE_INTEL, sizeof(cl_uint), &type_returned, ¶m_value_size_ret); EXPECT_EQ(CL_SUCCESS, result); EXPECT_EQ(sizeof(cl_accelerator_type_intel), param_value_size_ret); EXPECT_EQ(static_cast(CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL), type_returned); } TEST_F(IntelMotionEstimationGetInfoTest, GivenAcceleratorTypeIntelWhenGettingAcceleratorInfoThenClAcceleratorTypeMotionEstimationIntelIsReturned) { result = clGetAcceleratorInfoINTEL( accelerator, CL_ACCELERATOR_TYPE_INTEL, sizeof(cl_uint), // exact &type_returned, ¶m_value_size_ret); EXPECT_EQ(CL_SUCCESS, result); EXPECT_EQ(sizeof(cl_accelerator_type_intel), param_value_size_ret); EXPECT_EQ(static_cast(CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL), type_returned); } TEST_F(IntelMotionEstimationGetInfoTest, GivenAcceleratorTypeIntelAndTooShortTypeLengthWhenGettingAcceleratorInfoThenClInvalidValueIsReturned) { result = clGetAcceleratorInfoINTEL( accelerator, CL_ACCELERATOR_TYPE_INTEL, sizeof(cl_uint) - 1, // short &type_returned, ¶m_value_size_ret); EXPECT_EQ(CL_INVALID_VALUE, result); } TEST_F(IntelMotionEstimationGetInfoTest, GivenAcceleratorTypeIntelAndTypeLengthZeroWhenGettingAcceleratorInfoThenClInvalidValueIsReturned) { result = clGetAcceleratorInfoINTEL( accelerator, CL_ACCELERATOR_TYPE_INTEL, 0, // very short &type_returned, ¶m_value_size_ret); EXPECT_EQ(CL_INVALID_VALUE, result); } TEST_F(IntelMotionEstimationGetInfoTest, GivenAcceleratorTypeIntelAndTooLongTypeLengthWhenGettingAcceleratorInfoThenCorrectLengthIsReturned) { result = clGetAcceleratorInfoINTEL( accelerator, CL_ACCELERATOR_TYPE_INTEL, sizeof(cl_uint) + 1, // long &type_returned, ¶m_value_size_ret); EXPECT_EQ(CL_SUCCESS, result); EXPECT_EQ(sizeof(cl_accelerator_type_intel), param_value_size_ret); } TEST_F(IntelMotionEstimationGetInfoTest, GivenAcceleratorTypeIntelAndNullTypeWhenGettingAcceleratorInfoThenCorrectLengthIsReturned) { result = clGetAcceleratorInfoINTEL( accelerator, CL_ACCELERATOR_TYPE_INTEL, 0, nullptr, ¶m_value_size_ret); EXPECT_EQ(CL_SUCCESS, result); EXPECT_EQ(sizeof(cl_accelerator_type_intel), param_value_size_ret); } TEST_F(IntelMotionEstimationTest, GivenDescriptor8x8IntegerNone2x2WhenCreatingAcceleratorThenSuccessIsReturned) { desc.mb_block_type = CL_ME_MB_TYPE_8x8_INTEL; desc.subpixel_mode = CL_ME_SUBPIXEL_MODE_INTEGER_INTEL; desc.sad_adjust_mode = CL_ME_SAD_ADJUST_MODE_NONE_INTEL; desc.search_path_type = CL_ME_SEARCH_PATH_RADIUS_2_2_INTEL; accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), &desc, &retVal); EXPECT_EQ(CL_SUCCESS, retVal); result = clReleaseAcceleratorINTEL(accelerator); EXPECT_EQ(CL_SUCCESS, result); } TEST_F(IntelMotionEstimationTest, GivenDescriptor4x4HpelHaar16x12WhenCreatingAcceleratorThenSuccessIsReturned) { desc.mb_block_type = CL_ME_MB_TYPE_4x4_INTEL; desc.subpixel_mode = CL_ME_SUBPIXEL_MODE_HPEL_INTEL; desc.sad_adjust_mode = CL_ME_SAD_ADJUST_MODE_HAAR_INTEL; desc.search_path_type = CL_ME_SEARCH_PATH_RADIUS_16_12_INTEL; accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), &desc, &retVal); EXPECT_EQ(CL_SUCCESS, retVal); result = clReleaseAcceleratorINTEL(accelerator); EXPECT_EQ(CL_SUCCESS, result); } TEST_F(IntelMotionEstimationTest, GivenDescriptor16x16HpelHaar4x4WhenCreatingAcceleratorThenSuccessIsReturned) { desc.mb_block_type = CL_ME_MB_TYPE_16x16_INTEL; desc.subpixel_mode = CL_ME_SUBPIXEL_MODE_QPEL_INTEL; desc.sad_adjust_mode = CL_ME_SAD_ADJUST_MODE_HAAR_INTEL; desc.search_path_type = CL_ME_SEARCH_PATH_RADIUS_4_4_INTEL; accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), &desc, &retVal); EXPECT_EQ(CL_SUCCESS, retVal); result = clReleaseAcceleratorINTEL(accelerator); EXPECT_EQ(CL_SUCCESS, result); } TEST_F(IntelMotionEstimationNegativeTest, GivenInvalidBlockTypeWhenCreatingAcceleratorThenClInvalidAcceleratorDescriptorIntelErrorIsReturned) { desc.mb_block_type = static_cast(-1); accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), &desc, &retVal); EXPECT_EQ(CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL, retVal); } TEST_F(IntelMotionEstimationNegativeTest, GivenInvalidSubpixelModeWhenCreatingAcceleratorThenClInvalidAcceleratorDescriptorIntelErrorIsReturned) { desc.subpixel_mode = static_cast(-1); accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), &desc, &retVal); EXPECT_EQ(CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL, retVal); } TEST_F(IntelMotionEstimationNegativeTest, GivenInvalidAdjustModeWhenCreatingAcceleratorThenClInvalidAcceleratorDescriptorIntelErrorIsReturned) { desc.sad_adjust_mode = static_cast(-1); accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), &desc, &retVal); EXPECT_EQ(CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL, retVal); } TEST_F(IntelMotionEstimationNegativeTest, GivenInvalidPathTypeWhenCreatingAcceleratorThenClInvalidAcceleratorDescriptorIntelErrorIsReturned) { desc.search_path_type = static_cast(-1); accelerator = clCreateAcceleratorINTEL( pContext, CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL, sizeof(cl_motion_estimation_desc_intel), &desc, &retVal); EXPECT_EQ(CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL, retVal); } } // namespace ULT