Name

    NV_scissor_exclusive

Name Strings

    GL_NV_scissor_exclusive

Contact

    Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com)

Contributors

    Mark Kilgard, NVIDIA
    Pyarelal Knowles, NVIDIA

Status

    Shipping

Version

    Last Modified:      February 6, 2019
    Revision:           2

Number

    OpenGL Extension #529
    OpenGL ES Extension #311

Dependencies

    This extension is written against the OpenGL 4.5 Specification
    (Compatibility Profile), dated October 24, 2016.

    OpenGL 4.5 or OpenGL ES 3.2 is required.

    This extension is written against the OpenGL Shading Language
    Specification, version 4.50, dated April 14, 2016.

    This extension trivially interacts with EXT_draw_buffers2,
    EXT_transform_feedback, NV_transform_feedback, and
    EXT_direct_state_access.

    If implemented in OpenGL ES, at least one of NV_viewport_array or
    OES_viewport_array is required.

Overview

    In unextended OpenGL, applications can enable a per-viewport scissor test
    (SCISSOR_TEST) where fragments are discarded if their (x,y) coordinates
    lie outside the corresponding scissor rectangle.  In this extension, we
    provide a separate per-viewport exclusive scissor test, where fragments
    are discarded if their (x,y) coordinates lie *inside* the corresponding
    exclusive scissor rectangle.

    The regular (inclusive) scissor test and exclusive scissor test are
    orthogonal; applications can enable either or both tests for each
    viewport. If both tests are enabled, fragments will be discarded unless
    their (x,y) coordinates are both inside the regular scissor rectangle and
    outside the exclusive scissor rectangle.

New Procedures and Functions

    void ScissorExclusiveArrayvNV(uint first, sizei count, const int *v);
    void ScissorExclusiveNV(int x, int y, sizei width, sizei height);

New Tokens

    Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, by the
    <target> parameter of Enablei, Disablei, IsEnabledi, EnableIndexedEXT,
    DisableIndexedEXT, and IsEnabledIndexedEXT, and by the <pname> parameter
    of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, GetDoublev,
    GetDoubleIndexedv, GetBooleani_v, GetIntegeri_v, GetInteger64i_v,
    GetFloati_v, GetDoublei_v, GetBooleanIndexedvEXT, GetIntegerIndexedvEXT,
    and GetFloatIndexedvEXT:

        SCISSOR_TEST_EXCLUSIVE_NV                       0x9555

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

        SCISSOR_BOX_EXCLUSIVE_NV                        0x9556

Modifications to the OpenGL 4.5 Specification (Compatibility Profile)

    Insert a new section after section 14.9.2, Scissor Test (p. 560)

    14.9.3  Exclusive Scissor Test

    Like the scissor test (section 14.9.2), the exclusive scissor test
    determines if (x_w, y_w) lies outside the exclusive scissor rectangles
    defined by four values for each viewport.  These values are set with

      void ScissorExclusiveArrayvNV(uint first, sizei count, const int *v);
      void ScissorExclusiveNV(int x, int y, sizei width, sizei height);

    ScissorExclusiveArrayvNV defines a set of exclusive scissor rectangles that
    are each applied to the corresponding viewport (see section 13.6.1).
    <first> specifies the index of the first exclusive scissor rectangle to
    modify, and <count> specifies the number of scissor rectangles.  <v>
    specifies an array of 4*<count> integers, where each group of four
    integers specifies the left column, bottom row, width, and height (in that
    order) of an individual exclusive scissor rectangle.

    ScissorExclusiveNV is equivalent to calling ScissorExclusiveArrayvNV with
    <first> set to 0, <count> set to the value of MAX_VIEWPORTS, and <v>
    filled with an array of 4*MAX_VIEWPORTS integer, with each group of four
    integers set to <x>, <y>, <width>, and <height>, respectively.

    When enabled, the exclusive scissor test passes only if the fragment is
    outside the selected exclusive scissor rectangle, which is the case if
    any of the following conditions is true:

      * x_w <  left,
      * x_w >= left + width,
      * y_w <  bottom, or
      * y_w >= bottom + height.

    Otherwise, the test fails and the fragment is discarded. For points,
    lines, and polygons, the scissor rectangle for a primitive is selected in
    the same manner as the viewport (see section 13.6.1).  For bitmaps, pixel
    rectangles and buffer clears (see section 17.4.3), the scissor rectangle
    numbered zero is used for the scissor test.

      Errors

        An INVALID_VALUE error is generated by ScissorExclusiveArrayvNV if
        <first>+<count> is greater than the value of MAX_VIEWPORTS.

        An INVALID_VALUE error is generated if width or height is negative.

    The exclusive scissor test is enabled or disabled for all viewports using
    Enable or Disable with target SCISSOR_TEST_EXCLUSIVE_NV.  The test is enabled or
    disabled for a specific viewport using Enablei or Disablei with the
    constant SCISSOR_TEST_EXCLUSIVE_NV and the index of the selected viewport.
    When disabled, it is as if the exclusive scissor test always passes. The
    value of the scissor test enable for viewport <i> can be queried by
    calling IsEnabledi with target SCISSOR_TEST_EXCLUSIVE_NV and index <i>.
    The value of the exclusive scissor test enable for viewport zero may also
    be queried by calling IsEnabled with the same target, but no index
    parameter.

      Errors

        An INVALID_VALUE error is generated by Enablei, Disablei and
        IsEnabledi if target is SCISSOR_TEST_EXCLUSIVE_NV and <index> is
        greater than or equal to the value of MAX_VIEWPORTS.

    The state required for the exclusive scissor test consists of four integer
    values per viewport, and a bit indicating whether the test is enabled or
    disabled for each viewport. In the initial state for all viewports, the
    exclusive scissor test is disabled and the exclusive scissor rectangle has
    zero values for all of left, bottom, width, and height.

