Publish NVIDIA update to NV_gpu_multicast not pushed t (#380)

* Publish NVIDIA update to NV_gpu_multicast not pushed t

  clarify that the interactions with uniform APIs only apply to
  EXT_bindable_uniform (not ARB_uniform_buffer_object).
  optionally allow MulticastCopyBufferSubDataNV with buffers lacking
  per-GPU storage

* Also fix a non-ASCII quote character.
diff --git a/extensions/NV/NV_gpu_multicast.txt b/extensions/NV/NV_gpu_multicast.txt
index 1fc2e7e..0278792 100644
--- a/extensions/NV/NV_gpu_multicast.txt
+++ b/extensions/NV/NV_gpu_multicast.txt
@@ -25,8 +25,8 @@
 
 Version
 
-    Last Modified Date:         January 3, 2019
-    Revision:                   6
+    Last Modified Date:         April 2, 2019
+    Revision:                   7
 
 Number
 
@@ -45,6 +45,8 @@
 
     This extension requires EXT_direct_state_access.
 
+    This extension interacts with EXT_bindable_uniform
+
 Overview
 
     This extension enables novel multi-GPU rendering techniques by providing application control
@@ -201,7 +203,6 @@
     The following rules apply to buffer objects with per-GPU storage:
 
       When mapped updates apply to all GPUs (only WRITE_ONLY access is supported).
-      When bound to UNIFORM_BUFFER, client uniform updates apply to all GPUs.
       When used as the write buffer for CopyBufferSubData or CopyNamedBufferSubData, writes apply
       to all GPUs.
 
@@ -212,8 +213,6 @@
     
     An INVALID_VALUE error is generated if BufferStorage/NamedBufferStorageEXT is called with
     PER_GPU_STORAGE_BIT_NV set with MAP_READ_BIT or SPARSE_STORAGE_BIT_ARB.
-    An INVALID_OPERATION is generated if a buffer with PER_GPU_STORAGE_BIT_NV is bound to
-    UNIFORM_BUFFER and GetUniformfv, GetUniformiv, GetUniformuiv or GetUniformdv is called.
 
     To modify buffer object data on one or more GPUs, the client may use the command
 
@@ -246,10 +245,28 @@
         uint readBuffer, uint writeBuffer,
         intptr readOffset, intptr writeOffset, sizeiptr size);
 
-    This command operates similarly to CopyNamedBufferSubData, with the exception that it operates
-    on per-GPU instances of the buffer object.  The read GPU index is specified by <readGpu> and
-    the set of write GPUs is specified by the mask in <writeGpuMask>.  The following errors apply
-    to MulticastCopyBufferSubDataNV:
+    This command operates similarly to CopyNamedBufferSubData, while adding control over the
+    source and destination GPU(s).  The read GPU index is specified by <readGpu> and
+    the set of write GPUs is specified by the mask in <writeGpuMask>.
+    
+    Implementations may also support this command with buffers not created with
+    PER_GPU_STORAGE_BIT_NV.  This support can be determined with one test copy with an error check
+    (see error discussion below).  Note that a buffer created without PER_GPU_STORAGE_BIT_NV is
+    considered to have undefined storage and the behavior of the command depends on the storage
+    type (per-GPU or GPU-shared) currently used for <writeBuffer>.  If <writeBuffer> is using
+    GPU-shared storage, the normal error checks apply but the command behaves as if <writeGpuMask>
+    includes all GPUs.  If <writeBuffer> is using per-GPU storage, the command behaves as if
+    PER_GPU_STORAGE_BIT_NV were set, however performance may be reduced.
+
+    This following error may apply to MulticastCopyBufferSubDataNV on some implementations and not
+    on others.  In earlier revisions of this extension the error was required, therefore
+    applications should perform a test copy using buffers without PER_GPU_STORAGE_BIT_NV before
+    relying on that functionality:
+
+    An INVALID_OPERATION error is generated if the value of BUFFER_STORAGE_FLAGS for <readBuffer>
+    or <writeBuffer> does not have PER_GPU_STORAGE_BIT_NV set.
+
+    The following errors apply to MulticastCopyBufferSubDataNV:
 
     An INVALID_OPERATION error is generated if <readBuffer> or <writeBuffer> is not the name of an
     existing buffer object.
@@ -259,8 +276,6 @@
     An INVALID_OPERATION error is generated if either the source or destination buffer objects is
     mapped, unless they were mapped with MAP_PERSISTENT_BIT set in the Map*BufferRange access
     flags.
-    An INVALID_OPERATION error is generated if the value of BUFFER_STORAGE_FLAGS for <readBuffer>
-    or <writeBuffer> does not have PER_GPU_STORAGE_BIT_NV set.
     An INVALID_VALUE error is generated if <readGpu> is greater than or equal to
     MULTICAST_GPUS_NV.
     An INVALID_OPERATION error is generated if <writeGpuMask> is zero.  An INVALID_VALUE error is
@@ -574,6 +589,15 @@
     If ARB_sparse_buffer is not supported, any reference to SPARSE_STORAGE_BIT_ARB should be
     removed.
 
+Interactions with EXT_bindable_uniform
+
+    When using the functionality of EXT_bindable_uniform and a per-GPU storage buffer is bound
+    to a bindable location in a program object, client uniform updates apply to all GPUs.
+
+    An INVALID_OPERATION is generated if a buffer with PER_GPU_STORAGE_BIT_NV is bound to a
+    program object's bindable location and GetUniformfv, GetUniformiv, GetUniformuiv or
+    GetUniformdv is called.
+
 Errors
 
     Relaxation of INVALID_ENUM errors
@@ -776,6 +800,10 @@
 
     Rev.    Date    Author    Changes
     ----  --------  --------  -----------------------------------------------
+     7    04/02/19  jschnarr  clarify that the interactions with uniform APIs only apply to
+                              EXT_bindable_uniform (not ARB_uniform_buffer_object).
+                              optionally allow MulticastCopyBufferSubDataNV with buffers lacking
+                              per-GPU storage
      6    01/03/19  jschnarr  reduce MULTICAST_GPUS_NV minimum to 1
                               clarify that MULTICAST_GPUS_NV is constant for a context
      5    10/07/16  jschnarr  trivial typo fix