blob: ba251c794151cac015f65429affbdca354e42cf1 [file] [log] [blame]
/*
* Copyright 2017 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef COBALT_RENDERER_RASTERIZER_SKIA_HARDWARE_MESH_H_
#define COBALT_RENDERER_RASTERIZER_SKIA_HARDWARE_MESH_H_
#include <vector>
#include "base/threading/thread_checker.h"
#include "cobalt/render_tree/resource_provider.h"
#include "cobalt/renderer/rasterizer/skia/vertex_buffer_object.h"
#include "third_party/glm/glm/vec2.hpp"
#include "third_party/glm/glm/vec3.hpp"
namespace cobalt {
namespace renderer {
namespace rasterizer {
namespace skia {
class HardwareMesh : public render_tree::Mesh {
public:
HardwareMesh(scoped_ptr<std::vector<render_tree::Mesh::Vertex> > vertices,
DrawMode draw_mode)
: vertices_(vertices.Pass()), draw_mode_(CheckDrawMode(draw_mode)) {
DCHECK(vertices_);
thread_checker_.DetachFromThread();
}
uint32 GetEstimatedSizeInBytes() const OVERRIDE;
// Float array of vertices, contiguously interleaved X, Y, Z, U, V coords.
const float* GetVertices() const {
DCHECK(vertices_ && vertices_->size());
return reinterpret_cast<const float*>(vertices_->data());
}
const size_t GetVertexCount() const {
DCHECK(vertices_);
return vertices_->size();
}
const render_tree::Mesh::DrawMode GetDrawMode() const {
return draw_mode_ == GL_TRIANGLE_FAN
? render_tree::Mesh::DrawMode::kDrawModeTriangleFan
: draw_mode_ == GL_TRIANGLE_STRIP
? render_tree::Mesh::DrawMode::kDrawModeTriangleStrip
: render_tree::Mesh::DrawMode::kDrawModeTriangles;
}
// Obtains a vertex buffer object from this mesh. Called right before first
// rendering it so that the graphics context has already been made current.
const VertexBufferObject* GetVBO() const;
private:
static GLenum CheckDrawMode(DrawMode mode) {
switch (mode) {
case kDrawModeTriangles:
return GL_TRIANGLES;
case kDrawModeTriangleStrip:
return GL_TRIANGLE_STRIP;
case kDrawModeTriangleFan:
return GL_TRIANGLE_FAN;
default:
NOTREACHED() << "Unsupported Mesh DrawMode detected, "
"defaulting to GL_TRIANGLE_STRIP";
return GL_TRIANGLE_STRIP;
}
}
// Logically the mesh is the same, but internally upon fetching the VBO,
// the vertex list has been copied from CPU to GPU memory.
mutable scoped_ptr<std::vector<render_tree::Mesh::Vertex> > vertices_;
mutable scoped_ptr<VertexBufferObject> vbo_;
const GLenum draw_mode_;
base::ThreadChecker thread_checker_;
};
} // namespace skia
} // namespace rasterizer
} // namespace renderer
} // namespace cobalt
#endif // COBALT_RENDERER_RASTERIZER_SKIA_HARDWARE_MESH_H_