mirror of
https://github.com/NVIDIA/cuda-samples.git
synced 2024-12-01 10:19:16 +08:00
232 lines
7.9 KiB
C++
232 lines
7.9 KiB
C++
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
//
|
|
// DESCRIPTION: Simple EGL stream sample app
|
|
//
|
|
//
|
|
|
|
//#define EGL_EGLEXT_PROTOTYPES
|
|
|
|
#include "cudaEGL.h"
|
|
#include "cuda_consumer.h"
|
|
#include "cuda_producer.h"
|
|
#include "eglstrm_common.h"
|
|
|
|
/* ------ globals ---------*/
|
|
|
|
#if defined(EXTENSION_LIST)
|
|
EXTENSION_LIST(EXTLST_EXTERN)
|
|
#endif
|
|
|
|
#define NUM_TRAILS 4
|
|
|
|
bool signal_stop = 0;
|
|
|
|
static void sig_handler(int sig) {
|
|
signal_stop = 1;
|
|
printf("Signal: %d\n", sig);
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
TestArgs args;
|
|
CUresult curesult = CUDA_SUCCESS;
|
|
unsigned int i, j;
|
|
EGLint streamState = 0;
|
|
|
|
test_cuda_consumer_s cudaConsumer;
|
|
test_cuda_producer_s cudaProducer;
|
|
|
|
memset(&cudaProducer, 0, sizeof(test_cuda_producer_s));
|
|
memset(&cudaConsumer, 0, sizeof(test_cuda_consumer_s));
|
|
|
|
// Hook up Ctrl-C handler
|
|
signal(SIGINT, sig_handler);
|
|
if (!eglSetupExtensions()) {
|
|
printf("SetupExtentions failed \n");
|
|
curesult = CUDA_ERROR_UNKNOWN;
|
|
goto done;
|
|
}
|
|
|
|
checkCudaErrors(cuInit(0));
|
|
|
|
int count;
|
|
|
|
checkCudaErrors(cuDeviceGetCount(&count));
|
|
printf("Found %d cuda devices\n", count);
|
|
|
|
CUdevice devId;
|
|
|
|
if (!EGLStreamInit(&devId)) {
|
|
printf("EGLStream Init failed.\n");
|
|
curesult = CUDA_ERROR_UNKNOWN;
|
|
goto done;
|
|
}
|
|
curesult = cudaDeviceCreateProducer(&cudaProducer, devId);
|
|
if (curesult != CUDA_SUCCESS) {
|
|
goto done;
|
|
}
|
|
curesult = cudaDeviceCreateConsumer(&cudaConsumer, devId);
|
|
if (curesult != CUDA_SUCCESS) {
|
|
goto done;
|
|
}
|
|
checkCudaErrors(cuCtxPushCurrent(cudaConsumer.context));
|
|
if (CUDA_SUCCESS != (curesult = cuEGLStreamConsumerConnect(
|
|
&(cudaConsumer.cudaConn), eglStream))) {
|
|
printf("FAILED Connect CUDA consumer with error %d\n", curesult);
|
|
goto done;
|
|
} else {
|
|
printf("Connected CUDA consumer, CudaConsumer %p\n", cudaConsumer.cudaConn);
|
|
}
|
|
checkCudaErrors(cuCtxPopCurrent(&cudaConsumer.context));
|
|
|
|
checkCudaErrors(cuCtxPushCurrent(cudaProducer.context));
|
|
if (CUDA_SUCCESS ==
|
|
(curesult = cuEGLStreamProducerConnect(&(cudaProducer.cudaConn),
|
|
eglStream, WIDTH, HEIGHT))) {
|
|
printf("Connect CUDA producer Done, CudaProducer %p\n",
|
|
cudaProducer.cudaConn);
|
|
} else {
|
|
printf("Connect CUDA producer FAILED with error %d\n", curesult);
|
|
goto done;
|
|
}
|
|
checkCudaErrors(cuCtxPopCurrent(&cudaProducer.context));
|
|
|
|
// Initialize producer
|
|
for (i = 0; i < NUM_TRAILS; i++) {
|
|
if (streamState != EGL_STREAM_STATE_CONNECTING_KHR) {
|
|
if (!eglQueryStreamKHR(g_display, eglStream, EGL_STREAM_STATE_KHR,
|
|
&streamState)) {
|
|
printf("main: eglQueryStreamKHR EGL_STREAM_STATE_KHR failed\n");
|
|
curesult = CUDA_ERROR_UNKNOWN;
|
|
goto done;
|
|
}
|
|
}
|
|
args.inputWidth = WIDTH;
|
|
args.inputHeight = HEIGHT;
|
|
if (i % 2 != 0) {
|
|
args.isARGB = 1;
|
|
args.infile1 = sdkFindFilePath("cuda_f_1.yuv", argv[0]);
|
|
args.infile2 = sdkFindFilePath("cuda_f_2.yuv", argv[0]);
|
|
} else {
|
|
args.isARGB = 0;
|
|
args.infile1 = sdkFindFilePath("cuda_yuv_f_1.yuv", argv[0]);
|
|
args.infile2 = sdkFindFilePath("cuda_yuv_f_2.yuv", argv[0]);
|
|
}
|
|
if ((i % 4) < 2) {
|
|
args.pitchLinearOutput = 1;
|
|
} else {
|
|
args.pitchLinearOutput = 0;
|
|
}
|
|
|
|
checkCudaErrors(cuCtxPushCurrent(cudaProducer.context));
|
|
cudaProducerInit(&cudaProducer, g_display, eglStream, &args);
|
|
checkCudaErrors(cuCtxPopCurrent(&cudaProducer.context));
|
|
|
|
checkCudaErrors(cuCtxPushCurrent(cudaConsumer.context));
|
|
cuda_consumer_init(&cudaConsumer, &args);
|
|
checkCudaErrors(cuCtxPopCurrent(&cudaConsumer.context));
|
|
|
|
printf("main - Cuda Producer and Consumer Initialized.\n");
|
|
|
|
for (j = 0; j < 2; j++) {
|
|
printf("Running for %s frame and %s input\n",
|
|
args.isARGB ? "ARGB" : "YUV",
|
|
args.pitchLinearOutput ? "Pitchlinear" : "BlockLinear");
|
|
if (j == 0) {
|
|
checkCudaErrors(cuCtxPushCurrent(cudaProducer.context));
|
|
curesult = cudaProducerTest(&cudaProducer, cudaProducer.fileName1);
|
|
if (curesult != CUDA_SUCCESS) {
|
|
printf("Cuda Producer Test failed for frame = %d\n", j + 1);
|
|
goto done;
|
|
}
|
|
checkCudaErrors(cuCtxPopCurrent(&cudaProducer.context));
|
|
checkCudaErrors(cuCtxPushCurrent(cudaConsumer.context));
|
|
curesult = cudaConsumerTest(&cudaConsumer, cudaConsumer.outFile1);
|
|
if (curesult != CUDA_SUCCESS) {
|
|
printf("Cuda Consumer Test failed for frame = %d\n", j + 1);
|
|
goto done;
|
|
}
|
|
checkCudaErrors(cuCtxPopCurrent(&cudaConsumer.context));
|
|
} else {
|
|
checkCudaErrors(cuCtxPushCurrent(cudaProducer.context));
|
|
curesult = cudaProducerTest(&cudaProducer, cudaProducer.fileName2);
|
|
if (curesult != CUDA_SUCCESS) {
|
|
printf("Cuda Producer Test failed for frame = %d\n", j + 1);
|
|
goto done;
|
|
}
|
|
|
|
checkCudaErrors(cuCtxPopCurrent(&cudaProducer.context));
|
|
checkCudaErrors(cuCtxPushCurrent(cudaConsumer.context));
|
|
curesult = cudaConsumerTest(&cudaConsumer, cudaConsumer.outFile2);
|
|
if (curesult != CUDA_SUCCESS) {
|
|
printf("Cuda Consumer Test failed for frame = %d\n", j + 1);
|
|
goto done;
|
|
}
|
|
checkCudaErrors(cuCtxPopCurrent(&cudaConsumer.context));
|
|
}
|
|
}
|
|
}
|
|
|
|
checkCudaErrors(cuCtxPushCurrent(cudaProducer.context));
|
|
if (CUDA_SUCCESS != (curesult = cudaProducerDeinit(&cudaProducer))) {
|
|
printf("Producer Disconnect FAILED. \n");
|
|
goto done;
|
|
}
|
|
checkCudaErrors(cuCtxPopCurrent(&cudaProducer.context));
|
|
|
|
if (!eglQueryStreamKHR(g_display, eglStream, EGL_STREAM_STATE_KHR,
|
|
&streamState)) {
|
|
printf("Cuda consumer, eglQueryStreamKHR EGL_STREAM_STATE_KHR failed\n");
|
|
curesult = CUDA_ERROR_UNKNOWN;
|
|
goto done;
|
|
}
|
|
if (streamState != EGL_STREAM_STATE_DISCONNECTED_KHR) {
|
|
if (CUDA_SUCCESS != (curesult = cuda_consumer_deinit(&cudaConsumer))) {
|
|
printf("Consumer Disconnect FAILED.\n");
|
|
goto done;
|
|
}
|
|
}
|
|
printf("Producer and Consumer Disconnected \n");
|
|
|
|
done:
|
|
if (!eglQueryStreamKHR(g_display, eglStream, EGL_STREAM_STATE_KHR,
|
|
&streamState)) {
|
|
printf("Cuda consumer, eglQueryStreamKHR EGL_STREAM_STATE_KHR failed\n");
|
|
curesult = CUDA_ERROR_UNKNOWN;
|
|
}
|
|
if (streamState != EGL_STREAM_STATE_DISCONNECTED_KHR) {
|
|
EGLStreamFini();
|
|
}
|
|
|
|
if (curesult == CUDA_SUCCESS) {
|
|
printf("&&&& EGLStream interop test PASSED\n");
|
|
} else {
|
|
printf("&&&& EGLStream interop test FAILED\n");
|
|
}
|
|
return 0;
|
|
}
|