Interactions with EXT_draw_buffers2 or EXT_transform_feedback or
NV_transform_feedback or EXT_direct_state_access

    Ignore references to GetBooleanIndexedvEXT or GetIntegerIndexedvEXT if
    none of EXT_draw_buffers2, EXT_transform_feedback, NV_transform_feedback,
    or EXT_direct_state_access are supported.

Interactions with EXT_draw_buffers2 or EXT_direct_state_access

    Ignore references to EnableIndexedEXT, DisableIndexedEXT, and
    IsEnabledIndexedEXT if neither of EXT_draw_buffers2 or
    EXT_direct_state_access are supported.

Interactions with EXT_direct_state_access

    Ignore references to GetFloatIndexedvEXT and GetDoubleIndexedvEXT if
    EXT_direct_state_access is not supported.

Interactions with NV_viewport_array or OES_viewport_array

    If NV_viewport_array is supported, references to MAX_VIEWPORTS and
    GetFloati_v apply to MAX_VIEWPORTS_NV and GetFloati_vNV respecively.

    If OES_viewport_array is supported, references to MAX_VIEWPORTS and
    GetFloati_v apply to MAX_VIEWPORTS_OES and GetFloati_vOES respectively.

Interactions with OpenGL ES 3.2

    If implemented in OpenGL ES, remove all references to GetDoublev,
    GetDoublei_v, EnableIndexedEXT, DisableIndexedEXT, IsEnabledIndexedEXT,
    GetBooleanIndexedvEXT, GetIntegerIndexedvEXT, GetFloatIndexedvEXT and
    GetDoubleIndexedv.

    If implemented in OpenGL ES, remove all references to MAX_VIEWPORTS and
    GetFloati_v.

Additions to the AGL/GLX/WGL Specifications

    None

Errors

    Errors are described in "Errors" sections of the spec language above.

New State

    Get Value                  Type        Get Command   Initial Value   Description                    Sec     Attribute
    ------------------------   ----------  ------------  -------------   ----------------------------   -----   ---------
    SCISSOR_TEST_EXCLUSIVE_NV  16* x B     IsEnabledi    FALSE           Exclusive scissoring enabled   14.9.3  scissor/enable
    SCISSOR_BOX_EXCLUSIVE_NV   16* x 4 x Z GetIntegeri_v (0,0,0,0)       Exclusive scissor rectangles   14.9.3  scissor

New Implementation Dependent State

    None

Issues

    (1) How should we name this extension?

      RESOLVED:  NV_scissor_exclusive.  It defines scissor rectangles and
      tests that are "exclusive", where fragments pass only if they are
      outside the rectangle.

    (2) What should we use for the default values for exclusive scissor
        rectangles?

      RESOLVED:  For inclusive scissors, the default values for an OpenGL
      context are taken from the size of the drawable first used with the
      context.  While the inclusive scissor test is initially disabled, the
      default state allows for "normal" unscissored rendering to that drawable
      if the test is enabled without explicitly programming a scissor
      rectangle.

      If we used similar state for exclusive scissors, enabling the exclusive
      scissor test without programming a rectangle would scissor out all
      rendering to such drawables.  Instead, we specify the default rectangles
      as (0,0,0,0), which would cause the exclusive scissor test to discard
      nothing if enabled without programming a rectangle.  Additionally,
      this approach makes the default state independent of the drawable first
      used with the OpenGL context.

    (3) How does the exclusive scissor interact with the functionality
        of EXT_window_rectangles?

      RESOLVED:  The exclusive scissor, as with the inclusive scissor, is orthogonal
      to the window rectangles testing introduced by EXT_window_rectangles.

      The window rectangle testing applies to ALL viewports whereas the
      exclusive scissor, as with the inclusive scissor, are selected by the
      particular viewport index selected for rasterization.

      Additionally window rectangle testing is only support rendering
      to framebuffer objects (FBOs) whereas the exclusive scissor,
      as with the conventional inclusive scissor, works on all drawable.

Revision History

    Revision 2 (pknowles)
    - Add ES interactions.

    Revision 1 (pbrown)
    - Internal revisions.
