Name

    EXT_multiview_tessellation_geometry_shader

Name Strings

    GL_EXT_multiview_tessellation_geometry_shader

Contact

    Robert Menzel, NVIDIA Corporation (rmenzel 'at' nvidia.com)

Contributors

    Pat Brown, NVIDIA Corporation
    Jan-Harald Fredriksen, Arm Limited
    James Helferty, NVIDIA Corporation
    Kedarnath Thangudu, NVIDIA Corporation

Status

    Complete.

Version

    Last Modified Date:  May 13, 2019
    Author Revision: 1

Number

    OpenGL Extension #538
    OpenGL ES Extension #319

Dependencies

    OpenGL 4.0 or OpenGL ES 3.2 are required.

    This extension is written against the OpenGL 4.6 specification
    (Core Profile) (February 2, 2019) and OpenGL ES 3.2 specification
    (February 2, 2019).

    This extension is written against the OpenGL ES Shading Language 3.20.05
    specification and OpenGL Shading Language 4.60.6 specification.
    
    This extension interacts with OVR_multiview2.
    
    OVR_multiview is required.

Overview

    OVR_multiview introduced multiview rendering to OpenGL and OpenGL ES.
    
    This extension removes one of the limitations of the OVR_multiview 
    extension by allowing the use of tessellation control, tessellation 
    evaluation, and geometry shaders during multiview rendering. 
    OVR_multiview by itself forbids the use of any of these shader types.
    
    When using tessellation control, tessellation evaluation, and geometry 
    shaders during multiview rendering, any such shader must use the 
    "num_views" layout qualifier provided by the matching shading language 
    extension to specify a view count. The view count specified in these 
    shaders must match the count specified in the vertex shader. Additionally, 
    the shading language extension allows these shaders to use the 
    gl_ViewID_OVR built-in to handle tessellation or geometry shader processing 
    differently for each view.
    
    OVR_multiview2 extends OVR_multiview by allowing view-dependent values
    for any vertex attributes instead of just the position. This new extension
    does not imply the availability of OVR_multiview2, but if both are available,
    view-dependent values for any vertex attributes are also allowed in 
    tessellation control, tessellation evaluation, and geometry shaders.
    
    
New Tokens

    None.

    
New Procedures and Functions

    None.
    
    
