Files
nvsci_samples/rawstream/rawstream.h
svcmobrel-release 5482324389 Updating prebuilts and/or headers
8193be73ce0a488f62034cb87083cdf09f52cd5d - event_sample_app/block_pool.c
a0bd135d707994a41ed3a4234b5f875a268fed4d - event_sample_app/Makefile
44f6de348f8bdd5cb584b3e8cc4b05e9482dddd2 - event_sample_app/event_loop.h
6ff0f1c2d7ef2e2fa9ece6fdc850b58b87207526 - event_sample_app/block_returnsync.c
1158201e78094e9e866fa99095c9ffc2ec9f5a27 - event_sample_app/block_limiter.c
f5e2aea98ba9264ee1068a700222dff8d5d5c7a4 - event_sample_app/block_c2c.c
ef057870dade9af70656b37340e9bcad35d49380 - event_sample_app/block_multicast.c
641e3634da873970b574b23a1024b2e7155b88ff - event_sample_app/block_consumer_uc1.c
ced622a41d1a48dcb23e6a1a02ae9640ef9b837c - event_sample_app/util.h
3a1013021a572887303fb6db245b5b01fe07e9a0 - event_sample_app/block_producer_uc1.c
dac99c442185b020fbdae07bfc1e7df78343eb83 - event_sample_app/block_info.h
b5dd68bec3ae6f9049aad1cb5a86c3db4af02e17 - event_sample_app/block_presentsync.c
e0861e9fe5d160d47d758464146d7192f9c70a5f - event_sample_app/util.c
d7e42e2b6088ff4596abc7256eb018d757a4021e - event_sample_app/usecase1.h
65ffe5af6ae6bc0418f348167c473849d4697e47 - event_sample_app/block_ipc.c
b52e34443ac441a9df48029de944aa0a50d1b101 - event_sample_app/event_loop_service.c
5001f036389a4f7952cb4974dd3323908208ca30 - event_sample_app/event_loop_threads.c
a71ed037f9d77d0944f40f54cf25db8180d007e2 - event_sample_app/block_queue.c
d6bbd17599543f1760d87851150a12a2a842a24d - event_sample_app/block_common.c
40f949c4c37ab4aa4a84182b345f3de6fceab39b - event_sample_app/main.c
458833ab233a725c067bf9b1fc60ef39872eee80 - rawstream/Makefile
1fbb82e2281bb2e168c87fd20903bbed898ca160 - rawstream/rawstream_cuda.c
e26c09f1ad1a3a7d2c29dae1b38d3fd90c23af6e - rawstream/rawstream_consumer.c
2bed038ca070aa5dccd6b672a98f093340e829bb - rawstream/rawstream_producer.c
3df4e5c00a3dc002ee9877e282bd28ffa87fa6f0 - rawstream/rawstream.h
d5ffeef3c7ad2af6f6f31385db7917b5ef9a7438 - rawstream/rawstream_ipc_linux.c
f28c1cd5fe26b6dc5930d5556b54364c9b91767c - rawstream/rawstream_main.c

Change-Id: Icdf4312706c30fbcfa1533fba5277879e8d77aec
2025-01-21 05:25:22 -08:00

149 lines
4.8 KiB
C

