mirror of
https://github.com/NVIDIA/cuda-samples.git
synced 2024-11-24 18:39:16 +08:00
remove duplicate sample
This commit is contained in:
parent
01789304f0
commit
af0e1af181
|
@ -1,18 +0,0 @@
|
||||||
{
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"name": "Linux",
|
|
||||||
"includePath": [
|
|
||||||
"${workspaceFolder}/**",
|
|
||||||
"${workspaceFolder}/../../Common"
|
|
||||||
],
|
|
||||||
"defines": [],
|
|
||||||
"compilerPath": "/usr/local/cuda/bin/nvcc",
|
|
||||||
"cStandard": "gnu17",
|
|
||||||
"cppStandard": "gnu++14",
|
|
||||||
"intelliSenseMode": "linux-gcc-x64",
|
|
||||||
"configurationProvider": "ms-vscode.makefile-tools"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"version": 4
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
{
|
|
||||||
"recommendations": [
|
|
||||||
"nvidia.nsight-vscode-edition",
|
|
||||||
"ms-vscode.cpptools",
|
|
||||||
"ms-vscode.makefile-tools"
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
{
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"name": "CUDA C++: Launch",
|
|
||||||
"type": "cuda-gdb",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/EGLStream_CUDA_Interop"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
{
|
|
||||||
"version": "2.0.0",
|
|
||||||
"tasks": [
|
|
||||||
{
|
|
||||||
"label": "sample",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "make dbg=1",
|
|
||||||
"problemMatcher": ["$nvcc"],
|
|
||||||
"group": {
|
|
||||||
"kind": "build",
|
|
||||||
"isDefault": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,433 +0,0 @@
|
||||||
################################################################################
|
|
||||||
# Copyright (c) 2019, 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.
|
|
||||||
#
|
|
||||||
################################################################################
|
|
||||||
#
|
|
||||||
# Makefile project only supported on Mac OS X and Linux Platforms)
|
|
||||||
#
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
# Location of the CUDA Toolkit
|
|
||||||
CUDA_PATH ?= /usr/local/cuda
|
|
||||||
|
|
||||||
##############################
|
|
||||||
# start deprecated interface #
|
|
||||||
##############################
|
|
||||||
ifeq ($(x86_64),1)
|
|
||||||
$(info WARNING - x86_64 variable has been deprecated)
|
|
||||||
$(info WARNING - please use TARGET_ARCH=x86_64 instead)
|
|
||||||
TARGET_ARCH ?= x86_64
|
|
||||||
endif
|
|
||||||
ifeq ($(ARMv7),1)
|
|
||||||
$(info WARNING - ARMv7 variable has been deprecated)
|
|
||||||
$(info WARNING - please use TARGET_ARCH=armv7l instead)
|
|
||||||
TARGET_ARCH ?= armv7l
|
|
||||||
endif
|
|
||||||
ifeq ($(aarch64),1)
|
|
||||||
$(info WARNING - aarch64 variable has been deprecated)
|
|
||||||
$(info WARNING - please use TARGET_ARCH=aarch64 instead)
|
|
||||||
TARGET_ARCH ?= aarch64
|
|
||||||
endif
|
|
||||||
ifeq ($(ppc64le),1)
|
|
||||||
$(info WARNING - ppc64le variable has been deprecated)
|
|
||||||
$(info WARNING - please use TARGET_ARCH=ppc64le instead)
|
|
||||||
TARGET_ARCH ?= ppc64le
|
|
||||||
endif
|
|
||||||
ifneq ($(GCC),)
|
|
||||||
$(info WARNING - GCC variable has been deprecated)
|
|
||||||
$(info WARNING - please use HOST_COMPILER=$(GCC) instead)
|
|
||||||
HOST_COMPILER ?= $(GCC)
|
|
||||||
endif
|
|
||||||
ifneq ($(abi),)
|
|
||||||
$(error ERROR - abi variable has been removed)
|
|
||||||
endif
|
|
||||||
############################
|
|
||||||
# end deprecated interface #
|
|
||||||
############################
|
|
||||||
|
|
||||||
# architecture
|
|
||||||
HOST_ARCH := $(shell uname -m)
|
|
||||||
TARGET_ARCH ?= $(HOST_ARCH)
|
|
||||||
ifneq (,$(filter $(TARGET_ARCH),x86_64 aarch64 sbsa ppc64le armv7l))
|
|
||||||
ifneq ($(TARGET_ARCH),$(HOST_ARCH))
|
|
||||||
ifneq (,$(filter $(TARGET_ARCH),x86_64 aarch64 sbsa ppc64le))
|
|
||||||
TARGET_SIZE := 64
|
|
||||||
else ifneq (,$(filter $(TARGET_ARCH),armv7l))
|
|
||||||
TARGET_SIZE := 32
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
TARGET_SIZE := $(shell getconf LONG_BIT)
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
$(error ERROR - unsupported value $(TARGET_ARCH) for TARGET_ARCH!)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# sbsa and aarch64 systems look similar. Need to differentiate them at host level for now.
|
|
||||||
ifeq ($(HOST_ARCH),aarch64)
|
|
||||||
ifeq ($(CUDA_PATH)/targets/sbsa-linux,$(shell ls -1d $(CUDA_PATH)/targets/sbsa-linux 2>/dev/null))
|
|
||||||
HOST_ARCH := sbsa
|
|
||||||
TARGET_ARCH := sbsa
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ($(TARGET_ARCH),$(HOST_ARCH))
|
|
||||||
ifeq (,$(filter $(HOST_ARCH)-$(TARGET_ARCH),aarch64-armv7l x86_64-armv7l x86_64-aarch64 x86_64-sbsa x86_64-ppc64le))
|
|
||||||
$(error ERROR - cross compiling from $(HOST_ARCH) to $(TARGET_ARCH) is not supported!)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# When on native aarch64 system with userspace of 32-bit, change TARGET_ARCH to armv7l
|
|
||||||
ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_SIZE),aarch64-aarch64-32)
|
|
||||||
TARGET_ARCH = armv7l
|
|
||||||
endif
|
|
||||||
|
|
||||||
# operating system
|
|
||||||
HOST_OS := $(shell uname -s 2>/dev/null | tr "[:upper:]" "[:lower:]")
|
|
||||||
TARGET_OS ?= $(HOST_OS)
|
|
||||||
ifeq (,$(filter $(TARGET_OS),linux darwin qnx android))
|
|
||||||
$(error ERROR - unsupported value $(TARGET_OS) for TARGET_OS!)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# host compiler
|
|
||||||
ifeq ($(TARGET_OS),darwin)
|
|
||||||
ifeq ($(shell expr `xcodebuild -version | grep -i xcode | awk '{print $$2}' | cut -d'.' -f1` \>= 5),1)
|
|
||||||
HOST_COMPILER ?= clang++
|
|
||||||
endif
|
|
||||||
else ifneq ($(TARGET_ARCH),$(HOST_ARCH))
|
|
||||||
ifeq ($(HOST_ARCH)-$(TARGET_ARCH),x86_64-armv7l)
|
|
||||||
ifeq ($(TARGET_OS),linux)
|
|
||||||
HOST_COMPILER ?= arm-linux-gnueabihf-g++
|
|
||||||
else ifeq ($(TARGET_OS),qnx)
|
|
||||||
ifeq ($(QNX_HOST),)
|
|
||||||
$(error ERROR - QNX_HOST must be passed to the QNX host toolchain)
|
|
||||||
endif
|
|
||||||
ifeq ($(QNX_TARGET),)
|
|
||||||
$(error ERROR - QNX_TARGET must be passed to the QNX target toolchain)
|
|
||||||
endif
|
|
||||||
export QNX_HOST
|
|
||||||
export QNX_TARGET
|
|
||||||
HOST_COMPILER ?= $(QNX_HOST)/usr/bin/arm-unknown-nto-qnx6.6.0eabi-g++
|
|
||||||
else ifeq ($(TARGET_OS),android)
|
|
||||||
HOST_COMPILER ?= arm-linux-androideabi-g++
|
|
||||||
endif
|
|
||||||
else ifeq ($(TARGET_ARCH),aarch64)
|
|
||||||
ifeq ($(TARGET_OS), linux)
|
|
||||||
HOST_COMPILER ?= aarch64-linux-gnu-g++
|
|
||||||
else ifeq ($(TARGET_OS),qnx)
|
|
||||||
ifeq ($(QNX_HOST),)
|
|
||||||
$(error ERROR - QNX_HOST must be passed to the QNX host toolchain)
|
|
||||||
endif
|
|
||||||
ifeq ($(QNX_TARGET),)
|
|
||||||
$(error ERROR - QNX_TARGET must be passed to the QNX target toolchain)
|
|
||||||
endif
|
|
||||||
export QNX_HOST
|
|
||||||
export QNX_TARGET
|
|
||||||
HOST_COMPILER ?= $(QNX_HOST)/usr/bin/q++
|
|
||||||
else ifeq ($(TARGET_OS), android)
|
|
||||||
HOST_COMPILER ?= aarch64-linux-android-clang++
|
|
||||||
endif
|
|
||||||
else ifeq ($(TARGET_ARCH),sbsa)
|
|
||||||
HOST_COMPILER ?= aarch64-linux-gnu-g++
|
|
||||||
else ifeq ($(TARGET_ARCH),ppc64le)
|
|
||||||
HOST_COMPILER ?= powerpc64le-linux-gnu-g++
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
HOST_COMPILER ?= g++
|
|
||||||
NVCC := $(CUDA_PATH)/bin/nvcc -ccbin $(HOST_COMPILER)
|
|
||||||
|
|
||||||
# internal flags
|
|
||||||
NVCCFLAGS := -m${TARGET_SIZE}
|
|
||||||
CCFLAGS :=
|
|
||||||
LDFLAGS :=
|
|
||||||
|
|
||||||
# build flags
|
|
||||||
ifeq ($(TARGET_OS),darwin)
|
|
||||||
LDFLAGS += -rpath $(CUDA_PATH)/lib
|
|
||||||
CCFLAGS += -arch $(HOST_ARCH)
|
|
||||||
else ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_OS),x86_64-armv7l-linux)
|
|
||||||
LDFLAGS += --dynamic-linker=/lib/ld-linux-armhf.so.3
|
|
||||||
CCFLAGS += -mfloat-abi=hard
|
|
||||||
else ifeq ($(TARGET_OS),android)
|
|
||||||
LDFLAGS += -pie
|
|
||||||
CCFLAGS += -fpie -fpic -fexceptions
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ($(TARGET_ARCH),$(HOST_ARCH))
|
|
||||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-linux)
|
|
||||||
ifneq ($(TARGET_FS),)
|
|
||||||
GCCVERSIONLTEQ46 := $(shell expr `$(HOST_COMPILER) -dumpversion` \<= 4.6)
|
|
||||||
ifeq ($(GCCVERSIONLTEQ46),1)
|
|
||||||
CCFLAGS += --sysroot=$(TARGET_FS)
|
|
||||||
endif
|
|
||||||
LDFLAGS += --sysroot=$(TARGET_FS)
|
|
||||||
LDFLAGS += -rpath-link=$(TARGET_FS)/lib
|
|
||||||
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib
|
|
||||||
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib/arm-linux-gnueabihf
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-linux)
|
|
||||||
ifneq ($(TARGET_FS),)
|
|
||||||
GCCVERSIONLTEQ46 := $(shell expr `$(HOST_COMPILER) -dumpversion` \<= 4.6)
|
|
||||||
ifeq ($(GCCVERSIONLTEQ46),1)
|
|
||||||
CCFLAGS += --sysroot=$(TARGET_FS)
|
|
||||||
endif
|
|
||||||
LDFLAGS += --sysroot=$(TARGET_FS)
|
|
||||||
LDFLAGS += -rpath-link=$(TARGET_FS)/lib -L$(TARGET_FS)/lib
|
|
||||||
LDFLAGS += -rpath-link=$(TARGET_FS)/lib/aarch64-linux-gnu -L$(TARGET_FS)/lib/aarch64-linux-gnu
|
|
||||||
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib -L$(TARGET_FS)/usr/lib
|
|
||||||
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib/aarch64-linux-gnu -L$(TARGET_FS)/usr/lib/aarch64-linux-gnu
|
|
||||||
LDFLAGS += --unresolved-symbols=ignore-in-shared-libs
|
|
||||||
CCFLAGS += -isystem=$(TARGET_FS)/usr/include -I$(TARGET_FS)/usr/include -I$(TARGET_FS)/usr/include/libdrm
|
|
||||||
CCFLAGS += -isystem=$(TARGET_FS)/usr/include/aarch64-linux-gnu -I$(TARGET_FS)/usr/include/aarch64-linux-gnu
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-qnx)
|
|
||||||
NVCCFLAGS += --qpp-config 5.4.0,gcc_ntoaarch64le
|
|
||||||
CCFLAGS += -DWIN_INTERFACE_CUSTOM -I/usr/include/aarch64-qnx-gnu
|
|
||||||
LDFLAGS += -lsocket
|
|
||||||
LDFLAGS += -L/usr/lib/aarch64-qnx-gnu
|
|
||||||
CCFLAGS += "-Wl\,-rpath-link\,/usr/lib/aarch64-qnx-gnu"
|
|
||||||
ifdef TARGET_OVERRIDE
|
|
||||||
LDFLAGS += -lslog2
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ($(TARGET_FS),)
|
|
||||||
LDFLAGS += -L$(TARGET_FS)/usr/lib
|
|
||||||
CCFLAGS += "-Wl\,-rpath-link\,$(TARGET_FS)/usr/lib"
|
|
||||||
LDFLAGS += -L$(TARGET_FS)/usr/libnvidia
|
|
||||||
CCFLAGS += "-Wl\,-rpath-link\,$(TARGET_FS)/usr/libnvidia"
|
|
||||||
CCFLAGS += -I$(TARGET_FS)/../include
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef TARGET_OVERRIDE # cuda toolkit targets override
|
|
||||||
NVCCFLAGS += -target-dir $(TARGET_OVERRIDE)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Install directory of different arch
|
|
||||||
CUDA_INSTALL_TARGET_DIR :=
|
|
||||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-linux)
|
|
||||||
CUDA_INSTALL_TARGET_DIR = targets/armv7-linux-gnueabihf/
|
|
||||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-linux)
|
|
||||||
CUDA_INSTALL_TARGET_DIR = targets/aarch64-linux/
|
|
||||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),sbsa-linux)
|
|
||||||
CUDA_INSTALL_TARGET_DIR = targets/sbsa-linux/
|
|
||||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-android)
|
|
||||||
CUDA_INSTALL_TARGET_DIR = targets/armv7-linux-androideabi/
|
|
||||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-android)
|
|
||||||
CUDA_INSTALL_TARGET_DIR = targets/aarch64-linux-androideabi/
|
|
||||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-qnx)
|
|
||||||
CUDA_INSTALL_TARGET_DIR = targets/ARMv7-linux-QNX/
|
|
||||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-qnx)
|
|
||||||
CUDA_INSTALL_TARGET_DIR = targets/aarch64-qnx/
|
|
||||||
else ifeq ($(TARGET_ARCH),ppc64le)
|
|
||||||
CUDA_INSTALL_TARGET_DIR = targets/ppc64le-linux/
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Debug build flags
|
|
||||||
ifeq ($(dbg),1)
|
|
||||||
NVCCFLAGS += -g -G
|
|
||||||
BUILD_TYPE := debug
|
|
||||||
else
|
|
||||||
BUILD_TYPE := release
|
|
||||||
endif
|
|
||||||
|
|
||||||
ALL_CCFLAGS :=
|
|
||||||
ALL_CCFLAGS += $(NVCCFLAGS)
|
|
||||||
ALL_CCFLAGS += $(EXTRA_NVCCFLAGS)
|
|
||||||
ALL_CCFLAGS += $(addprefix -Xcompiler ,$(CCFLAGS))
|
|
||||||
ALL_CCFLAGS += $(addprefix -Xcompiler ,$(EXTRA_CCFLAGS))
|
|
||||||
|
|
||||||
UBUNTU = $(shell lsb_release -i -s 2>/dev/null | grep -i ubuntu)
|
|
||||||
|
|
||||||
SAMPLE_ENABLED := 1
|
|
||||||
|
|
||||||
# This sample is not supported on Mac OSX
|
|
||||||
ifeq ($(TARGET_OS),darwin)
|
|
||||||
$(info >>> WARNING - EGLStream_CUDA_Interop is not supported on Mac OSX - waiving sample <<<)
|
|
||||||
SAMPLE_ENABLED := 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
# This sample is not supported on ARMv7
|
|
||||||
ifeq ($(TARGET_ARCH),armv7l)
|
|
||||||
$(info >>> WARNING - EGLStream_CUDA_Interop is not supported on ARMv7 - waiving sample <<<)
|
|
||||||
SAMPLE_ENABLED := 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
# This sample is not supported on android
|
|
||||||
ifeq ($(TARGET_OS),android)
|
|
||||||
$(info >>> WARNING - EGLStream_CUDA_Interop is not supported on android - waiving sample <<<)
|
|
||||||
SAMPLE_ENABLED := 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
ALL_LDFLAGS :=
|
|
||||||
ALL_LDFLAGS += $(ALL_CCFLAGS)
|
|
||||||
ALL_LDFLAGS += $(addprefix -Xlinker ,$(LDFLAGS))
|
|
||||||
ALL_LDFLAGS += $(addprefix -Xlinker ,$(EXTRA_LDFLAGS))
|
|
||||||
|
|
||||||
# Common includes and paths for CUDA
|
|
||||||
INCLUDES := -I../../Common
|
|
||||||
LIBRARIES :=
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
# Makefile include to help find EGL Libraries
|
|
||||||
include ./findegl.mk
|
|
||||||
|
|
||||||
# EGL specific libraries
|
|
||||||
ifneq ($(TARGET_OS),darwin)
|
|
||||||
LIBRARIES += -lEGL
|
|
||||||
endif
|
|
||||||
|
|
||||||
#Detect if installed version of GCC supports required C++11
|
|
||||||
ifeq ($(TARGET_OS),linux)
|
|
||||||
empty :=
|
|
||||||
space := $(empty) $(empty)
|
|
||||||
GCCVERSIONSTRING := $(shell expr `$(HOST_COMPILER) -dumpversion`)
|
|
||||||
#Create version number without "."
|
|
||||||
GCCVERSION := $(shell expr `echo $(GCCVERSIONSTRING)` | cut -f1 -d.)
|
|
||||||
GCCVERSION += $(shell expr `echo $(GCCVERSIONSTRING)` | cut -f2 -d.)
|
|
||||||
GCCVERSION += $(shell expr `echo $(GCCVERSIONSTRING)` | cut -f3 -d.)
|
|
||||||
# Make sure the version number has at least 3 decimals
|
|
||||||
GCCVERSION += 00
|
|
||||||
# Remove spaces from the version number
|
|
||||||
GCCVERSION := $(subst $(space),$(empty),$(GCCVERSION))
|
|
||||||
#$(warning $(GCCVERSION))
|
|
||||||
|
|
||||||
IS_MIN_VERSION := $(shell expr `echo $(GCCVERSION)` \>= 51000)
|
|
||||||
|
|
||||||
ifeq ($(IS_MIN_VERSION), 1)
|
|
||||||
$(info >>> GCC Version is greater or equal to 5.1.0 <<<)
|
|
||||||
else
|
|
||||||
$(info >>> Waiving build. Minimum GCC version required is 5.1.0<<<)
|
|
||||||
SAMPLE_ENABLED := 0
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(TARGET_OS),darwin)
|
|
||||||
ALL_LDFLAGS += -Xcompiler -F/Library/Frameworks -Xlinker -framework -Xlinker CUDA
|
|
||||||
else
|
|
||||||
ifeq ($(TARGET_ARCH),x86_64)
|
|
||||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/lib64/stubs
|
|
||||||
CUDA_SEARCH_PATH += $(CUDA_PATH)/targets/x86_64-linux/lib/stubs
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-linux)
|
|
||||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/armv7-linux-gnueabihf/lib/stubs
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-linux)
|
|
||||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/aarch64-linux/lib/stubs
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),sbsa-linux)
|
|
||||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/sbsa-linux/lib/stubs
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-android)
|
|
||||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/armv7-linux-androideabi/lib/stubs
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-android)
|
|
||||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/aarch64-linux-androideabi/lib/stubs
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-qnx)
|
|
||||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/ARMv7-linux-QNX/lib/stubs
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-qnx)
|
|
||||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/aarch64-qnx/lib/stubs
|
|
||||||
ifdef TARGET_OVERRIDE
|
|
||||||
CUDA_SEARCH_PATH := $(CUDA_PATH)/targets/$(TARGET_OVERRIDE)/lib/stubs
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH),ppc64le)
|
|
||||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/ppc64le-linux/lib/stubs
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(HOST_ARCH),ppc64le)
|
|
||||||
CUDA_SEARCH_PATH += $(CUDA_PATH)/lib64/stubs
|
|
||||||
endif
|
|
||||||
|
|
||||||
CUDALIB ?= $(shell find -L $(CUDA_SEARCH_PATH) -maxdepth 1 -name libcuda.so 2> /dev/null)
|
|
||||||
ifeq ("$(CUDALIB)","")
|
|
||||||
$(info >>> WARNING - libcuda.so not found, CUDA Driver is not installed. Please re-install the driver. <<<)
|
|
||||||
SAMPLE_ENABLED := 0
|
|
||||||
else
|
|
||||||
CUDALIB := $(shell echo $(CUDALIB) | sed "s/ .*//" | sed "s/\/libcuda.so//" )
|
|
||||||
LIBRARIES += -L$(CUDALIB) -lcuda
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ALL_CCFLAGS += --threads 0 --std=c++11
|
|
||||||
|
|
||||||
ifeq ($(SAMPLE_ENABLED),0)
|
|
||||||
EXEC ?= @echo "[@]"
|
|
||||||
endif
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
# Target rules
|
|
||||||
all: build
|
|
||||||
|
|
||||||
build: EGLStream_CUDA_Interop
|
|
||||||
|
|
||||||
check.deps:
|
|
||||||
ifeq ($(SAMPLE_ENABLED),0)
|
|
||||||
@echo "Sample will be waived due to the above missing dependencies"
|
|
||||||
else
|
|
||||||
@echo "Sample is ready - all dependencies have been met"
|
|
||||||
endif
|
|
||||||
|
|
||||||
cuda_consumer.o:cuda_consumer.cpp
|
|
||||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
|
||||||
|
|
||||||
cuda_producer.o:cuda_producer.cpp
|
|
||||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
|
||||||
|
|
||||||
eglstrm_common.o:eglstrm_common.cpp
|
|
||||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
|
||||||
|
|
||||||
main.o:main.cpp
|
|
||||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
|
||||||
|
|
||||||
EGLStream_CUDA_Interop: cuda_consumer.o cuda_producer.o eglstrm_common.o main.o
|
|
||||||
$(EXEC) $(NVCC) $(ALL_LDFLAGS) $(GENCODE_FLAGS) -o $@ $+ $(LIBRARIES)
|
|
||||||
$(EXEC) mkdir -p ../../bin/$(TARGET_ARCH)/$(TARGET_OS)/$(BUILD_TYPE)
|
|
||||||
$(EXEC) cp $@ ../../bin/$(TARGET_ARCH)/$(TARGET_OS)/$(BUILD_TYPE)
|
|
||||||
|
|
||||||
run: build
|
|
||||||
$(EXEC) ./EGLStream_CUDA_Interop
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f EGLStream_CUDA_Interop cuda_consumer.o cuda_producer.o eglstrm_common.o main.o
|
|
||||||
rm -rf ../../bin/$(TARGET_ARCH)/$(TARGET_OS)/$(BUILD_TYPE)/EGLStream_CUDA_Interop
|
|
||||||
|
|
||||||
clobber: clean
|
|
|
@ -1,77 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE entry SYSTEM "SamplesInfo.dtd">
|
|
||||||
<entry>
|
|
||||||
<name>EGLStream_CUDA_Interop</name>
|
|
||||||
<cuda_api_list>
|
|
||||||
<driver>cuDeviceGet</driver>
|
|
||||||
<driver>cuDeviceGetAttribute</driver>
|
|
||||||
<driver>cuDeviceComputeCapability</driver>
|
|
||||||
<driver>cuDeviceGetCount</driver>
|
|
||||||
<driver>cuDeviceGetName</driver>
|
|
||||||
<driver>cuGraphicsResourceGetMappedEglFrame</driver>
|
|
||||||
<driver>cuEGLStreamConsumerAcquireFrame</driver>
|
|
||||||
<driver>cuEGLStreamConsumerReleaseFrame</driver>
|
|
||||||
<driver>cuEGLStreamProducerPresentFrame</driver>
|
|
||||||
<driver>cuCtxCreate</driver>
|
|
||||||
<driver>cuMemAlloc</driver>
|
|
||||||
<driver>cuMemFree</driver>
|
|
||||||
<driver>cuMemcpy3D</driver>
|
|
||||||
<driver>cuStreamCreate</driver>
|
|
||||||
<driver>cuCtxPushCurrent</driver>
|
|
||||||
<driver>cuCtxPopCurrent</driver>
|
|
||||||
<driver>cuCtxDestroy</driver>
|
|
||||||
</cuda_api_list>
|
|
||||||
<description><![CDATA[Demonstrates data exchange between CUDA and EGL Streams.]]></description>
|
|
||||||
<devicecompilation>whole</devicecompilation>
|
|
||||||
<includepaths>
|
|
||||||
<path>./</path>
|
|
||||||
<path>../</path>
|
|
||||||
<path>../../Common</path>
|
|
||||||
</includepaths>
|
|
||||||
<keyconcepts>
|
|
||||||
<concept level="basic">EGLStreams Interop</concept>
|
|
||||||
</keyconcepts>
|
|
||||||
<keywords>
|
|
||||||
<keyword>EGL Streams</keyword>
|
|
||||||
</keywords>
|
|
||||||
<libraries>
|
|
||||||
<library os="linux">cuda</library>
|
|
||||||
<library framework="true" os="macosx">CUDA</library>
|
|
||||||
</libraries>
|
|
||||||
<librarypaths>
|
|
||||||
</librarypaths>
|
|
||||||
<nsight_eclipse>true</nsight_eclipse>
|
|
||||||
<primary_file>main.cpp</primary_file>
|
|
||||||
<required_dependencies>
|
|
||||||
<dependency>EGL</dependency>
|
|
||||||
</required_dependencies>
|
|
||||||
<scopes>
|
|
||||||
<scope>1:CUDA Basic Topics</scope>
|
|
||||||
<scope>2:Graphics Interop</scope>
|
|
||||||
</scopes>
|
|
||||||
<sm-arch>sm35</sm-arch>
|
|
||||||
<sm-arch>sm37</sm-arch>
|
|
||||||
<sm-arch>sm50</sm-arch>
|
|
||||||
<sm-arch>sm52</sm-arch>
|
|
||||||
<sm-arch>sm60</sm-arch>
|
|
||||||
<sm-arch>sm61</sm-arch>
|
|
||||||
<sm-arch>sm70</sm-arch>
|
|
||||||
<sm-arch>sm72</sm-arch>
|
|
||||||
<sm-arch>sm75</sm-arch>
|
|
||||||
<sm-arch>sm80</sm-arch>
|
|
||||||
<sm-arch>sm86</sm-arch>
|
|
||||||
<supported_envs>
|
|
||||||
<env>
|
|
||||||
<arch>x86_64</arch>
|
|
||||||
<platform>linux</platform>
|
|
||||||
</env>
|
|
||||||
<env>
|
|
||||||
<arch>aarch64</arch>
|
|
||||||
</env>
|
|
||||||
</supported_envs>
|
|
||||||
<supported_sm_architectures>
|
|
||||||
<include>all</include>
|
|
||||||
</supported_sm_architectures>
|
|
||||||
<title>EGLStream CUDA Interop</title>
|
|
||||||
<type>exe</type>
|
|
||||||
</entry>
|
|
|
@ -1,64 +0,0 @@
|
||||||
# EGLStream_CUDA_Interop - EGLStream CUDA Interop
|
|
||||||
|
|
||||||
## Description
|
|
||||||
|
|
||||||
Demonstrates data exchange between CUDA and EGL Streams.
|
|
||||||
|
|
||||||
## Key Concepts
|
|
||||||
|
|
||||||
EGLStreams Interop
|
|
||||||
|
|
||||||
## Supported SM Architectures
|
|
||||||
|
|
||||||
[SM 3.5 ](https://developer.nvidia.com/cuda-gpus) [SM 3.7 ](https://developer.nvidia.com/cuda-gpus) [SM 5.0 ](https://developer.nvidia.com/cuda-gpus) [SM 5.2 ](https://developer.nvidia.com/cuda-gpus) [SM 6.0 ](https://developer.nvidia.com/cuda-gpus) [SM 6.1 ](https://developer.nvidia.com/cuda-gpus) [SM 7.0 ](https://developer.nvidia.com/cuda-gpus) [SM 7.2 ](https://developer.nvidia.com/cuda-gpus) [SM 7.5 ](https://developer.nvidia.com/cuda-gpus) [SM 8.0 ](https://developer.nvidia.com/cuda-gpus) [SM 8.6 ](https://developer.nvidia.com/cuda-gpus)
|
|
||||||
|
|
||||||
## Supported OSes
|
|
||||||
|
|
||||||
Linux
|
|
||||||
|
|
||||||
## Supported CPU Architecture
|
|
||||||
|
|
||||||
x86_64, aarch64
|
|
||||||
|
|
||||||
## CUDA APIs involved
|
|
||||||
|
|
||||||
### [CUDA Driver API](http://docs.nvidia.com/cuda/cuda-driver-api/index.html)
|
|
||||||
cuDeviceGet, cuDeviceGetAttribute, cuDeviceComputeCapability, cuDeviceGetCount, cuDeviceGetName, cuGraphicsResourceGetMappedEglFrame, cuEGLStreamConsumerAcquireFrame, cuEGLStreamConsumerReleaseFrame, cuEGLStreamProducerPresentFrame, cuCtxCreate, cuMemAlloc, cuMemFree, cuMemcpy3D, cuStreamCreate, cuCtxPushCurrent, cuCtxPopCurrent, cuCtxDestroy
|
|
||||||
|
|
||||||
## Dependencies needed to build/run
|
|
||||||
[EGL](../../README.md#egl)
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
Download and install the [CUDA Toolkit 11.5](https://developer.nvidia.com/cuda-downloads) for your corresponding platform.
|
|
||||||
Make sure the dependencies mentioned in [Dependencies]() section above are installed.
|
|
||||||
|
|
||||||
## Build and Run
|
|
||||||
|
|
||||||
### Linux
|
|
||||||
The Linux samples are built using makefiles. To use the makefiles, change the current directory to the sample directory you wish to build, and run make:
|
|
||||||
```
|
|
||||||
$ cd <sample_dir>
|
|
||||||
$ make
|
|
||||||
```
|
|
||||||
The samples makefiles can take advantage of certain options:
|
|
||||||
* **TARGET_ARCH=<arch>** - cross-compile targeting a specific architecture. Allowed architectures are x86_64, aarch64.
|
|
||||||
By default, TARGET_ARCH is set to HOST_ARCH. On a x86_64 machine, not setting TARGET_ARCH is the equivalent of setting TARGET_ARCH=x86_64.<br/>
|
|
||||||
`$ make TARGET_ARCH=x86_64` <br/> `$ make TARGET_ARCH=aarch64` <br/>
|
|
||||||
See [here](http://docs.nvidia.com/cuda/cuda-samples/index.html#cross-samples) for more details.
|
|
||||||
* **dbg=1** - build with debug symbols
|
|
||||||
```
|
|
||||||
$ make dbg=1
|
|
||||||
```
|
|
||||||
* **SMS="A B ..."** - override the SM architectures for which the sample will be built, where `"A B ..."` is a space-delimited list of SM architectures. For example, to generate SASS for SM 50 and SM 60, use `SMS="50 60"`.
|
|
||||||
```
|
|
||||||
$ make SMS="50 60"
|
|
||||||
```
|
|
||||||
|
|
||||||
* **HOST_COMPILER=<host_compiler>** - override the default g++ host compiler. See the [Linux Installation Guide](http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#system-requirements) for a list of supported host compilers.
|
|
||||||
```
|
|
||||||
$ make HOST_COMPILER=g++
|
|
||||||
```
|
|
||||||
|
|
||||||
## References (for more details)
|
|
||||||
|
|
|
@ -1,318 +0,0 @@
|
||||||
/* Copyright (c) 2021, 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 CUDA consumer rendering sample app
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "cuda_consumer.h"
|
|
||||||
#include <helper_cuda_drvapi.h>
|
|
||||||
#include "eglstrm_common.h"
|
|
||||||
|
|
||||||
#if defined(EXTENSION_LIST)
|
|
||||||
EXTENSION_LIST(EXTLST_EXTERN)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int checkbuf(FILE *fp1, FILE *fp2);
|
|
||||||
|
|
||||||
CUresult cudaConsumerTest(test_cuda_consumer_s *data, char *fileName) {
|
|
||||||
CUresult cuStatus = CUDA_SUCCESS;
|
|
||||||
CUarray cudaArr = NULL;
|
|
||||||
CUeglFrame cudaEgl;
|
|
||||||
CUgraphicsResource cudaResource;
|
|
||||||
unsigned int i;
|
|
||||||
int check_result;
|
|
||||||
FILE *pInFile1 = NULL, *pInFile2 = NULL, *file_p = NULL;
|
|
||||||
EGLint streamState = 0;
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
printf("%s: Bad parameter\n", __func__);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!eglQueryStreamKHR(g_display, eglStream, EGL_STREAM_STATE_KHR,
|
|
||||||
&streamState)) {
|
|
||||||
printf("Cuda consumer, eglQueryStreamKHR EGL_STREAM_STATE_KHR failed\n");
|
|
||||||
}
|
|
||||||
if (streamState == EGL_STREAM_STATE_DISCONNECTED_KHR) {
|
|
||||||
printf("CUDA Consumer: - EGL_STREAM_STATE_DISCONNECTED_KHR received\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (streamState == EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR) {
|
|
||||||
cuStatus = cuEGLStreamConsumerAcquireFrame(&(data->cudaConn), &cudaResource,
|
|
||||||
NULL, 16000);
|
|
||||||
|
|
||||||
if (cuStatus == CUDA_SUCCESS) {
|
|
||||||
CUdeviceptr pDevPtr = 0;
|
|
||||||
int bufferSize;
|
|
||||||
unsigned char *pCudaCopyMem = NULL;
|
|
||||||
unsigned int copyWidthInBytes = 0, copyHeight = 0;
|
|
||||||
|
|
||||||
file_p = fopen(fileName, "wb+");
|
|
||||||
if (!file_p) {
|
|
||||||
printf("WriteFrame: file open failed %s\n", fileName);
|
|
||||||
cuStatus = CUDA_ERROR_UNKNOWN;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
cuStatus =
|
|
||||||
cuGraphicsResourceGetMappedEglFrame(&cudaEgl, cudaResource, 0, 0);
|
|
||||||
if (cuStatus != CUDA_SUCCESS) {
|
|
||||||
printf("Cuda get resource failed with %d\n", cuStatus);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
cuStatus = cuCtxSynchronize();
|
|
||||||
if (cuStatus != CUDA_SUCCESS) {
|
|
||||||
printf("cuCtxSynchronize failed \n");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
if (!(cudaEgl.planeCount >= 1 && cudaEgl.planeCount <= 3)) {
|
|
||||||
printf("Plane count is invalid\nExiting\n");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < cudaEgl.planeCount; i++) {
|
|
||||||
if (cudaEgl.frameType == CU_EGL_FRAME_TYPE_PITCH) {
|
|
||||||
pDevPtr = (CUdeviceptr)cudaEgl.frame.pPitch[i];
|
|
||||||
if (cudaEgl.planeCount == 1) {
|
|
||||||
bufferSize = cudaEgl.pitch * cudaEgl.height;
|
|
||||||
copyWidthInBytes = cudaEgl.pitch;
|
|
||||||
copyHeight = data->height;
|
|
||||||
} else if (i == 1 && cudaEgl.planeCount == 2) { // YUV 420
|
|
||||||
// semi-planar
|
|
||||||
bufferSize = cudaEgl.pitch * cudaEgl.height / 2;
|
|
||||||
copyWidthInBytes = cudaEgl.pitch;
|
|
||||||
copyHeight = data->height / 2;
|
|
||||||
} else {
|
|
||||||
bufferSize = data->width * data->height;
|
|
||||||
copyWidthInBytes = data->width;
|
|
||||||
copyHeight = data->height;
|
|
||||||
if (i > 0) {
|
|
||||||
bufferSize >>= 2;
|
|
||||||
copyWidthInBytes >>= 1;
|
|
||||||
copyHeight >>= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cudaArr = cudaEgl.frame.pArray[i];
|
|
||||||
if (cudaEgl.planeCount == 1) {
|
|
||||||
bufferSize = data->width * data->height * 4;
|
|
||||||
copyWidthInBytes = data->width * 4;
|
|
||||||
copyHeight = data->height;
|
|
||||||
} else if (i == 1 && cudaEgl.planeCount == 2) { // YUV 420
|
|
||||||
// semi-planar
|
|
||||||
bufferSize = data->width * data->height / 2;
|
|
||||||
copyWidthInBytes = data->width;
|
|
||||||
copyHeight = data->height / 2;
|
|
||||||
} else {
|
|
||||||
bufferSize = data->width * data->height;
|
|
||||||
copyWidthInBytes = data->width;
|
|
||||||
copyHeight = data->height;
|
|
||||||
if (i > 0) {
|
|
||||||
bufferSize >>= 2;
|
|
||||||
copyWidthInBytes >>= 1;
|
|
||||||
copyHeight >>= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i == 0) {
|
|
||||||
pCudaCopyMem = (unsigned char *)malloc(bufferSize);
|
|
||||||
if (pCudaCopyMem == NULL) {
|
|
||||||
printf("pCudaCopyMem malloc failed\n");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
memset(pCudaCopyMem, 0, bufferSize);
|
|
||||||
if (data->pitchLinearOutput) {
|
|
||||||
cuStatus = cuMemcpyDtoH(pCudaCopyMem, pDevPtr, bufferSize);
|
|
||||||
if (cuStatus != CUDA_SUCCESS) {
|
|
||||||
printf(
|
|
||||||
"cuda_consumer: pitch linear Memcpy failed, bufferSize =%d\n",
|
|
||||||
bufferSize);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
cuStatus = cuCtxSynchronize();
|
|
||||||
if (cuStatus != CUDA_SUCCESS) {
|
|
||||||
printf("cuda_consumer: cuCtxSynchronize failed after memcpy \n");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
CUDA_MEMCPY3D cpdesc;
|
|
||||||
memset(&cpdesc, 0, sizeof(cpdesc));
|
|
||||||
cpdesc.srcXInBytes = cpdesc.srcY = cpdesc.srcZ = cpdesc.srcLOD = 0;
|
|
||||||
cpdesc.srcMemoryType = CU_MEMORYTYPE_ARRAY;
|
|
||||||
cpdesc.srcArray = cudaArr;
|
|
||||||
cpdesc.dstXInBytes = cpdesc.dstY = cpdesc.dstZ = cpdesc.dstLOD = 0;
|
|
||||||
cpdesc.dstMemoryType = CU_MEMORYTYPE_HOST;
|
|
||||||
cpdesc.dstHost = (void *)pCudaCopyMem;
|
|
||||||
cpdesc.WidthInBytes = copyWidthInBytes; // data->width * 4;
|
|
||||||
cpdesc.Height = copyHeight; // data->height;
|
|
||||||
cpdesc.Depth = 1;
|
|
||||||
|
|
||||||
cuStatus = cuMemcpy3D(&cpdesc);
|
|
||||||
if (cuStatus != CUDA_SUCCESS) {
|
|
||||||
printf(
|
|
||||||
"Cuda consumer: cuMemCpy3D failed, copyWidthInBytes=%d, "
|
|
||||||
"copyHight=%d\n",
|
|
||||||
copyWidthInBytes, copyHeight);
|
|
||||||
}
|
|
||||||
cuStatus = cuCtxSynchronize();
|
|
||||||
if (cuStatus != CUDA_SUCCESS) {
|
|
||||||
printf("cuCtxSynchronize failed after memcpy \n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (cuStatus == CUDA_SUCCESS) {
|
|
||||||
if (fwrite(pCudaCopyMem, bufferSize, 1, file_p) != 1) {
|
|
||||||
printf("Cuda consumer: output file write failed\n");
|
|
||||||
cuStatus = CUDA_ERROR_UNKNOWN;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pInFile1 = fopen(data->fileName1, "rb");
|
|
||||||
if (!pInFile1) {
|
|
||||||
printf("Failed to open file :%s\n", data->fileName1);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
pInFile2 = fopen(data->fileName2, "rb");
|
|
||||||
if (!pInFile2) {
|
|
||||||
printf("Failed to open file :%s\n", data->fileName2);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
rewind(file_p);
|
|
||||||
check_result = checkbuf(file_p, pInFile1);
|
|
||||||
if (check_result == -1) {
|
|
||||||
rewind(file_p);
|
|
||||||
check_result = checkbuf(file_p, pInFile2);
|
|
||||||
if (check_result == -1) {
|
|
||||||
printf("Frame received does not match any valid image: FAILED\n");
|
|
||||||
} else {
|
|
||||||
printf("Frame check Passed\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
printf("Frame check Passed\n");
|
|
||||||
}
|
|
||||||
if (pCudaCopyMem) {
|
|
||||||
free(pCudaCopyMem);
|
|
||||||
pCudaCopyMem = NULL;
|
|
||||||
}
|
|
||||||
cuStatus =
|
|
||||||
cuEGLStreamConsumerReleaseFrame(&data->cudaConn, cudaResource, NULL);
|
|
||||||
if (cuStatus != CUDA_SUCCESS) {
|
|
||||||
printf("cuEGLStreamConsumerReleaseFrame failed with cuStatus = %d\n",
|
|
||||||
cuStatus);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
printf("cuda AcquireFrame FAILED with cuStatus=%d\n", cuStatus);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
if (file_p) {
|
|
||||||
fclose(file_p);
|
|
||||||
file_p = NULL;
|
|
||||||
}
|
|
||||||
if (pInFile1) {
|
|
||||||
fclose(pInFile1);
|
|
||||||
pInFile1 = NULL;
|
|
||||||
}
|
|
||||||
if (pInFile1) {
|
|
||||||
fclose(pInFile2);
|
|
||||||
pInFile2 = NULL;
|
|
||||||
}
|
|
||||||
return cuStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
int checkbuf(FILE *fp1, FILE *fp2) {
|
|
||||||
int match = 0;
|
|
||||||
int ch1, ch2;
|
|
||||||
if (fp1 == NULL) {
|
|
||||||
printf("Invalid file pointer for first file\n");
|
|
||||||
return -1;
|
|
||||||
} else if (fp2 == NULL) {
|
|
||||||
printf("Invalid file pointer for second file\n");
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
ch1 = getc(fp1);
|
|
||||||
ch2 = getc(fp2);
|
|
||||||
while ((ch1 != EOF) && (ch2 != EOF) && (ch1 == ch2)) {
|
|
||||||
ch1 = getc(fp1);
|
|
||||||
ch2 = getc(fp2);
|
|
||||||
}
|
|
||||||
if (ch1 == ch2) {
|
|
||||||
match = 1;
|
|
||||||
} else if (ch1 != ch2) {
|
|
||||||
match = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return match;
|
|
||||||
}
|
|
||||||
|
|
||||||
CUresult cudaDeviceCreateConsumer(test_cuda_consumer_s *cudaConsumer,
|
|
||||||
CUdevice device) {
|
|
||||||
CUresult status = CUDA_SUCCESS;
|
|
||||||
if (CUDA_SUCCESS != (status = cuInit(0))) {
|
|
||||||
printf("Failed to initialize CUDA\n");
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
int major = 0, minor = 0;
|
|
||||||
char deviceName[256];
|
|
||||||
checkCudaErrors(cuDeviceGetAttribute(
|
|
||||||
&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, device));
|
|
||||||
checkCudaErrors(cuDeviceGetAttribute(
|
|
||||||
&minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, device));
|
|
||||||
checkCudaErrors(cuDeviceGetName(deviceName, 256, device));
|
|
||||||
printf(
|
|
||||||
"CUDA Consumer on GPU Device %d: \"%s\" with compute capability "
|
|
||||||
"%d.%d\n\n",
|
|
||||||
device, deviceName, major, minor);
|
|
||||||
|
|
||||||
if (CUDA_SUCCESS !=
|
|
||||||
(status = cuCtxCreate(&cudaConsumer->context, 0, device))) {
|
|
||||||
printf("failed to create CUDA context\n");
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
checkCudaErrors(cuCtxPopCurrent(&cudaConsumer->context));
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cuda_consumer_init(test_cuda_consumer_s *cudaConsumer, TestArgs *args) {
|
|
||||||
cudaConsumer->pitchLinearOutput = args->pitchLinearOutput;
|
|
||||||
cudaConsumer->width = args->inputWidth;
|
|
||||||
cudaConsumer->height = args->inputHeight;
|
|
||||||
cudaConsumer->fileName1 = args->infile1;
|
|
||||||
cudaConsumer->fileName2 = args->infile2;
|
|
||||||
|
|
||||||
cudaConsumer->outFile1 = "cuda_out1.yuv";
|
|
||||||
cudaConsumer->outFile2 = "cuda_out2.yuv";
|
|
||||||
}
|
|
||||||
|
|
||||||
CUresult cuda_consumer_deinit(test_cuda_consumer_s *cudaConsumer) {
|
|
||||||
return cuEGLStreamConsumerDisconnect(&cudaConsumer->cudaConn);
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
/* Copyright (c) 2021, 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: CUDA consumer header file
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef _CUDA_CONSUMER_H_
|
|
||||||
#define _CUDA_CONSUMER_H_
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "cudaEGL.h"
|
|
||||||
#include "eglstrm_common.h"
|
|
||||||
|
|
||||||
extern EGLStreamKHR eglStream;
|
|
||||||
extern EGLDisplay g_display;
|
|
||||||
|
|
||||||
typedef struct _test_cuda_consumer_s {
|
|
||||||
CUcontext context;
|
|
||||||
CUeglStreamConnection cudaConn;
|
|
||||||
bool pitchLinearOutput;
|
|
||||||
unsigned int width;
|
|
||||||
unsigned int height;
|
|
||||||
char *fileName1;
|
|
||||||
char *fileName2;
|
|
||||||
char *outFile1;
|
|
||||||
char *outFile2;
|
|
||||||
unsigned int frameCount;
|
|
||||||
} test_cuda_consumer_s;
|
|
||||||
|
|
||||||
void cuda_consumer_init(test_cuda_consumer_s *cudaConsumer, TestArgs *args);
|
|
||||||
CUresult cuda_consumer_deinit(test_cuda_consumer_s *cudaConsumer);
|
|
||||||
CUresult cudaConsumerTest(test_cuda_consumer_s *data, char *outFile);
|
|
||||||
CUresult cudaDeviceCreateConsumer(test_cuda_consumer_s *cudaConsumer,
|
|
||||||
CUdevice device);
|
|
||||||
#endif
|
|
Binary file not shown.
Binary file not shown.
|
@ -1,406 +0,0 @@
|
||||||
/* Copyright (c) 2021, 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 cuda EGL stream producer app
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "cuda_producer.h"
|
|
||||||
#include <helper_cuda_drvapi.h>
|
|
||||||
#include "cudaEGL.h"
|
|
||||||
#include "eglstrm_common.h"
|
|
||||||
|
|
||||||
#if defined(EXTENSION_LIST)
|
|
||||||
EXTENSION_LIST(EXTLST_EXTERN)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static CUresult cudaProducerReadYUVFrame(FILE *file, unsigned int frameNum,
|
|
||||||
unsigned int width,
|
|
||||||
unsigned int height,
|
|
||||||
unsigned char *pBuff) {
|
|
||||||
int bOrderUV = 0;
|
|
||||||
unsigned char *pYBuff, *pUBuff, *pVBuff, *pChroma;
|
|
||||||
unsigned int frameSize = (width * height * 3) / 2;
|
|
||||||
CUresult ret = CUDA_SUCCESS;
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
if (!pBuff || !file) return CUDA_ERROR_FILE_NOT_FOUND;
|
|
||||||
|
|
||||||
pYBuff = pBuff;
|
|
||||||
|
|
||||||
// YVU order in the buffer
|
|
||||||
pVBuff = pYBuff + width * height;
|
|
||||||
pUBuff = pVBuff + width * height / 4;
|
|
||||||
|
|
||||||
if (fseek(file, frameNum * frameSize, SEEK_SET)) {
|
|
||||||
printf("ReadYUVFrame: Error seeking file: %p\n", file);
|
|
||||||
ret = CUDA_ERROR_NOT_PERMITTED;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
// read Y U V separately
|
|
||||||
for (i = 0; i < height; i++) {
|
|
||||||
if (fread(pYBuff, width, 1, file) != 1) {
|
|
||||||
printf("ReadYUVFrame: Error reading file: %p\n", file);
|
|
||||||
ret = CUDA_ERROR_NOT_PERMITTED;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
pYBuff += width;
|
|
||||||
}
|
|
||||||
|
|
||||||
pChroma = bOrderUV ? pUBuff : pVBuff;
|
|
||||||
for (i = 0; i < height / 2; i++) {
|
|
||||||
if (fread(pChroma, width / 2, 1, file) != 1) {
|
|
||||||
printf("ReadYUVFrame: Error reading file: %p\n", file);
|
|
||||||
ret = CUDA_ERROR_NOT_PERMITTED;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
pChroma += width / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
pChroma = bOrderUV ? pVBuff : pUBuff;
|
|
||||||
for (i = 0; i < height / 2; i++) {
|
|
||||||
if (fread(pChroma, width / 2, 1, file) != 1) {
|
|
||||||
printf("ReadYUVFrame: Error reading file: %p\n", file);
|
|
||||||
ret = CUDA_ERROR_NOT_PERMITTED;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
pChroma += width / 2;
|
|
||||||
}
|
|
||||||
done:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static CUresult cudaProducerReadARGBFrame(FILE *file, unsigned int frameNum,
|
|
||||||
unsigned int width,
|
|
||||||
unsigned int height,
|
|
||||||
unsigned char *pBuff) {
|
|
||||||
unsigned int frameSize = width * height * 4;
|
|
||||||
CUresult ret = CUDA_SUCCESS;
|
|
||||||
|
|
||||||
if (!pBuff || !file) return CUDA_ERROR_FILE_NOT_FOUND;
|
|
||||||
|
|
||||||
if (fseek(file, frameNum * frameSize, SEEK_SET)) {
|
|
||||||
printf("ReadYUVFrame: Error seeking file: %p\n", file);
|
|
||||||
ret = CUDA_ERROR_NOT_PERMITTED;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
// read ARGB data
|
|
||||||
if (fread(pBuff, frameSize, 1, file) != 1) {
|
|
||||||
if (feof(file))
|
|
||||||
printf("ReadARGBFrame: file read to the end\n");
|
|
||||||
else
|
|
||||||
printf("ReadARGBFrame: Error reading file: %p\n", file);
|
|
||||||
ret = CUDA_ERROR_NOT_PERMITTED;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
done:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
CUresult cudaProducerTest(test_cuda_producer_s *cudaProducer, char *file) {
|
|
||||||
int framenum = 0;
|
|
||||||
CUarray cudaArr[3] = {0};
|
|
||||||
CUdeviceptr cudaPtr[3] = {0, 0, 0};
|
|
||||||
unsigned int bufferSize;
|
|
||||||
CUresult cuStatus = CUDA_SUCCESS;
|
|
||||||
unsigned int i, surfNum, uvOffset[3] = {0};
|
|
||||||
unsigned int copyWidthInBytes[3] = {0, 0, 0}, copyHeight[3] = {0, 0, 0};
|
|
||||||
CUeglColorFormat eglColorFormat;
|
|
||||||
FILE *file_p;
|
|
||||||
CUeglFrame cudaEgl;
|
|
||||||
CUcontext oldContext;
|
|
||||||
|
|
||||||
file_p = fopen(file, "rb");
|
|
||||||
if (!file_p) {
|
|
||||||
printf("CudaProducer: Error opening file: %s\n", file);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cudaProducer->pitchLinearOutput) {
|
|
||||||
if (cudaProducer->isARGB) {
|
|
||||||
cudaPtr[0] = cudaProducer->cudaPtrARGB[0];
|
|
||||||
} else { // YUV case
|
|
||||||
for (i = 0; i < 3; i++) {
|
|
||||||
if (i == 0) {
|
|
||||||
bufferSize = cudaProducer->width * cudaProducer->height;
|
|
||||||
} else {
|
|
||||||
bufferSize = cudaProducer->width * cudaProducer->height / 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
cudaPtr[i] = cudaProducer->cudaPtrYUV[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (cudaProducer->isARGB) {
|
|
||||||
cudaArr[0] = cudaProducer->cudaArrARGB[0];
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < 3; i++) {
|
|
||||||
cudaArr[i] = cudaProducer->cudaArrYUV[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
uvOffset[0] = 0;
|
|
||||||
if (cudaProducer->isARGB) {
|
|
||||||
if (CUDA_SUCCESS !=
|
|
||||||
cudaProducerReadARGBFrame(file_p, framenum, cudaProducer->width,
|
|
||||||
cudaProducer->height, cudaProducer->pBuff)) {
|
|
||||||
printf("cuda producer, read ARGB frame failed\n");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
copyWidthInBytes[0] = cudaProducer->width * 4;
|
|
||||||
copyHeight[0] = cudaProducer->height;
|
|
||||||
surfNum = 1;
|
|
||||||
eglColorFormat = CU_EGL_COLOR_FORMAT_ARGB;
|
|
||||||
} else {
|
|
||||||
if (CUDA_SUCCESS !=
|
|
||||||
cudaProducerReadYUVFrame(file_p, framenum, cudaProducer->width,
|
|
||||||
cudaProducer->height, cudaProducer->pBuff)) {
|
|
||||||
printf("cuda producer, reading YUV frame failed\n");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
surfNum = 3;
|
|
||||||
eglColorFormat = CU_EGL_COLOR_FORMAT_YUV420_PLANAR;
|
|
||||||
copyWidthInBytes[0] = cudaProducer->width;
|
|
||||||
copyHeight[0] = cudaProducer->height;
|
|
||||||
copyWidthInBytes[1] = cudaProducer->width / 2;
|
|
||||||
copyHeight[1] = cudaProducer->height / 2;
|
|
||||||
copyWidthInBytes[2] = cudaProducer->width / 2;
|
|
||||||
copyHeight[2] = cudaProducer->height / 2;
|
|
||||||
uvOffset[1] = cudaProducer->width * cudaProducer->height;
|
|
||||||
uvOffset[2] =
|
|
||||||
uvOffset[1] + cudaProducer->width / 2 * cudaProducer->height / 2;
|
|
||||||
}
|
|
||||||
if (cudaProducer->pitchLinearOutput) {
|
|
||||||
for (i = 0; i < surfNum; i++) {
|
|
||||||
cuStatus =
|
|
||||||
cuMemcpy(cudaPtr[i], (CUdeviceptr)(cudaProducer->pBuff + uvOffset[i]),
|
|
||||||
copyWidthInBytes[i] * copyHeight[i]);
|
|
||||||
|
|
||||||
if (cuStatus != CUDA_SUCCESS) {
|
|
||||||
printf("Cuda producer: cuMemCpy pitchlinear failed, cuStatus =%d\n",
|
|
||||||
cuStatus);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// copy cudaProducer->pBuff to cudaArray
|
|
||||||
CUDA_MEMCPY3D cpdesc;
|
|
||||||
for (i = 0; i < surfNum; i++) {
|
|
||||||
memset(&cpdesc, 0, sizeof(cpdesc));
|
|
||||||
cpdesc.srcXInBytes = cpdesc.srcY = cpdesc.srcZ = cpdesc.srcLOD = 0;
|
|
||||||
cpdesc.srcMemoryType = CU_MEMORYTYPE_HOST;
|
|
||||||
cpdesc.srcHost = (void *)(cudaProducer->pBuff + uvOffset[i]);
|
|
||||||
cpdesc.dstXInBytes = cpdesc.dstY = cpdesc.dstZ = cpdesc.dstLOD = 0;
|
|
||||||
cpdesc.dstMemoryType = CU_MEMORYTYPE_ARRAY;
|
|
||||||
cpdesc.dstArray = cudaArr[i];
|
|
||||||
cpdesc.WidthInBytes = copyWidthInBytes[i];
|
|
||||||
cpdesc.Height = copyHeight[i];
|
|
||||||
cpdesc.Depth = 1;
|
|
||||||
cuStatus = cuMemcpy3D(&cpdesc);
|
|
||||||
if (cuStatus != CUDA_SUCCESS) {
|
|
||||||
printf("Cuda producer: cuMemCpy failed, cuStatus =%d\n", cuStatus);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (i = 0; i < surfNum; i++) {
|
|
||||||
if (cudaProducer->pitchLinearOutput)
|
|
||||||
cudaEgl.frame.pPitch[i] = (void *)cudaPtr[i];
|
|
||||||
else
|
|
||||||
cudaEgl.frame.pArray[i] = cudaArr[i];
|
|
||||||
}
|
|
||||||
cudaEgl.width = copyWidthInBytes[0];
|
|
||||||
cudaEgl.depth = 1;
|
|
||||||
cudaEgl.height = copyHeight[0];
|
|
||||||
cudaEgl.pitch = cudaProducer->pitchLinearOutput ? cudaEgl.width : 0;
|
|
||||||
cudaEgl.frameType = cudaProducer->pitchLinearOutput ? CU_EGL_FRAME_TYPE_PITCH
|
|
||||||
: CU_EGL_FRAME_TYPE_ARRAY;
|
|
||||||
cudaEgl.planeCount = surfNum;
|
|
||||||
cudaEgl.numChannels = (eglColorFormat == CU_EGL_COLOR_FORMAT_ARGB) ? 4 : 1;
|
|
||||||
cudaEgl.eglColorFormat = eglColorFormat;
|
|
||||||
cudaEgl.cuFormat = CU_AD_FORMAT_UNSIGNED_INT8;
|
|
||||||
|
|
||||||
static int numFramesPresented = 0;
|
|
||||||
// If there is a frame presented before we check if consumer
|
|
||||||
// is done with it using cuEGLStreamProducerReturnFrame.
|
|
||||||
while (numFramesPresented) {
|
|
||||||
CUeglFrame returnedCudaEgl;
|
|
||||||
cuStatus = cuEGLStreamProducerReturnFrame(&cudaProducer->cudaConn,
|
|
||||||
&returnedCudaEgl, NULL);
|
|
||||||
if (cuStatus == CUDA_ERROR_LAUNCH_TIMEOUT) {
|
|
||||||
continue;
|
|
||||||
} else if (cuStatus != CUDA_SUCCESS) {
|
|
||||||
printf("cuda Producer return frame FAILED with custatus= %d\n", cuStatus);
|
|
||||||
return cuStatus;
|
|
||||||
} else {
|
|
||||||
numFramesPresented--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cuStatus =
|
|
||||||
cuEGLStreamProducerPresentFrame(&cudaProducer->cudaConn, cudaEgl, NULL);
|
|
||||||
if (cuStatus != CUDA_SUCCESS) {
|
|
||||||
printf("cuda Producer present frame FAILED with custatus= %d\n", cuStatus);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
numFramesPresented++;
|
|
||||||
|
|
||||||
done:
|
|
||||||
if (file_p) {
|
|
||||||
fclose(file_p);
|
|
||||||
file_p = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return cuStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
CUresult cudaDeviceCreateProducer(test_cuda_producer_s *cudaProducer,
|
|
||||||
CUdevice device) {
|
|
||||||
CUresult status = CUDA_SUCCESS;
|
|
||||||
if (CUDA_SUCCESS != (status = cuInit(0))) {
|
|
||||||
printf("Failed to initialize CUDA\n");
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
int major = 0, minor = 0;
|
|
||||||
char deviceName[256];
|
|
||||||
checkCudaErrors(cuDeviceGetAttribute(
|
|
||||||
&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, device));
|
|
||||||
checkCudaErrors(cuDeviceGetAttribute(
|
|
||||||
&minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, device));
|
|
||||||
checkCudaErrors(cuDeviceGetName(deviceName, 256, device));
|
|
||||||
printf(
|
|
||||||
"CUDA Producer on GPU Device %d: \"%s\" with compute capability "
|
|
||||||
"%d.%d\n\n",
|
|
||||||
device, deviceName, major, minor);
|
|
||||||
|
|
||||||
if (major < 6) {
|
|
||||||
printf(
|
|
||||||
"EGLStreams_CUDA_Interop requires SM 6.0 or higher arch GPU. "
|
|
||||||
"Exiting...\n");
|
|
||||||
exit(2); // EXIT_WAIVED
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CUDA_SUCCESS !=
|
|
||||||
(status = cuCtxCreate(&cudaProducer->context, 0, device))) {
|
|
||||||
printf("failed to create CUDA context\n");
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = cuMemAlloc(&cudaProducer->cudaPtrARGB[0], (WIDTH * HEIGHT * 4));
|
|
||||||
if (status != CUDA_SUCCESS) {
|
|
||||||
printf("Create CUDA pointer failed, cuStatus=%d\n", status);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = cuMemAlloc(&cudaProducer->cudaPtrYUV[0], (WIDTH * HEIGHT));
|
|
||||||
if (status != CUDA_SUCCESS) {
|
|
||||||
printf("Create CUDA pointer failed, cuStatus=%d\n", status);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
status = cuMemAlloc(&cudaProducer->cudaPtrYUV[1], (WIDTH * HEIGHT) / 4);
|
|
||||||
if (status != CUDA_SUCCESS) {
|
|
||||||
printf("Create CUDA pointer failed, cuStatus=%d\n", status);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
status = cuMemAlloc(&cudaProducer->cudaPtrYUV[2], (WIDTH * HEIGHT) / 4);
|
|
||||||
if (status != CUDA_SUCCESS) {
|
|
||||||
printf("Create CUDA pointer failed, cuStatus=%d\n", status);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
CUDA_ARRAY3D_DESCRIPTOR desc = {0};
|
|
||||||
|
|
||||||
desc.Format = CU_AD_FORMAT_UNSIGNED_INT8;
|
|
||||||
desc.Depth = 1;
|
|
||||||
desc.Flags = CUDA_ARRAY3D_SURFACE_LDST;
|
|
||||||
desc.NumChannels = 4;
|
|
||||||
desc.Width = WIDTH * 4;
|
|
||||||
desc.Height = HEIGHT;
|
|
||||||
status = cuArray3DCreate(&cudaProducer->cudaArrARGB[0], &desc);
|
|
||||||
if (status != CUDA_SUCCESS) {
|
|
||||||
printf("Create CUDA array failed, cuStatus=%d\n", status);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++) {
|
|
||||||
if (i == 0) {
|
|
||||||
desc.NumChannels = 1;
|
|
||||||
desc.Width = WIDTH;
|
|
||||||
desc.Height = HEIGHT;
|
|
||||||
} else { // U/V surface as planar
|
|
||||||
desc.NumChannels = 1;
|
|
||||||
desc.Width = WIDTH / 2;
|
|
||||||
desc.Height = HEIGHT / 2;
|
|
||||||
}
|
|
||||||
status = cuArray3DCreate(&cudaProducer->cudaArrYUV[i], &desc);
|
|
||||||
if (status != CUDA_SUCCESS) {
|
|
||||||
printf("Create CUDA array failed, cuStatus=%d\n", status);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cudaProducer->pBuff = (unsigned char *)malloc((WIDTH * HEIGHT * 4));
|
|
||||||
if (!cudaProducer->pBuff) {
|
|
||||||
printf("CudaProducer: Failed to allocate image buffer\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
checkCudaErrors(cuCtxPopCurrent(&cudaProducer->context));
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cudaProducerInit(test_cuda_producer_s *cudaProducer, EGLDisplay eglDisplay,
|
|
||||||
EGLStreamKHR eglStream, TestArgs *args) {
|
|
||||||
cudaProducer->fileName1 = args->infile1;
|
|
||||||
cudaProducer->fileName2 = args->infile2;
|
|
||||||
|
|
||||||
cudaProducer->frameCount = 2;
|
|
||||||
cudaProducer->width = args->inputWidth;
|
|
||||||
cudaProducer->height = args->inputHeight;
|
|
||||||
cudaProducer->isARGB = args->isARGB;
|
|
||||||
cudaProducer->pitchLinearOutput = args->pitchLinearOutput;
|
|
||||||
|
|
||||||
// Set cudaProducer default parameters
|
|
||||||
cudaProducer->eglDisplay = eglDisplay;
|
|
||||||
cudaProducer->eglStream = eglStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
CUresult cudaProducerDeinit(test_cuda_producer_s *cudaProducer) {
|
|
||||||
if (cudaProducer->pBuff) free(cudaProducer->pBuff);
|
|
||||||
|
|
||||||
checkCudaErrors(cuMemFree(cudaProducer->cudaPtrARGB[0]));
|
|
||||||
checkCudaErrors(cuMemFree(cudaProducer->cudaPtrYUV[0]));
|
|
||||||
checkCudaErrors(cuMemFree(cudaProducer->cudaPtrYUV[1]));
|
|
||||||
checkCudaErrors(cuMemFree(cudaProducer->cudaPtrYUV[2]));
|
|
||||||
checkCudaErrors(cuArrayDestroy(cudaProducer->cudaArrARGB[0]));
|
|
||||||
checkCudaErrors(cuArrayDestroy(cudaProducer->cudaArrYUV[0]));
|
|
||||||
checkCudaErrors(cuArrayDestroy(cudaProducer->cudaArrYUV[1]));
|
|
||||||
checkCudaErrors(cuArrayDestroy(cudaProducer->cudaArrYUV[2]));
|
|
||||||
|
|
||||||
return cuEGLStreamProducerDisconnect(&cudaProducer->cudaConn);
|
|
||||||
}
|
|
|
@ -1,68 +0,0 @@
|
||||||
/* Copyright (c) 2021, 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 cuda producer header file
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef _CUDA_PRODUCER_H_
|
|
||||||
#define _CUDA_PRODUCER_H_
|
|
||||||
#include <EGL/egl.h>
|
|
||||||
#include <EGL/eglext.h>
|
|
||||||
#include "cudaEGL.h"
|
|
||||||
#include "eglstrm_common.h"
|
|
||||||
|
|
||||||
extern EGLStreamKHR eglStream;
|
|
||||||
extern EGLDisplay g_display;
|
|
||||||
|
|
||||||
typedef struct _test_cuda_producer_s {
|
|
||||||
// Stream params
|
|
||||||
char *fileName1;
|
|
||||||
char *fileName2;
|
|
||||||
unsigned char *pBuff;
|
|
||||||
int frameCount;
|
|
||||||
bool isARGB;
|
|
||||||
bool pitchLinearOutput;
|
|
||||||
unsigned int width;
|
|
||||||
unsigned int height;
|
|
||||||
CUcontext context;
|
|
||||||
CUeglStreamConnection cudaConn;
|
|
||||||
CUdeviceptr cudaPtrARGB[1];
|
|
||||||
CUdeviceptr cudaPtrYUV[3];
|
|
||||||
CUarray cudaArrARGB[1];
|
|
||||||
CUarray cudaArrYUV[3];
|
|
||||||
EGLStreamKHR eglStream;
|
|
||||||
EGLDisplay eglDisplay;
|
|
||||||
} test_cuda_producer_s;
|
|
||||||
|
|
||||||
void cudaProducerInit(test_cuda_producer_s *cudaProducer, EGLDisplay eglDisplay,
|
|
||||||
EGLStreamKHR eglStream, TestArgs *args);
|
|
||||||
CUresult cudaProducerTest(test_cuda_producer_s *parserArg, char *file);
|
|
||||||
CUresult cudaProducerDeinit(test_cuda_producer_s *cudaProducer);
|
|
||||||
CUresult cudaDeviceCreateProducer(test_cuda_producer_s *cudaProducer,
|
|
||||||
CUdevice device);
|
|
||||||
#endif
|
|
Binary file not shown.
Binary file not shown.
|
@ -1,139 +0,0 @@
|
||||||
/* Copyright (c) 2021, 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: Common egl stream functions
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "eglstrm_common.h"
|
|
||||||
|
|
||||||
EGLStreamKHR eglStream;
|
|
||||||
EGLDisplay g_display;
|
|
||||||
EGLAttrib cudaIndex;
|
|
||||||
|
|
||||||
#if defined(EXTENSION_LIST)
|
|
||||||
EXTENSION_LIST(EXTLST_DECL)
|
|
||||||
typedef void (*extlst_fnptr_t)(void);
|
|
||||||
static struct {
|
|
||||||
extlst_fnptr_t *fnptr;
|
|
||||||
char const *name;
|
|
||||||
} extensionList[] = {EXTENSION_LIST(EXTLST_ENTRY)};
|
|
||||||
|
|
||||||
int eglSetupExtensions(void) {
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < (sizeof(extensionList) / sizeof(*extensionList)); i++) {
|
|
||||||
*extensionList[i].fnptr = eglGetProcAddress(extensionList[i].name);
|
|
||||||
if (*extensionList[i].fnptr == NULL) {
|
|
||||||
printf("Couldn't get address of %s()\n", extensionList[i].name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int EGLStreamInit(int *cuda_device) {
|
|
||||||
static const EGLint streamAttrMailboxMode[] = {EGL_SUPPORT_REUSE_NV,
|
|
||||||
EGL_FALSE, EGL_NONE};
|
|
||||||
EGLBoolean eglStatus;
|
|
||||||
#define MAX_EGL_DEVICES 4
|
|
||||||
EGLint numDevices = 0;
|
|
||||||
EGLDeviceEXT devices[MAX_EGL_DEVICES];
|
|
||||||
eglStatus = eglQueryDevicesEXT(MAX_EGL_DEVICES, devices, &numDevices);
|
|
||||||
if (eglStatus != EGL_TRUE) {
|
|
||||||
printf("Error querying EGL devices\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (numDevices == 0) {
|
|
||||||
printf("No EGL devices found.. Waiving\n");
|
|
||||||
eglStatus = EGL_FALSE;
|
|
||||||
exit(EXIT_WAIVED);
|
|
||||||
}
|
|
||||||
|
|
||||||
int egl_device_id = 0;
|
|
||||||
for (egl_device_id = 0; egl_device_id < numDevices; egl_device_id++) {
|
|
||||||
eglStatus = eglQueryDeviceAttribEXT(devices[egl_device_id],
|
|
||||||
EGL_CUDA_DEVICE_NV, &cudaIndex);
|
|
||||||
if (eglStatus == EGL_TRUE) {
|
|
||||||
*cuda_device = cudaIndex; // We select first EGL-CUDA Capable device.
|
|
||||||
printf("Found EGL-CUDA Capable device with CUDA Device id = %d\n",
|
|
||||||
(int)cudaIndex);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (egl_device_id >= numDevices) {
|
|
||||||
printf("No CUDA Capable EGL Device found.. Waiving execution\n");
|
|
||||||
exit(EXIT_WAIVED);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_display = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT,
|
|
||||||
(void *)devices[egl_device_id], NULL);
|
|
||||||
if (g_display == EGL_NO_DISPLAY) {
|
|
||||||
printf("Could not get EGL display from device. \n");
|
|
||||||
eglStatus = EGL_FALSE;
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
eglStatus = eglInitialize(g_display, 0, 0);
|
|
||||||
if (!eglStatus) {
|
|
||||||
printf("EGL failed to initialize. \n");
|
|
||||||
eglStatus = EGL_FALSE;
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
eglStream = eglCreateStreamKHR(g_display, streamAttrMailboxMode);
|
|
||||||
if (eglStream == EGL_NO_STREAM_KHR) {
|
|
||||||
printf("Could not create EGL stream.\n");
|
|
||||||
eglStatus = EGL_FALSE;
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Created EGLStream %p\n", eglStream);
|
|
||||||
|
|
||||||
// Set stream attribute
|
|
||||||
if (!eglStreamAttribKHR(g_display, eglStream, EGL_CONSUMER_LATENCY_USEC_KHR,
|
|
||||||
16000)) {
|
|
||||||
printf(
|
|
||||||
"Consumer: eglStreamAttribKHR EGL_CONSUMER_LATENCY_USEC_KHR failed\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (!eglStreamAttribKHR(g_display, eglStream,
|
|
||||||
EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, 16000)) {
|
|
||||||
printf(
|
|
||||||
"Consumer: eglStreamAttribKHR EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR "
|
|
||||||
"failed\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
printf("EGLStream initialized\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EGLStreamFini(void) { eglDestroyStreamKHR(g_display, eglStream); }
|
|
||||||
#endif
|
|
|
@ -1,103 +0,0 @@
|
||||||
/* Copyright (c) 2021, 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: Common EGL stream functions header file
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef _EGLSTRM_COMMON_H_
|
|
||||||
#define _EGLSTRM_COMMON_H_
|
|
||||||
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "cuda.h"
|
|
||||||
#include "cudaEGL.h"
|
|
||||||
#include "helper_cuda_drvapi.h"
|
|
||||||
|
|
||||||
#define EXTENSION_LIST(T) \
|
|
||||||
T(PFNEGLCREATESTREAMKHRPROC, eglCreateStreamKHR) \
|
|
||||||
T(PFNEGLDESTROYSTREAMKHRPROC, eglDestroyStreamKHR) \
|
|
||||||
T(PFNEGLQUERYSTREAMKHRPROC, eglQueryStreamKHR) \
|
|
||||||
T(PFNEGLQUERYSTREAMU64KHRPROC, eglQueryStreamu64KHR) \
|
|
||||||
T(PFNEGLQUERYSTREAMTIMEKHRPROC, eglQueryStreamTimeKHR) \
|
|
||||||
T(PFNEGLSTREAMATTRIBKHRPROC, eglStreamAttribKHR) \
|
|
||||||
T(PFNEGLSTREAMCONSUMERACQUIREKHRPROC, eglStreamConsumerAcquireKHR) \
|
|
||||||
T(PFNEGLSTREAMCONSUMERRELEASEKHRPROC, eglStreamConsumerReleaseKHR) \
|
|
||||||
T(PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC, \
|
|
||||||
eglStreamConsumerGLTextureExternalKHR) \
|
|
||||||
T(PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC, eglGetStreamFileDescriptorKHR) \
|
|
||||||
T(PFNEGLQUERYDEVICESEXTPROC, eglQueryDevicesEXT) \
|
|
||||||
T(PFNEGLGETPLATFORMDISPLAYEXTPROC, eglGetPlatformDisplayEXT) \
|
|
||||||
T(PFNEGLQUERYDEVICEATTRIBEXTPROC, eglQueryDeviceAttribEXT) \
|
|
||||||
T(PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC, \
|
|
||||||
eglCreateStreamFromFileDescriptorKHR)
|
|
||||||
|
|
||||||
#define eglCreateStreamKHR my_eglCreateStreamKHR
|
|
||||||
#define eglDestroyStreamKHR my_eglDestroyStreamKHR
|
|
||||||
#define eglQueryStreamKHR my_eglQueryStreamKHR
|
|
||||||
#define eglQueryStreamu64KHR my_eglQueryStreamu64KHR
|
|
||||||
#define eglQueryStreamTimeKHR my_eglQueryStreamTimeKHR
|
|
||||||
#define eglStreamAttribKHR my_eglStreamAttribKHR
|
|
||||||
#define eglStreamConsumerAcquireKHR my_eglStreamConsumerAcquireKHR
|
|
||||||
#define eglStreamConsumerReleaseKHR my_eglStreamConsumerReleaseKHR
|
|
||||||
#define eglStreamConsumerGLTextureExternalKHR \
|
|
||||||
my_eglStreamConsumerGLTextureExternalKHR
|
|
||||||
#define eglGetStreamFileDescriptorKHR my_eglGetStreamFileDescriptorKHR
|
|
||||||
#define eglCreateStreamFromFileDescriptorKHR \
|
|
||||||
my_eglCreateStreamFromFileDescriptorKHR
|
|
||||||
#define eglQueryDevicesEXT my_eglQueryDevicesEXT
|
|
||||||
#define eglGetPlatformDisplayEXT my_eglGetPlatformDisplayEXT
|
|
||||||
#define eglQueryDeviceAttribEXT my_eglQueryDeviceAttribEXT
|
|
||||||
|
|
||||||
#define EXTLST_DECL(tx, x) tx my_##x = NULL;
|
|
||||||
#define EXTLST_EXTERN(tx, x) extern tx my_##x;
|
|
||||||
#define EXTLST_ENTRY(tx, x) {(extlst_fnptr_t *)&my_##x, #x},
|
|
||||||
|
|
||||||
#define MAX_STRING_SIZE 256
|
|
||||||
#define WIDTH 720
|
|
||||||
#define HEIGHT 480
|
|
||||||
|
|
||||||
typedef struct _TestArgs {
|
|
||||||
char *infile1;
|
|
||||||
char *infile2;
|
|
||||||
bool isARGB;
|
|
||||||
unsigned int inputWidth;
|
|
||||||
unsigned int inputHeight;
|
|
||||||
bool pitchLinearOutput;
|
|
||||||
} TestArgs;
|
|
||||||
|
|
||||||
int eglSetupExtensions(void);
|
|
||||||
int EGLStreamInit(int *dev);
|
|
||||||
void EGLStreamFini(void);
|
|
||||||
#endif
|
|
|
@ -1,160 +0,0 @@
|
||||||
################################################################################
|
|
||||||
# Copyright (c) 2019, 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.
|
|
||||||
#
|
|
||||||
################################################################################
|
|
||||||
#
|
|
||||||
# findegl.mk is used to find the necessary EGL Libraries for specific distributions
|
|
||||||
# this is supported on Linux
|
|
||||||
#
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
# Determine OS platform and unix distribution
|
|
||||||
ifeq ("$(TARGET_OS)","linux")
|
|
||||||
# first search lsb_release
|
|
||||||
DISTRO = $(shell lsb_release -i -s 2>/dev/null | tr "[:upper:]" "[:lower:]")
|
|
||||||
ifeq ("$(DISTRO)","")
|
|
||||||
# second search and parse /etc/issue
|
|
||||||
DISTRO = $(shell more /etc/issue | awk '{print $$1}' | sed '1!d' | sed -e "/^$$/d" 2>/dev/null | tr "[:upper:]" "[:lower:]")
|
|
||||||
# ensure data from /etc/issue is valid
|
|
||||||
ifeq (,$(filter $(DISTRO),ubuntu fedora red rhel centos suse))
|
|
||||||
DISTRO =
|
|
||||||
endif
|
|
||||||
ifeq ("$(DISTRO)","")
|
|
||||||
# third, we can search in /etc/os-release or /etc/{distro}-release
|
|
||||||
DISTRO = $(shell awk '/ID/' /etc/*-release | sed 's/ID=//' | grep -v "VERSION" | grep -v "ID" | grep -v "DISTRIB")
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ("$(TARGET_OS)","linux")
|
|
||||||
# $(info) >> findegl.mk -> LINUX path <<<)
|
|
||||||
# Each set of Linux Distros have different paths for where to find their OpenGL libraries reside
|
|
||||||
UBUNTU = $(shell echo $(DISTRO) | grep -i ubuntu >/dev/null 2>&1; echo $$?)
|
|
||||||
FEDORA = $(shell echo $(DISTRO) | grep -i fedora >/dev/null 2>&1; echo $$?)
|
|
||||||
RHEL = $(shell echo $(DISTRO) | grep -i 'red\|rhel' >/dev/null 2>&1; echo $$?)
|
|
||||||
CENTOS = $(shell echo $(DISTRO) | grep -i centos >/dev/null 2>&1; echo $$?)
|
|
||||||
SUSE = $(shell echo $(DISTRO) | grep -i 'suse\|sles' >/dev/null 2>&1; echo $$?)
|
|
||||||
ifeq ("$(UBUNTU)","0")
|
|
||||||
ifeq ($(HOST_ARCH)-$(TARGET_ARCH),x86_64-armv7l)
|
|
||||||
GLPATH := /usr/arm-linux-gnueabihf/lib
|
|
||||||
GLLINK := -L/usr/arm-linux-gnueabihf/lib
|
|
||||||
ifneq ($(TARGET_FS),)
|
|
||||||
GLPATH += $(TARGET_FS)/usr/lib/arm-linux-gnueabihf
|
|
||||||
GLLINK += -L$(TARGET_FS)/usr/lib/arm-linux-gnueabihf
|
|
||||||
endif
|
|
||||||
else ifeq ($(HOST_ARCH)-$(TARGET_ARCH),x86_64-aarch64)
|
|
||||||
GLPATH := /usr/aarch64-linux-gnu/lib
|
|
||||||
GLLINK := -L/usr/aarch64-linux-gnu/lib
|
|
||||||
ifneq ($(TARGET_FS),)
|
|
||||||
GLPATH += $(TARGET_FS)/usr/lib
|
|
||||||
GLPATH += $(TARGET_FS)/usr/lib/aarch64-linux-gnu
|
|
||||||
GLLINK += -L$(TARGET_FS)/usr/lib/aarch64-linux-gnu
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
UBUNTU_PKG_NAME = $(shell which dpkg >/dev/null 2>&1 && dpkg -l 'nvidia-*' | grep '^ii' | awk '{print $$2}' | head -1)
|
|
||||||
ifneq ("$(UBUNTU_PKG_NAME)","")
|
|
||||||
GLPATH ?= /usr/lib/$(UBUNTU_PKG_NAME)
|
|
||||||
GLLINK ?= -L/usr/lib/$(UBUNTU_PKG_NAME)
|
|
||||||
endif
|
|
||||||
|
|
||||||
DFLT_PATH ?= /usr/lib
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ("$(SUSE)","0")
|
|
||||||
GLPATH ?= /usr/X11R6/lib64
|
|
||||||
GLLINK ?= -L/usr/X11R6/lib64
|
|
||||||
DFLT_PATH ?= /usr/lib64
|
|
||||||
endif
|
|
||||||
ifeq ("$(FEDORA)","0")
|
|
||||||
GLPATH ?= /usr/lib64/nvidia
|
|
||||||
GLLINK ?= -L/usr/lib64/nvidia
|
|
||||||
DFLT_PATH ?= /usr/lib64
|
|
||||||
endif
|
|
||||||
ifeq ("$(RHEL)","0")
|
|
||||||
GLPATH ?= /usr/lib64/nvidia
|
|
||||||
GLLINK ?= -L/usr/lib64/nvidia
|
|
||||||
DFLT_PATH ?= /usr/lib64
|
|
||||||
endif
|
|
||||||
ifeq ("$(CENTOS)","0")
|
|
||||||
GLPATH ?= /usr/lib64/nvidia
|
|
||||||
GLLINK ?= -L/usr/lib64/nvidia
|
|
||||||
DFLT_PATH ?= /usr/lib64
|
|
||||||
endif
|
|
||||||
|
|
||||||
EGLLIB := $(shell find -L $(GLPATH) $(DFLT_PATH) -name libEGL.so -print 2>/dev/null)
|
|
||||||
|
|
||||||
ifeq ("$(EGLLIB)","")
|
|
||||||
$(info >>> WARNING - libEGL.so not found, please install libEGL.so <<<)
|
|
||||||
SAMPLE_ENABLED := 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
HEADER_SEARCH_PATH ?= $(TARGET_FS)/usr/include
|
|
||||||
ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_OS),x86_64-armv7l-linux)
|
|
||||||
HEADER_SEARCH_PATH += /usr/arm-linux-gnueabihf/include
|
|
||||||
else ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_OS),x86_64-aarch64-linux)
|
|
||||||
HEADER_SEARCH_PATH += /usr/aarch64-linux-gnu/include
|
|
||||||
endif
|
|
||||||
|
|
||||||
EGLHEADER := $(shell find -L $(HEADER_SEARCH_PATH) -name egl.h -print 2>/dev/null)
|
|
||||||
EGLEXTHEADER := $(shell find -L $(HEADER_SEARCH_PATH) -name eglext.h -print 2>/dev/null)
|
|
||||||
|
|
||||||
ifeq ("$(EGLHEADER)","")
|
|
||||||
$(info >>> WARNING - egl.h not found, please install egl.h <<<)
|
|
||||||
SAMPLE_ENABLED := 0
|
|
||||||
endif
|
|
||||||
ifeq ("$(EGLEXTHEADER)","")
|
|
||||||
$(info >>> WARNING - eglext.h not found, please install eglext.h <<<)
|
|
||||||
SAMPLE_ENABLED := 0
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ("$(TARGET_OS)","qnx")
|
|
||||||
HOST_CCFLAGS := -V5.4.0,gcc_ntoaarch64le
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Attempt to compile a minimal EGL application and run to check if EGL_SUPPORT_REUSE_NV is supported in the EGL headers available.
|
|
||||||
ifneq ($(SAMPLE_ENABLED), 0)
|
|
||||||
$(shell printf "#include <EGL/egl.h>\n#include <EGL/eglext.h>\nint main() {\n#ifdef EGL_SUPPORT_REUSE_NV \n #error \"Compatible EGL header found\" \n return 0;\n#endif \n return 1;\n}" > test.c; )
|
|
||||||
EGL_DEFINES := $(shell $(HOST_COMPILER) $(HOST_CCFLAGS) $(CCFLAGS) $(EXTRA_CCFLAGS) -lEGL test.c -c 2>&1 | grep -ic "Compatible EGL header found";)
|
|
||||||
SHOULD_WAIVE := 0
|
|
||||||
ifeq ($(EGL_DEFINES),0)
|
|
||||||
SHOULD_WAIVE := 1
|
|
||||||
endif
|
|
||||||
ifeq ($(SHOULD_WAIVE),1)
|
|
||||||
$(info -----------------------------------------------------------------------------------------------)
|
|
||||||
$(info WARNING - NVIDIA EGL EXTENSIONS are not available in the present EGL headers)
|
|
||||||
$(info -----------------------------------------------------------------------------------------------)
|
|
||||||
$(info This CUDA Sample cannot be built if the EGL NVIDIA EXTENSIONS like EGL_SUPPORT_REUSE_NV are not supported in EGL headers.)
|
|
||||||
$(info This will be a dry-run of the Makefile.)
|
|
||||||
$(info Please install the latest khronos EGL headers and libs to build this sample)
|
|
||||||
$(info -----------------------------------------------------------------------------------------------)
|
|
||||||
SAMPLE_ENABLED := 0
|
|
||||||
endif
|
|
||||||
$(shell rm test.o test.c 2>/dev/null)
|
|
||||||
endif
|
|
||||||
|
|
|
@ -1,231 +0,0 @@
|
||||||
/* Copyright (c) 2021, 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;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user