Merge pull request #296 from bquest-nvidia/GLX_NV_multigpu_context

Adding GLX_NV_multigpu_context extension
diff --git a/api/GL/glxext.h b/api/GL/glxext.h
index a6f1c0c..ea970a0 100755
--- a/api/GL/glxext.h
+++ b/api/GL/glxext.h
@@ -34,7 +34,7 @@
 **   https://github.com/KhronosGroup/OpenGL-Registry
 */
 
-#define GLX_GLXEXT_VERSION 20190728
+#define GLX_GLXEXT_VERSION 20190822
 
 /* Generated C header for:
  * API: glx
@@ -555,6 +555,15 @@
 #define GLX_FLOAT_COMPONENTS_NV           0x20B0
 #endif /* GLX_NV_float_buffer */
 
+#ifndef GLX_NV_multigpu_context
+#define GLX_NV_multigpu_context 1
+#define GLX_CONTEXT_MULTIGPU_ATTRIB_NV    0x20AA
+#define GLX_CONTEXT_MULTIGPU_ATTRIB_SINGLE_NV 0x20AB
+#define GLX_CONTEXT_MULTIGPU_ATTRIB_AFR_NV 0x20AC
+#define GLX_CONTEXT_MULTIGPU_ATTRIB_MULTICAST_NV 0x20AD
+#define GLX_CONTEXT_MULTIGPU_ATTRIB_MULTI_DISPLAY_MULTICAST_NV 0x20AE
+#endif /* GLX_NV_multigpu_context */
+
 #ifndef GLX_NV_multisample_coverage
 #define GLX_NV_multisample_coverage 1
 #define GLX_COVERAGE_SAMPLES_NV           100001
diff --git a/extensions/NV/GLX_NV_multigpu_context.txt b/extensions/NV/GLX_NV_multigpu_context.txt
new file mode 100644
index 0000000..9830311
--- /dev/null
+++ b/extensions/NV/GLX_NV_multigpu_context.txt
@@ -0,0 +1,142 @@
+Name
+
+    NV_multigpu_context
+
+Name Strings
+
+    GLX_NV_multigpu_context
+
+Contact
+
+    Ben Quest (bquest 'at' nvidia.com)
+
+Contributors
+
+    Ben Quest, NVIDIA
+    Joshua Schnarr, NVIDIA
+    Ralf Biermann, NVIDIA
+    Ingo Esser, NVIDIA
+    Robert Menzel, NVIDIA
+    James Jones, NVIDIA
+
+Notice
+
+    Copyright (c) 2019 NVIDIA
+
+Status
+
+    Complete.
+
+Version
+
+    Last Modified Date:         2019-05-17
+    Author Revision:            1
+
+Number
+
+    OpenGL Extension #545
+
+Dependencies
+
+    GLX_NV_multigpu_context is written against the GLX 1.4 and
+    GLX_ARB_create_context specifications. Both are required.
+
+    This extension interacts with NV_gpu_multicast.
+
+Overview
+
+    This extension allows the creation of an OpenGL context in a multi-GPU
+    environment with a specified multi-GPU strategy (known as SLI mode) which
+    takes precedence over process-wide multi-GPU mode settings.
+
+    The multi-GPU mode denotes vendor specific techniques to allow distributed
+    rendering on multiple GPUs, further called AFR (alternate frame rendering)
+    and Multicast (as defined in NV_gpu_multicast).
+
+    OpenGL supports multiple contexts. The semantics of switching contexts
+    is generally left to window system binding APIs such as WGL, GLX and EGL.
+    The extension GLX_NV_multigpu_context allows to specify a preferred
+    multi-GPU rendering mode per context, thus context switching can also
+    switch the current multi-GPU rendering mode.
+
+    In addition to the modes described above, this extension allows creating
+    contexts in single mode to force all rendering to be done on a single GPU,
+    and multi-display multicast mode to allow multicast rendering on a
+    multi-display configuration where displays attached to multiple GPUs are
+    linked together in a desktop configuration spanning multiple GPUs.
+
+    The implementation is platform dependent and the actual multi-GPU rendering
+    mode of the created context may vary on different hardware and operation
+    system platforms.
+
+New Procedures and Functions
+
+    None
+
+New Tokens (GLX)
+
+    Accepted as an attribute name in the <*attrib_list> argument to
+    glXCreateContextAttribsARB:
+
+        GLX_CONTEXT_MULTIGPU_ATTRIB_NV                         0x20AA
+
+    Accepted as an attribute value for GLX_CONTEXT_MULTIGPU_ATTRIB_NV in
+    the <*attrib_list> argument to glXCreateContextAttribsARB:
+
+        GLX_CONTEXT_MULTIGPU_ATTRIB_SINGLE_NV                  0x20AB
+        GLX_CONTEXT_MULTIGPU_ATTRIB_AFR_NV                     0x20AC
+        GLX_CONTEXT_MULTIGPU_ATTRIB_MULTICAST_NV               0x20AD
+        GLX_CONTEXT_MULTIGPU_ATTRIB_MULTI_DISPLAY_MULTICAST_NV 0x20AE
+
+Additions to the GLX 1.4 Specification
+
+    This extension modifies language specified in the GLX_ARB_create_context
+    extension.
+
+    Add a new paragraph to the description of glXCreateContextAttribsARB:
+
+    "The attribute name GLX_CONTEXT_MULTIGPU_ATTRIB_NV indicates the
+    preferred multi-GPU rendering mode for the OpenGL context.
+    This specified mode precedes other selected configuration settings."
+
+    Add a new context creation error to glXCreateContextAttribsARB:
+
+    "If attribute GLX_CONTEXT_MULTIGPU_ATTRIB_NV does not describe a valid and
+    supported SLI rendering mode, BadValue is generated."
+
+    Append a new paragraph to the end of section 3.5 "Rendering Contexts":
+
+    "When multiple contexts created with a multigpu context attribute are being
+    used, glXMakeCurrent and glXMakeContextCurrent will return FALSE if the
+    GLXDrawable is already current with a context using a different multigpu
+    attribute."
+
+GLX Errors
+
+    BadValue is generated if GLX_CONTEXT_MULTIGPU_ATTRIB_NV does not describe a
+    valid and supported SLI rendering mode.
+
+    GLXBadContextState is generated if glXMakeCurrent is called with a context
+    created with a different multigpu attribute than the context previously
+    current to the drawable.
+
+GLX Protocol
+
+    None
+
+New State
+
+    None
+
+Issues
+
+    All non-window-system dependent issues described in the
+    WGL_NV_multigpu_context extension specification apply equally to
+    GLX_NV_multigpu_context.
+
+Revision History
+
+ Rev.   Date      Author    Changes
+ ---- ----------  --------  ---------------------------------------------
+   1  2019-05-17  bquest    Fork from WGL_NV_multigpu_context
+
diff --git a/extensions/glext.php b/extensions/glext.php
index c0204bd..9baab5d 100644
--- a/extensions/glext.php
+++ b/extensions/glext.php
@@ -1027,4 +1027,6 @@
 </li>
 <li value=544><a href="extensions/NV/NV_shader_subgroup_partitioned.txt">GL_NV_shader_subgroup_partitioned</a>
 </li>
