/* * Copyright (c) Advanced Micro Devices, Inc., or its affiliates. * * SPDX-License-Identifier: MIT */ #include /** * @addtogroup hipCreateTextureObject hipCreateTextureObject * @{ * @ingroup TextureTest */ #define UNALIGN_OFFSET 1 #define SIZE_H 20 #define SIZE_W 30 #define N 512 /** * Test Description * ------------------------ * - Validates handling of invalid 2D pitch resource: * -# When device pointer is `nullptr` * - Expected output: do not return `hipSuccess` * -# When device pointer is not aligned appropriately * - Expected output: do not return `hipSuccess` * -# When pitch is not aligned appropriately * - Expected output: do not return `hipSuccess` * -# When height is 0 * - Expected output: do not return `hipSuccess` * -# When height is 0 and device pointer is `nullptr` * - Expected output: do not return `hipSuccess` * -# When height is `size_t` maximum * - Expected output: do not return `hipSuccess` * -# When width is 0 * - Expected output: do not return `hipSuccess` * -# When width is 0 and device pointer is `nullptr` * - Expected output: do not return `hipSuccess` * -# When width is `size_t` maximum * - Expected output: do not return `hipSuccess` * -# When pitch is `size_t` maximum * - Expected output: do not return `hipSuccess` * Test source * ------------------------ * - unit/texture/hipCreateTextureObject_Pitch2D.cc * Test requirements * ------------------------ * - Textures supported on device * - HIP_VERSION >= 5.2 */ HIP_TEST_CASE(Unit_hipCreateTextureObject_Pitch2DResource) { CHECK_IMAGE_SUPPORT hipError_t ret; hipResourceDesc resDesc; hipTextureDesc texDesc; hipTextureObject_t texObj; hipDeviceProp_t devProp; size_t devPitchA; float* devPtrA; // Initialization HIP_CHECK(hipMallocPitch(reinterpret_cast(&devPtrA), &devPitchA, SIZE_W * sizeof(float), SIZE_H)); HIP_CHECK(hipGetDeviceProperties(&devProp, 0)); memset(&resDesc, 0, sizeof(resDesc)); memset(&texDesc, 0, sizeof(texDesc)); resDesc.resType = hipResourceTypePitch2D; // Sections SECTION("hipResourceTypePitch2D and devPtr(nullptr)") { // Populate resource descriptor resDesc.res.pitch2D.devPtr = nullptr; resDesc.res.pitch2D.height = SIZE_H; resDesc.res.pitch2D.width = SIZE_W; resDesc.res.pitch2D.pitchInBytes = devPitchA; resDesc.res.pitch2D.desc = hipCreateChannelDesc(); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; ret = hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr); REQUIRE(ret != hipSuccess); } SECTION("hipResourceTypePitch2D and devicePtr un-aligned") { if (devProp.textureAlignment > UNALIGN_OFFSET) { // Populate resource descriptor resDesc.res.pitch2D.devPtr = reinterpret_cast(devPtrA) + UNALIGN_OFFSET; resDesc.res.pitch2D.height = SIZE_H; resDesc.res.pitch2D.width = SIZE_W; resDesc.res.pitch2D.pitchInBytes = devPitchA; resDesc.res.pitch2D.desc = hipCreateChannelDesc(); // Populate texture descriptor memset(&texDesc, 0, sizeof(texDesc)); texDesc.readMode = hipReadModeElementType; ret = hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr); REQUIRE(ret != hipSuccess); } } SECTION("hipResourceTypePitch2D and pitch(un-aligned)") { // Populate resource descriptor resDesc.res.pitch2D.devPtr = devPtrA; resDesc.res.pitch2D.height = SIZE_H; resDesc.res.pitch2D.width = SIZE_W; resDesc.res.pitch2D.pitchInBytes = UNALIGN_OFFSET; resDesc.res.pitch2D.desc = hipCreateChannelDesc(); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; ret = hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr); REQUIRE(ret != hipSuccess); } SECTION("hipResourceTypePitch2D and height(0)") { // Populate resource descriptor resDesc.res.pitch2D.devPtr = devPtrA; resDesc.res.pitch2D.height = 0; resDesc.res.pitch2D.width = SIZE_W; resDesc.res.pitch2D.pitchInBytes = devPitchA; resDesc.res.pitch2D.desc = hipCreateChannelDesc(); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; HIP_CHECK(hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr)); HIP_CHECK(hipDestroyTextureObject(texObj)); } SECTION("hipResourceTypePitch2D and height(0)/devptr(nullptr)") { // Populate resource descriptor resDesc.res.pitch2D.devPtr = nullptr; resDesc.res.pitch2D.height = 0; resDesc.res.pitch2D.width = SIZE_W; resDesc.res.pitch2D.pitchInBytes = devPitchA; resDesc.res.pitch2D.desc = hipCreateChannelDesc(); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; ret = hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr); REQUIRE(ret != hipSuccess); } SECTION("hipResourceTypePitch2D and height(max(size_t))") { // Populate resource descriptor resDesc.res.pitch2D.devPtr = devPtrA; resDesc.res.pitch2D.height = std::numeric_limits::max(); resDesc.res.pitch2D.width = SIZE_W; resDesc.res.pitch2D.pitchInBytes = devPitchA; resDesc.res.pitch2D.desc = hipCreateChannelDesc(); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; ret = hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr); REQUIRE(ret != hipSuccess); } SECTION("hipResourceTypePitch2D and width(0)") { // Populate resource descriptor resDesc.resType = hipResourceTypePitch2D; resDesc.res.pitch2D.devPtr = devPtrA; resDesc.res.pitch2D.height = SIZE_H; resDesc.res.pitch2D.width = 0; resDesc.res.pitch2D.pitchInBytes = devPitchA; resDesc.res.pitch2D.desc = hipCreateChannelDesc(); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; HIP_CHECK(hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr)); HIP_CHECK(hipDestroyTextureObject(texObj)); } SECTION("hipResourceTypePitch2D and width(0)/devPtr(nullptr)") { // Populate resource descriptor resDesc.res.pitch2D.devPtr = nullptr; resDesc.res.pitch2D.height = SIZE_H; resDesc.res.pitch2D.width = 0; resDesc.res.pitch2D.pitchInBytes = devPitchA; resDesc.res.pitch2D.desc = hipCreateChannelDesc(); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; ret = hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr); REQUIRE(ret != hipSuccess); } SECTION("hipResourceTypePitch2D and width(max(size_t))") { // Populate resource descriptor resDesc.res.pitch2D.devPtr = devPtrA; resDesc.res.pitch2D.height = SIZE_H; resDesc.res.pitch2D.width = std::numeric_limits::max(); resDesc.res.pitch2D.pitchInBytes = devPitchA; resDesc.res.pitch2D.desc = hipCreateChannelDesc(); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; ret = hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr); REQUIRE(ret != hipSuccess); } SECTION("hipResourceTypePitch2D and pitch(max(size_t))") { // Populate resource descriptor resDesc.res.pitch2D.devPtr = devPtrA; resDesc.res.pitch2D.height = SIZE_H; resDesc.res.pitch2D.width = SIZE_W; resDesc.res.pitch2D.pitchInBytes = std::numeric_limits::max(); resDesc.res.pitch2D.desc = hipCreateChannelDesc(); // Populate texture descriptor texDesc.readMode = hipReadModeElementType; ret = hipCreateTextureObject(&texObj, &resDesc, &texDesc, nullptr); REQUIRE(ret != hipSuccess); } // De-Initialization HIP_CHECK(hipFree(devPtrA)); } /** * End doxygen group TextureTest. * @} */