EXT_external_objects_win32

Name

EXT_external_objects_win32

Name Strings

GL_EXT_memory_object_win32
GL_EXT_semaphore_win32

Contributors

Carsten Rohde, NVIDIA
James Jones, NVIDIA
Jan-Harald Fredriksen, ARM
Jeff Juliano, NVIDIA

Contact

James Jones, NVIDIA (jajones 'at' nvidia.com)

Status

Complete

Version

Last Modified Date: June 2, 2017
Revision: 8

Number

505
OpenGL ES Extension #282

Dependencies

Written against the OpenGL 4.5 and OpenGL ES 3.2 specifications

GL_EXT_memory_object_win32 requires GL_EXT_memory_object

GL_EXT_semaphore_win32 requires GL_EXT_semaphore

Overview

Building upon the OpenGL memory object and semaphore framework
defined in EXT_external_objects, this extension enables an OpenGL
application to import a memory object or semaphore from a Win32 NT
handle or a KMT share handle.

New Procedures and Functions

If the GL_EXT_memory_object_win32 string is reported, the following
commands are added:

void ImportMemoryWin32HandleEXT(uint memory,
                                uint64 size,
                                enum handleType,
                                void *handle);

void ImportMemoryWin32NameEXT(uint memory,
                              uint64 size,
                              enum handleType,
                              const void *name);

If the GL_EXT_semaphore_win32 string is reported, the following commands
are added:

void ImportSemaphoreWin32HandleEXT(uint semaphore,
                                   enum handleType,
                                   void *handle);

void ImportSemaphoreWin32NameEXT(uint semaphore,
                                 enum handleType,
                                 const void *name);

New Tokens

The following tokens are added if either of the
GL_EXT_memory_object_win32 or GL_EXT_semaphore_win32 strings are
reported:

Accepted by the <handleType> parameter of
ImportMemoryWin32HandleEXT(), ImportMemoryWin32NameEXT(),
ImportSemaphoreWin32HandleEXT(), and ImportSemaphoreWin32NameEXT():

    HANDLE_TYPE_OPAQUE_WIN32_EXT               0x9587

Accepted by the <handleType> parameter of
ImportMemoryWin32HandleEXT() and ImportSemaphoreWin32HandleEXT():

    HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT           0x9588

Accepted by the <pname> parameter of GetBooleanv, GetDoublev, GetFloatv,
GetIntegerv, GetInteger64v, GetBooleani_v, GetIntegeri_v, GetFloati_v,
GetDoublei_v, and GetInteger64i_v:

    DEVICE_LUID_EXT                            0x9599
    DEVICE_NODE_MASK_EXT                       0x959A

Constant values:

    LUID_SIZE_EXT                              8

If the GL_EXT_memory_object_win32 string is reported, the following
tokens are added:

Accepted by the <handleType> parameter of
ImportMemoryWin32HandleEXT() and ImportMemoryWin32NameEXT():

    HANDLE_TYPE_D3D12_TILEPOOL_EXT             0x9589
    HANDLE_TYPE_D3D12_RESOURCE_EXT             0x958A
    HANDLE_TYPE_D3D11_IMAGE_EXT                0x958B

Accepted by the <handleType> parameter of
ImportMemoryWin32HandleEXT():
    HANDLE_TYPE_D3D11_IMAGE_KMT_EXT            0x958C

If the GL_EXT_semaphore_win32 string is reported, the following tokens
are added:

Accepted by the <handleType> parameter of
ImportSemaphoreWin32HandleEXT():

    HANDLE_TYPE_D3D12_FENCE_EXT                0x9594

Accepted by the <pname> parameter of SemaphoreParameterui64v() and
GetSemaphoreParameterui64v():

    D3D12_FENCE_VALUE_EXT                      0x9595

Additions to Chapter 4 of the OpenGL 4.5 Specification (Event Model)

Add the following entries to table 4.2 "Commands for importing
external semaphore handles."

    | Handle Type                      | Import commands                |
    +----------------------------------+--------------------------------+
    | HANDLE_TYPE_OPAQUE_WIN32_EXT     | ImportSemaphoreWin32HandleEXT, |
    |                                  | ImportSemaphoreWin32NameEXT    |
    | HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT | ImportSemaphoreWin32HandleEXT  |
    | HANDLE_TYPE_D3D12_FENCE_EXT      | ImportSemaphoreWin32HandleEXT, |
    |                                  | ImportSemaphoreWin32NameEXT    |
    +----------------------------------+--------------------------------+

Add the following after the second paragraph of section 4.2.1 "Importing
External Semaphore Handles into Semaphores"

    The devices in use by the current context may also be identified by
    an (LUID, node) pair.  To determine the LUID of the
    current context, call GetUnsignedBytev with <pname> set to
    DEVICE_LUID_EXT and <data> set to point to an array of LUID_SIZE_EXT
    unsigned bytes.  Following the call, <data> can be cast to a pointer
    to an LUID object that will be equal to the locally unique
    identifier of an IDXGIAdapter1 object corresponding to the adapter
    used by the current context.  To identify which individual devices
    within an adapter are used by the current context, call GetIntegerv
    with <pname> set to DEVICE_NODE_MASK_EXT.  A bitfield is returned
    with one bit set for each device node used by the current context.
    The bits set will be subset of those available on a Direct3D 12
    device created on an adapter with the same LUID as the current
    context.

