[gnome-remote-desktop] hwaccel-nvidia: Add utility functions for accessing GL resources



commit 40faae0de177ca8cb16a4ad0437782e37e69682f
Author: Pascal Nowack <Pascal Nowack gmx de>
Date:   Tue Jan 4 16:14:22 2022 +0100

    hwaccel-nvidia: Add utility functions for accessing GL resources
    
    Add functions to register, unregister, map, and unmap GL resources on
    the GPU.
    These functions will later be used by the EGL thread.

 src/grd-hwaccel-nvidia.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/grd-hwaccel-nvidia.h | 25 ++++++++++++++
 2 files changed, 112 insertions(+)
---
diff --git a/src/grd-hwaccel-nvidia.c b/src/grd-hwaccel-nvidia.c
index 90bda2e4..8aa4fd78 100644
--- a/src/grd-hwaccel-nvidia.c
+++ b/src/grd-hwaccel-nvidia.c
@@ -102,6 +102,93 @@ grd_hwaccel_nvidia_pop_cuda_context (GrdHwAccelNvidia *hwaccel_nvidia)
   hwaccel_nvidia->cuda_funcs->cuCtxPopCurrent (&cu_context);
 }
 
+gboolean
+grd_hwaccel_nvidia_register_read_only_gl_buffer (GrdHwAccelNvidia   *hwaccel_nvidia,
+                                                 CUgraphicsResource *cuda_resource,
+                                                 uint32_t            buffer)
+{
+  ExtraCudaFunctions *extra_cuda_funcs = hwaccel_nvidia->extra_cuda_funcs;
+
+  if (extra_cuda_funcs->cuGraphicsGLRegisterBuffer (
+        cuda_resource, buffer,
+        CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY) != CUDA_SUCCESS)
+    {
+      g_warning ("[HWAccel.CUDA] Failed to register GL buffer");
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+void
+grd_hwaccel_nvidia_unregister_cuda_resource (GrdHwAccelNvidia   *hwaccel_nvidia,
+                                             CUgraphicsResource  cuda_resource,
+                                             CUstream            cuda_stream)
+{
+  hwaccel_nvidia->cuda_funcs->cuStreamSynchronize (cuda_stream);
+  hwaccel_nvidia->cuda_funcs->cuGraphicsUnregisterResource (cuda_resource);
+}
+
+gboolean
+grd_hwaccel_nvidia_map_cuda_resource (GrdHwAccelNvidia   *hwaccel_nvidia,
+                                      CUgraphicsResource  cuda_resource,
+                                      CUdeviceptr        *dev_ptr,
+                                      size_t             *size,
+                                      CUstream            cuda_stream)
+{
+  CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
+  ExtraCudaFunctions *extra_cuda_funcs = hwaccel_nvidia->extra_cuda_funcs;
+
+  if (cuda_funcs->cuGraphicsMapResources (1, &cuda_resource,
+                                          cuda_stream) != CUDA_SUCCESS)
+    {
+      g_warning ("[HWAccel.CUDA] Failed to map resources");
+      return FALSE;
+    }
+  if (extra_cuda_funcs->cuGraphicsResourceGetMappedPointer (dev_ptr, size,
+                                                            cuda_resource) != CUDA_SUCCESS)
+    {
+      g_warning ("[HWAccel.CUDA] Failed to get mapped pointer");
+      cuda_funcs->cuGraphicsUnmapResources (1, &cuda_resource, cuda_stream);
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+void
+grd_hwaccel_nvidia_unmap_cuda_resource (GrdHwAccelNvidia   *hwaccel_nvidia,
+                                        CUgraphicsResource  cuda_resource,
+                                        CUstream            cuda_stream)
+{
+  hwaccel_nvidia->cuda_funcs->cuGraphicsUnmapResources (1, &cuda_resource,
+                                                        cuda_stream);
+}
+
+gboolean
+grd_hwaccel_nvidia_create_cuda_stream (GrdHwAccelNvidia *hwaccel_nvidia,
+                                       CUstream         *cuda_stream)
+{
+  CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
+
+  if (cuda_funcs->cuStreamCreate (cuda_stream,
+                                  CU_STREAM_NON_BLOCKING) != CUDA_SUCCESS)
+    {
+      g_warning ("[HWAccel.CUDA] Failed to create stream");
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+void
+grd_hwaccel_nvidia_destroy_cuda_stream (GrdHwAccelNvidia *hwaccel_nvidia,
+                                        CUstream          cuda_stream)
+{
+  hwaccel_nvidia->cuda_funcs->cuStreamSynchronize (cuda_stream);
+  hwaccel_nvidia->cuda_funcs->cuStreamDestroy (cuda_stream);
+}
+
 static uint32_t
 get_next_free_encode_session_id (GrdHwAccelNvidia *hwaccel_nvidia)
 {
diff --git a/src/grd-hwaccel-nvidia.h b/src/grd-hwaccel-nvidia.h
index de8871ff..069a9b80 100644
--- a/src/grd-hwaccel-nvidia.h
+++ b/src/grd-hwaccel-nvidia.h
@@ -20,6 +20,7 @@
 #ifndef GRD_HWACCEL_NVIDIA_H
 #define GRD_HWACCEL_NVIDIA_H
 
+#include <ffnvcodec/dynlink_cuda.h>
 #include <glib-object.h>
 #include <stdint.h>
 
@@ -35,6 +36,30 @@ void grd_hwaccel_nvidia_push_cuda_context (GrdHwAccelNvidia *hwaccel_nvidia);
 
 void grd_hwaccel_nvidia_pop_cuda_context (GrdHwAccelNvidia *hwaccel_nvidia);
 
+gboolean grd_hwaccel_nvidia_register_read_only_gl_buffer (GrdHwAccelNvidia   *hwaccel_nvidia,
+                                                          CUgraphicsResource *cuda_resource,
+                                                          uint32_t            buffer);
+
+void grd_hwaccel_nvidia_unregister_cuda_resource (GrdHwAccelNvidia   *hwaccel_nvidia,
+                                                  CUgraphicsResource  cuda_resource,
+                                                  CUstream            cuda_stream);
+
+gboolean grd_hwaccel_nvidia_map_cuda_resource (GrdHwAccelNvidia   *hwaccel_nvidia,
+                                               CUgraphicsResource  cuda_resource,
+                                               CUdeviceptr        *dev_ptr,
+                                               size_t             *size,
+                                               CUstream            cuda_stream);
+
+void grd_hwaccel_nvidia_unmap_cuda_resource (GrdHwAccelNvidia   *hwaccel_nvidia,
+                                             CUgraphicsResource  cuda_resource,
+                                             CUstream            cuda_stream);
+
+gboolean grd_hwaccel_nvidia_create_cuda_stream (GrdHwAccelNvidia *hwaccel_nvidia,
+                                                CUstream         *cuda_stream);
+
+void grd_hwaccel_nvidia_destroy_cuda_stream (GrdHwAccelNvidia *hwaccel_nvidia,
+                                             CUstream          cuda_stream);
+
 gboolean grd_hwaccel_nvidia_create_nvenc_session (GrdHwAccelNvidia *hwaccel_nvidia,
                                                   uint32_t         *encode_session_id,
                                                   uint16_t          surface_width,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]