168513a70bcd92384395513322f1b801e7bf9c729Steve Block/*
268513a70bcd92384395513322f1b801e7bf9c729Steve Block * Copyright (C) 2010 Apple Inc. All rights reserved.
368513a70bcd92384395513322f1b801e7bf9c729Steve Block *
468513a70bcd92384395513322f1b801e7bf9c729Steve Block * Redistribution and use in source and binary forms, with or without
568513a70bcd92384395513322f1b801e7bf9c729Steve Block * modification, are permitted provided that the following conditions
668513a70bcd92384395513322f1b801e7bf9c729Steve Block * are met:
768513a70bcd92384395513322f1b801e7bf9c729Steve Block * 1. Redistributions of source code must retain the above copyright
868513a70bcd92384395513322f1b801e7bf9c729Steve Block *    notice, this list of conditions and the following disclaimer.
968513a70bcd92384395513322f1b801e7bf9c729Steve Block * 2. Redistributions in binary form must reproduce the above copyright
1068513a70bcd92384395513322f1b801e7bf9c729Steve Block *    notice, this list of conditions and the following disclaimer in the
1168513a70bcd92384395513322f1b801e7bf9c729Steve Block *    documentation and/or other materials provided with the distribution.
1268513a70bcd92384395513322f1b801e7bf9c729Steve Block *
1368513a70bcd92384395513322f1b801e7bf9c729Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
1468513a70bcd92384395513322f1b801e7bf9c729Steve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1568513a70bcd92384395513322f1b801e7bf9c729Steve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1668513a70bcd92384395513322f1b801e7bf9c729Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
1768513a70bcd92384395513322f1b801e7bf9c729Steve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
1868513a70bcd92384395513322f1b801e7bf9c729Steve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
1968513a70bcd92384395513322f1b801e7bf9c729Steve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2068513a70bcd92384395513322f1b801e7bf9c729Steve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
2168513a70bcd92384395513322f1b801e7bf9c729Steve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2268513a70bcd92384395513322f1b801e7bf9c729Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2368513a70bcd92384395513322f1b801e7bf9c729Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2468513a70bcd92384395513322f1b801e7bf9c729Steve Block */
2568513a70bcd92384395513322f1b801e7bf9c729Steve Block
2668513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "config.h"
2768513a70bcd92384395513322f1b801e7bf9c729Steve Block
282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEBGL)
2968513a70bcd92384395513322f1b801e7bf9c729Steve Block
3068513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "GraphicsContext3D.h"
3168513a70bcd92384395513322f1b801e7bf9c729Steve Block
3268513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "ArrayBuffer.h"
3368513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "ArrayBufferView.h"
3468513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "WebGLObject.h"
3568513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "CanvasRenderingContext.h"
3628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "Extensions3DOpenGL.h"
3768513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "Float32Array.h"
3868513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "GraphicsContext.h"
3968513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "HTMLCanvasElement.h"
4068513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "ImageBuffer.h"
412bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "ImageData.h"
4268513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "Int32Array.h"
4368513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "NotImplemented.h"
4468513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "Uint8Array.h"
452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <cstring>
462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <wtf/UnusedParam.h>
472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <wtf/text/CString.h>
4868513a70bcd92384395513322f1b801e7bf9c729Steve Block
4968513a70bcd92384395513322f1b801e7bf9c729Steve Block#if PLATFORM(MAC)
5068513a70bcd92384395513322f1b801e7bf9c729Steve Block#include <OpenGL/gl.h>
512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif PLATFORM(GTK)
522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "OpenGLShims.h"
5368513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
5468513a70bcd92384395513322f1b801e7bf9c729Steve Block
5568513a70bcd92384395513322f1b801e7bf9c729Steve Blocknamespace WebCore {
5668513a70bcd92384395513322f1b801e7bf9c729Steve Block
5768513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::validateAttributes()
5868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
592bde8e466a4451c7319e3a072d118917957d6554Steve Block    Extensions3D* extensions = getExtensions();
6068513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.stencil) {
612bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (extensions->supports("GL_EXT_packed_depth_stencil")) {
622bde8e466a4451c7319e3a072d118917957d6554Steve Block            extensions->ensureEnabled("GL_EXT_packed_depth_stencil");
632bde8e466a4451c7319e3a072d118917957d6554Steve Block            // Force depth if stencil is true.
642bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_attrs.depth = true;
6568513a70bcd92384395513322f1b801e7bf9c729Steve Block        } else
6668513a70bcd92384395513322f1b801e7bf9c729Steve Block            m_attrs.stencil = false;
6768513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
6868513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.antialias) {
6968513a70bcd92384395513322f1b801e7bf9c729Steve Block        bool isValidVendor = true;
7068513a70bcd92384395513322f1b801e7bf9c729Steve Block        // Currently in Mac we only turn on antialias if vendor is NVIDIA.
7168513a70bcd92384395513322f1b801e7bf9c729Steve Block        const char* vendor = reinterpret_cast<const char*>(::glGetString(GL_VENDOR));
7268513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (!std::strstr(vendor, "NVIDIA"))
7368513a70bcd92384395513322f1b801e7bf9c729Steve Block            isValidVendor = false;
742bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!isValidVendor || !extensions->supports("GL_ANGLE_framebuffer_multisample"))
7568513a70bcd92384395513322f1b801e7bf9c729Steve Block            m_attrs.antialias = false;
762bde8e466a4451c7319e3a072d118917957d6554Steve Block        else
772bde8e466a4451c7319e3a072d118917957d6554Steve Block            extensions->ensureEnabled("GL_ANGLE_framebuffer_multisample");
7868513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
7968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
8068513a70bcd92384395513322f1b801e7bf9c729Steve Block
812bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid GraphicsContext3D::readRenderingResults(unsigned char *pixels, int pixelsSize)
8268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
832bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (pixelsSize < m_currentWidth * m_currentHeight * 4)
8468513a70bcd92384395513322f1b801e7bf9c729Steve Block        return;
8568513a70bcd92384395513322f1b801e7bf9c729Steve Block
8668513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
8768513a70bcd92384395513322f1b801e7bf9c729Steve Block
8868513a70bcd92384395513322f1b801e7bf9c729Steve Block    bool mustRestoreFBO = false;
8968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.antialias) {
9068513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_multisampleFBO);
9168513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_fbo);
9268513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBlitFramebufferEXT(0, 0, m_currentWidth, m_currentHeight, 0, 0, m_currentWidth, m_currentHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
9368513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
9468513a70bcd92384395513322f1b801e7bf9c729Steve Block        mustRestoreFBO = true;
9568513a70bcd92384395513322f1b801e7bf9c729Steve Block    } else {
9668513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (m_boundFBO != m_fbo) {
9768513a70bcd92384395513322f1b801e7bf9c729Steve Block            mustRestoreFBO = true;
9868513a70bcd92384395513322f1b801e7bf9c729Steve Block            ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
9968513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
10068513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
10168513a70bcd92384395513322f1b801e7bf9c729Steve Block
10268513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLint packAlignment = 4;
10368513a70bcd92384395513322f1b801e7bf9c729Steve Block    bool mustRestorePackAlignment = false;
10468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGetIntegerv(GL_PACK_ALIGNMENT, &packAlignment);
10568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (packAlignment > 4) {
10668513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glPixelStorei(GL_PACK_ALIGNMENT, 4);
10768513a70bcd92384395513322f1b801e7bf9c729Steve Block        mustRestorePackAlignment = true;
10868513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
10968513a70bcd92384395513322f1b801e7bf9c729Steve Block
1102bde8e466a4451c7319e3a072d118917957d6554Steve Block    ::glReadPixels(0, 0, m_currentWidth, m_currentHeight, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, pixels);
11168513a70bcd92384395513322f1b801e7bf9c729Steve Block
11268513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (mustRestorePackAlignment)
11368513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glPixelStorei(GL_PACK_ALIGNMENT, packAlignment);
11468513a70bcd92384395513322f1b801e7bf9c729Steve Block
11568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (mustRestoreFBO)
11668513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
1172bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1182bde8e466a4451c7319e3a072d118917957d6554Steve Block
1192bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid GraphicsContext3D::paintRenderingResultsToCanvas(CanvasRenderingContext* context)
1202bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1212bde8e466a4451c7319e3a072d118917957d6554Steve Block    HTMLCanvasElement* canvas = context->canvas();
1222bde8e466a4451c7319e3a072d118917957d6554Steve Block    ImageBuffer* imageBuffer = canvas->buffer();
1232bde8e466a4451c7319e3a072d118917957d6554Steve Block
1242bde8e466a4451c7319e3a072d118917957d6554Steve Block    int rowBytes = m_currentWidth * 4;
1252bde8e466a4451c7319e3a072d118917957d6554Steve Block    int totalBytes = rowBytes * m_currentHeight;
1262bde8e466a4451c7319e3a072d118917957d6554Steve Block
1272bde8e466a4451c7319e3a072d118917957d6554Steve Block    OwnArrayPtr<unsigned char> pixels = adoptArrayPtr(new unsigned char[totalBytes]);
1282bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!pixels)
1292bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
1302bde8e466a4451c7319e3a072d118917957d6554Steve Block
1312bde8e466a4451c7319e3a072d118917957d6554Steve Block    readRenderingResults(pixels.get(), totalBytes);
1322bde8e466a4451c7319e3a072d118917957d6554Steve Block
1332bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_attrs.premultipliedAlpha) {
1342bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (int i = 0; i < totalBytes; i += 4) {
1352bde8e466a4451c7319e3a072d118917957d6554Steve Block            // Premultiply alpha
1362bde8e466a4451c7319e3a072d118917957d6554Steve Block            pixels[i + 0] = std::min(255, pixels[i + 0] * pixels[i + 3] / 255);
1372bde8e466a4451c7319e3a072d118917957d6554Steve Block            pixels[i + 1] = std::min(255, pixels[i + 1] * pixels[i + 3] / 255);
1382bde8e466a4451c7319e3a072d118917957d6554Steve Block            pixels[i + 2] = std::min(255, pixels[i + 2] * pixels[i + 3] / 255);
1392bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
1402bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
14168513a70bcd92384395513322f1b801e7bf9c729Steve Block
14268513a70bcd92384395513322f1b801e7bf9c729Steve Block    paintToCanvas(pixels.get(), m_currentWidth, m_currentHeight,
14368513a70bcd92384395513322f1b801e7bf9c729Steve Block                  canvas->width(), canvas->height(), imageBuffer->context()->platformContext());
14468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
14568513a70bcd92384395513322f1b801e7bf9c729Steve Block
1462bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<ImageData> GraphicsContext3D::paintRenderingResultsToImageData()
1472bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1482bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Reading premultiplied alpha would involve unpremultiplying, which is
1492bde8e466a4451c7319e3a072d118917957d6554Steve Block    // lossy
1502bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_attrs.premultipliedAlpha)
1512bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
1522bde8e466a4451c7319e3a072d118917957d6554Steve Block
1532bde8e466a4451c7319e3a072d118917957d6554Steve Block    RefPtr<ImageData> imageData = ImageData::create(IntSize(m_currentWidth, m_currentHeight));
1542bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned char* pixels = imageData->data()->data()->data();
1552bde8e466a4451c7319e3a072d118917957d6554Steve Block    int totalBytes = 4 * m_currentWidth * m_currentHeight;
1562bde8e466a4451c7319e3a072d118917957d6554Steve Block
1572bde8e466a4451c7319e3a072d118917957d6554Steve Block    readRenderingResults(pixels, totalBytes);
1582bde8e466a4451c7319e3a072d118917957d6554Steve Block
1592bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Convert to RGBA
1602bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (int i = 0; i < totalBytes; i += 4)
1612bde8e466a4451c7319e3a072d118917957d6554Steve Block        std::swap(pixels[i], pixels[i + 2]);
1622bde8e466a4451c7319e3a072d118917957d6554Steve Block
1632bde8e466a4451c7319e3a072d118917957d6554Steve Block    return imageData.release();
1642bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1652bde8e466a4451c7319e3a072d118917957d6554Steve Block
16668513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::reshape(int width, int height)
16768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
1682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!platformGraphicsContext3D())
169f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
170f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
171f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (width == m_currentWidth && height == m_currentHeight)
17268513a70bcd92384395513322f1b801e7bf9c729Steve Block        return;
17368513a70bcd92384395513322f1b801e7bf9c729Steve Block
17468513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_currentWidth = width;
17568513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_currentHeight = height;
17668513a70bcd92384395513322f1b801e7bf9c729Steve Block
17768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1782bde8e466a4451c7319e3a072d118917957d6554Steve Block    validateAttributes();
1792bde8e466a4451c7319e3a072d118917957d6554Steve Block
1802bde8e466a4451c7319e3a072d118917957d6554Steve Block    GLuint colorFormat, internalDepthStencilFormat = 0;
18168513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.alpha) {
1822bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_internalColorFormat = GL_RGBA8;
18368513a70bcd92384395513322f1b801e7bf9c729Steve Block        colorFormat = GL_RGBA;
18468513a70bcd92384395513322f1b801e7bf9c729Steve Block    } else {
1852bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_internalColorFormat = GL_RGB8;
18668513a70bcd92384395513322f1b801e7bf9c729Steve Block        colorFormat = GL_RGB;
18768513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
18868513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.stencil || m_attrs.depth) {
18968513a70bcd92384395513322f1b801e7bf9c729Steve Block        // We don't allow the logic where stencil is required and depth is not.
1902bde8e466a4451c7319e3a072d118917957d6554Steve Block        // See GraphicsContext3D::validateAttributes.
1912bde8e466a4451c7319e3a072d118917957d6554Steve Block
1922bde8e466a4451c7319e3a072d118917957d6554Steve Block        Extensions3D* extensions = getExtensions();
1932bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Use a 24 bit depth buffer where we know we have it
1942bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (extensions->supports("GL_EXT_packed_depth_stencil"))
19568513a70bcd92384395513322f1b801e7bf9c729Steve Block            internalDepthStencilFormat = GL_DEPTH24_STENCIL8_EXT;
19668513a70bcd92384395513322f1b801e7bf9c729Steve Block        else
19768513a70bcd92384395513322f1b801e7bf9c729Steve Block            internalDepthStencilFormat = GL_DEPTH_COMPONENT;
19868513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
19968513a70bcd92384395513322f1b801e7bf9c729Steve Block
20068513a70bcd92384395513322f1b801e7bf9c729Steve Block    bool mustRestoreFBO = false;
20168513a70bcd92384395513322f1b801e7bf9c729Steve Block
20268513a70bcd92384395513322f1b801e7bf9c729Steve Block    // resize multisample FBO
20368513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.antialias) {
20468513a70bcd92384395513322f1b801e7bf9c729Steve Block        GLint maxSampleCount;
20568513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glGetIntegerv(GL_MAX_SAMPLES_EXT, &maxSampleCount);
20668513a70bcd92384395513322f1b801e7bf9c729Steve Block        GLint sampleCount = std::min(8, maxSampleCount);
20768513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (sampleCount > maxSampleCount)
20868513a70bcd92384395513322f1b801e7bf9c729Steve Block            sampleCount = maxSampleCount;
20968513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (m_boundFBO != m_multisampleFBO) {
21068513a70bcd92384395513322f1b801e7bf9c729Steve Block            ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO);
21168513a70bcd92384395513322f1b801e7bf9c729Steve Block            mustRestoreFBO = true;
21268513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
21368513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_multisampleColorBuffer);
2142bde8e466a4451c7319e3a072d118917957d6554Steve Block        ::glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, sampleCount, m_internalColorFormat, width, height);
21568513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, m_multisampleColorBuffer);
21668513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (m_attrs.stencil || m_attrs.depth) {
21768513a70bcd92384395513322f1b801e7bf9c729Steve Block            ::glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_multisampleDepthStencilBuffer);
21868513a70bcd92384395513322f1b801e7bf9c729Steve Block            ::glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, sampleCount, internalDepthStencilFormat, width, height);
21968513a70bcd92384395513322f1b801e7bf9c729Steve Block            if (m_attrs.stencil)
22068513a70bcd92384395513322f1b801e7bf9c729Steve Block                ::glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_multisampleDepthStencilBuffer);
22168513a70bcd92384395513322f1b801e7bf9c729Steve Block            if (m_attrs.depth)
22268513a70bcd92384395513322f1b801e7bf9c729Steve Block                ::glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_multisampleDepthStencilBuffer);
22368513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
22468513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
22568513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) {
22668513a70bcd92384395513322f1b801e7bf9c729Steve Block            // FIXME: cleanup.
22768513a70bcd92384395513322f1b801e7bf9c729Steve Block            notImplemented();
22868513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
22968513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
23068513a70bcd92384395513322f1b801e7bf9c729Steve Block
23168513a70bcd92384395513322f1b801e7bf9c729Steve Block    // resize regular FBO
23268513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_boundFBO != m_fbo) {
23368513a70bcd92384395513322f1b801e7bf9c729Steve Block        mustRestoreFBO = true;
23468513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
23568513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
23668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glBindTexture(GL_TEXTURE_2D, m_texture);
2372bde8e466a4451c7319e3a072d118917957d6554Steve Block    ::glTexImage2D(GL_TEXTURE_2D, 0, m_internalColorFormat, width, height, 0, colorFormat, GL_UNSIGNED_BYTE, 0);
23868513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_texture, 0);
2392bde8e466a4451c7319e3a072d118917957d6554Steve Block    ::glBindTexture(GL_TEXTURE_2D, m_compositorTexture);
2402bde8e466a4451c7319e3a072d118917957d6554Steve Block    ::glTexImage2D(GL_TEXTURE_2D, 0, m_internalColorFormat, width, height, 0, colorFormat, GL_UNSIGNED_BYTE, 0);
24168513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glBindTexture(GL_TEXTURE_2D, 0);
24268513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!m_attrs.antialias && (m_attrs.stencil || m_attrs.depth)) {
24368513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depthStencilBuffer);
24468513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, internalDepthStencilFormat, width, height);
24568513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (m_attrs.stencil)
24668513a70bcd92384395513322f1b801e7bf9c729Steve Block            ::glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthStencilBuffer);
24768513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (m_attrs.depth)
24868513a70bcd92384395513322f1b801e7bf9c729Steve Block            ::glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthStencilBuffer);
24968513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
25068513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
25168513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) {
25268513a70bcd92384395513322f1b801e7bf9c729Steve Block        // FIXME: cleanup
25368513a70bcd92384395513322f1b801e7bf9c729Steve Block        notImplemented();
25468513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
25568513a70bcd92384395513322f1b801e7bf9c729Steve Block
25668513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.antialias) {
25768513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO);
25868513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (m_boundFBO == m_multisampleFBO)
25968513a70bcd92384395513322f1b801e7bf9c729Steve Block            mustRestoreFBO = false;
26068513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
26168513a70bcd92384395513322f1b801e7bf9c729Steve Block
26268513a70bcd92384395513322f1b801e7bf9c729Steve Block    // Initialize renderbuffers to 0.
2634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    GLfloat clearColor[] = {0, 0, 0, 0}, clearDepth = 0;
2644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    GLint clearStencil = 0;
2654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    GLboolean colorMask[] = {GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE}, depthMask = GL_TRUE;
2664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    GLuint stencilMask = 0xffffffff;
26768513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLboolean isScissorEnabled = GL_FALSE;
26868513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLboolean isDitherEnabled = GL_FALSE;
26968513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLbitfield clearMask = GL_COLOR_BUFFER_BIT;
2704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ::glGetFloatv(GL_COLOR_CLEAR_VALUE, clearColor);
2714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ::glClearColor(0, 0, 0, 0);
27268513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGetBooleanv(GL_COLOR_WRITEMASK, colorMask);
27368513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
27468513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.depth) {
2754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ::glGetFloatv(GL_DEPTH_CLEAR_VALUE, &clearDepth);
2764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ::glClearDepth(1);
27768513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glGetBooleanv(GL_DEPTH_WRITEMASK, &depthMask);
27868513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glDepthMask(GL_TRUE);
27968513a70bcd92384395513322f1b801e7bf9c729Steve Block        clearMask |= GL_DEPTH_BUFFER_BIT;
28068513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
28168513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.stencil) {
2824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ::glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &clearStencil);
2834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ::glClearStencil(0);
2844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ::glGetIntegerv(GL_STENCIL_WRITEMASK, reinterpret_cast<GLint*>(&stencilMask));
2854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ::glStencilMaskSeparate(GL_FRONT, 0xffffffff);
28668513a70bcd92384395513322f1b801e7bf9c729Steve Block        clearMask |= GL_STENCIL_BUFFER_BIT;
28768513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
28868513a70bcd92384395513322f1b801e7bf9c729Steve Block    isScissorEnabled = ::glIsEnabled(GL_SCISSOR_TEST);
28968513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glDisable(GL_SCISSOR_TEST);
29068513a70bcd92384395513322f1b801e7bf9c729Steve Block    isDitherEnabled = ::glIsEnabled(GL_DITHER);
29168513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glDisable(GL_DITHER);
29268513a70bcd92384395513322f1b801e7bf9c729Steve Block
29368513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glClear(clearMask);
29468513a70bcd92384395513322f1b801e7bf9c729Steve Block
2954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ::glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
29668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glColorMask(colorMask[0], colorMask[1], colorMask[2], colorMask[3]);
2974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (m_attrs.depth) {
2984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ::glClearDepth(clearDepth);
29968513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glDepthMask(depthMask);
3004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
3014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (m_attrs.stencil) {
3024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ::glClearStencil(clearStencil);
3034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ::glStencilMaskSeparate(GL_FRONT, stencilMask);
3044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
30568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (isScissorEnabled)
30668513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glEnable(GL_SCISSOR_TEST);
30768513a70bcd92384395513322f1b801e7bf9c729Steve Block    else
30868513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glDisable(GL_SCISSOR_TEST);
30968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (isDitherEnabled)
31068513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glEnable(GL_DITHER);
31168513a70bcd92384395513322f1b801e7bf9c729Steve Block    else
31268513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glDisable(GL_DITHER);
31368513a70bcd92384395513322f1b801e7bf9c729Steve Block
31468513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (mustRestoreFBO)
31568513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
31668513a70bcd92384395513322f1b801e7bf9c729Steve Block
31768513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glFlush();
31868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
31968513a70bcd92384395513322f1b801e7bf9c729Steve Block
320cad810f21b803229eb11403f9209855525a25d57Steve BlockIntSize GraphicsContext3D::getInternalFramebufferSize()
321cad810f21b803229eb11403f9209855525a25d57Steve Block{
322cad810f21b803229eb11403f9209855525a25d57Steve Block    return IntSize(m_currentWidth, m_currentHeight);
323cad810f21b803229eb11403f9209855525a25d57Steve Block}
324cad810f21b803229eb11403f9209855525a25d57Steve Block
32568513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::prepareTexture()
32668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
3272bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_layerComposited)
3282bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
32968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
33068513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.antialias) {
33168513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_multisampleFBO);
33268513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_fbo);
33368513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBlitFramebufferEXT(0, 0, m_currentWidth, m_currentHeight, 0, 0, m_currentWidth, m_currentHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
33468513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
3352bde8e466a4451c7319e3a072d118917957d6554Steve Block    ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
3362bde8e466a4451c7319e3a072d118917957d6554Steve Block    ::glActiveTexture(0);
3372bde8e466a4451c7319e3a072d118917957d6554Steve Block    ::glBindTexture(GL_TEXTURE_2D, m_compositorTexture);
3382bde8e466a4451c7319e3a072d118917957d6554Steve Block    ::glCopyTexImage2D(GL_TEXTURE_2D, 0, m_internalColorFormat, 0, 0, m_currentWidth, m_currentHeight, 0);
3392bde8e466a4451c7319e3a072d118917957d6554Steve Block    ::glBindTexture(GL_TEXTURE_2D, m_boundTexture0);
3402bde8e466a4451c7319e3a072d118917957d6554Steve Block    ::glActiveTexture(m_activeTexture);
3412bde8e466a4451c7319e3a072d118917957d6554Steve Block    ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
34268513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glFinish();
3432bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_layerComposited = true;
34468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
34568513a70bcd92384395513322f1b801e7bf9c729Steve Block
346cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::activeTexture(GC3Denum texture)
34768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
34868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
3492bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_activeTexture = texture;
35068513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glActiveTexture(texture);
35168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
35268513a70bcd92384395513322f1b801e7bf9c729Steve Block
35368513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::attachShader(Platform3DObject program, Platform3DObject shader)
35468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
35568513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(program);
35668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(shader);
35768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
358cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glAttachShader(program, shader);
35968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
36068513a70bcd92384395513322f1b801e7bf9c729Steve Block
361cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bindAttribLocation(Platform3DObject program, GC3Duint index, const String& name)
36268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
36368513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(program);
36468513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
365cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glBindAttribLocation(program, index, name.utf8().data());
36668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
36768513a70bcd92384395513322f1b801e7bf9c729Steve Block
368cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bindBuffer(GC3Denum target, Platform3DObject buffer)
36968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
37068513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
371cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glBindBuffer(target, buffer);
37268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
37368513a70bcd92384395513322f1b801e7bf9c729Steve Block
37468513a70bcd92384395513322f1b801e7bf9c729Steve Block
375cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bindFramebuffer(GC3Denum target, Platform3DObject buffer)
37668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
37768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
37868513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLuint fbo;
37968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (buffer)
380cad810f21b803229eb11403f9209855525a25d57Steve Block        fbo = buffer;
38168513a70bcd92384395513322f1b801e7bf9c729Steve Block    else
38268513a70bcd92384395513322f1b801e7bf9c729Steve Block        fbo = (m_attrs.antialias ? m_multisampleFBO : m_fbo);
38368513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (fbo != m_boundFBO) {
38468513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(target, fbo);
38568513a70bcd92384395513322f1b801e7bf9c729Steve Block        m_boundFBO = fbo;
38668513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
38768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
38868513a70bcd92384395513322f1b801e7bf9c729Steve Block
389cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bindRenderbuffer(GC3Denum target, Platform3DObject renderbuffer)
39068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
39168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
392cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glBindRenderbufferEXT(target, renderbuffer);
39368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
39468513a70bcd92384395513322f1b801e7bf9c729Steve Block
39568513a70bcd92384395513322f1b801e7bf9c729Steve Block
396cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bindTexture(GC3Denum target, Platform3DObject texture)
39768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
39868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
3992bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_activeTexture && target == GL_TEXTURE_2D)
4002bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_boundTexture0 = texture;
401cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glBindTexture(target, texture);
40268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
40368513a70bcd92384395513322f1b801e7bf9c729Steve Block
404cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::blendColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha)
40568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
40668513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
407cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glBlendColor(red, green, blue, alpha);
40868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
40968513a70bcd92384395513322f1b801e7bf9c729Steve Block
410cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::blendEquation(GC3Denum mode)
41168513a70bcd92384395513322f1b801e7bf9c729Steve Block{
41268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
41368513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glBlendEquation(mode);
41468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
41568513a70bcd92384395513322f1b801e7bf9c729Steve Block
416cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha)
41768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
41868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
41968513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glBlendEquationSeparate(modeRGB, modeAlpha);
42068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
42168513a70bcd92384395513322f1b801e7bf9c729Steve Block
42268513a70bcd92384395513322f1b801e7bf9c729Steve Block
423cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::blendFunc(GC3Denum sfactor, GC3Denum dfactor)
42468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
42568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
42668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glBlendFunc(sfactor, dfactor);
42768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
42868513a70bcd92384395513322f1b801e7bf9c729Steve Block
429cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha)
43068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
43168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
43268513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
43368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
43468513a70bcd92384395513322f1b801e7bf9c729Steve Block
435cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bufferData(GC3Denum target, GC3Dsizeiptr size, GC3Denum usage)
43668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
43768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
43868513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glBufferData(target, size, 0, usage);
43968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
44068513a70bcd92384395513322f1b801e7bf9c729Steve Block
441cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bufferData(GC3Denum target, GC3Dsizeiptr size, const void* data, GC3Denum usage)
44268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
44368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
44468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glBufferData(target, size, data, usage);
44568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
44668513a70bcd92384395513322f1b801e7bf9c729Steve Block
447cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr size, const void* data)
44868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
44968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
45068513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glBufferSubData(target, offset, size, data);
45168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
45268513a70bcd92384395513322f1b801e7bf9c729Steve Block
453cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Denum GraphicsContext3D::checkFramebufferStatus(GC3Denum target)
45468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
45568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
45668513a70bcd92384395513322f1b801e7bf9c729Steve Block    return ::glCheckFramebufferStatusEXT(target);
45768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
45868513a70bcd92384395513322f1b801e7bf9c729Steve Block
459cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::clearColor(GC3Dclampf r, GC3Dclampf g, GC3Dclampf b, GC3Dclampf a)
46068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
46168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
462cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glClearColor(r, g, b, a);
46368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
46468513a70bcd92384395513322f1b801e7bf9c729Steve Block
465cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::clear(GC3Dbitfield mask)
46668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
46768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
46868513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glClear(mask);
46968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
47068513a70bcd92384395513322f1b801e7bf9c729Steve Block
471cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::clearDepth(GC3Dclampf depth)
47268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
47368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
47468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glClearDepth(depth);
47568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
47668513a70bcd92384395513322f1b801e7bf9c729Steve Block
477cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::clearStencil(GC3Dint s)
47868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
47968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
48068513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glClearStencil(s);
48168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
48268513a70bcd92384395513322f1b801e7bf9c729Steve Block
483cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha)
48468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
48568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
48668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glColorMask(red, green, blue, alpha);
48768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
48868513a70bcd92384395513322f1b801e7bf9c729Steve Block
48968513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::compileShader(Platform3DObject shader)
49068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
49168513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(shader);
49268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
49368513a70bcd92384395513322f1b801e7bf9c729Steve Block
49468513a70bcd92384395513322f1b801e7bf9c729Steve Block    int GLshaderType;
49568513a70bcd92384395513322f1b801e7bf9c729Steve Block    ANGLEShaderType shaderType;
49668513a70bcd92384395513322f1b801e7bf9c729Steve Block
49768513a70bcd92384395513322f1b801e7bf9c729Steve Block    glGetShaderiv(shader, SHADER_TYPE, &GLshaderType);
49868513a70bcd92384395513322f1b801e7bf9c729Steve Block
49968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (GLshaderType == VERTEX_SHADER)
50068513a70bcd92384395513322f1b801e7bf9c729Steve Block        shaderType = SHADER_TYPE_VERTEX;
50168513a70bcd92384395513322f1b801e7bf9c729Steve Block    else if (GLshaderType == FRAGMENT_SHADER)
50268513a70bcd92384395513322f1b801e7bf9c729Steve Block        shaderType = SHADER_TYPE_FRAGMENT;
50368513a70bcd92384395513322f1b801e7bf9c729Steve Block    else
50468513a70bcd92384395513322f1b801e7bf9c729Steve Block        return; // Invalid shader type.
50568513a70bcd92384395513322f1b801e7bf9c729Steve Block
50668513a70bcd92384395513322f1b801e7bf9c729Steve Block    HashMap<Platform3DObject, ShaderSourceEntry>::iterator result = m_shaderSourceMap.find(shader);
50768513a70bcd92384395513322f1b801e7bf9c729Steve Block
50868513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (result == m_shaderSourceMap.end())
50968513a70bcd92384395513322f1b801e7bf9c729Steve Block        return;
51068513a70bcd92384395513322f1b801e7bf9c729Steve Block
51168513a70bcd92384395513322f1b801e7bf9c729Steve Block    ShaderSourceEntry& entry = result->second;
51268513a70bcd92384395513322f1b801e7bf9c729Steve Block
51368513a70bcd92384395513322f1b801e7bf9c729Steve Block    String translatedShaderSource;
51468513a70bcd92384395513322f1b801e7bf9c729Steve Block    String shaderInfoLog;
51568513a70bcd92384395513322f1b801e7bf9c729Steve Block
51668513a70bcd92384395513322f1b801e7bf9c729Steve Block    bool isValid = m_compiler.validateShaderSource(entry.source.utf8().data(), shaderType, translatedShaderSource, shaderInfoLog);
51768513a70bcd92384395513322f1b801e7bf9c729Steve Block
51868513a70bcd92384395513322f1b801e7bf9c729Steve Block    entry.log = shaderInfoLog;
51968513a70bcd92384395513322f1b801e7bf9c729Steve Block    entry.isValid = isValid;
52068513a70bcd92384395513322f1b801e7bf9c729Steve Block
52168513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!isValid)
52268513a70bcd92384395513322f1b801e7bf9c729Steve Block        return; // Shader didn't validate, don't move forward with compiling translated source
52368513a70bcd92384395513322f1b801e7bf9c729Steve Block
52468513a70bcd92384395513322f1b801e7bf9c729Steve Block    int translatedShaderLength = translatedShaderSource.length();
52568513a70bcd92384395513322f1b801e7bf9c729Steve Block
52668513a70bcd92384395513322f1b801e7bf9c729Steve Block    const CString& translatedShaderCString = translatedShaderSource.utf8();
52768513a70bcd92384395513322f1b801e7bf9c729Steve Block    const char* translatedShaderPtr = translatedShaderCString.data();
52868513a70bcd92384395513322f1b801e7bf9c729Steve Block
529cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glShaderSource(shader, 1, &translatedShaderPtr, &translatedShaderLength);
53068513a70bcd92384395513322f1b801e7bf9c729Steve Block
531cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glCompileShader(shader);
53268513a70bcd92384395513322f1b801e7bf9c729Steve Block
53368513a70bcd92384395513322f1b801e7bf9c729Steve Block    int GLCompileSuccess;
53468513a70bcd92384395513322f1b801e7bf9c729Steve Block
535cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glGetShaderiv(shader, COMPILE_STATUS, &GLCompileSuccess);
53668513a70bcd92384395513322f1b801e7bf9c729Steve Block
53768513a70bcd92384395513322f1b801e7bf9c729Steve Block    // ASSERT that ANGLE generated GLSL will be accepted by OpenGL
53868513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(GLCompileSuccess == GL_TRUE);
53968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
54068513a70bcd92384395513322f1b801e7bf9c729Steve Block
541cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border)
54268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
54368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
54468513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.antialias && m_boundFBO == m_multisampleFBO) {
54568513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_multisampleFBO);
54668513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_fbo);
54768513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBlitFramebufferEXT(x, y, x + width, y + height, x, y, x + width, y + height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
54868513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
54968513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
55068513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
55168513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.antialias && m_boundFBO == m_multisampleFBO)
55268513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO);
55368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
55468513a70bcd92384395513322f1b801e7bf9c729Steve Block
555cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
55668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
55768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
55868513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.antialias && m_boundFBO == m_multisampleFBO) {
55968513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_multisampleFBO);
56068513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_fbo);
56168513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBlitFramebufferEXT(x, y, x + width, y + height, x, y, x + width, y + height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
56268513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
56368513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
56468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
56568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.antialias && m_boundFBO == m_multisampleFBO)
56668513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO);
56768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
56868513a70bcd92384395513322f1b801e7bf9c729Steve Block
569cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::cullFace(GC3Denum mode)
57068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
57168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
57268513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glCullFace(mode);
57368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
57468513a70bcd92384395513322f1b801e7bf9c729Steve Block
575cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::depthFunc(GC3Denum func)
57668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
57768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
57868513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glDepthFunc(func);
57968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
58068513a70bcd92384395513322f1b801e7bf9c729Steve Block
581cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::depthMask(GC3Dboolean flag)
58268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
58368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
58468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glDepthMask(flag);
58568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
58668513a70bcd92384395513322f1b801e7bf9c729Steve Block
587cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::depthRange(GC3Dclampf zNear, GC3Dclampf zFar)
58868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
58968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
59068513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glDepthRange(zNear, zFar);
59168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
59268513a70bcd92384395513322f1b801e7bf9c729Steve Block
59368513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::detachShader(Platform3DObject program, Platform3DObject shader)
59468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
59568513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(program);
59668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(shader);
59768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
598cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glDetachShader(program, shader);
59968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
60068513a70bcd92384395513322f1b801e7bf9c729Steve Block
601cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::disable(GC3Denum cap)
60268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
60368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
60468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glDisable(cap);
60568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
60668513a70bcd92384395513322f1b801e7bf9c729Steve Block
607cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::disableVertexAttribArray(GC3Duint index)
60868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
60968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
61068513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glDisableVertexAttribArray(index);
61168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
61268513a70bcd92384395513322f1b801e7bf9c729Steve Block
613cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count)
61468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
61568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
61668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glDrawArrays(mode, first, count);
61768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
61868513a70bcd92384395513322f1b801e7bf9c729Steve Block
619cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset)
62068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
62168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
622cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glDrawElements(mode, count, type, reinterpret_cast<GLvoid*>(static_cast<intptr_t>(offset)));
62368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
62468513a70bcd92384395513322f1b801e7bf9c729Steve Block
625cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::enable(GC3Denum cap)
62668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
62768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
62868513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glEnable(cap);
62968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
63068513a70bcd92384395513322f1b801e7bf9c729Steve Block
631cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::enableVertexAttribArray(GC3Duint index)
63268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
63368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
63468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glEnableVertexAttribArray(index);
63568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
63668513a70bcd92384395513322f1b801e7bf9c729Steve Block
63768513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::finish()
63868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
63968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
64068513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glFinish();
64168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
64268513a70bcd92384395513322f1b801e7bf9c729Steve Block
64368513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::flush()
64468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
64568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
64668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glFlush();
64768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
64868513a70bcd92384395513322f1b801e7bf9c729Steve Block
649cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, Platform3DObject buffer)
65068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
65168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
652cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, buffer);
65368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
65468513a70bcd92384395513322f1b801e7bf9c729Steve Block
655cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject texture, GC3Dint level)
65668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
65768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
658cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glFramebufferTexture2DEXT(target, attachment, textarget, texture, level);
65968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
66068513a70bcd92384395513322f1b801e7bf9c729Steve Block
661cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::frontFace(GC3Denum mode)
66268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
66368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
66468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glFrontFace(mode);
66568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
66668513a70bcd92384395513322f1b801e7bf9c729Steve Block
667cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::generateMipmap(GC3Denum target)
66868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
66968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
67068513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGenerateMipmapEXT(target);
67168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
67268513a70bcd92384395513322f1b801e7bf9c729Steve Block
673cad810f21b803229eb11403f9209855525a25d57Steve Blockbool GraphicsContext3D::getActiveAttrib(Platform3DObject program, GC3Duint index, ActiveInfo& info)
67468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
67568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!program) {
67668513a70bcd92384395513322f1b801e7bf9c729Steve Block        synthesizeGLError(INVALID_VALUE);
67768513a70bcd92384395513322f1b801e7bf9c729Steve Block        return false;
67868513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
67968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
68068513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLint maxAttributeSize = 0;
681cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glGetProgramiv(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxAttributeSize);
68268513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLchar name[maxAttributeSize]; // GL_ACTIVE_ATTRIBUTE_MAX_LENGTH includes null termination
68368513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLsizei nameLength = 0;
68468513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLint size = 0;
68568513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLenum type = 0;
686cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glGetActiveAttrib(program, index, maxAttributeSize, &nameLength, &size, &type, name);
68768513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!nameLength)
68868513a70bcd92384395513322f1b801e7bf9c729Steve Block        return false;
68968513a70bcd92384395513322f1b801e7bf9c729Steve Block    info.name = String(name, nameLength);
69068513a70bcd92384395513322f1b801e7bf9c729Steve Block    info.type = type;
69168513a70bcd92384395513322f1b801e7bf9c729Steve Block    info.size = size;
69268513a70bcd92384395513322f1b801e7bf9c729Steve Block    return true;
69368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
69468513a70bcd92384395513322f1b801e7bf9c729Steve Block
695cad810f21b803229eb11403f9209855525a25d57Steve Blockbool GraphicsContext3D::getActiveUniform(Platform3DObject program, GC3Duint index, ActiveInfo& info)
69668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
69768513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!program) {
69868513a70bcd92384395513322f1b801e7bf9c729Steve Block        synthesizeGLError(INVALID_VALUE);
69968513a70bcd92384395513322f1b801e7bf9c729Steve Block        return false;
70068513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
70168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
70268513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLint maxUniformSize = 0;
703cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glGetProgramiv(program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxUniformSize);
70468513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLchar name[maxUniformSize]; // GL_ACTIVE_UNIFORM_MAX_LENGTH includes null termination
70568513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLsizei nameLength = 0;
70668513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLint size = 0;
70768513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLenum type = 0;
708cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glGetActiveUniform(program, index, maxUniformSize, &nameLength, &size, &type, name);
70968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!nameLength)
71068513a70bcd92384395513322f1b801e7bf9c729Steve Block        return false;
71168513a70bcd92384395513322f1b801e7bf9c729Steve Block    info.name = String(name, nameLength);
71268513a70bcd92384395513322f1b801e7bf9c729Steve Block    info.type = type;
71368513a70bcd92384395513322f1b801e7bf9c729Steve Block    info.size = size;
71468513a70bcd92384395513322f1b801e7bf9c729Steve Block    return true;
71568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
71668513a70bcd92384395513322f1b801e7bf9c729Steve Block
717cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getAttachedShaders(Platform3DObject program, GC3Dsizei maxCount, GC3Dsizei* count, Platform3DObject* shaders)
71868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
71968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!program) {
72068513a70bcd92384395513322f1b801e7bf9c729Steve Block        synthesizeGLError(INVALID_VALUE);
72168513a70bcd92384395513322f1b801e7bf9c729Steve Block        return;
72268513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
72368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
724cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glGetAttachedShaders(program, maxCount, count, shaders);
72568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
72668513a70bcd92384395513322f1b801e7bf9c729Steve Block
72768513a70bcd92384395513322f1b801e7bf9c729Steve Blockint GraphicsContext3D::getAttribLocation(Platform3DObject program, const String& name)
72868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
72968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!program)
73068513a70bcd92384395513322f1b801e7bf9c729Steve Block        return -1;
73168513a70bcd92384395513322f1b801e7bf9c729Steve Block
73268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
733cad810f21b803229eb11403f9209855525a25d57Steve Block    return ::glGetAttribLocation(program, name.utf8().data());
73468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
73568513a70bcd92384395513322f1b801e7bf9c729Steve Block
73668513a70bcd92384395513322f1b801e7bf9c729Steve BlockGraphicsContext3D::Attributes GraphicsContext3D::getContextAttributes()
73768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
73868513a70bcd92384395513322f1b801e7bf9c729Steve Block    return m_attrs;
73968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
74068513a70bcd92384395513322f1b801e7bf9c729Steve Block
741cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Denum GraphicsContext3D::getError()
74268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
74368513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_syntheticErrors.size() > 0) {
744cad810f21b803229eb11403f9209855525a25d57Steve Block        ListHashSet<GC3Denum>::iterator iter = m_syntheticErrors.begin();
745cad810f21b803229eb11403f9209855525a25d57Steve Block        GC3Denum err = *iter;
74668513a70bcd92384395513322f1b801e7bf9c729Steve Block        m_syntheticErrors.remove(iter);
74768513a70bcd92384395513322f1b801e7bf9c729Steve Block        return err;
74868513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
74968513a70bcd92384395513322f1b801e7bf9c729Steve Block
75068513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
75168513a70bcd92384395513322f1b801e7bf9c729Steve Block    return ::glGetError();
75268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
75368513a70bcd92384395513322f1b801e7bf9c729Steve Block
754cad810f21b803229eb11403f9209855525a25d57Steve BlockString GraphicsContext3D::getString(GC3Denum name)
75568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
75668513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
75768513a70bcd92384395513322f1b801e7bf9c729Steve Block    return String((const char*) ::glGetString(name));
75868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
75968513a70bcd92384395513322f1b801e7bf9c729Steve Block
760cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::hint(GC3Denum target, GC3Denum mode)
76168513a70bcd92384395513322f1b801e7bf9c729Steve Block{
76268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
76368513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glHint(target, mode);
76468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
76568513a70bcd92384395513322f1b801e7bf9c729Steve Block
766cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isBuffer(Platform3DObject buffer)
76768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
76868513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!buffer)
769cad810f21b803229eb11403f9209855525a25d57Steve Block        return GL_FALSE;
77068513a70bcd92384395513322f1b801e7bf9c729Steve Block
77168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
772cad810f21b803229eb11403f9209855525a25d57Steve Block    return ::glIsBuffer(buffer);
77368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
77468513a70bcd92384395513322f1b801e7bf9c729Steve Block
775cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isEnabled(GC3Denum cap)
77668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
77768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
77868513a70bcd92384395513322f1b801e7bf9c729Steve Block    return ::glIsEnabled(cap);
77968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
78068513a70bcd92384395513322f1b801e7bf9c729Steve Block
781cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isFramebuffer(Platform3DObject framebuffer)
78268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
78368513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!framebuffer)
784cad810f21b803229eb11403f9209855525a25d57Steve Block        return GL_FALSE;
78568513a70bcd92384395513322f1b801e7bf9c729Steve Block
78668513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
787cad810f21b803229eb11403f9209855525a25d57Steve Block    return ::glIsFramebufferEXT(framebuffer);
78868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
78968513a70bcd92384395513322f1b801e7bf9c729Steve Block
790cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isProgram(Platform3DObject program)
79168513a70bcd92384395513322f1b801e7bf9c729Steve Block{
79268513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!program)
793cad810f21b803229eb11403f9209855525a25d57Steve Block        return GL_FALSE;
79468513a70bcd92384395513322f1b801e7bf9c729Steve Block
79568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
796cad810f21b803229eb11403f9209855525a25d57Steve Block    return ::glIsProgram(program);
79768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
79868513a70bcd92384395513322f1b801e7bf9c729Steve Block
799cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isRenderbuffer(Platform3DObject renderbuffer)
80068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
80168513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!renderbuffer)
802cad810f21b803229eb11403f9209855525a25d57Steve Block        return GL_FALSE;
80368513a70bcd92384395513322f1b801e7bf9c729Steve Block
80468513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
805cad810f21b803229eb11403f9209855525a25d57Steve Block    return ::glIsRenderbufferEXT(renderbuffer);
80668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
80768513a70bcd92384395513322f1b801e7bf9c729Steve Block
808cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isShader(Platform3DObject shader)
80968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
81068513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!shader)
811cad810f21b803229eb11403f9209855525a25d57Steve Block        return GL_FALSE;
81268513a70bcd92384395513322f1b801e7bf9c729Steve Block
81368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
814cad810f21b803229eb11403f9209855525a25d57Steve Block    return ::glIsShader(shader);
81568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
81668513a70bcd92384395513322f1b801e7bf9c729Steve Block
817cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isTexture(Platform3DObject texture)
81868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
81968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!texture)
820cad810f21b803229eb11403f9209855525a25d57Steve Block        return GL_FALSE;
82168513a70bcd92384395513322f1b801e7bf9c729Steve Block
82268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
823cad810f21b803229eb11403f9209855525a25d57Steve Block    return ::glIsTexture(texture);
82468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
82568513a70bcd92384395513322f1b801e7bf9c729Steve Block
826cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::lineWidth(GC3Dfloat width)
82768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
82868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
829cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glLineWidth(width);
83068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
83168513a70bcd92384395513322f1b801e7bf9c729Steve Block
83268513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::linkProgram(Platform3DObject program)
83368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
83468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(program);
83568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
836cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glLinkProgram(program);
83768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
83868513a70bcd92384395513322f1b801e7bf9c729Steve Block
839cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::pixelStorei(GC3Denum pname, GC3Dint param)
84068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
84168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
84268513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glPixelStorei(pname, param);
84368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
84468513a70bcd92384395513322f1b801e7bf9c729Steve Block
845cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::polygonOffset(GC3Dfloat factor, GC3Dfloat units)
84668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
84768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
848cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glPolygonOffset(factor, units);
84968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
85068513a70bcd92384395513322f1b801e7bf9c729Steve Block
851cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data)
85268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
85368513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: remove the two glFlush calls when the driver bug is fixed, i.e.,
85468513a70bcd92384395513322f1b801e7bf9c729Steve Block    // all previous rendering calls should be done before reading pixels.
85568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
85668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glFlush();
85768513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.antialias && m_boundFBO == m_multisampleFBO) {
85868513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_multisampleFBO);
85968513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_fbo);
86068513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBlitFramebufferEXT(x, y, x + width, y + height, x, y, x + width, y + height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
86168513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
86268513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glFlush();
86368513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
86468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glReadPixels(x, y, width, height, format, type, data);
86568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (m_attrs.antialias && m_boundFBO == m_multisampleFBO)
86668513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO);
86768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
86868513a70bcd92384395513322f1b801e7bf9c729Steve Block
86968513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::releaseShaderCompiler()
87068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
87168513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: This is not implemented on desktop OpenGL. We need to have ifdefs for the different GL variants
87268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
87368513a70bcd92384395513322f1b801e7bf9c729Steve Block    //::glReleaseShaderCompiler();
87468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
87568513a70bcd92384395513322f1b801e7bf9c729Steve Block
876cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height)
87768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
87868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
87968513a70bcd92384395513322f1b801e7bf9c729Steve Block    switch (internalformat) {
88068513a70bcd92384395513322f1b801e7bf9c729Steve Block    case DEPTH_STENCIL:
88168513a70bcd92384395513322f1b801e7bf9c729Steve Block        internalformat = GL_DEPTH24_STENCIL8_EXT;
88268513a70bcd92384395513322f1b801e7bf9c729Steve Block        break;
88368513a70bcd92384395513322f1b801e7bf9c729Steve Block    case DEPTH_COMPONENT16:
88468513a70bcd92384395513322f1b801e7bf9c729Steve Block        internalformat = GL_DEPTH_COMPONENT;
88568513a70bcd92384395513322f1b801e7bf9c729Steve Block        break;
88668513a70bcd92384395513322f1b801e7bf9c729Steve Block    case RGBA4:
88768513a70bcd92384395513322f1b801e7bf9c729Steve Block    case RGB5_A1:
88868513a70bcd92384395513322f1b801e7bf9c729Steve Block        internalformat = GL_RGBA;
88968513a70bcd92384395513322f1b801e7bf9c729Steve Block        break;
89068513a70bcd92384395513322f1b801e7bf9c729Steve Block    case RGB565:
89168513a70bcd92384395513322f1b801e7bf9c729Steve Block        internalformat = GL_RGB;
89268513a70bcd92384395513322f1b801e7bf9c729Steve Block        break;
89368513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
89468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glRenderbufferStorageEXT(target, internalformat, width, height);
89568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
89668513a70bcd92384395513322f1b801e7bf9c729Steve Block
897cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::sampleCoverage(GC3Dclampf value, GC3Dboolean invert)
89868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
89968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
900cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glSampleCoverage(value, invert);
90168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
90268513a70bcd92384395513322f1b801e7bf9c729Steve Block
903cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
90468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
90568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
90668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glScissor(x, y, width, height);
90768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
90868513a70bcd92384395513322f1b801e7bf9c729Steve Block
90968513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::shaderSource(Platform3DObject shader, const String& string)
91068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
91168513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(shader);
91268513a70bcd92384395513322f1b801e7bf9c729Steve Block
91368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
91468513a70bcd92384395513322f1b801e7bf9c729Steve Block
91568513a70bcd92384395513322f1b801e7bf9c729Steve Block    ShaderSourceEntry entry;
91668513a70bcd92384395513322f1b801e7bf9c729Steve Block
91768513a70bcd92384395513322f1b801e7bf9c729Steve Block    entry.source = string;
91868513a70bcd92384395513322f1b801e7bf9c729Steve Block
91968513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_shaderSourceMap.set(shader, entry);
92068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
92168513a70bcd92384395513322f1b801e7bf9c729Steve Block
922cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask)
92368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
92468513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
92568513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glStencilFunc(func, ref, mask);
92668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
92768513a70bcd92384395513322f1b801e7bf9c729Steve Block
928cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask)
92968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
93068513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
93168513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glStencilFuncSeparate(face, func, ref, mask);
93268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
93368513a70bcd92384395513322f1b801e7bf9c729Steve Block
934cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::stencilMask(GC3Duint mask)
93568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
93668513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
93768513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glStencilMask(mask);
93868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
93968513a70bcd92384395513322f1b801e7bf9c729Steve Block
940cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::stencilMaskSeparate(GC3Denum face, GC3Duint mask)
94168513a70bcd92384395513322f1b801e7bf9c729Steve Block{
94268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
94368513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glStencilMaskSeparate(face, mask);
94468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
94568513a70bcd92384395513322f1b801e7bf9c729Steve Block
946cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass)
94768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
94868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
94968513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glStencilOp(fail, zfail, zpass);
95068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
95168513a70bcd92384395513322f1b801e7bf9c729Steve Block
952cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass)
95368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
95468513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
95568513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glStencilOpSeparate(face, fail, zfail, zpass);
95668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
95768513a70bcd92384395513322f1b801e7bf9c729Steve Block
958cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat value)
95968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
96068513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
961cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glTexParameterf(target, pname, value);
96268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
96368513a70bcd92384395513322f1b801e7bf9c729Steve Block
964cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::texParameteri(GC3Denum target, GC3Denum pname, GC3Dint value)
96568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
96668513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
967cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glTexParameteri(target, pname, value);
96868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
96968513a70bcd92384395513322f1b801e7bf9c729Steve Block
970cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform1f(GC3Dint location, GC3Dfloat v0)
97168513a70bcd92384395513322f1b801e7bf9c729Steve Block{
97268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
97368513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform1f(location, v0);
97468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
97568513a70bcd92384395513322f1b801e7bf9c729Steve Block
976cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform1fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
97768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
97868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
97968513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform1fv(location, size, array);
98068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
98168513a70bcd92384395513322f1b801e7bf9c729Steve Block
982cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform2f(GC3Dint location, GC3Dfloat v0, GC3Dfloat v1)
98368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
98468513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
98568513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform2f(location, v0, v1);
98668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
98768513a70bcd92384395513322f1b801e7bf9c729Steve Block
988cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform2fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
98968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
99068513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: length needs to be a multiple of 2
99168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
99268513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform2fv(location, size, array);
99368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
99468513a70bcd92384395513322f1b801e7bf9c729Steve Block
995cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform3f(GC3Dint location, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2)
99668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
99768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
99868513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform3f(location, v0, v1, v2);
99968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
100068513a70bcd92384395513322f1b801e7bf9c729Steve Block
1001cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform3fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
100268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
100368513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: length needs to be a multiple of 3
100468513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
100568513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform3fv(location, size, array);
100668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
100768513a70bcd92384395513322f1b801e7bf9c729Steve Block
1008cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform4f(GC3Dint location, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfloat v3)
100968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
101068513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
101168513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform4f(location, v0, v1, v2, v3);
101268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
101368513a70bcd92384395513322f1b801e7bf9c729Steve Block
1014cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform4fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
101568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
101668513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: length needs to be a multiple of 4
101768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
101868513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform4fv(location, size, array);
101968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
102068513a70bcd92384395513322f1b801e7bf9c729Steve Block
1021cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform1i(GC3Dint location, GC3Dint v0)
102268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
102368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
102468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform1i(location, v0);
102568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
102668513a70bcd92384395513322f1b801e7bf9c729Steve Block
1027cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform1iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
102868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
102968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
103068513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform1iv(location, size, array);
103168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
103268513a70bcd92384395513322f1b801e7bf9c729Steve Block
1033cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform2i(GC3Dint location, GC3Dint v0, GC3Dint v1)
103468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
103568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
103668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform2i(location, v0, v1);
103768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
103868513a70bcd92384395513322f1b801e7bf9c729Steve Block
1039cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform2iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
104068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
104168513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: length needs to be a multiple of 2
104268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
104368513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform2iv(location, size, array);
104468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
104568513a70bcd92384395513322f1b801e7bf9c729Steve Block
1046cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform3i(GC3Dint location, GC3Dint v0, GC3Dint v1, GC3Dint v2)
104768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
104868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
104968513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform3i(location, v0, v1, v2);
105068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
105168513a70bcd92384395513322f1b801e7bf9c729Steve Block
1052cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform3iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
105368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
105468513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: length needs to be a multiple of 3
105568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
105668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform3iv(location, size, array);
105768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
105868513a70bcd92384395513322f1b801e7bf9c729Steve Block
1059cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform4i(GC3Dint location, GC3Dint v0, GC3Dint v1, GC3Dint v2, GC3Dint v3)
106068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
106168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
106268513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform4i(location, v0, v1, v2, v3);
106368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
106468513a70bcd92384395513322f1b801e7bf9c729Steve Block
1065cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform4iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
106668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
106768513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: length needs to be a multiple of 4
106868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
106968513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniform4iv(location, size, array);
107068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
107168513a70bcd92384395513322f1b801e7bf9c729Steve Block
1072cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniformMatrix2fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* array, GC3Dsizei size)
107368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
107468513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: length needs to be a multiple of 4
107568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
107668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniformMatrix2fv(location, size, transpose, array);
107768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
107868513a70bcd92384395513322f1b801e7bf9c729Steve Block
1079cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniformMatrix3fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* array, GC3Dsizei size)
108068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
108168513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: length needs to be a multiple of 9
108268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
108368513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniformMatrix3fv(location, size, transpose, array);
108468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
108568513a70bcd92384395513322f1b801e7bf9c729Steve Block
1086cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniformMatrix4fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* array, GC3Dsizei size)
108768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
108868513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: length needs to be a multiple of 16
108968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
109068513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glUniformMatrix4fv(location, size, transpose, array);
109168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
109268513a70bcd92384395513322f1b801e7bf9c729Steve Block
109368513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::useProgram(Platform3DObject program)
109468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
109568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1096cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glUseProgram(program);
109768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
109868513a70bcd92384395513322f1b801e7bf9c729Steve Block
109968513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid GraphicsContext3D::validateProgram(Platform3DObject program)
110068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
110168513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(program);
110268513a70bcd92384395513322f1b801e7bf9c729Steve Block
110368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1104cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glValidateProgram(program);
110568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
110668513a70bcd92384395513322f1b801e7bf9c729Steve Block
1107cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib1f(GC3Duint index, GC3Dfloat v0)
110868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
110968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1110cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glVertexAttrib1f(index, v0);
111168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
111268513a70bcd92384395513322f1b801e7bf9c729Steve Block
1113cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib1fv(GC3Duint index, GC3Dfloat* array)
111468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
111568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1116cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glVertexAttrib1fv(index, array);
111768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
111868513a70bcd92384395513322f1b801e7bf9c729Steve Block
1119cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib2f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1)
112068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
112168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1122cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glVertexAttrib2f(index, v0, v1);
112368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
112468513a70bcd92384395513322f1b801e7bf9c729Steve Block
1125cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib2fv(GC3Duint index, GC3Dfloat* array)
112668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
112768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1128cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glVertexAttrib2fv(index, array);
112968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
113068513a70bcd92384395513322f1b801e7bf9c729Steve Block
1131cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib3f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2)
113268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
113368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1134cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glVertexAttrib3f(index, v0, v1, v2);
113568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
113668513a70bcd92384395513322f1b801e7bf9c729Steve Block
1137cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib3fv(GC3Duint index, GC3Dfloat* array)
113868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
113968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1140cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glVertexAttrib3fv(index, array);
114168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
114268513a70bcd92384395513322f1b801e7bf9c729Steve Block
1143cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib4f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfloat v3)
114468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
114568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1146cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glVertexAttrib4f(index, v0, v1, v2, v3);
114768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
114868513a70bcd92384395513322f1b801e7bf9c729Steve Block
1149cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib4fv(GC3Duint index, GC3Dfloat* array)
115068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
115168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1152cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glVertexAttrib4fv(index, array);
115368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
115468513a70bcd92384395513322f1b801e7bf9c729Steve Block
1155cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized, GC3Dsizei stride, GC3Dintptr offset)
115668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
115768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1158cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glVertexAttribPointer(index, size, type, normalized, stride, reinterpret_cast<GLvoid*>(static_cast<intptr_t>(offset)));
115968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
116068513a70bcd92384395513322f1b801e7bf9c729Steve Block
1161cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
116268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
116368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1164cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glViewport(x, y, width, height);
116568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
116668513a70bcd92384395513322f1b801e7bf9c729Steve Block
1167cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getBooleanv(GC3Denum pname, GC3Dboolean* value)
116868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
116968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
117068513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGetBooleanv(pname, value);
117168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
117268513a70bcd92384395513322f1b801e7bf9c729Steve Block
1173cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getBufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value)
117468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
117568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
117668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGetBufferParameteriv(target, pname, value);
117768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
117868513a70bcd92384395513322f1b801e7bf9c729Steve Block
1179cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getFloatv(GC3Denum pname, GC3Dfloat* value)
118068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
118168513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
118268513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGetFloatv(pname, value);
118368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
118468513a70bcd92384395513322f1b801e7bf9c729Steve Block
1185cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getFramebufferAttachmentParameteriv(GC3Denum target, GC3Denum attachment, GC3Denum pname, GC3Dint* value)
118668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
118768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
118868513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (attachment == DEPTH_STENCIL_ATTACHMENT)
118968513a70bcd92384395513322f1b801e7bf9c729Steve Block        attachment = DEPTH_ATTACHMENT; // Or STENCIL_ATTACHMENT, either works.
119068513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, value);
119168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
119268513a70bcd92384395513322f1b801e7bf9c729Steve Block
1193cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getIntegerv(GC3Denum pname, GC3Dint* value)
119468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
119568513a70bcd92384395513322f1b801e7bf9c729Steve Block    // Need to emulate MAX_FRAGMENT/VERTEX_UNIFORM_VECTORS and MAX_VARYING_VECTORS
119668513a70bcd92384395513322f1b801e7bf9c729Steve Block    // because desktop GL's corresponding queries return the number of components
119768513a70bcd92384395513322f1b801e7bf9c729Steve Block    // whereas GLES2 return the number of vectors (each vector has 4 components).
119868513a70bcd92384395513322f1b801e7bf9c729Steve Block    // Therefore, the value returned by desktop GL needs to be divided by 4.
119968513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
120068513a70bcd92384395513322f1b801e7bf9c729Steve Block    switch (pname) {
120168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case MAX_FRAGMENT_UNIFORM_VECTORS:
120268513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, value);
120368513a70bcd92384395513322f1b801e7bf9c729Steve Block        *value /= 4;
120468513a70bcd92384395513322f1b801e7bf9c729Steve Block        break;
120568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case MAX_VERTEX_UNIFORM_VECTORS:
120668513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, value);
120768513a70bcd92384395513322f1b801e7bf9c729Steve Block        *value /= 4;
120868513a70bcd92384395513322f1b801e7bf9c729Steve Block        break;
120968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case MAX_VARYING_VECTORS:
121068513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glGetIntegerv(GL_MAX_VARYING_FLOATS, value);
121168513a70bcd92384395513322f1b801e7bf9c729Steve Block        *value /= 4;
121268513a70bcd92384395513322f1b801e7bf9c729Steve Block        break;
121368513a70bcd92384395513322f1b801e7bf9c729Steve Block    default:
121468513a70bcd92384395513322f1b801e7bf9c729Steve Block        ::glGetIntegerv(pname, value);
121568513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
121668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
121768513a70bcd92384395513322f1b801e7bf9c729Steve Block
1218cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getProgramiv(Platform3DObject program, GC3Denum pname, GC3Dint* value)
121968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
122068513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1221cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glGetProgramiv(program, pname, value);
122268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
122368513a70bcd92384395513322f1b801e7bf9c729Steve Block
122468513a70bcd92384395513322f1b801e7bf9c729Steve BlockString GraphicsContext3D::getProgramInfoLog(Platform3DObject program)
122568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
122668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(program);
122768513a70bcd92384395513322f1b801e7bf9c729Steve Block
122868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
122968513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLint length;
1230cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);
1231a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!length)
1232a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return "";
1233a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
123468513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLsizei size;
123568513a70bcd92384395513322f1b801e7bf9c729Steve Block    GLchar* info = (GLchar*) fastMalloc(length);
123668513a70bcd92384395513322f1b801e7bf9c729Steve Block
1237cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glGetProgramInfoLog(program, length, &size, info);
123868513a70bcd92384395513322f1b801e7bf9c729Steve Block    String s(info);
123968513a70bcd92384395513322f1b801e7bf9c729Steve Block    fastFree(info);
124068513a70bcd92384395513322f1b801e7bf9c729Steve Block    return s;
124168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
124268513a70bcd92384395513322f1b801e7bf9c729Steve Block
1243cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getRenderbufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value)
124468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
124568513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
124668513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGetRenderbufferParameterivEXT(target, pname, value);
124768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
124868513a70bcd92384395513322f1b801e7bf9c729Steve Block
1249cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getShaderiv(Platform3DObject shader, GC3Denum pname, GC3Dint* value)
125068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
125168513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(shader);
125268513a70bcd92384395513322f1b801e7bf9c729Steve Block
125368513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
125468513a70bcd92384395513322f1b801e7bf9c729Steve Block
125568513a70bcd92384395513322f1b801e7bf9c729Steve Block    HashMap<Platform3DObject, ShaderSourceEntry>::iterator result = m_shaderSourceMap.find(shader);
125668513a70bcd92384395513322f1b801e7bf9c729Steve Block
125768513a70bcd92384395513322f1b801e7bf9c729Steve Block    switch (pname) {
125868513a70bcd92384395513322f1b801e7bf9c729Steve Block        case DELETE_STATUS:
125968513a70bcd92384395513322f1b801e7bf9c729Steve Block        case SHADER_TYPE:
126068513a70bcd92384395513322f1b801e7bf9c729Steve Block            // Let OpenGL handle these.
126168513a70bcd92384395513322f1b801e7bf9c729Steve Block
1262cad810f21b803229eb11403f9209855525a25d57Steve Block            ::glGetShaderiv(shader, pname, value);
126368513a70bcd92384395513322f1b801e7bf9c729Steve Block            break;
126468513a70bcd92384395513322f1b801e7bf9c729Steve Block
126568513a70bcd92384395513322f1b801e7bf9c729Steve Block        case COMPILE_STATUS:
126668513a70bcd92384395513322f1b801e7bf9c729Steve Block            if (result == m_shaderSourceMap.end()) {
126768513a70bcd92384395513322f1b801e7bf9c729Steve Block                (*value) = static_cast<int>(false);
126868513a70bcd92384395513322f1b801e7bf9c729Steve Block                return;
126968513a70bcd92384395513322f1b801e7bf9c729Steve Block            }
127068513a70bcd92384395513322f1b801e7bf9c729Steve Block
127168513a70bcd92384395513322f1b801e7bf9c729Steve Block            (*value) = static_cast<int>(result->second.isValid);
127268513a70bcd92384395513322f1b801e7bf9c729Steve Block            break;
127368513a70bcd92384395513322f1b801e7bf9c729Steve Block
127468513a70bcd92384395513322f1b801e7bf9c729Steve Block        case INFO_LOG_LENGTH:
127568513a70bcd92384395513322f1b801e7bf9c729Steve Block            if (result == m_shaderSourceMap.end()) {
127668513a70bcd92384395513322f1b801e7bf9c729Steve Block                (*value) = 0;
127768513a70bcd92384395513322f1b801e7bf9c729Steve Block                return;
127868513a70bcd92384395513322f1b801e7bf9c729Steve Block            }
127968513a70bcd92384395513322f1b801e7bf9c729Steve Block
128068513a70bcd92384395513322f1b801e7bf9c729Steve Block            (*value) = getShaderInfoLog(shader).length();
128168513a70bcd92384395513322f1b801e7bf9c729Steve Block            break;
128268513a70bcd92384395513322f1b801e7bf9c729Steve Block
128368513a70bcd92384395513322f1b801e7bf9c729Steve Block        case SHADER_SOURCE_LENGTH:
128468513a70bcd92384395513322f1b801e7bf9c729Steve Block            (*value) = getShaderSource(shader).length();
128568513a70bcd92384395513322f1b801e7bf9c729Steve Block            break;
128668513a70bcd92384395513322f1b801e7bf9c729Steve Block
128768513a70bcd92384395513322f1b801e7bf9c729Steve Block        default:
128868513a70bcd92384395513322f1b801e7bf9c729Steve Block            synthesizeGLError(INVALID_ENUM);
128968513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
129068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
129168513a70bcd92384395513322f1b801e7bf9c729Steve Block
129268513a70bcd92384395513322f1b801e7bf9c729Steve BlockString GraphicsContext3D::getShaderInfoLog(Platform3DObject shader)
129368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
129468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(shader);
129568513a70bcd92384395513322f1b801e7bf9c729Steve Block
129668513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
129768513a70bcd92384395513322f1b801e7bf9c729Steve Block
129868513a70bcd92384395513322f1b801e7bf9c729Steve Block    HashMap<Platform3DObject, ShaderSourceEntry>::iterator result = m_shaderSourceMap.find(shader);
129968513a70bcd92384395513322f1b801e7bf9c729Steve Block
130068513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (result == m_shaderSourceMap.end())
130168513a70bcd92384395513322f1b801e7bf9c729Steve Block         return "";
130268513a70bcd92384395513322f1b801e7bf9c729Steve Block
130368513a70bcd92384395513322f1b801e7bf9c729Steve Block     ShaderSourceEntry entry = result->second;
130468513a70bcd92384395513322f1b801e7bf9c729Steve Block
130568513a70bcd92384395513322f1b801e7bf9c729Steve Block     if (entry.isValid) {
130668513a70bcd92384395513322f1b801e7bf9c729Steve Block         GLint length;
1307cad810f21b803229eb11403f9209855525a25d57Steve Block         ::glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
1308a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         if (!length)
1309a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch             return "";
131068513a70bcd92384395513322f1b801e7bf9c729Steve Block
131168513a70bcd92384395513322f1b801e7bf9c729Steve Block         GLsizei size;
131268513a70bcd92384395513322f1b801e7bf9c729Steve Block         GLchar* info = (GLchar*) fastMalloc(length);
131368513a70bcd92384395513322f1b801e7bf9c729Steve Block
1314cad810f21b803229eb11403f9209855525a25d57Steve Block         ::glGetShaderInfoLog(shader, length, &size, info);
131568513a70bcd92384395513322f1b801e7bf9c729Steve Block
131668513a70bcd92384395513322f1b801e7bf9c729Steve Block         String s(info);
131768513a70bcd92384395513322f1b801e7bf9c729Steve Block         fastFree(info);
131868513a70bcd92384395513322f1b801e7bf9c729Steve Block         return s;
1319a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch     } else
132068513a70bcd92384395513322f1b801e7bf9c729Steve Block         return entry.log;
132168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
132268513a70bcd92384395513322f1b801e7bf9c729Steve Block
132368513a70bcd92384395513322f1b801e7bf9c729Steve BlockString GraphicsContext3D::getShaderSource(Platform3DObject shader)
132468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
132568513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(shader);
132668513a70bcd92384395513322f1b801e7bf9c729Steve Block
132768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
132868513a70bcd92384395513322f1b801e7bf9c729Steve Block
132968513a70bcd92384395513322f1b801e7bf9c729Steve Block    HashMap<Platform3DObject, ShaderSourceEntry>::iterator result = m_shaderSourceMap.find(shader);
133068513a70bcd92384395513322f1b801e7bf9c729Steve Block
133168513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (result == m_shaderSourceMap.end())
133268513a70bcd92384395513322f1b801e7bf9c729Steve Block        return "";
133368513a70bcd92384395513322f1b801e7bf9c729Steve Block
133468513a70bcd92384395513322f1b801e7bf9c729Steve Block    return result->second.source;
133568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
133668513a70bcd92384395513322f1b801e7bf9c729Steve Block
133768513a70bcd92384395513322f1b801e7bf9c729Steve Block
1338cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getTexParameterfv(GC3Denum target, GC3Denum pname, GC3Dfloat* value)
133968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
134068513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
134168513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGetTexParameterfv(target, pname, value);
134268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
134368513a70bcd92384395513322f1b801e7bf9c729Steve Block
1344cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getTexParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value)
134568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
134668513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
134768513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGetTexParameteriv(target, pname, value);
134868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
134968513a70bcd92384395513322f1b801e7bf9c729Steve Block
1350cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value)
135168513a70bcd92384395513322f1b801e7bf9c729Steve Block{
135268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1353cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glGetUniformfv(program, location, value);
135468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
135568513a70bcd92384395513322f1b801e7bf9c729Steve Block
1356cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getUniformiv(Platform3DObject program, GC3Dint location, GC3Dint* value)
135768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
135868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1359cad810f21b803229eb11403f9209855525a25d57Steve Block    ::glGetUniformiv(program, location, value);
136068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
136168513a70bcd92384395513322f1b801e7bf9c729Steve Block
1362cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dint GraphicsContext3D::getUniformLocation(Platform3DObject program, const String& name)
136368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
136468513a70bcd92384395513322f1b801e7bf9c729Steve Block    ASSERT(program);
136568513a70bcd92384395513322f1b801e7bf9c729Steve Block
136668513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1367cad810f21b803229eb11403f9209855525a25d57Steve Block    return ::glGetUniformLocation(program, name.utf8().data());
136868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
136968513a70bcd92384395513322f1b801e7bf9c729Steve Block
1370cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getVertexAttribfv(GC3Duint index, GC3Denum pname, GC3Dfloat* value)
137168513a70bcd92384395513322f1b801e7bf9c729Steve Block{
137268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
137368513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGetVertexAttribfv(index, pname, value);
137468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
137568513a70bcd92384395513322f1b801e7bf9c729Steve Block
1376cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getVertexAttribiv(GC3Duint index, GC3Denum pname, GC3Dint* value)
137768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
137868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
137968513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGetVertexAttribiv(index, pname, value);
138068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
138168513a70bcd92384395513322f1b801e7bf9c729Steve Block
1382cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dsizeiptr GraphicsContext3D::getVertexAttribOffset(GC3Duint index, GC3Denum pname)
138368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
138468513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
138568513a70bcd92384395513322f1b801e7bf9c729Steve Block
1386cad810f21b803229eb11403f9209855525a25d57Steve Block    GLvoid* pointer = 0;
138768513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glGetVertexAttribPointerv(index, pname, &pointer);
1388cad810f21b803229eb11403f9209855525a25d57Steve Block    return static_cast<GC3Dsizeiptr>(reinterpret_cast<intptr_t>(pointer));
138968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
139068513a70bcd92384395513322f1b801e7bf9c729Steve Block
1391cad810f21b803229eb11403f9209855525a25d57Steve Blockbool GraphicsContext3D::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels)
139268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
1393f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (width && height && !pixels) {
1394f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        synthesizeGLError(INVALID_VALUE);
1395cad810f21b803229eb11403f9209855525a25d57Steve Block        return false;
1396f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
139768513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1398cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Denum openGLInternalFormat = internalformat;
1399f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (type == GL_FLOAT) {
1400f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (format == GL_RGBA)
1401f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            openGLInternalFormat = GL_RGBA32F_ARB;
1402f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        else if (format == GL_RGB)
1403f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            openGLInternalFormat = GL_RGB32F_ARB;
1404f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
140568513a70bcd92384395513322f1b801e7bf9c729Steve Block
1406f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    ::glTexImage2D(target, level, openGLInternalFormat, width, height, border, format, type, pixels);
1407cad810f21b803229eb11403f9209855525a25d57Steve Block    return true;
140868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
140968513a70bcd92384395513322f1b801e7bf9c729Steve Block
1410cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoff, GC3Dint yoff, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels)
141168513a70bcd92384395513322f1b801e7bf9c729Steve Block{
141268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
141368513a70bcd92384395513322f1b801e7bf9c729Steve Block
141468513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: we will need to deal with PixelStore params when dealing with image buffers that differ from the subimage size
141568513a70bcd92384395513322f1b801e7bf9c729Steve Block    ::glTexSubImage2D(target, level, xoff, yoff, width, height, format, type, pixels);
141668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
141768513a70bcd92384395513322f1b801e7bf9c729Steve Block
1418cad810f21b803229eb11403f9209855525a25d57Steve BlockPlatform3DObject GraphicsContext3D::createBuffer()
141968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
142068513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1421cad810f21b803229eb11403f9209855525a25d57Steve Block    GLuint o = 0;
142268513a70bcd92384395513322f1b801e7bf9c729Steve Block    glGenBuffers(1, &o);
142368513a70bcd92384395513322f1b801e7bf9c729Steve Block    return o;
142468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
142568513a70bcd92384395513322f1b801e7bf9c729Steve Block
1426cad810f21b803229eb11403f9209855525a25d57Steve BlockPlatform3DObject GraphicsContext3D::createFramebuffer()
142768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
142868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1429cad810f21b803229eb11403f9209855525a25d57Steve Block    GLuint o = 0;
143068513a70bcd92384395513322f1b801e7bf9c729Steve Block    glGenFramebuffersEXT(1, &o);
143168513a70bcd92384395513322f1b801e7bf9c729Steve Block    return o;
143268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
143368513a70bcd92384395513322f1b801e7bf9c729Steve Block
1434cad810f21b803229eb11403f9209855525a25d57Steve BlockPlatform3DObject GraphicsContext3D::createProgram()
143568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
143668513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
143768513a70bcd92384395513322f1b801e7bf9c729Steve Block    return glCreateProgram();
143868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
143968513a70bcd92384395513322f1b801e7bf9c729Steve Block
1440cad810f21b803229eb11403f9209855525a25d57Steve BlockPlatform3DObject GraphicsContext3D::createRenderbuffer()
144168513a70bcd92384395513322f1b801e7bf9c729Steve Block{
144268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1443cad810f21b803229eb11403f9209855525a25d57Steve Block    GLuint o = 0;
144468513a70bcd92384395513322f1b801e7bf9c729Steve Block    glGenRenderbuffersEXT(1, &o);
144568513a70bcd92384395513322f1b801e7bf9c729Steve Block    return o;
144668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
144768513a70bcd92384395513322f1b801e7bf9c729Steve Block
1448cad810f21b803229eb11403f9209855525a25d57Steve BlockPlatform3DObject GraphicsContext3D::createShader(GC3Denum type)
144968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
145068513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
145168513a70bcd92384395513322f1b801e7bf9c729Steve Block    return glCreateShader((type == FRAGMENT_SHADER) ? GL_FRAGMENT_SHADER : GL_VERTEX_SHADER);
145268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
145368513a70bcd92384395513322f1b801e7bf9c729Steve Block
1454cad810f21b803229eb11403f9209855525a25d57Steve BlockPlatform3DObject GraphicsContext3D::createTexture()
145568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
145668513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
1457cad810f21b803229eb11403f9209855525a25d57Steve Block    GLuint o = 0;
145868513a70bcd92384395513322f1b801e7bf9c729Steve Block    glGenTextures(1, &o);
145968513a70bcd92384395513322f1b801e7bf9c729Steve Block    return o;
146068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
146168513a70bcd92384395513322f1b801e7bf9c729Steve Block
1462cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::deleteBuffer(Platform3DObject buffer)
146368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
146468513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
146568513a70bcd92384395513322f1b801e7bf9c729Steve Block    glDeleteBuffers(1, &buffer);
146668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
146768513a70bcd92384395513322f1b801e7bf9c729Steve Block
1468cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::deleteFramebuffer(Platform3DObject framebuffer)
146968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
147068513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
147168513a70bcd92384395513322f1b801e7bf9c729Steve Block    glDeleteFramebuffersEXT(1, &framebuffer);
147268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
147368513a70bcd92384395513322f1b801e7bf9c729Steve Block
1474cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::deleteProgram(Platform3DObject program)
147568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
147668513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
147768513a70bcd92384395513322f1b801e7bf9c729Steve Block    glDeleteProgram(program);
147868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
147968513a70bcd92384395513322f1b801e7bf9c729Steve Block
1480cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::deleteRenderbuffer(Platform3DObject renderbuffer)
148168513a70bcd92384395513322f1b801e7bf9c729Steve Block{
148268513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
148368513a70bcd92384395513322f1b801e7bf9c729Steve Block    glDeleteRenderbuffersEXT(1, &renderbuffer);
148468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
148568513a70bcd92384395513322f1b801e7bf9c729Steve Block
1486cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::deleteShader(Platform3DObject shader)
148768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
148868513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
148968513a70bcd92384395513322f1b801e7bf9c729Steve Block    glDeleteShader(shader);
149068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
149168513a70bcd92384395513322f1b801e7bf9c729Steve Block
1492cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::deleteTexture(Platform3DObject texture)
149368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
149468513a70bcd92384395513322f1b801e7bf9c729Steve Block    makeContextCurrent();
149568513a70bcd92384395513322f1b801e7bf9c729Steve Block    glDeleteTextures(1, &texture);
149668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
149768513a70bcd92384395513322f1b801e7bf9c729Steve Block
1498cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::synthesizeGLError(GC3Denum error)
149968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
150068513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_syntheticErrors.add(error);
150168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
150268513a70bcd92384395513322f1b801e7bf9c729Steve Block
15032bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid GraphicsContext3D::markContextChanged()
15042bde8e466a4451c7319e3a072d118917957d6554Steve Block{
15052bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_layerComposited = false;
15062bde8e466a4451c7319e3a072d118917957d6554Steve Block}
15072bde8e466a4451c7319e3a072d118917957d6554Steve Block
15082bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid GraphicsContext3D::markLayerComposited()
15092bde8e466a4451c7319e3a072d118917957d6554Steve Block{
15102bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_layerComposited = true;
15112bde8e466a4451c7319e3a072d118917957d6554Steve Block}
15122bde8e466a4451c7319e3a072d118917957d6554Steve Block
15132bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool GraphicsContext3D::layerComposited() const
15142bde8e466a4451c7319e3a072d118917957d6554Steve Block{
15152bde8e466a4451c7319e3a072d118917957d6554Steve Block    return m_layerComposited;
15162bde8e466a4451c7319e3a072d118917957d6554Steve Block}
15172bde8e466a4451c7319e3a072d118917957d6554Steve Block
151828040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuExtensions3D* GraphicsContext3D::getExtensions()
1519a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
152028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!m_extensions)
1521ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        m_extensions = adoptPtr(new Extensions3DOpenGL(this));
152228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return m_extensions.get();
1523a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
1524a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
152568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
152668513a70bcd92384395513322f1b801e7bf9c729Steve Block
15272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WEBGL)
1528