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 "GeometryBinding.h"
3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "GraphicsContext.h"
3381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "GraphicsContext3D.h"
3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "LayerRendererChromium.h"
3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochnamespace WebCore {
3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochGeometryBinding::GeometryBinding(GraphicsContext3D* context)
3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    : m_context(context)
4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_quadVerticesVbo(0)
4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_quadElementsVbo(0)
4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_initialized(false)
4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Vertex positions and texture coordinates for the 4 corners of a 1x1 quad.
4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    float vertices[] = { -0.5f,  0.5f, 0.0f, 0.0f,  1.0f,
4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                         -0.5f, -0.5f, 0.0f, 0.0f,  0.0f,
4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                         0.5f, -0.5f, 0.0f, 1.0f,  0.0f,
4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                         0.5f,  0.5f, 0.0f, 1.0f,  1.0f };
4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    uint16_t indices[] = { 0, 1, 2, 0, 2, 3, // The two triangles that make up the layer quad.
5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                           0, 1, 2, 3}; // A line path for drawing the layer border.
5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_quadVerticesVbo = m_context->createBuffer());
5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_quadElementsVbo = m_context->createBuffer());
5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_quadVerticesVbo));
5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_context->bufferData(GraphicsContext3D::ARRAY_BUFFER, sizeof(vertices), vertices, GraphicsContext3D::STATIC_DRAW));
5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_context->bindBuffer(GraphicsContext3D::ELEMENT_ARRAY_BUFFER, m_quadElementsVbo));
5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_context->bufferData(GraphicsContext3D::ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GraphicsContext3D::STATIC_DRAW));
5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_initialized = true;
6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochGeometryBinding::~GeometryBinding()
6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_context->deleteBuffer(m_quadVerticesVbo));
6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_context->deleteBuffer(m_quadElementsVbo));
6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid GeometryBinding::prepareForDraw()
6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, quadVerticesVbo()));
7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_context->bindBuffer(GraphicsContext3D::ELEMENT_ARRAY_BUFFER, quadElementsVbo()));
7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned offset = 0;
7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_context->vertexAttribPointer(positionAttribLocation(), 3, GraphicsContext3D::FLOAT, false, 5 * sizeof(float), offset));
7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    offset += 3 * sizeof(float);
7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_context->vertexAttribPointer(texCoordAttribLocation(), 2, GraphicsContext3D::FLOAT, false, 5 * sizeof(float), offset));
7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_context->enableVertexAttribArray(positionAttribLocation()));
7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLC(m_context, m_context->enableVertexAttribArray(texCoordAttribLocation()));
7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} // namespace WebCore
8181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif // USE(ACCELERATED_COMPOSITING)
83