mirror of
git://nv-tegra.nvidia.com/tegra/nv-sci-src/nvsci_samples.git
synced 2025-12-24 10:35:19 +03:00
2eba699906039d6615aae4967f6ea79bfe44a40a - event_sample_app/block_pool.c f3abb0a884f0647204ad32ff51255c4712e52120 - event_sample_app/Makefile 9ee49033e077ac5c8bf458a04c91dd3dbed9633d - event_sample_app/event_loop.h b33adce6eb1bbc7af23f6c37b6a635479e18a66a - event_sample_app/block_returnsync.c a56041c06b6bc1d3812b72b399d7d78dd7895485 - event_sample_app/block_limiter.c ca34c957759f7a010f0cbbbf9bedc03a2c98092b - event_sample_app/block_c2c.c 8d6d0ec3aa8e374a1d2a5fedc9dd24ff7bbdb731 - event_sample_app/block_multicast.c a76149a2531899e35843d939f60ad8979d8cf65f - event_sample_app/block_consumer_uc1.c 9da8763e4af4b4b7278507a3ebfe2c68a7a24585 - event_sample_app/util.h 2bf7e1383d6e8913c9b0a6a8bdd48fe63d8098d0 - event_sample_app/block_producer_uc1.c a54abf82eaa2d888e379ab4596ba68ce264e80b5 - event_sample_app/block_info.h 080a6efe263be076c7046e70e31098c2bbed0f6d - event_sample_app/block_presentsync.c 7dd10e5ea71f0c4a09bbe1f9f148f67a13ee098c - event_sample_app/util.c bc1a6f9017b28e5707c166a658a35e6b3986fdf4 - event_sample_app/usecase1.h 317f43efc59638bf1eae8303f0c79eafb059241a - event_sample_app/block_ipc.c 40361c8f0b68f7d5207db2466ce08c19c0bf1c90 - event_sample_app/event_loop_service.c efad113d0107e5d8f90146f3102a7c0ed22f1a35 - event_sample_app/event_loop_threads.c 2908615cebcf36330b9850c57e8745bf324867b2 - event_sample_app/block_queue.c 36ed68eca1a7800cf0d94e763c9fc352ee8cda1e - event_sample_app/block_common.c 675f75d61bd0226625a8eaaf0e503c9e976c8d61 - event_sample_app/main.c c3b26619dd07d221e953fc5dc29a50dcb95a8b97 - rawstream/Makefile 1fbb82e2281bb2e168c87fd20903bbed898ca160 - rawstream/rawstream_cuda.c 1d96498fe3c922f143f7e50e0a32b099714060ad - rawstream/rawstream_consumer.c d077dafc9176686f6d081026225325c2a303a60e - rawstream/rawstream_producer.c 54ae655edddda7dcabe22fbf0b27c3f617978851 - rawstream/rawstream.h d5ffeef3c7ad2af6f6f31385db7917b5ef9a7438 - rawstream/rawstream_ipc_linux.c 81e3d6f8ff5252797a7e9e170b74df6255f54f1b - rawstream/rawstream_main.c Change-Id: I0f4e671693eb0addfe8d0e6532cc8f240cb6c778
153 lines
4.9 KiB
C
153 lines
4.9 KiB
C
/*
|
|
* Copyright (c) 2020-2025 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
|
|
|
|
#if defined(__x86_64__)
|
|
#define cuDeviceGetUuid cuDeviceGetUuid_v2
|
|
#endif
|
|
|
|
// 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
|