blob: f8b6ebe4cd75cf1cbbfd13c9984074dd3e01e34d [file] [log] [blame]
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 <semaphores> 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 <fenceObjectCount>
semaphores in <semaphoreArray>. Each signal writes the corresponding fence value in
<fenceValueArray>.
If the GL context uses NV_gpu_multicast to control multiple GPUs, the
<signalGpu> parameter is required to specify the GPU that signals the
fence value to the fence object. Otherwise <signalGpu> must be 0.
If a value in <semaphoreArray> 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 <signalGpu>
is greater than or equal to MULTICAST_GPUS_NV. Otherwise, an INVALID_VALUE error is
generated if <signalGpu> != 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 <waitGpu>
for each of the <fenceObjectCount> progress fence objects in <semaphoreArray> which
blocks <waitGpu> until all fence objects reach or exceed the associated fence value
in <fenceValueArray>.
If a value in <semaphoreArray> 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 <fenceObjectCount> fence objects in a
specified array <semaphoreArray> reaches the corresponding fence value
in <fenceValueArray>, respectively.
If a value in <semaphoreArray> 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
<semaphoreArray> that were created by CreateProgressFenceNVX or imported
from a handle of the type HANDLE_TYPE_D3D12_FENCE_EXT.
If a value in <semaphoreArray> 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 <semaphore>
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.