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