Name

    KHR_no_error

Name Strings

    GL_KHR_no_error

Contributors

    Maurice Ribble
    Dominik Witczak
    Christophe Riccio
    Piers Daniell
    Jon Leech
    James Jones
    Daniel Kartch
    Steve Hill
    Jan-Harald Fredriksen

Contact

    Maurice Ribble (mribble 'at' qti.qualcomm.com)

Notice

    Copyright (c) 2012-2014 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL and OpenGL ES Working Groups. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

Status

    Complete.
    Approved by the Khronos Board of Promoters on May 8, 2015.

Version

    Version 6, February 25, 2015

Number

    ARB Extension #175
    OpenGL ES Extension #243

Dependencies

    Requires OpenGL ES 2.0 or OpenGL 2.0.

    Written against the OpenGL ES 3.1 specification.

    Interacts with EGL_KHR_create_context_no_error (or equivalent) extension.

    CONTEXT_FLAG_NO_ERROR_BIT_KHR is only supported if the OpenGL version has
    support for context flags (as defined in the OpenGL 4.5 core spec) or an
    extension supporting equivalent functionality is exposed.

Overview

    With this extension enabled any behavior that generates a GL error will
    have undefined behavior.  The reason this extension exists is performance
    can be increased and power usage decreased.  When this mode is used, a GL
    driver can have undefined behavior where it would have generated a GL error
    without this extension.  This could include application termination.  In
    general this extension should be used after you have verified all the GL
    errors are removed, and an application is not the kind that would check
    for GL errors and adjust behavior based on those errors.

New Procedures and Functions

    None

New Tokens

    CONTEXT_FLAG_NO_ERROR_BIT_KHR    0x00000008

Additions to the OpenGL ES Specification

    Add the following to the end of section 2.3.1 "Errors":

    If this context was created with the no error mode enabled then any place
    where the driver would have generated an error instead has undefined
    behavior.  This could include application termination.  All calls to
    GetError will return NO_ERROR or OUT_OF_MEMORY.  OUT_OF_MEMORY
    errors are a special case because they already allow for undefined behavior
    and are more difficult for application developers to predict than other
    errors.  This extension allows OUT_OF_MEMORY errors to be delayed, which
    can be useful for optimizing multithreaded drivers, but eventually the
    OUT_OF_MEMORY error should be reported if an implementation would have
    reported this error.  Since behavior of OUT_OF_MEMORY errors are undefined
    there is some implementation flexibility here.  However, this behavior may
    provide useful information on some implementations that do report
    OUT_OF_MEMORY without crashing.

    Add the following in the section that describes CONTEXT_FLAGS:

    If CONTEXT_FLAG_NO_ERROR_BIT_KHR is set in CONTEXT_FLAGS, then no error
    behavior is enabled for this context.

Errors

    None

New State

    None

Conformance Tests

    TBD

Issues

  (1) How does this extension interact with KHR_robustness and debug contexts?

  RESOLVED: The EGL/WGL/GLX layers should prevent these features from being
  enabled at the same time.  However, if they are somehow enabled at the same
  time this extension should be ignored.

  (2) Can we provide a guarantee bad usage of this API won't affect other apps
  that are running? This implies (but perhaps is not limited to) the risk of
  resource leaks (eg. If I use incorrect coordinates when executing load ops on
  images, am I guaranteed such ops will return the spec-guaranteed values or
  can I accidentally read someone else's memory?) and crashing other apps if I
  do horrendous stuff with the API.

  RESOLVED: GL already allows passing in invalid pointers in some calls that
  read or write to memory outside this apps process space.  Many drivers/OS
  models today offer protection from one process accessing memory from another
  process.  If you have that sort of protection before this extension then using
  this extension does not remove such protections.

  To put it another way this should not turn off kernel level or hardware level
  protections.

  (3) Should glGetError() always return NO_ERROR or have undefined results?

  RESOLVED: It should for all errors except OUT_OF_MEMORY.  For OUT_OF_MEMORY
  errors the error may be delayed to allow more optimization in multithreaded
  drivers, but if a driver would typically not crash and return OUT_OF_MEMORY
  then it should eventually return OUT_OF_MEMORY in this mode.  Since
  OUT_OF_MEMORY errors have undefined behavior this can't really be enforced.
  The reason OUT_OF_MEMORY errors aren't just converted to NO_ERROR like other
  errors is because some implementations don't crash on OUT_OF_MEMORY errors
  and apps can't easily predict when OUT_OF_MEMORY errors will happen so on
  these implementations apps might want to check for OUT_OF_MEMORY errors at
  certain points to see if things have gone very badly and then decide to do
  something else if they see an OUT_OF_MEMORY error.

  (4) Should we add something similar for CheckFramebufferStatus()?

  RESOLVED: NO.  It is unclear what the gain of this would be, and this is
  vendor specific behavior.  The same is true for ValidateProgram and
  ValidateProgramPipeline.  Also these features aren't as frequent as other GL
  calls so the gains from optimizing these would be much smaller.

  (5) Should there be a CONTEXT_FLAG for this behavior?

  RESOLVED: If CONTEXT_FLAGS are supported in the version of OpenGL being used
  or with an extension then yes.

Revision History

    Rev.    Date       Author     Changes
    ----  ------------ ---------  ----------------------------------------
      1   Jan 28, 2015 ribble     Initial version
      2   Jan 29, 2015 ribble     Added issues list
      3   Jan 30, 2015 ribble     Split into separate GL and EGL extensions
      4   Feb 18, 2015 ribble     Add special OOM error case and cleanup
      5   Feb 23, 2015 ribble     Add CONTEXT_FLAG issue
      6   Feb 25, 2015 ribble     Spec cleanup
