Skip to content

Commit 73da391

Browse files
mdboomleofang
andauthored
Fix #1122: Reinstate graphics APIs (#1123)
* Fix #1122: Reinstate graphics APIs * Add a test * Update cuda_bindings/tests/test_graphics_apis.py Co-authored-by: Leo Fang <[email protected]> * Use importorskip * Improve tests * Fix test * Fix Windows tests --------- Co-authored-by: Leo Fang <[email protected]>
1 parent ebd5453 commit 73da391

File tree

3 files changed

+61
-19
lines changed

3 files changed

+61
-19
lines changed

cuda_bindings/cuda/bindings/_lib/cyruntime/cyruntime.pxi

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# c.b._lib.cyruntime.utils), but was merged into one.
1414

1515
from libc.string cimport memset
16-
cimport cuda.bindings.cydriver as cydriver
16+
cimport cuda.bindings._bindings.cydriver as cydriver
1717

1818
cdef cudaError_t _cudaEGLStreamProducerPresentFrame(cyruntime.cudaEglStreamConnection* conn, cyruntime.cudaEglFrame eglframe, cudaStream_t* pStream) except ?cudaErrorCallRequiresNewerDriver nogil:
1919
cdef cudaError_t err = cudaSuccess
@@ -25,7 +25,7 @@ cdef cudaError_t _cudaEGLStreamProducerPresentFrame(cyruntime.cudaEglStreamConne
2525
err = getDriverEglFrame(&cueglFrame, eglframe)
2626
if err != cudaSuccess:
2727
return err
28-
# err = <cudaError_t>cydriver._cuEGLStreamProducerPresentFrame(<cydriver.CUeglStreamConnection*>conn, cueglFrame, pStream)
28+
err = <cudaError_t>cydriver._cuEGLStreamProducerPresentFrame(<cydriver.CUeglStreamConnection*>conn, cueglFrame, pStream)
2929
return err
3030

3131
cdef cudaError_t _cudaEGLStreamProducerReturnFrame(cyruntime.cudaEglStreamConnection* conn, cyruntime.cudaEglFrame* eglframe, cudaStream_t* pStream) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -38,7 +38,7 @@ cdef cudaError_t _cudaEGLStreamProducerReturnFrame(cyruntime.cudaEglStreamConnec
3838
err = cudaErrorInvalidResourceHandle
3939
return err
4040
cdef cydriver.CUeglFrame cueglFrame
41-
# err = <cudaError_t>cydriver._cuEGLStreamProducerReturnFrame(<cydriver.CUeglStreamConnection*>conn, &cueglFrame, pStream)
41+
err = <cudaError_t>cydriver._cuEGLStreamProducerReturnFrame(<cydriver.CUeglStreamConnection*>conn, &cueglFrame, pStream)
4242
if err != cudaSuccess:
4343
return err
4444
err = getRuntimeEglFrame(eglframe, cueglFrame)
@@ -52,7 +52,7 @@ cdef cudaError_t _cudaGraphicsResourceGetMappedEglFrame(cyruntime.cudaEglFrame*
5252
return err
5353
cdef cydriver.CUeglFrame cueglFrame
5454
memset(&cueglFrame, 0, sizeof(cueglFrame))
55-
# err = <cudaError_t>cydriver._cuGraphicsResourceGetMappedEglFrame(&cueglFrame, <cydriver.CUgraphicsResource>resource, index, mipLevel)
55+
err = <cudaError_t>cydriver._cuGraphicsResourceGetMappedEglFrame(&cueglFrame, <cydriver.CUgraphicsResource>resource, index, mipLevel)
5656
if err != cudaSuccess:
5757
return err
5858
err = getRuntimeEglFrame(eglFrame, cueglFrame)
@@ -67,7 +67,7 @@ cdef cudaError_t _cudaVDPAUGetDevice(int* device, cyruntime.VdpDevice vdpDevice,
6767
err = cudaFree(<void*>0)
6868
if err != cudaSuccess:
6969
return err
70-
# err = <cudaError_t>cydriver._cuVDPAUGetDevice(<cydriver.CUdevice*>device, vdpDevice, vdpGetProcAddress)
70+
err = <cudaError_t>cydriver._cuVDPAUGetDevice(<cydriver.CUdevice*>device, vdpDevice, vdpGetProcAddress)
7171
return err
7272

7373
cdef cudaError_t _cudaGraphicsVDPAURegisterVideoSurface(cudaGraphicsResource** resource, cyruntime.VdpVideoSurface vdpSurface, unsigned int flags) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -76,7 +76,7 @@ cdef cudaError_t _cudaGraphicsVDPAURegisterVideoSurface(cudaGraphicsResource** r
7676
err = cudaFree(<void*>0)
7777
if err != cudaSuccess:
7878
return err
79-
# err = <cudaError_t>cydriver._cuGraphicsVDPAURegisterVideoSurface(<cydriver.CUgraphicsResource*>resource, vdpSurface, flags)
79+
err = <cudaError_t>cydriver._cuGraphicsVDPAURegisterVideoSurface(<cydriver.CUgraphicsResource*>resource, vdpSurface, flags)
8080
return err
8181

8282
cdef cudaError_t _cudaGraphicsVDPAURegisterOutputSurface(cudaGraphicsResource** resource, cyruntime.VdpOutputSurface vdpSurface, unsigned int flags) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -85,7 +85,7 @@ cdef cudaError_t _cudaGraphicsVDPAURegisterOutputSurface(cudaGraphicsResource**
8585
err = cudaFree(<void*>0)
8686
if err != cudaSuccess:
8787
return err
88-
# err = <cudaError_t>cydriver._cuGraphicsVDPAURegisterOutputSurface(<cydriver.CUgraphicsResource*>resource, vdpSurface, flags)
88+
err = <cudaError_t>cydriver._cuGraphicsVDPAURegisterOutputSurface(<cydriver.CUgraphicsResource*>resource, vdpSurface, flags)
8989
return err
9090

9191
cdef cudaError_t _cudaGLGetDevices(unsigned int* pCudaDeviceCount, int* pCudaDevices, unsigned int cudaDeviceCount, cyruntime.cudaGLDeviceList deviceList) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -94,7 +94,7 @@ cdef cudaError_t _cudaGLGetDevices(unsigned int* pCudaDeviceCount, int* pCudaDev
9494
err = cudaFree(<void*>0)
9595
if err != cudaSuccess:
9696
return err
97-
# err = <cudaError_t>cydriver._cuGLGetDevices_v2(pCudaDeviceCount, <cydriver.CUdevice*>pCudaDevices, cudaDeviceCount, <cydriver.CUGLDeviceList>deviceList)
97+
err = <cudaError_t>cydriver._cuGLGetDevices_v2(pCudaDeviceCount, <cydriver.CUdevice*>pCudaDevices, cudaDeviceCount, <cydriver.CUGLDeviceList>deviceList)
9898
return err
9999

100100
cdef cudaError_t _cudaGraphicsGLRegisterImage(cudaGraphicsResource** resource, cyruntime.GLuint image, cyruntime.GLenum target, unsigned int flags) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -103,7 +103,7 @@ cdef cudaError_t _cudaGraphicsGLRegisterImage(cudaGraphicsResource** resource, c
103103
err = cudaFree(<void*>0)
104104
if err != cudaSuccess:
105105
return err
106-
# err = <cudaError_t>cydriver._cuGraphicsGLRegisterImage(<cydriver.CUgraphicsResource*>resource, image, target, flags)
106+
err = <cudaError_t>cydriver._cuGraphicsGLRegisterImage(<cydriver.CUgraphicsResource*>resource, image, target, flags)
107107
return err
108108

109109
cdef cudaError_t _cudaGraphicsGLRegisterBuffer(cudaGraphicsResource** resource, cyruntime.GLuint buffer, unsigned int flags) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -112,7 +112,7 @@ cdef cudaError_t _cudaGraphicsGLRegisterBuffer(cudaGraphicsResource** resource,
112112
err = cudaFree(<void*>0)
113113
if err != cudaSuccess:
114114
return err
115-
# err = <cudaError_t>cydriver._cuGraphicsGLRegisterBuffer(<cydriver.CUgraphicsResource*>resource, buffer, flags)
115+
err = <cudaError_t>cydriver._cuGraphicsGLRegisterBuffer(<cydriver.CUgraphicsResource*>resource, buffer, flags)
116116
return err
117117

118118
cdef cudaError_t _cudaGraphicsEGLRegisterImage(cudaGraphicsResource_t* pCudaResource, cyruntime.EGLImageKHR image, unsigned int flags) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -121,7 +121,7 @@ cdef cudaError_t _cudaGraphicsEGLRegisterImage(cudaGraphicsResource_t* pCudaReso
121121
err = cudaFree(<void*>0)
122122
if err != cudaSuccess:
123123
return err
124-
# err = <cudaError_t>cydriver._cuGraphicsEGLRegisterImage(<cydriver.CUgraphicsResource*>pCudaResource, image, flags)
124+
err = <cudaError_t>cydriver._cuGraphicsEGLRegisterImage(<cydriver.CUgraphicsResource*>pCudaResource, image, flags)
125125
return err
126126

127127
cdef cudaError_t _cudaEGLStreamConsumerConnect(cyruntime.cudaEglStreamConnection* conn, cyruntime.EGLStreamKHR eglStream) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -130,7 +130,7 @@ cdef cudaError_t _cudaEGLStreamConsumerConnect(cyruntime.cudaEglStreamConnection
130130
err = cudaFree(<void*>0)
131131
if err != cudaSuccess:
132132
return err
133-
# err = <cudaError_t>cydriver._cuEGLStreamConsumerConnect(<cydriver.CUeglStreamConnection*>conn, eglStream)
133+
err = <cudaError_t>cydriver._cuEGLStreamConsumerConnect(<cydriver.CUeglStreamConnection*>conn, eglStream)
134134
return err
135135

136136
cdef cudaError_t _cudaEGLStreamConsumerConnectWithFlags(cyruntime.cudaEglStreamConnection* conn, cyruntime.EGLStreamKHR eglStream, unsigned int flags) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -139,7 +139,7 @@ cdef cudaError_t _cudaEGLStreamConsumerConnectWithFlags(cyruntime.cudaEglStreamC
139139
err = cudaFree(<void*>0)
140140
if err != cudaSuccess:
141141
return err
142-
# err = <cudaError_t>cydriver._cuEGLStreamConsumerConnectWithFlags(<cydriver.CUeglStreamConnection*>conn, eglStream, flags)
142+
err = <cudaError_t>cydriver._cuEGLStreamConsumerConnectWithFlags(<cydriver.CUeglStreamConnection*>conn, eglStream, flags)
143143
return err
144144

145145
cdef cudaError_t _cudaEGLStreamConsumerDisconnect(cyruntime.cudaEglStreamConnection* conn) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -148,7 +148,7 @@ cdef cudaError_t _cudaEGLStreamConsumerDisconnect(cyruntime.cudaEglStreamConnect
148148
err = cudaFree(<void*>0)
149149
if err != cudaSuccess:
150150
return err
151-
# err = <cudaError_t>cydriver._cuEGLStreamConsumerDisconnect(<cydriver.CUeglStreamConnection*>conn)
151+
err = <cudaError_t>cydriver._cuEGLStreamConsumerDisconnect(<cydriver.CUeglStreamConnection*>conn)
152152
return err
153153

154154
cdef cudaError_t _cudaEGLStreamConsumerAcquireFrame(cyruntime.cudaEglStreamConnection* conn, cudaGraphicsResource_t* pCudaResource, cudaStream_t* pStream, unsigned int timeout) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -157,7 +157,7 @@ cdef cudaError_t _cudaEGLStreamConsumerAcquireFrame(cyruntime.cudaEglStreamConne
157157
err = cudaFree(<void*>0)
158158
if err != cudaSuccess:
159159
return err
160-
# err = <cudaError_t>cydriver._cuEGLStreamConsumerAcquireFrame(<cydriver.CUeglStreamConnection*>conn, <cydriver.CUgraphicsResource*>pCudaResource, <cydriver.CUstream*>pStream, timeout)
160+
err = <cudaError_t>cydriver._cuEGLStreamConsumerAcquireFrame(<cydriver.CUeglStreamConnection*>conn, <cydriver.CUgraphicsResource*>pCudaResource, <cydriver.CUstream*>pStream, timeout)
161161
return err
162162

163163
cdef cudaError_t _cudaEGLStreamConsumerReleaseFrame(cyruntime.cudaEglStreamConnection* conn, cudaGraphicsResource_t pCudaResource, cudaStream_t* pStream) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -166,7 +166,7 @@ cdef cudaError_t _cudaEGLStreamConsumerReleaseFrame(cyruntime.cudaEglStreamConne
166166
err = cudaFree(<void*>0)
167167
if err != cudaSuccess:
168168
return err
169-
# err = <cudaError_t>cydriver._cuEGLStreamConsumerReleaseFrame(<cydriver.CUeglStreamConnection*>conn, <cydriver.CUgraphicsResource>pCudaResource, <cydriver.CUstream*>pStream)
169+
err = <cudaError_t>cydriver._cuEGLStreamConsumerReleaseFrame(<cydriver.CUeglStreamConnection*>conn, <cydriver.CUgraphicsResource>pCudaResource, <cydriver.CUstream*>pStream)
170170
return err
171171

172172
cdef cudaError_t _cudaEGLStreamProducerConnect(cyruntime.cudaEglStreamConnection* conn, cyruntime.EGLStreamKHR eglStream, cyruntime.EGLint width, cyruntime.EGLint height) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -175,7 +175,7 @@ cdef cudaError_t _cudaEGLStreamProducerConnect(cyruntime.cudaEglStreamConnection
175175
err = cudaFree(<void*>0)
176176
if err != cudaSuccess:
177177
return err
178-
# err = <cudaError_t>cydriver._cuEGLStreamProducerConnect(<cydriver.CUeglStreamConnection*>conn, eglStream, width, height)
178+
err = <cudaError_t>cydriver._cuEGLStreamProducerConnect(<cydriver.CUeglStreamConnection*>conn, eglStream, width, height)
179179
return err
180180

181181
cdef cudaError_t _cudaEGLStreamProducerDisconnect(cyruntime.cudaEglStreamConnection* conn) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -184,7 +184,7 @@ cdef cudaError_t _cudaEGLStreamProducerDisconnect(cyruntime.cudaEglStreamConnect
184184
err = cudaFree(<void*>0)
185185
if err != cudaSuccess:
186186
return err
187-
# err = <cudaError_t>cydriver._cuEGLStreamProducerDisconnect(<cydriver.CUeglStreamConnection*>conn)
187+
err = <cudaError_t>cydriver._cuEGLStreamProducerDisconnect(<cydriver.CUeglStreamConnection*>conn)
188188
return err
189189

190190
cdef cudaError_t _cudaEventCreateFromEGLSync(cudaEvent_t* phEvent, cyruntime.EGLSyncKHR eglSync, unsigned int flags) except ?cudaErrorCallRequiresNewerDriver nogil:
@@ -193,7 +193,7 @@ cdef cudaError_t _cudaEventCreateFromEGLSync(cudaEvent_t* phEvent, cyruntime.EGL
193193
err = cudaFree(<void*>0)
194194
if err != cudaSuccess:
195195
return err
196-
# err = <cudaError_t>cydriver._cuEventCreateFromEGLSync(<cydriver.CUevent*>phEvent, eglSync, flags)
196+
err = <cudaError_t>cydriver._cuEventCreateFromEGLSync(<cydriver.CUevent*>phEvent, eglSync, flags)
197197
return err
198198

199199
## utility functions

cuda_bindings/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ test = [
4242
"numpy>=1.21.1",
4343
"pytest>=6.2.4",
4444
"pytest-benchmark>=3.4.1",
45+
"pyglet>=2.1.9"
4546
]
4647

4748
[project.urls]
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE
3+
4+
import pytest
5+
from cuda.bindings import runtime as cudart
6+
7+
8+
def test_graphics_api_smoketest():
9+
# Due to lazy importing in pyglet, pytest.importorskip doesn't work
10+
try:
11+
import pyglet
12+
13+
tex = pyglet.image.Texture.create(512, 512)
14+
except (ImportError, AttributeError):
15+
pytest.skip("pyglet not available or could not create GL context")
16+
# return to make linters happy
17+
return
18+
19+
err, gfx_resource = cudart.cudaGraphicsGLRegisterImage(
20+
tex.id, tex.target, cudart.cudaGraphicsRegisterFlags.cudaGraphicsRegisterFlagsWriteDiscard
21+
)
22+
error_name = cudart.cudaGetErrorName(err)[1].decode()
23+
if error_name == "cudaSuccess":
24+
assert int(gfx_resource) != 0
25+
else:
26+
assert error_name in ("cudaErrorInvalidValue", "cudaErrorUnknown")
27+
28+
29+
def test_cuda_register_image_invalid():
30+
"""Exercise cudaGraphicsGLRegisterImage with dummy handle only using CUDA runtime API."""
31+
fake_gl_texture_id = 1
32+
fake_gl_target = 0x0DE1
33+
flags = cudart.cudaGraphicsRegisterFlags.cudaGraphicsRegisterFlagsWriteDiscard
34+
35+
err, resource = cudart.cudaGraphicsGLRegisterImage(fake_gl_texture_id, fake_gl_target, flags)
36+
err_name = cudart.cudaGetErrorName(err)[1].decode()
37+
err_str = cudart.cudaGetErrorString(err)[1].decode()
38+
39+
if err == 0:
40+
cudart.cudaGraphicsUnregisterResource(resource)
41+
raise AssertionError("Expected error from invalid GL texture ID")

0 commit comments

Comments
 (0)