@@ -13,29 +13,34 @@ from cuda.core._resource_handles cimport (
1313from cuda.core._stream cimport Stream, Stream_accept
1414from cuda.core._utils.cuda_utils cimport HANDLE_RETURN
1515
16- from enum import IntEnum
17-
1816from cuda.core._memory import Buffer
1917
20- __all__ = [' GraphicsResource' , ' GraphicsRegisterFlags' ]
21-
22-
23- class GraphicsRegisterFlags (IntEnum ):
24- """ Flags for registering a graphics resource with CUDA.
25-
26- These flags specify the intended usage when registering a graphics
27- resource (e.g., an OpenGL buffer) for CUDA access.
28- """
29- NONE = cydriver.CU_GRAPHICS_REGISTER_FLAGS_NONE
30- """ No hints about how this resource will be used. CUDA may read and write."""
31- READ_ONLY = cydriver.CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY
32- """ CUDA will not write to this resource."""
33- WRITE_DISCARD = cydriver.CU_GRAPHICS_REGISTER_FLAGS_WRITE_DISCARD
34- """ CUDA will not read from this resource and will write over the entire contents."""
35- SURFACE_LOAD_STORE = cydriver.CU_GRAPHICS_REGISTER_FLAGS_SURFACE_LDST
36- """ CUDA will bind this resource to a surface reference."""
37- TEXTURE_GATHER = cydriver.CU_GRAPHICS_REGISTER_FLAGS_TEXTURE_GATHER
38- """ CUDA will perform texture gather operations on this resource."""
18+ __all__ = [' GraphicsResource' ]
19+
20+ _REGISTER_FLAGS = {
21+ " none" : cydriver.CU_GRAPHICS_REGISTER_FLAGS_NONE,
22+ " read_only" : cydriver.CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY,
23+ " write_discard" : cydriver.CU_GRAPHICS_REGISTER_FLAGS_WRITE_DISCARD,
24+ " surface_load_store" : cydriver.CU_GRAPHICS_REGISTER_FLAGS_SURFACE_LDST,
25+ " texture_gather" : cydriver.CU_GRAPHICS_REGISTER_FLAGS_TEXTURE_GATHER,
26+ }
27+
28+
29+ def _parse_register_flags (flags ):
30+ if flags is None :
31+ return 0
32+ if isinstance (flags, str ):
33+ flags = (flags,)
34+ result = 0
35+ for f in flags:
36+ try :
37+ result |= _REGISTER_FLAGS[f]
38+ except KeyError :
39+ raise ValueError (
40+ f" Unknown register flag {f!r}. "
41+ f" Valid flags: {', '.join(sorted(_REGISTER_FLAGS))}"
42+ ) from None
43+ return result
3944
4045
4146class _MappedBufferContext :
@@ -114,16 +119,20 @@ cdef class GraphicsResource:
114119 )
115120
116121 @classmethod
117- def from_gl_buffer (cls , int gl_buffer , *, int flags = 0 ) -> GraphicsResource:
122+ def from_gl_buffer (cls , int gl_buffer , *, flags = None ) -> GraphicsResource:
118123 """Register an OpenGL buffer object for CUDA access.
119124
120125 Parameters
121126 ----------
122127 gl_buffer : int
123128 The OpenGL buffer name (``GLuint``) to register.
124- flags : int , optional
125- Registration flags from :class:`GraphicsRegisterFlags`.
126- Defaults to :attr:`GraphicsRegisterFlags.NONE`.
129+ flags : str or sequence of str , optional
130+ Registration flags specifying intended usage. Accepted values:
131+ ``"none"``, ``"read_only"``, ``"write_discard"``,
132+ ``"surface_load_store"``, ``"texture_gather"``.
133+ Multiple flags can be combined by passing a sequence
134+ (e.g., ``("surface_load_store", "read_only")``).
135+ Defaults to ``None`` (no flags ).
127136
128137 Returns
129138 -------
@@ -135,21 +144,24 @@ cdef class GraphicsResource:
135144 CUDAError
136145 If the registration fails (e.g., no current GL context , invalid
137146 buffer name , or operating system error ).
147+ ValueError
148+ If an unknown flag string is provided.
138149 """
139150 cdef GraphicsResource self = GraphicsResource.__new__ (cls )
140151 cdef cydriver.CUgraphicsResource resource
141152 cdef cydriver.GLuint cy_buffer = < cydriver.GLuint> gl_buffer
153+ cdef unsigned int cy_flags = _parse_register_flags(flags)
142154 with nogil:
143155 HANDLE_RETURN(
144- cydriver.cuGraphicsGLRegisterBuffer(&resource , cy_buffer , <unsigned int> flags )
156+ cydriver.cuGraphicsGLRegisterBuffer(&resource , cy_buffer , cy_flags )
145157 )
146158 self._handle = create_graphics_resource_handle(resource)
147159 self._mapped = False
148160 return self
149161
150162 @classmethod
151163 def from_gl_image(
152- cls , int image , int target , *, int flags = 0
164+ cls , int image , int target , *, flags = None
153165 ) -> GraphicsResource:
154166 """Register an OpenGL texture or renderbuffer for CUDA access.
155167
@@ -159,9 +171,13 @@ cdef class GraphicsResource:
159171 The OpenGL texture or renderbuffer name (``GLuint``) to register.
160172 target : int
161173 The OpenGL target type (e.g., ``GL_TEXTURE_2D``).
162- flags : int , optional
163- Registration flags from :class:`GraphicsRegisterFlags`.
164- Defaults to :attr:`GraphicsRegisterFlags.NONE`.
174+ flags : str or sequence of str , optional
175+ Registration flags specifying intended usage. Accepted values:
176+ ``"none"``, ``"read_only"``, ``"write_discard"``,
177+ ``"surface_load_store"``, ``"texture_gather"``.
178+ Multiple flags can be combined by passing a sequence
179+ (e.g., ``("surface_load_store", "read_only")``).
180+ Defaults to ``None`` (no flags ).
165181
166182 Returns
167183 -------
@@ -172,14 +188,17 @@ cdef class GraphicsResource:
172188 ------
173189 CUDAError
174190 If the registration fails.
191+ ValueError
192+ If an unknown flag string is provided.
175193 """
176194 cdef GraphicsResource self = GraphicsResource.__new__ (cls )
177195 cdef cydriver.CUgraphicsResource resource
178196 cdef cydriver.GLuint cy_image = < cydriver.GLuint> image
179197 cdef cydriver.GLenum cy_target = < cydriver.GLenum> target
198+ cdef unsigned int cy_flags = _parse_register_flags(flags)
180199 with nogil:
181200 HANDLE_RETURN(
182- cydriver.cuGraphicsGLRegisterImage(&resource , cy_image , cy_target , <unsigned int> flags )
201+ cydriver.cuGraphicsGLRegisterImage(&resource , cy_image , cy_target , cy_flags )
183202 )
184203 self._handle = create_graphics_resource_handle(resource)
185204 self._mapped = False
0 commit comments