/* * Copyright (c) Advanced Micro Devices, Inc., or its affiliates. * * SPDX-License-Identifier: MIT */ #include /** * @addtogroup hipCreateTextureObject hipCreateTextureObject * @{ * @ingroup TextureTest */ #define UNALIGN_OFFSET 1 #define N 512 /** * Test Description * ------------------------ * - Validates handling of invalid linear resource: * -# When device pointer is `nullptr` * - Expected output: do not return `hipSuccess` * -# When size in bytes is 0 * - Expected output: do not return `hipSuccess` * -# When size in bytes is `size_t` maximum * - Expected output: do not return `hipSuccess` * -# When a valid resource view descriptor is provided * - Platform specific (AMD) * - Expected output: do not return `hipSuccess` * -# When device pointer is not aligned appropriately * - Expected output: do not return `hipSuccess` * Test source * ------------------------ * - unit/texture/hipCreateTextureObject_Linear.cc * Test requirements * ------------------------ * - Textures supported on device * - HIP_VERSION >= 5.2 */ HIP_TEST_CASE(Unit_hipCreateTextureObject_LinearResource) { CHECK_IMAGE_SUPPORT float* texBuf; hipError_t ret; constexpr int xsize = 32; hipResourceDesc resDesc; hipTextureDesc texDesc; hipResourceViewDesc resViewDesc; hipTextureObject_t texObj; hipDeviceProp_t devProp; // Initialization HIP_CHECK(hipMalloc(&texBuf, N * sizeof(float))); HIP_CHECK(hipGetDeviceProperties(&devProp, 0)); memset(&resDesc, 0, sizeof(resDesc)); memset(&texDesc, 0, sizeof(texDesc)); resDesc.resType = hipResourceTypeLinear; // Sections SECTION("hipResourceTypeLinear and devPtr(nullptr)") { // Populate resource descriptor resDesc.res.linear.devPtr = nullptr; resDesc.res.linear.desc = hipCreateChannelDesc(xsize, 0, 0, 0, hipChannelFormatKindFloat); resDesc.res.linear.sizeInBytes = N * sizeof(float); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; ret = hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr); REQUIRE(ret != hipSuccess); } SECTION("hipResourceTypeLinear and sizeInBytes(0)") { // Populate resource descriptor resDesc.res.linear.devPtr = texBuf; resDesc.res.linear.desc = hipCreateChannelDesc(xsize, 0, 0, 0, hipChannelFormatKindFloat); resDesc.res.linear.sizeInBytes = 0; // Populate texture descriptor texDesc.readMode = hipReadModeElementType; HIP_CHECK(hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr)); HIP_CHECK(hipDestroyTextureObject(texObj)); } SECTION("hipResourceTypeLinear and sizeInBytes(max(size_t))") { // Populate resource descriptor resDesc.res.linear.devPtr = texBuf; resDesc.res.linear.desc = hipCreateChannelDesc(xsize, 0, 0, 0, hipChannelFormatKindFloat); resDesc.res.linear.sizeInBytes = std::numeric_limits::max(); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; ret = hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr); REQUIRE(ret != hipSuccess); } SECTION("hipResourceTypeLinear and valid resource view descriptor") { #if HT_AMD // Populate resource descriptor resDesc.res.linear.devPtr = texBuf; resDesc.res.linear.desc = hipCreateChannelDesc(xsize, 0, 0, 0, hipChannelFormatKindFloat); resDesc.res.linear.sizeInBytes = N * sizeof(float); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; // Populate resourceview descriptor memset(&resViewDesc, 0, sizeof(resViewDesc)); resViewDesc.format = hipResViewFormatFloat1; resViewDesc.width = N * sizeof(float); ret = hipCreateTextureObject(&texObj, &resDesc, &texDesc, &resViewDesc); REQUIRE(ret != hipSuccess); #else // API expected to return error according to cuda documentation. WARN("Skipping section: " << HipTest::SkipReason::kApiUnsupportedOnNvidia); #endif } SECTION("hipResourceTypeLinear and devicePtr un-aligned") { if (devProp.textureAlignment > UNALIGN_OFFSET) { // Populate resource descriptor resDesc.res.linear.devPtr = reinterpret_cast(texBuf) + UNALIGN_OFFSET; resDesc.res.linear.desc = hipCreateChannelDesc(xsize, 0, 0, 0, hipChannelFormatKindFloat); resDesc.res.linear.sizeInBytes = N * sizeof(float); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; ret = hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr); REQUIRE(ret != hipSuccess); } } // De-Initialization HIP_CHECK(hipFree(texBuf)); } /** * End doxygen group TextureTest. * @} */