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