Modifications to Chapter 9 of the OpenGL ES 3.2 Specification as well as
Chapter 9 of the OpenGL 4.6 Specification (Framebuffers and Framebuffer 
Objects) 
    
    Modify the subsection 9.2.2.2 (Multiview Images) which has been added by 
    OVR_multiview:
    
    Remove from the list of restrictions ("In this mode there are several 
    restrictions:") the following items:

    "- no tessellation control or evaluation shaders (section 11.1.3.11)
    - no geometry shader (section 11.1.3.11)"
        
    effectively allowing the usage of multiview rendering with tessellation and
    geometry shaders.
    
    In the same list replace
        "- in fragment shader the contents of gl_Layer are undefined"
    with
        "- reads and writes of gl_Layer by any shaders are undefined".
    
    
Modifications to Chapter 11 of the OpenGL ES 3.2 Specification as well
as Chapter 11 of the OpenGL 4.6 Specification (Programmable Vertex Processing)

    Modify section 11.1.3.11 (Validation) by removing the following condition
    from the list of reasons that may result in an INVALID_OPERATION error
    being generated by any command that transfers vertices to the GL
    (added by OVR_multiview) after
    "Any attachment of the draw framebuffer is multiview (section 9.2.8)
      and any of the following conditions are true:":

    "- There is an active program for tessellation control, tessellation
      evaluation, or geometry stages, or".
    
    
    Modify section 11.1.3.11 (Validation) by adding the following 
    item to the bullet point list of conditions generating an INVALID_OPERATION:
        "The active program for the vertex, tessellation control, tessellation 
        evaluation, or geometry shader stages contains an executable that declared 
        a multiview view count using the "num_views" layout qualifier, but the 
        active program for another one of these stages includes an executable that 
        declared a different view count or failed to declare any view count."

    
Modifications to The OpenGL ES Shading Language Specification, Version 3.20.05
and The OpenGL Shading Language Specification, Version 4.60.6:

    Including the following line in a tessellation control, tessellation evaluation, 
    or geometry shader can be used to control the language features described in 
    this extension:

      #extension GL_EXT_multiview_tessellation_geometry_shader : <behavior>

    where <behavior> is as specified in section 3.5.

    A new preprocessor #define is added to the OpenGL ES Shading Language
    as well as the OpenGL Shading Language for those shaders:

      #define GL_EXT_multiview_tessellation_geometry_shader 1
    
    In section "Input Layout Qualifiers" a new paragraph was added by OVR_multiview
    (section 4.3.8.1 in the OpenGL ES Shading Language Specification, version 3.00.04,
    which moved to section 4.4.1 in version 3.20.05 of the OpenGL ES Shading Language 
    Specification and version 4.60.6 of the OpenGL Shading Language Specification).
    
    In this new paragraph replace
        "Vertex shaders also allow the following layout qualifier on 'in' only"
    with
        "Vertex, tessellation control, tessellation evaluation and geometry shaders 
        also allow the following layout qualifier on 'in' only".
    
    In the following paragraph of the same addition by OVR_multiview replace
        "If multiple vertex shaders attached to a
        single program object declare num_views, the declarations must be
        identical; otherwise a link-time error results."
    with
        "If multiple shaders of the same type attached to a
        single program object declare num_views, the declarations must be
        identical; otherwise a link-time error results.
        
        If any vertex, tessellation control, tessellation evaluation, or 
        geometry shader in a single program object declares a view count using 
        'num_views', at least one shader of each type present in the program must 
        declare a view count and all such declarations must match. If there is a 
        missing or mismatched view count declaration, a link-time error results."
    

Modifications to Section 7.1 "Built-in Language Variables"
    
    Replace the following paragraph added by OVR_multiview
        "Add the following to the list of built-in variables that are intrinsically
        declared in the vertex and fragment shading languages:

            in mediump uint gl_ViewID_OVR;"
    with
        "Add the following to the list of built-in variables that are intrinsically
        declared in the vertex, tessellation control, tessellation evaluation 
        geometry and fragment shading languages:

            [[ If implemented in the OpenGL ES Shading Language ]]
            in mediump uint gl_ViewID_OVR;
            
            [[ If implemented in the OpenGL Shading Language ]]
            in uint gl_ViewID_OVR;"
    

Interactions with OVR_multiview2:

    If OVR_multiview2 is supported the restriction from OVR_multiview that only
    gl_Position is allowed to depend on gl_ViewID_OVR is also lifted from the 
    tessellation control, tessellation evaluation, and geometry 
    shaders.
    
    
Issues

    (1) This extension is based on an OVR extension, why call it EXT?
    
    While started as a single vendor extension, OVR_multiview and OVR_multiview2
    are already supported by multiple vendors. This new extension also has the 
    support from multiple vendors to be specified as EXT.
    
    (2) Should the functions and tokens introduced by OVR_multiview be renamed
    to have EXT suffixes?
    
    No. While it is unusual to mix a vendor suffix with EXT in this "family" of
    extensions, the main goal of this extension is to remove restrictions of 
    OVR_multiview while keeping source code compatibiliy where possible. It is 
    up to a successor of OVR_multiview to change the names (e.g. to revisit 
    the unusual second underscore in gl_ViewID_OVR). The intent of this extension 
    is to change the functionality while "inheriting" the names of the base 
    multiview extension. 

    (3) Are separable program objects with multiview allowed?
    
    Yes. Note that when using separable program objects, each program object 
    can have its own multiview view count declared with the "num_views" layout 
    qualfiier. When using separable programs, a draw-time error will occur if 
    the view count for the programs used by the vertex, tessellation control,
    tessellation evaluation, and geometry stages don't match.
    
Revision History

      Rev.    Date    Author    Changes
      ----  --------  --------  -----------------------------------------
        1   05/13/19  rmenzel   Initial version.