Replace the paragraph in section 4.2.1 beginning "External handles
are often defined..." with the following

    The commands

        void ImportSemaphoreWin32HandleEXT(uint semaphore,
                                           enum handleType,
                                           void *handle);

        void ImportSemaphoreWin32NameEXT(uint semaphore,
                                         enum handleType,
                                         const void *name);

    import a semaphore from the win32 handle <handle> or the win32
    object name <name>.  <handle> is a windows HANDLE cast to the type
    "void*".  <name> is a NULL-terminated array of UTF-16 characters.
    What type of object <handle> or <name> refers to is determined by
    <handleType>.  Importing a Windows handle does not transfer
    ownership of the handle to the GL implementation.  For handle types
    defined as NT handles, the application must release the handle using
    an appropriate system call when it is no longer needed.

    The parameter <handle> takes the value of a windows HANDLE cast to


Add the following entries to table 4.3 "Semaphore parameters"

    | Name                  | Handle Types                | Legal Values |
    +-----------------------+-----------------------------+--------------+
    | D3D12_FENCE_VALUE_EXT | HANDLE_TYPE_D3D12_FENCE_EXT | any value    |
    +-----------------------+-----------------------------+--------------+

Add the following after the first paragraph of section 4.2.3 "Waiting
for Semaphores"

    If <semaphore> was imported from a handle of the type
    HANDLE_TYPE_D3D12_FENCE_EXT, it will reach the signaled state when
    its value is greater than or equal to the value specified by its
    D3D12_FENCE_VALUE_EXT parameter.

Add the following after the first paragraph of section 4.2.4 "Signaling
Semaphores"

    If <semaphore> was imported from a handle of the type
    HANDLE_TYPE_D3D12_FENCE_EXT, its value will be set to the value
    specified by its D3D12_FENCE_VALUE_EXT parameter when the signal
    operation completes.

Additions to Chapter 6 of the OpenGL 4.5 Specification (Memory Objects)

Add the following entry to table 6.2 "Commands for importing
external memory handles."

    | Handle Type                      | Import command              |
    +----------------------------------+-----------------------------+
    | HANDLE_TYPE_OPAQUE_WIN32_EXT     | ImportMemoryWin32HandleEXT, |
    |                                  | ImportMemoryWin32NameEXT    |
    | HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT | ImportMemoryWin32HandleEXT, |
    | HANDLE_TYPE_D3D12_TILEPOOL_EXT   | ImportMemoryWin32HandleEXT, |
    |                                  | ImportMemoryWin32NameEXT    |
    | HANDLE_TYPE_D3D12_RESOURCE_EXT   | ImportMemoryWin32HandleEXT, |
    |                                  | ImportMemoryWin32NameEXT    |
    | HANDLE_TYPE_D3D11_IMAGE_EXT      | ImportMemoryWin32HandleEXT, |
    |                                  | ImportMemoryWin32NameEXT    |
    | HANDLE_TYPE_D3D11_KMT_IMAGE_EXT  | ImportMemoryWin32HandleEXT  |
    +----------------------------------------------------------------+

Replace the paragraph in section 6.1 beginning "External handles are
often defined..." with the following

    The commands

        void ImportMemoryWin32HandleEXT(uint memory,
                                        uint64 size,
                                        enum handleType,
                                        void *handle);

        void ImportMemoryWin32NameEXT(uint memory,
                                      uint64 size,
                                      enum handleType,
                                      const void *name);

    import a memory object of length <size> from the win32 handle
    <handle> or the win32 object name <name>.  <handle> is a windows
    HANDLE cast to the type "void*".  <name> is NULL-terminated array of
    UTF-16 characters.  What type of object <handle> or <name> refers to
    is determined by <handleType>.  Importing a Windows handle does not
    transfer ownership of the handle to the GL implementation.  For
    handle types defined as NT handles, the application must release the
    handle using an appropriate system call when it is no longer needed.

Issues

1) What should the type of the <name> parameter be in the functions
   ImportMemoryWin32NameEXT() and ImportSemaphoreWin32NameEXT()?

   RESOLVED: const void*.  There is no wchar type in GL, and the issues
   with C's wchar_t make it seem undesirable to introduce one.
   Further, wchar_t isn't necessarily the correct type.  The win32 type
   LPCWSTR is the fully correct type, but using it directly would
   introduce dependencies on windows headers in glext.h.  Reusing
   GLshort or GLushort would result in a correctly sized type, but
   casting would still often be needed, and it looks non-intuitive.
   Therefore, it seems best to leave the pointer loosely typed in the
   prototype and define its type through spec language.

Revision History

Revision 8, 2017-06-02 (James Jones)
    - Added extension numbers.
    - Fixed the name of GL_HANDLE_TYPE_D3D12_RESOURCE_EXT.
    - Fixed the name -f GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT.
    - Clarified which extensions each command and token belongs to.
    - Clarified how to assign values to the "handle" import parameters.
    - Marked complete.

Revision 7, 2017-05-24 (James Jones)
    - Filled in real token values
    - Refer to the GL implementation, not the Vulkan implementation.
    - ImportSemaphoreWin32HandleEXT is used to import semaphores,
      not ImportMemoryWin32HandleEXT.
    - Added name-based object import functions.

Revision 6, 2017-04-05 (James Jones)
    - Added context device LUID and node mask queries.

Revision 5, 2017-04-04 (James Jones)
    - Clarified the effects of import operations on handles.

Revision 4, 2017-03-17 (James Jones)
    - Renamed from KHR to EXT
    - Added D3D12 fence value semaphore parameter

Revision 3, 2016-09-28 (James Jones)
    - Merged the GL_KHR_memory_object_win32 and GL_KHR_semaphore_win32
      specs.
    - Added spec body describing how to use the new commands and tokens.

Revision 2, 2016-08-15 (Jeff Juliano)
    - Clarified overview text.

Revision 1, 2016-08-05 (James Jones)
    - Initial draft.