| 246 | |
| 247 | template<typename T> |
| 248 | void StartTest(int srcWidth, int srcHeight, int numBatches, int topPad, int bottomPad, int leftPad, int rightPad, |
| 249 | NVCVBorderType borderType, float4 borderValue, nvcv::ImageFormat format) |
| 250 | { |
| 251 | cudaStream_t stream; |
| 252 | ASSERT_EQ(cudaSuccess, cudaStreamCreate(&stream)); |
| 253 | |
| 254 | int dstWidth = srcWidth + leftPad + rightPad; |
| 255 | int dstHeight = srcHeight + topPad + bottomPad; |
| 256 | |
| 257 | std::vector<T> srcVec; |
| 258 | |
| 259 | nvcv::Tensor imgSrc(numBatches, {srcWidth, srcHeight}, format); |
| 260 | auto srcData = imgSrc.exportData<nvcv::TensorDataStridedCuda>(); |
| 261 | ASSERT_NE(nullptr, srcData); |
| 262 | auto srcAccess = nvcv::TensorDataAccessStridedImagePlanar::Create(*srcData); |
| 263 | ASSERT_TRUE(srcData); |
| 264 | int srcBufSize = (srcAccess->sampleStride() / sizeof(T)) * srcAccess->numSamples(); |
| 265 | srcVec.resize(srcBufSize); |
| 266 | |
| 267 | std::default_random_engine randEng{0}; |
| 268 | std::uniform_int_distribution<uint8_t> srcRand{0u, 255u}; |
| 269 | if (std::is_same<T, float>::value) |
| 270 | std::generate(srcVec.begin(), srcVec.end(), [&]() { return srcRand(randEng) / 255.0f; }); |
| 271 | else |
| 272 | std::generate(srcVec.begin(), srcVec.end(), [&]() { return srcRand(randEng); }); |
| 273 | |
| 274 | // Copy each input image with random data to the GPU |
| 275 | ASSERT_EQ(cudaSuccess, cudaMemcpyAsync(srcData->basePtr(), srcVec.data(), srcBufSize * sizeof(T), |
| 276 | cudaMemcpyHostToDevice, stream)); |
| 277 | |
| 278 | nvcv::Tensor imgDst(numBatches, {dstWidth, dstHeight}, format); |
| 279 | auto dstData = imgDst.exportData<nvcv::TensorDataStridedCuda>(); |
| 280 | ASSERT_NE(nullptr, dstData); |
| 281 | auto dstAccess = nvcv::TensorDataAccessStridedImagePlanar::Create(*dstData); |
| 282 | ASSERT_TRUE(dstData); |
| 283 | int dstBufSize = (dstAccess->sampleStride() / sizeof(T)) * dstAccess->numSamples(); |
| 284 | ASSERT_EQ(cudaSuccess, cudaMemsetAsync(dstData->basePtr(), 0, dstBufSize * sizeof(T), stream)); |
| 285 | |
| 286 | std::vector<T> testVec(dstBufSize); |
| 287 | std::vector<T> goldVec(dstBufSize); |
| 288 | |
| 289 | int srcPixPitch = srcAccess->numChannels(); |
| 290 | int srcRowStride = srcAccess->rowStride() / sizeof(T); |
| 291 | int srcImgPitch = srcAccess->sampleStride() / sizeof(T); |
| 292 | |
| 293 | // Generate gold result |
| 294 | CopyMakeBorder(goldVec, srcVec, *dstAccess, srcWidth, srcHeight, srcRowStride, srcPixPitch, srcImgPitch, topPad, |
| 295 | leftPad, borderType, borderValue); |
| 296 | |
| 297 | // Generate test result |
| 298 | cvcuda::CopyMakeBorder cpyMakeBorderOp; |
| 299 | |
| 300 | EXPECT_NO_THROW(cpyMakeBorderOp(stream, imgSrc, imgDst, topPad, leftPad, borderType, borderValue)); |
| 301 | |
| 302 | // Get test data back |
| 303 | ASSERT_EQ(cudaSuccess, cudaStreamSynchronize(stream)); |
| 304 | ASSERT_EQ(cudaSuccess, cudaStreamDestroy(stream)); |
| 305 | ASSERT_EQ(cudaSuccess, |
nothing calls this directly
no test coverage detected