/*
* Copyright (c) 2020-2021 NVIDIA Corporation. All Rights Reserved.
*
* NVIDIA Corporation and its licensors retain all intellectual property and
* proprietary rights in and to this software and related documentation. Any
* use, reproduction, disclosure or distribution of this software and related
* documentation without an express license agreement from NVIDIA Corporation
* is strictly prohibited.
*/
#ifndef _rawstream_h
#define _rawstream_h
#include <unistd.h>
#include <pthread.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <assert.h>
#include <nvscisync.h>
#include <nvscibuf.h>
#include "cuda.h"
#include "cuda_runtime_api.h"
// Constants controlling configuration
#define totalFrames 32U
#define totalBuffers 4U
// Sync/Buf modules
extern NvSciSyncModule syncModule;
extern NvSciBufModule bufModule;
// Exchanged sync info
extern NvSciSyncAttrList producerSignalAttrs;
extern NvSciSyncAttrList consumerSignalAttrs;
extern NvSciSyncAttrList producerWaitAttrs;
extern NvSciSyncAttrList consumerWaitAttrs;
extern NvSciSyncAttrList prodToConsAttrs;
extern NvSciSyncAttrList consToProdAttrs;
extern NvSciSyncObj consumerSignalObj;
extern NvSciSyncObj producerSignalObj;
extern NvSciSyncObj consumerWaitObj;
extern NvSciSyncObj producerWaitObj;
// Exchanged buf info
extern NvSciBufAttrList producerWriteAttrs;
extern NvSciBufAttrList consumerReadAttrs;
extern NvSciBufAttrList combinedBufAttrs;
// CUDA info common to producer and consumer
typedef struct {
int deviceId;
CUuuid uuid;
cudaStream_t stream;
cudaExternalSemaphore_t signalerSem;
cudaExternalSemaphore_t waiterSem;
NvSciBufType bufType;
uint64_t bufSize;
uint8_t* bufCopy;
} CudaClientInfo;
// List of buffers with status
typedef struct {
// Buffer handle
NvSciBufObj obj;
// CUDA external memory object
cudaExternalMemory_t extMem;
// Mapping into virtual memory
uint8_t* ptr;
// Current owner (0 = producer, 1 = consumer)
uint32_t owner;
// Fence to wait for
NvSciSyncFence fence;
// Checksum for error checking
uint32_t crc;
} Buffer;
extern Buffer buffers[totalBuffers];
// packet data
// Note: The checksum is not, in general, needed in a real streaming
// application. All that is required is something to identify
// the buffer and provide the fences. See comments in the producer
// and consumer for the reason for the checksum.
typedef struct {
// buffer identifier
uint32_t bufferId;
// buffer checksum
uint32_t crc;
// Fence to wait for
NvSciSyncFenceIpcExportDescriptor fenceDesc;
} Packet;
// IPC related info
typedef struct {
// NvSciIpc handle
NvSciIpcEndpoint endpoint;
// IPC channel info
struct NvSciIpcEndpointInfo info;
// QNX: Channel id to get event
int32_t chId;
// QNX: Connection id to send event in library
int32_t connId;
// Linux: IPC event fd
int32_t ipcEventFd;
} IpcWrapper;
extern IpcWrapper ipcWrapper;
// CUDA data types
typedef struct cudaExternalSemaphoreHandleDesc cudaExternalSemaphoreHandleDesc;
typedef struct cudaExternalMemoryHandleDesc cudaExternalMemoryHandleDesc;
typedef struct cudaExternalMemoryBufferDesc cudaExternalMemoryBufferDesc;
typedef struct cudaExternalSemaphoreWaitParams cudaExternalSemaphoreWaitParams;
typedef struct cudaExternalSemaphoreSignalParams cudaExternalSemaphoreSignalParams;
// Utility functions
extern uint32_t GenerateCRC(uint8_t* data, uint32_t width, uint32_t height, uint32_t pitch);
// Thread functions
extern void* producerFunc(void*);
extern void* consumerFunc(void*);
// IPC functions
extern NvSciError ipcInit(const char* endpointName, IpcWrapper* ipcWrapper);
extern NvSciError ipcSend(IpcWrapper* ipcWrapper, const void* buf, const size_t size);
extern NvSciError ipcRecvFill(IpcWrapper* ipcWrapper, void* buf, const size_t size);
extern void ipcDeinit(IpcWrapper* ipcWrapper);
// CUDA-specific operations
extern bool setupCuda(CudaClientInfo* info);
extern bool setupCudaSync(CudaClientInfo* info,
NvSciSyncObj sciSignalObj,
NvSciSyncObj sciWaitObj);
extern bool setupCudaBufAttr(CudaClientInfo* info,
NvSciBufAttrList attrs);
extern bool setupCudaBuffer(CudaClientInfo* info,
Buffer* buf);
extern bool waitCudaFence(CudaClientInfo* info,
Buffer* buf);
extern bool signalCudaFence(CudaClientInfo* info,
Buffer* buf);
extern void deinitCuda(CudaClientInfo* info);
extern void deinitCudaBuffer(Buffer* buf, int num);
#endif // _rawstream_h