/*
 * Copyright (C) 2013 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

typedef unsigned long GLenum;

[
    NoInterfaceObject,
    Conditional=WEBGL,
    DoNotCheckConstants
] interface EXTDrawBuffers {
    const GLenum COLOR_ATTACHMENT0_EXT = 0x8CE0;
    const GLenum COLOR_ATTACHMENT1_EXT = 0x8CE1;
    const GLenum COLOR_ATTACHMENT2_EXT = 0x8CE2;
    const GLenum COLOR_ATTACHMENT3_EXT = 0x8CE3;
    const GLenum COLOR_ATTACHMENT4_EXT = 0x8CE4;
    const GLenum COLOR_ATTACHMENT5_EXT = 0x8CE5;
    const GLenum COLOR_ATTACHMENT6_EXT = 0x8CE6;
    const GLenum COLOR_ATTACHMENT7_EXT = 0x8CE7;
    const GLenum COLOR_ATTACHMENT8_EXT = 0x8CE8;
    const GLenum COLOR_ATTACHMENT9_EXT = 0x8CE9;
    const GLenum COLOR_ATTACHMENT10_EXT = 0x8CEA;
    const GLenum COLOR_ATTACHMENT11_EXT = 0x8CEB;
    const GLenum COLOR_ATTACHMENT12_EXT = 0x8CEC;
    const GLenum COLOR_ATTACHMENT13_EXT = 0x8CED;
    const GLenum COLOR_ATTACHMENT14_EXT = 0x8CEE;
    const GLenum COLOR_ATTACHMENT15_EXT = 0x8CEF;

    const GLenum DRAW_BUFFER0_EXT = 0x8825;
    const GLenum DRAW_BUFFER1_EXT = 0x8826;
    const GLenum DRAW_BUFFER2_EXT = 0x8827;
    const GLenum DRAW_BUFFER3_EXT = 0x8828;
    const GLenum DRAW_BUFFER4_EXT = 0x8829;
    const GLenum DRAW_BUFFER5_EXT = 0x882A;
    const GLenum DRAW_BUFFER6_EXT = 0x882B;
    const GLenum DRAW_BUFFER7_EXT = 0x882C;
    const GLenum DRAW_BUFFER8_EXT = 0x882D;
    const GLenum DRAW_BUFFER9_EXT = 0x882E;
    const GLenum DRAW_BUFFER10_EXT = 0x882F;
    const GLenum DRAW_BUFFER11_EXT = 0x8830;
    const GLenum DRAW_BUFFER12_EXT = 0x8831;
    const GLenum DRAW_BUFFER13_EXT = 0x8832;
    const GLenum DRAW_BUFFER14_EXT = 0x8833;
    const GLenum DRAW_BUFFER15_EXT = 0x8834;

    const GLenum MAX_COLOR_ATTACHMENTS_EXT = 0x8CDF;
    const GLenum MAX_DRAW_BUFFERS_EXT = 0x8824;

    void drawBuffersEXT(sequence<GLenum> buffers);
};
