Name NVX_progress_fence Name Strings GL_NVX_progress_fence Contributors Ingo Esser, NVIDIA Joshua Schnarr, NVIDIA Ralf Biermann, NVIDIA Contact Ralf Biermann, NVIDIA corporation (rbiermann'at' nvidia.com) Status Complete. Version Last Modified Date: August 15, 2018 Author Revision: 2 Number OpenGL Extension #541 Dependencies This extension is written against the OpenGL 4.5 and OpenGL ES 3.2 specifications. This extension requires EXT_external_objects. This extension requires EXT_external_objects_win32 This extension interacts with NV_gpu_multicast. Overview This extension uses the concept of GL semaphores as defined in GL_EXT_semaphore to better coordinate operations between multiple GPU command streams. A semaphore type called "progress fence" is derived from the GL semaphore. The progress fence semaphore is created by CreateProgressFenceNVX() returning the name of a newly created semaphore object. Like other semaphores, these are signaled by the GL server. Each signal operation is queued in the GPU command stream with an associated fence value that is written to the semaphore at the completion of a signal operation. A GL server wait can be added to the command stream using WaitSemaphoreui64NVX. This blocks the GPU until the progress fence semaphore reaches or exceeds the specified fence value. A GL client wait can be initiated using ClientWaitSemaphoreui64NVX. This blocks the CPU until the specified fence value is reached. New Procedures and Functions uint CreateProgressFenceNVX(); void SignalSemaphoreui64NVX(uint signalGpu, sizei fenceObjectCount, const uint *semaphoreArray, const uint64 *fenceValueArray); void WaitSemaphoreui64NVX(uint waitGpu, sizei fenceObjectCount, const uint *semaphoreArray, const uint64 *fenceValueArray); void ClientWaitSemaphoreui64NVX(sizei fenceObjectCount, const uint *semaphoreArray, const uint64 *fenceValueArray); New Types None New Tokens None Additions to Chapter 4 of the OpenGL 4.5 Specification (Event Model) Addition to Section 4.2, "Semaphore Objects" A command uint CreateProgressFenceNVX(); creates a named progress fence semaphore object. A set of progress fence objects can be deleted by passing the names in the array to the command void DeleteSemaphoresEXT(sizei n, const uint *semaphores); Progress fence operations can be performed on named semaphore objects. The command void SignalSemaphoreui64NVX(uint signalGpu, sizei fenceObjectCount, const uint *semaphoreArray, const uint64 *fenceValueArray); SignalSemaphoreui64NVX inserts a signal operation for each of the semaphores in . Each signal writes the corresponding fence value in . If the GL context uses NV_gpu_multicast to control multiple GPUs, the parameter is required to specify the GPU that signals the fence value to the fence object. Otherwise must be 0. If a value in is not the name of a semaphore object, an INVALID_VALUE error is generated. If NV_gpu_multicast is supported, an INVALID_VALUE error is generated if is greater than or equal to MULTICAST_GPUS_NV. Otherwise, an INVALID_VALUE error is generated if != 0. The command void WaitSemaphoreui64NVX(uint waitGpu, sizei fenceObjectCount, const uint *semaphoreArray, const uint64 *fenceValueArray); inserts a wait command into the GL server command stream of a specified GPU for each of the progress fence objects in which blocks until all fence objects reach or exceed the associated fence value in . If a value in is not the name of a semaphore object, an INVALID_VALUE error is generated. The command void ClientWaitSemaphoreui64NVX(sizei fenceObjectCount, const uint *semaphoreArray, const uint64 *fenceValueArray); blocks the CPU until each of the fence objects in a specified array reaches the corresponding fence value in , respectively. If a value in is not the name of a semaphore object, an INVALID_VALUE error is generated. The commands SignalSemaphoreui64NVX, WaitSemaphoreui64NVX and ClientWaitSemaphoreui64NVX accept semaphore object names as input in that were created by CreateProgressFenceNVX or imported from a handle of the type HANDLE_TYPE_D3D12_FENCE_EXT. If a value in is not the name of such a semaphore object, an INVALID_VALUE error is generated. The command boolean IsSemaphoreEXT(uint semaphore); can be used with progress fence semaphores and returns TRUE if is the name of a semaphore as defined in EXT_external_objects. Issues 1) Are Vulkan semaphores imported via the GL_EXT_memory_object_win32 supported by GL_NVX_progress_fence as input parameters? RESOLVED: No. As Vulkan semaphores currently do not support progress fence operation, these are not compatible with progress fence semaphores. Revision History Revision 1, 2018-08-14 (Ralf Biermann) - Initial specification proposal. Revision 2, 2018-08-15 (Ralf Biermann) - Adding Vulkan semaphore limitation to Issues.