fune/gfx/layers/mlgpu/ShaderDefinitionsMLGPU.cpp
David Anderson 8eb9963527 Initial import of Advanced Layers. (bug 1365879 part 20, r=bas)
--HG--
extra : rebase_source : 57032a3e3d383c27cfdc2f26841d387ca57d0011
2017-06-22 21:12:19 -07:00

127 lines
4.1 KiB
C++

/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "ShaderDefinitionsMLGPU.h"
#include "RenderPassMLGPU.h"
namespace mozilla {
namespace layers {
namespace mlg {
using namespace gfx;
// Helper function for adding triangle vertices to shader buffers.
struct TriangleVertex
{
TriangleVertex(const gfx::Point& aPoint,
const ItemInfo& aItem,
uint32_t aItemIndex)
: point(aPoint),
layerIndex(aItem.layerIndex),
depth(aItem.sortOrder),
itemIndex(aItemIndex)
{}
gfx::Point point;
uint32_t layerIndex;
int depth;
uint32_t itemIndex;
};
bool
SimpleTraits::AddVerticesTo(ShaderRenderPass* aPass,
const ItemInfo& aItem,
uint32_t aItemIndex,
const gfx::Polygon* aGeometry) const
{
VertexStagingBuffer* vertices = aPass->GetVertices();
// If we don't have geometry, take a fast path where we can hardcode
// the set of triangles.
if (!aGeometry) {
if (!vertices->PrependItem(TriangleVertex(mRect.BottomLeft(), aItem, aItemIndex)) ||
!vertices->PrependItem(TriangleVertex(mRect.TopLeft(), aItem, aItemIndex)) ||
!vertices->PrependItem(TriangleVertex(mRect.TopRight(), aItem, aItemIndex)) ||
!vertices->PrependItem(TriangleVertex(mRect.TopRight(), aItem, aItemIndex)) ||
!vertices->PrependItem(TriangleVertex(mRect.BottomRight(), aItem, aItemIndex)) ||
!vertices->PrependItem(TriangleVertex(mRect.BottomLeft(), aItem, aItemIndex)))
{
return false;
}
return true;
}
// Slow path: full-fledged geometry.
nsTArray<Triangle> triangles = aGeometry->ToTriangles();
for (const Triangle& t : triangles) {
if (!vertices->PrependItem(TriangleVertex(t.p1, aItem, aItemIndex)) ||
!vertices->PrependItem(TriangleVertex(t.p2, aItem, aItemIndex)) ||
!vertices->PrependItem(TriangleVertex(t.p3, aItem, aItemIndex)))
{
return false;
}
}
return true;
}
struct TexturedTriangleVertex
{
TexturedTriangleVertex(const gfx::Point& aPoint,
const gfx::Point& aTexCoord,
const ItemInfo& aItem)
: point(aPoint),
texCoord(aTexCoord),
layerIndex(aItem.layerIndex),
depth(aItem.sortOrder)
{}
gfx::Point point;
gfx::Point texCoord;
uint32_t layerIndex;
int depth;
};
bool
TexturedTraits::AddVerticesTo(ShaderRenderPass* aPass,
const ItemInfo& aItem,
uint32_t aItemIndex,
const gfx::Polygon* aGeometry) const
{
VertexStagingBuffer* vertices = aPass->GetVertices();
using Vertex = TexturedTriangleVertex;
// If we don't have geometry, take a fast path where we can hardcode
// the set of triangles.
if (!aGeometry) {
if (!vertices->PrependItem(Vertex(mRect.BottomLeft(), mTexCoords.BottomLeft(), aItem)) ||
!vertices->PrependItem(Vertex(mRect.TopLeft(), mTexCoords.TopLeft(), aItem)) ||
!vertices->PrependItem(Vertex(mRect.TopRight(), mTexCoords.TopRight(), aItem)) ||
!vertices->PrependItem(Vertex(mRect.TopRight(), mTexCoords.TopRight(), aItem)) ||
!vertices->PrependItem(Vertex(mRect.BottomRight(), mTexCoords.BottomRight(), aItem)) ||
!vertices->PrependItem(Vertex(mRect.BottomLeft(), mTexCoords.BottomLeft(), aItem)))
{
return false;
}
return true;
}
// Slow path: full-fledged geometry.
nsTArray<TexturedTriangle> triangles =
GenerateTexturedTriangles(*aGeometry, mRect, mTexCoords);
for (const TexturedTriangle& t: triangles) {
if (!vertices->PrependItem(Vertex(t.p1, t.textureCoords.p1, aItem)) ||
!vertices->PrependItem(Vertex(t.p2, t.textureCoords.p2, aItem)) ||
!vertices->PrependItem(Vertex(t.p3, t.textureCoords.p3, aItem)))
{
return false;
}
}
return true;
}
} // namespace mlg
} // namespace layers
} // namespace mozilla