181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch/* 281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (C) 2011 Google Inc. All rights reserved. 381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Redistribution and use in source and binary forms, with or without 581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * modification, are permitted provided that the following conditions 681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * are met: 781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 1. Redistributions of source code must retain the above copyright 981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * notice, this list of conditions and the following disclaimer. 1081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * notice, this list of conditions and the following disclaimer in the 1281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * documentation and/or other materials provided with the distribution. 1381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 1481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 1581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 1681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 1781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 1881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 1981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 2081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 2181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch */ 2581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 2681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "config.h" 2781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 2881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(ACCELERATED_COMPOSITING) 2981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "ProgramBinding.h" 3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "GeometryBinding.h" 3381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "GraphicsContext.h" 3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "GraphicsContext3D.h" 3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "LayerRendererChromium.h" 3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochnamespace WebCore { 3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochProgramBindingBase::ProgramBindingBase(GraphicsContext3D* context) 4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch : m_context(context) 4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_program(0) 4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_initialized(false) 4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochProgramBindingBase::~ProgramBindingBase() 4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (m_program) 4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->deleteProgram(m_program)); 5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool ProgramBindingBase::init(const String& vertexShader, const String& fragmentShader) 5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_program = createShaderProgram(vertexShader, fragmentShader); 5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_program) { 5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch LOG_ERROR("Failed to create shader program"); 5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return false; 5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return true; 6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochunsigned ProgramBindingBase::loadShader(unsigned type, const String& shaderSource) 6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch unsigned shader = m_context->createShader(type); 6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!shader) 6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return 0; 6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch String sourceString(shaderSource); 6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->shaderSource(shader, sourceString)); 6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->compileShader(shader)); 7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch int compiled = 0; 7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->getShaderiv(shader, GraphicsContext3D::COMPILE_STATUS, &compiled)); 7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!compiled) { 7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->deleteShader(shader)); 7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return 0; 7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return shader; 7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochunsigned ProgramBindingBase::createShaderProgram(const String& vertexShaderSource, const String& fragmentShaderSource) 8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 8181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch unsigned vertexShader = loadShader(GraphicsContext3D::VERTEX_SHADER, vertexShaderSource); 8281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!vertexShader) { 8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch LOG_ERROR("Failed to create vertex shader"); 8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return 0; 8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch unsigned fragmentShader = loadShader(GraphicsContext3D::FRAGMENT_SHADER, fragmentShaderSource); 8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!fragmentShader) { 8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->deleteShader(vertexShader)); 9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch LOG_ERROR("Failed to create fragment shader"); 9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return 0; 9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch unsigned programObject = m_context->createProgram(); 9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!programObject) { 9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch LOG_ERROR("Failed to create shader program"); 9781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return 0; 9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->attachShader(programObject, vertexShader)); 10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->attachShader(programObject, fragmentShader)); 10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Bind the common attrib locations. 10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->bindAttribLocation(programObject, GeometryBinding::positionAttribLocation(), "a_position")); 10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->bindAttribLocation(programObject, GeometryBinding::texCoordAttribLocation(), "a_texCoord")); 10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->linkProgram(programObject)); 10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch int linked = 0; 10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->getProgramiv(programObject, GraphicsContext3D::LINK_STATUS, &linked)); 11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!linked) { 11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch LOG_ERROR("Failed to link shader program"); 11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->deleteProgram(programObject)); 11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return 0; 11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 11581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->deleteShader(vertexShader)); 11781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GLC(m_context, m_context->deleteShader(fragmentShader)); 11881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return programObject; 11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 12081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 12181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} // namespace WebCore 12281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 12381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif // USE(ACCELERATED_COMPOSITING) 124