Name

    EXT_extensions_string

Name Strings

    WGL_EXT_extensions_string

Version

    $Date: 1999/04/03 08:41:12 $ $Revision: 1.3 $

Number

    168

Dependencies

    None

Overview

    This extension provides a way for applications to determine which
    WGL extensions are supported by a device.  This is the foundation
    upon which other WGL extensions are built.

Issues

    Note that extensions that were previously advertised via glGetString
    (e.g., the swap interval extension) should continue to be advertised
    there so existing applications don't break.  They should also be
    advertised via wglGetExtensionsStringEXT so new applications can make
    one call to find out which WGL extensions are supported.

New Procedures and Functions

    const char *wglGetExtensionsStringEXT(void);

New Tokens

    None

Additions to Chapter 2 of the 1.2 Specification (OpenGL Operation)

    None

Additions to Chapter 3 of the 1.2 Specification (Rasterization)

    None

Additions to Chapter 4 of the 1.2 Specification (Per-Fragment Operations
and the Frame buffer)

    None

Additions to Chapter 5 of the 1.2 Specification (Special Functions)

    None

Additions to Chapter 6 of the 1.2 Specification (State and State Requests)

    None

Additions to the WGL Specification

    Advertising WGL Extensions

    Applications should call wglGetProcAddress to see whether or not
    wglGetExtensionsStringEXT is supported.  If it is supported then it
    can be used to determine which WGL extensions are supported by the device.

        const char *wglGetExtensionsString(void);

    If the function succeeds, it returns a list of supported
    extensions to WGL.  Although the contents of the string is
    implementation specific, the string will be NULL terminated and
    will contain a space-separated list of extension names. (The
    extension names themselves do not contain spaces.) If there are no
    extensions then the empty string is returned.

    If the function fails, the return value is NULL. To get extended
    error information, call GetLastError.

New State

    None

New Implementation Dependent State

    None