+<li value=545><a href="extensions/NV/GLX_NV_multigpu_context.txt">GLX_NV_multigpu_context</a>
+</li>
 </ol>
diff --git a/extensions/registry.py b/extensions/registry.py
index 1c176f4..acd3d7f 100644
--- a/extensions/registry.py
+++ b/extensions/registry.py
@@ -5544,4 +5544,10 @@
         'supporters' : { 'NVIDIA' },
         'url' : 'extensions/NV/WGL_NV_multigpu_context.txt',
     },
+    'GLX_NV_multigpu_context' : {
+        'number' : 545,
+        'flags' : { 'public' },
+        'supporters' : { 'NVIDIA' },
+        'url' : 'extensions/NV/GLX_NV_multigpu_context.txt',
+    },
 }
diff --git a/xml/glx.xml b/xml/glx.xml
index 0ce9cba..d9e504b 100644
--- a/xml/glx.xml
+++ b/xml/glx.xml
@@ -387,6 +387,11 @@
     </enums>
 
     <enums namespace="GLX" start="0x20A0" end="0x219F" vendor="NV" comment="Shared with WGL">
+        <enum value="0x20AA"        name="GLX_CONTEXT_MULTIGPU_ATTRIB_NV"/>
+        <enum value="0x20AB"        name="GLX_CONTEXT_MULTIGPU_ATTRIB_SINGLE_NV"/>
+        <enum value="0x20AC"        name="GLX_CONTEXT_MULTIGPU_ATTRIB_AFR_NV"/>
+        <enum value="0x20AD"        name="GLX_CONTEXT_MULTIGPU_ATTRIB_MULTICAST_NV"/>
+        <enum value="0x20AE"        name="GLX_CONTEXT_MULTIGPU_ATTRIB_MULTI_DISPLAY_MULTICAST_NV"/>
         <enum value="0x20B0"        name="GLX_FLOAT_COMPONENTS_NV"/>
         <enum value="0x20B1"        name="GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT"/>
         <enum value="0x20B2"        name="GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB"/>
@@ -2198,5 +2203,14 @@
                 <command name="glXGetTransparentIndexSUN"/>
             </require>
         </extension>
+        <extension name="GLX_NV_multigpu_context" supported="glx">
+            <require>
+                <enum name="GLX_CONTEXT_MULTIGPU_ATTRIB_NV"/>
+                <enum name="GLX_CONTEXT_MULTIGPU_ATTRIB_SINGLE_NV"/>
+                <enum name="GLX_CONTEXT_MULTIGPU_ATTRIB_AFR_NV"/>
+                <enum name="GLX_CONTEXT_MULTIGPU_ATTRIB_MULTICAST_NV"/>
+                <enum name="GLX_CONTEXT_MULTIGPU_ATTRIB_MULTI_DISPLAY_MULTICAST_NV"/>
+            </require>
+        </extension>
     </extensions>
 </registry>