[general] moving ios and android project under ./platform folder
This commit is contained in:
354
test/gl/bucket.test.cpp
Normal file
354
test/gl/bucket.test.cpp
Normal file
@@ -0,0 +1,354 @@
|
||||
#include <mbgl/test/util.hpp>
|
||||
#include <mbgl/test/stub_geometry_tile_feature.hpp>
|
||||
|
||||
#include <mbgl/gfx/backend_scope.hpp>
|
||||
#include <mbgl/renderer/buckets/circle_bucket.hpp>
|
||||
#include <mbgl/renderer/buckets/fill_bucket.hpp>
|
||||
#include <mbgl/renderer/buckets/line_bucket.hpp>
|
||||
#include <mbgl/renderer/buckets/raster_bucket.hpp>
|
||||
#include <mbgl/renderer/buckets/symbol_bucket.hpp>
|
||||
#include <mbgl/renderer/bucket_parameters.hpp>
|
||||
#include <mbgl/style/layers/symbol_layer_properties.hpp>
|
||||
#include <mbgl/gl/context.hpp>
|
||||
#include <mbgl/gl/headless_backend.hpp>
|
||||
|
||||
#include <mbgl/map/mode.hpp>
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
template <class Attributes>
|
||||
bool operator==(const Segment<Attributes>& lhs, const Segment<Attributes>& rhs) {
|
||||
return std::tie(lhs.vertexOffset, lhs.indexOffset, lhs.vertexLength, lhs.indexLength) ==
|
||||
std::tie(rhs.vertexOffset, rhs.indexOffset, rhs.vertexLength, rhs.indexLength);
|
||||
}
|
||||
|
||||
namespace gfx {
|
||||
namespace detail {
|
||||
|
||||
template <class A1, class A2>
|
||||
bool operator==(const VertexType<A1, A2>& lhs, const VertexType<A1, A2>& rhs) {
|
||||
return std::tie(lhs.a1, lhs.a2) == std::tie(rhs.a1, rhs.a2);
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
} // namespace gfx
|
||||
} // namespace mbgl
|
||||
|
||||
using namespace mbgl;
|
||||
|
||||
namespace {
|
||||
|
||||
PropertyMap properties;
|
||||
|
||||
} // namespace
|
||||
|
||||
TEST(Buckets, CircleBucket) {
|
||||
gl::HeadlessBackend backend({ 512, 256 });
|
||||
gfx::BackendScope scope { backend };
|
||||
|
||||
gl::Context context{ backend };
|
||||
CircleBucket bucket{{}, MapMode::Static, 1.0};
|
||||
ASSERT_FALSE(bucket.hasData());
|
||||
ASSERT_FALSE(bucket.needsUpload());
|
||||
|
||||
// CircleBucket::addFeature() is a no-op.
|
||||
GeometryCollection point { { { 0, 0 } } };
|
||||
bucket.addFeature(StubGeometryTileFeature{{}, FeatureType::Point, point, properties},
|
||||
point,
|
||||
{},
|
||||
PatternLayerMap(),
|
||||
0,
|
||||
CanonicalTileID(0, 0, 0));
|
||||
ASSERT_FALSE(bucket.hasData());
|
||||
ASSERT_FALSE(bucket.needsUpload());
|
||||
|
||||
bucket.segments.emplace_back(0, 0);
|
||||
ASSERT_TRUE(bucket.hasData());
|
||||
ASSERT_TRUE(bucket.needsUpload());
|
||||
|
||||
auto commandEncoder = context.createCommandEncoder();
|
||||
auto uploadPass = commandEncoder->createUploadPass("upload");
|
||||
bucket.upload(*uploadPass);
|
||||
ASSERT_TRUE(bucket.hasData());
|
||||
ASSERT_FALSE(bucket.needsUpload());
|
||||
}
|
||||
|
||||
TEST(Buckets, FillBucket) {
|
||||
gl::HeadlessBackend backend({ 512, 256 });
|
||||
gfx::BackendScope scope { backend };
|
||||
FillBucket::PossiblyEvaluatedLayoutProperties layout;
|
||||
|
||||
gl::Context context{ backend };
|
||||
FillBucket bucket { layout, {}, 5.0f, 1};
|
||||
ASSERT_FALSE(bucket.hasData());
|
||||
ASSERT_FALSE(bucket.needsUpload());
|
||||
|
||||
GeometryCollection polygon { { { 0, 0 }, { 0, 1 }, { 1, 1 } } };
|
||||
bucket.addFeature(StubGeometryTileFeature{{}, FeatureType::Polygon, polygon, properties},
|
||||
polygon,
|
||||
{},
|
||||
PatternLayerMap(),
|
||||
0,
|
||||
CanonicalTileID(0, 0, 0));
|
||||
ASSERT_TRUE(bucket.hasData());
|
||||
ASSERT_TRUE(bucket.needsUpload());
|
||||
|
||||
auto commandEncoder = context.createCommandEncoder();
|
||||
auto uploadPass = commandEncoder->createUploadPass("upload");
|
||||
bucket.upload(*uploadPass);
|
||||
ASSERT_FALSE(bucket.needsUpload());
|
||||
}
|
||||
|
||||
TEST(Buckets, LineBucket) {
|
||||
gl::HeadlessBackend backend({ 512, 256 });
|
||||
gfx::BackendScope scope { backend };
|
||||
LineBucket::PossiblyEvaluatedLayoutProperties layout;
|
||||
|
||||
gl::Context context{ backend };
|
||||
LineBucket bucket { layout, {}, 10.0f, 1 };
|
||||
ASSERT_FALSE(bucket.hasData());
|
||||
ASSERT_FALSE(bucket.needsUpload());
|
||||
|
||||
// Ignore invalid feature type.
|
||||
GeometryCollection point { { { 0, 0 } } };
|
||||
bucket.addFeature(StubGeometryTileFeature{{}, FeatureType::Point, point, properties},
|
||||
point,
|
||||
{},
|
||||
PatternLayerMap(),
|
||||
0,
|
||||
CanonicalTileID(0, 0, 0));
|
||||
ASSERT_FALSE(bucket.hasData());
|
||||
|
||||
GeometryCollection line { { { 0, 0 }, { 1, 1 } } };
|
||||
bucket.addFeature(StubGeometryTileFeature{{}, FeatureType::LineString, line, properties},
|
||||
line,
|
||||
{},
|
||||
PatternLayerMap(),
|
||||
1,
|
||||
CanonicalTileID(0, 0, 0));
|
||||
ASSERT_TRUE(bucket.hasData());
|
||||
ASSERT_TRUE(bucket.needsUpload());
|
||||
|
||||
auto commandEncoder = context.createCommandEncoder();
|
||||
auto uploadPass = commandEncoder->createUploadPass("upload");
|
||||
bucket.upload(*uploadPass);
|
||||
ASSERT_FALSE(bucket.needsUpload());
|
||||
}
|
||||
|
||||
TEST(Buckets, SymbolBucket) {
|
||||
gl::HeadlessBackend backend({ 512, 256 });
|
||||
gfx::BackendScope scope { backend };
|
||||
|
||||
auto layout = makeMutable<style::SymbolLayoutProperties::PossiblyEvaluated>();
|
||||
bool iconsNeedLinear = false;
|
||||
bool sortFeaturesByY = false;
|
||||
std::string bucketLeaderID = "test";
|
||||
std::vector<SymbolInstance> symbolInstances;
|
||||
std::vector<SortKeyRange> symbolRanges;
|
||||
|
||||
gl::Context context{ backend };
|
||||
SymbolBucket bucket{std::move(layout),
|
||||
{},
|
||||
16.0f,
|
||||
1.0f,
|
||||
0,
|
||||
iconsNeedLinear,
|
||||
sortFeaturesByY,
|
||||
bucketLeaderID,
|
||||
std::move(symbolInstances),
|
||||
std::move(symbolRanges),
|
||||
1.0f,
|
||||
false,
|
||||
{},
|
||||
false /*iconsInText*/};
|
||||
ASSERT_FALSE(bucket.hasIconData());
|
||||
ASSERT_FALSE(bucket.hasSdfIconData());
|
||||
ASSERT_FALSE(bucket.hasTextData());
|
||||
ASSERT_FALSE(bucket.hasIconCollisionBoxData());
|
||||
ASSERT_FALSE(bucket.hasTextCollisionBoxData());
|
||||
ASSERT_FALSE(bucket.hasIconCollisionCircleData());
|
||||
ASSERT_FALSE(bucket.hasTextCollisionCircleData());
|
||||
ASSERT_FALSE(bucket.hasData());
|
||||
ASSERT_FALSE(bucket.needsUpload());
|
||||
|
||||
// SymbolBucket::addFeature() is a no-op.
|
||||
GeometryCollection point { { { 0, 0 } } };
|
||||
bucket.addFeature(StubGeometryTileFeature{{}, FeatureType::Point, std::move(point), properties},
|
||||
point,
|
||||
{},
|
||||
PatternLayerMap(),
|
||||
0,
|
||||
CanonicalTileID(0, 0, 0));
|
||||
ASSERT_FALSE(bucket.hasData());
|
||||
ASSERT_FALSE(bucket.needsUpload());
|
||||
|
||||
bucket.text.segments.emplace_back(0, 0);
|
||||
ASSERT_TRUE(bucket.hasTextData());
|
||||
ASSERT_TRUE(bucket.hasData());
|
||||
ASSERT_TRUE(bucket.needsUpload());
|
||||
|
||||
auto commandEncoder = context.createCommandEncoder();
|
||||
auto uploadPass = commandEncoder->createUploadPass("upload");
|
||||
bucket.upload(*uploadPass);
|
||||
ASSERT_FALSE(bucket.needsUpload());
|
||||
}
|
||||
|
||||
TEST(Buckets, RasterBucket) {
|
||||
gl::HeadlessBackend backend({ 512, 256 });
|
||||
gfx::BackendScope scope { backend };
|
||||
|
||||
gl::Context context{ backend };
|
||||
PremultipliedImage rgba({ 1, 1 });
|
||||
|
||||
// RasterBucket::hasData() is always true.
|
||||
RasterBucket bucket = { std::move(rgba) };
|
||||
ASSERT_TRUE(bucket.hasData());
|
||||
ASSERT_TRUE(bucket.needsUpload());
|
||||
|
||||
auto commandEncoder = context.createCommandEncoder();
|
||||
auto uploadPass = commandEncoder->createUploadPass("upload");
|
||||
bucket.upload(*uploadPass);
|
||||
ASSERT_FALSE(bucket.needsUpload());
|
||||
|
||||
bucket.clear();
|
||||
ASSERT_TRUE(bucket.needsUpload());
|
||||
}
|
||||
|
||||
TEST(Buckets, RasterBucketMaskEmpty) {
|
||||
RasterBucket bucket{ nullptr };
|
||||
bucket.setMask({});
|
||||
EXPECT_EQ((std::vector<RasterLayoutVertex>{}), bucket.vertices.vector());
|
||||
EXPECT_EQ((std::vector<uint16_t>{}), bucket.indices.vector());
|
||||
SegmentVector<RasterAttributes> expectedSegments;
|
||||
expectedSegments.emplace_back(0, 0, 0, 0);
|
||||
EXPECT_EQ(expectedSegments, bucket.segments);
|
||||
}
|
||||
|
||||
TEST(Buckets, RasterBucketMaskNoChildren) {
|
||||
RasterBucket bucket{ nullptr };
|
||||
bucket.setMask({ CanonicalTileID{ 0, 0, 0 } });
|
||||
|
||||
// A mask of 0/0/0 doesn't produce buffers since we're instead using the global shared buffers.
|
||||
EXPECT_EQ((std::vector<RasterLayoutVertex>{}), bucket.vertices.vector());
|
||||
EXPECT_EQ((std::vector<uint16_t>{}), bucket.indices.vector());
|
||||
EXPECT_EQ((SegmentVector<RasterAttributes>{}), bucket.segments);
|
||||
}
|
||||
|
||||
TEST(Buckets, RasterBucketMaskTwoChildren) {
|
||||
RasterBucket bucket{ nullptr };
|
||||
bucket.setMask(
|
||||
{ CanonicalTileID{ 1, 0, 0 }, CanonicalTileID{ 1, 1, 1 } });
|
||||
|
||||
EXPECT_EQ(
|
||||
(std::vector<RasterLayoutVertex>{
|
||||
// 1/0/1
|
||||
RasterProgram::layoutVertex({ 0, 0 }, { 0, 0 }),
|
||||
RasterProgram::layoutVertex({ 4096, 0 }, { 4096, 0 }),
|
||||
RasterProgram::layoutVertex({ 0, 4096 }, { 0, 4096 }),
|
||||
RasterProgram::layoutVertex({ 4096, 4096 }, { 4096, 4096 }),
|
||||
|
||||
// 1/1/1
|
||||
RasterProgram::layoutVertex({ 4096, 4096 }, { 4096, 4096 }),
|
||||
RasterProgram::layoutVertex({ 8192, 4096 }, { 8192, 4096 }),
|
||||
RasterProgram::layoutVertex({ 4096, 8192 }, { 4096, 8192 }),
|
||||
RasterProgram::layoutVertex({ 8192, 8192 }, { 8192, 8192 }),
|
||||
}),
|
||||
bucket.vertices.vector());
|
||||
|
||||
EXPECT_EQ(
|
||||
(std::vector<uint16_t>{
|
||||
// 1/0/1
|
||||
0, 1, 2,
|
||||
1, 2, 3,
|
||||
|
||||
// 1/1/1
|
||||
4, 5, 6,
|
||||
5, 6, 7,
|
||||
}),
|
||||
bucket.indices.vector());
|
||||
|
||||
|
||||
SegmentVector<RasterAttributes> expectedSegments;
|
||||
expectedSegments.emplace_back(0, 0, 8, 12);
|
||||
EXPECT_EQ(expectedSegments, bucket.segments);
|
||||
}
|
||||
|
||||
TEST(Buckets, RasterBucketMaskComplex) {
|
||||
RasterBucket bucket{ nullptr };
|
||||
bucket.setMask(
|
||||
{ CanonicalTileID{ 1, 0, 1 }, CanonicalTileID{ 1, 1, 0 }, CanonicalTileID{ 2, 2, 3 },
|
||||
CanonicalTileID{ 2, 3, 2 }, CanonicalTileID{ 3, 6, 7 }, CanonicalTileID{ 3, 7, 6 } });
|
||||
|
||||
EXPECT_EQ(
|
||||
(std::vector<RasterLayoutVertex>{
|
||||
// 1/0/1
|
||||
RasterProgram::layoutVertex({ 0, 4096 }, { 0, 4096 }),
|
||||
RasterProgram::layoutVertex({ 4096, 4096 }, { 4096, 4096 }),
|
||||
RasterProgram::layoutVertex({ 0, 8192 }, { 0, 8192 }),
|
||||
RasterProgram::layoutVertex({ 4096, 8192 }, { 4096, 8192 }),
|
||||
|
||||
// 1/1/0
|
||||
RasterProgram::layoutVertex({ 4096, 0 }, { 4096, 0 }),
|
||||
RasterProgram::layoutVertex({ 8192, 0 }, { 8192, 0 }),
|
||||
RasterProgram::layoutVertex({ 4096, 4096 }, { 4096, 4096 }),
|
||||
RasterProgram::layoutVertex({ 8192, 4096 }, { 8192, 4096 }),
|
||||
|
||||
// 2/2/3
|
||||
RasterProgram::layoutVertex({ 4096, 6144 }, { 4096, 6144 }),
|
||||
RasterProgram::layoutVertex({ 6144, 6144 }, { 6144, 6144 }),
|
||||
RasterProgram::layoutVertex({ 4096, 8192 }, { 4096, 8192 }),
|
||||
RasterProgram::layoutVertex({ 6144, 8192 }, { 6144, 8192 }),
|
||||
|
||||
// 2/3/2
|
||||
RasterProgram::layoutVertex({ 6144, 4096 }, { 6144, 4096 }),
|
||||
RasterProgram::layoutVertex({ 8192, 4096 }, { 8192, 4096 }),
|
||||
RasterProgram::layoutVertex({ 6144, 6144 }, { 6144, 6144 }),
|
||||
RasterProgram::layoutVertex({ 8192, 6144 }, { 8192, 6144 }),
|
||||
|
||||
// 3/6/7
|
||||
RasterProgram::layoutVertex({ 6144, 7168 }, { 6144, 7168 }),
|
||||
RasterProgram::layoutVertex({ 7168, 7168 }, { 7168, 7168 }),
|
||||
RasterProgram::layoutVertex({ 6144, 8192 }, { 6144, 8192 }),
|
||||
RasterProgram::layoutVertex({ 7168, 8192 }, { 7168, 8192 }),
|
||||
|
||||
// 3/7/6
|
||||
RasterProgram::layoutVertex({ 7168, 6144 }, { 7168, 6144 }),
|
||||
RasterProgram::layoutVertex({ 8192, 6144 }, { 8192, 6144 }),
|
||||
RasterProgram::layoutVertex({ 7168, 7168 }, { 7168, 7168 }),
|
||||
RasterProgram::layoutVertex({ 8192, 7168 }, { 8192, 7168 }),
|
||||
}),
|
||||
bucket.vertices.vector());
|
||||
|
||||
EXPECT_EQ(
|
||||
(std::vector<uint16_t>{
|
||||
// 1/0/1
|
||||
0, 1, 2,
|
||||
1, 2, 3,
|
||||
|
||||
// 1/1/0
|
||||
4, 5, 6,
|
||||
5, 6, 7,
|
||||
|
||||
// 2/2/3
|
||||
8, 9, 10,
|
||||
9, 10, 11,
|
||||
|
||||
// 2/3/2
|
||||
12, 13, 14,
|
||||
13, 14, 15,
|
||||
|
||||
// 3/6/7
|
||||
16, 17, 18,
|
||||
17, 18, 19,
|
||||
|
||||
// 3/7/6
|
||||
20, 21, 22,
|
||||
21, 22, 23,
|
||||
}),
|
||||
bucket.indices.vector());
|
||||
|
||||
|
||||
SegmentVector<RasterAttributes> expectedSegments;
|
||||
expectedSegments.emplace_back(0, 0, 24, 36);
|
||||
EXPECT_EQ(expectedSegments, bucket.segments);
|
||||
}
|
||||
123
test/gl/context.test.cpp
Normal file
123
test/gl/context.test.cpp
Normal file
@@ -0,0 +1,123 @@
|
||||
#include <mbgl/test/util.hpp>
|
||||
|
||||
#include <mbgl/gfx/backend_scope.hpp>
|
||||
#include <mbgl/gfx/headless_frontend.hpp>
|
||||
#include <mbgl/gl/context.hpp>
|
||||
#include <mbgl/gl/custom_layer.hpp>
|
||||
#include <mbgl/gl/defines.hpp>
|
||||
#include <mbgl/gl/renderable_resource.hpp>
|
||||
#include <mbgl/map/map.hpp>
|
||||
#include <mbgl/map/map_options.hpp>
|
||||
#include <mbgl/platform/gl_functions.hpp>
|
||||
#include <mbgl/storage/resource_options.hpp>
|
||||
#include <mbgl/style/layers/background_layer.hpp>
|
||||
#include <mbgl/style/layers/fill_layer.hpp>
|
||||
#include <mbgl/style/style.hpp>
|
||||
#include <mbgl/util/io.hpp>
|
||||
#include <mbgl/util/mat4.hpp>
|
||||
#include <mbgl/util/run_loop.hpp>
|
||||
|
||||
using namespace mbgl;
|
||||
using namespace mbgl::style;
|
||||
using namespace mbgl::platform;
|
||||
|
||||
static const GLchar* vertexShaderSource = R"MBGL_SHADER(
|
||||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
attribute vec2 a_pos;
|
||||
void main() {
|
||||
gl_Position = vec4(a_pos, 0, 1);
|
||||
}
|
||||
)MBGL_SHADER";
|
||||
|
||||
static const GLchar* fragmentShaderSource = R"MBGL_SHADER(
|
||||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
void main() {
|
||||
gl_FragColor = vec4(0, 1, 0, 1);
|
||||
}
|
||||
)MBGL_SHADER";
|
||||
|
||||
struct Shader {
|
||||
Shader(const GLchar* vertex, const GLchar* fragment) {
|
||||
program = MBGL_CHECK_ERROR(glCreateProgram());
|
||||
vertexShader = MBGL_CHECK_ERROR(glCreateShader(GL_VERTEX_SHADER));
|
||||
fragmentShader = MBGL_CHECK_ERROR(glCreateShader(GL_FRAGMENT_SHADER));
|
||||
MBGL_CHECK_ERROR(glShaderSource(vertexShader, 1, &vertex, nullptr));
|
||||
MBGL_CHECK_ERROR(glCompileShader(vertexShader));
|
||||
MBGL_CHECK_ERROR(glAttachShader(program, vertexShader));
|
||||
MBGL_CHECK_ERROR(glShaderSource(fragmentShader, 1, &fragment, nullptr));
|
||||
MBGL_CHECK_ERROR(glCompileShader(fragmentShader));
|
||||
MBGL_CHECK_ERROR(glAttachShader(program, fragmentShader));
|
||||
MBGL_CHECK_ERROR(glLinkProgram(program));
|
||||
a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos"));
|
||||
}
|
||||
|
||||
~Shader() {
|
||||
MBGL_CHECK_ERROR(glDetachShader(program, vertexShader));
|
||||
MBGL_CHECK_ERROR(glDetachShader(program, fragmentShader));
|
||||
MBGL_CHECK_ERROR(glDeleteShader(vertexShader));
|
||||
MBGL_CHECK_ERROR(glDeleteShader(fragmentShader));
|
||||
MBGL_CHECK_ERROR(glDeleteProgram(program));
|
||||
}
|
||||
|
||||
GLuint program = 0;
|
||||
GLuint vertexShader = 0;
|
||||
GLuint fragmentShader = 0;
|
||||
GLuint a_pos = 0;
|
||||
};
|
||||
|
||||
struct Buffer {
|
||||
Buffer(std::vector<GLfloat> data) {
|
||||
MBGL_CHECK_ERROR(glGenBuffers(1, &buffer));
|
||||
MBGL_CHECK_ERROR(glBindBuffer(GL_ARRAY_BUFFER, buffer));
|
||||
MBGL_CHECK_ERROR(glBufferData(GL_ARRAY_BUFFER, data.size() * sizeof(GLfloat), data.data(),
|
||||
GL_STATIC_DRAW));
|
||||
}
|
||||
|
||||
~Buffer() {
|
||||
MBGL_CHECK_ERROR(glDeleteBuffers(1, &buffer));
|
||||
}
|
||||
|
||||
GLuint buffer = 0;
|
||||
};
|
||||
|
||||
TEST(GLContextMode, Shared) {
|
||||
if (gfx::Backend::GetType() != gfx::Backend::Type::OpenGL) {
|
||||
return;
|
||||
}
|
||||
|
||||
util::RunLoop loop;
|
||||
|
||||
HeadlessFrontend frontend{1, gfx::HeadlessBackend::SwapBehaviour::NoFlush, gfx::ContextMode::Shared};
|
||||
|
||||
Map map(frontend,
|
||||
MapObserver::nullObserver(),
|
||||
MapOptions().withMapMode(MapMode::Static).withSize(frontend.getSize()),
|
||||
ResourceOptions().withCachePath(":memory:").withAssetPath("test/fixtures/api/assets"));
|
||||
map.getStyle().loadJSON(util::read_file("test/fixtures/api/water.json"));
|
||||
map.jumpTo(CameraOptions().withCenter(LatLng { 37.8, -122.5 }).withZoom(10.0));
|
||||
|
||||
// Set transparent background layer.
|
||||
auto layer = map.getStyle().getLayer("background");
|
||||
ASSERT_STREQ("background", layer->getTypeInfo()->type);
|
||||
static_cast<BackgroundLayer*>(layer)->setBackgroundColor( { { 1.0f, 0.0f, 0.0f, 0.5f } } );
|
||||
|
||||
{
|
||||
// Custom rendering outside of GL Native render loop.
|
||||
gfx::BackendScope scope { *frontend.getBackend() };
|
||||
frontend.getBackend()->getDefaultRenderable().getResource<gl::RenderableResource>().bind();
|
||||
|
||||
Shader paintShader(vertexShaderSource, fragmentShaderSource);
|
||||
Buffer triangleBuffer({ 0, 0.5, 0.5, -0.5, -0.5, -0.5 });
|
||||
MBGL_CHECK_ERROR(glUseProgram(paintShader.program));
|
||||
MBGL_CHECK_ERROR(glBindBuffer(GL_ARRAY_BUFFER, triangleBuffer.buffer));
|
||||
MBGL_CHECK_ERROR(glEnableVertexAttribArray(paintShader.a_pos));
|
||||
MBGL_CHECK_ERROR(glVertexAttribPointer(paintShader.a_pos, 2, GL_FLOAT, GL_FALSE, 0, nullptr));
|
||||
MBGL_CHECK_ERROR(glDrawArrays(GL_TRIANGLE_STRIP, 0, 3));
|
||||
}
|
||||
|
||||
test::checkImage("test/fixtures/shared_context", frontend.render(map).image, 0.5, 0.1);
|
||||
}
|
||||
158
test/gl/gl_functions.test.cpp
Normal file
158
test/gl/gl_functions.test.cpp
Normal file
@@ -0,0 +1,158 @@
|
||||
#include <mbgl/test/util.hpp>
|
||||
|
||||
#include <mbgl/platform/gl_functions.hpp>
|
||||
|
||||
using namespace mbgl::platform;
|
||||
|
||||
TEST(GLFunctions, OpenGLES) {
|
||||
EXPECT_NE(glActiveTexture, nullptr);
|
||||
EXPECT_NE(glAttachShader, nullptr);
|
||||
EXPECT_NE(glBindAttribLocation, nullptr);
|
||||
EXPECT_NE(glBindBuffer, nullptr);
|
||||
EXPECT_NE(glBindFramebuffer, nullptr);
|
||||
EXPECT_NE(glBindRenderbuffer, nullptr);
|
||||
EXPECT_NE(glBindTexture, nullptr);
|
||||
EXPECT_NE(glBlendColor, nullptr);
|
||||
EXPECT_NE(glBlendEquation, nullptr);
|
||||
EXPECT_NE(glBlendEquationSeparate, nullptr);
|
||||
EXPECT_NE(glBlendFunc, nullptr);
|
||||
EXPECT_NE(glBlendFuncSeparate, nullptr);
|
||||
EXPECT_NE(glBufferData, nullptr);
|
||||
EXPECT_NE(glBufferSubData, nullptr);
|
||||
EXPECT_NE(glCheckFramebufferStatus, nullptr);
|
||||
EXPECT_NE(glClear, nullptr);
|
||||
EXPECT_NE(glClearColor, nullptr);
|
||||
EXPECT_NE(glClearDepthf, nullptr);
|
||||
EXPECT_NE(glClearStencil, nullptr);
|
||||
EXPECT_NE(glColorMask, nullptr);
|
||||
EXPECT_NE(glCompileShader, nullptr);
|
||||
EXPECT_NE(glCompressedTexImage2D, nullptr);
|
||||
EXPECT_NE(glCompressedTexSubImage2D, nullptr);
|
||||
EXPECT_NE(glCopyTexImage2D, nullptr);
|
||||
EXPECT_NE(glCopyTexSubImage2D, nullptr);
|
||||
EXPECT_NE(glCreateProgram, nullptr);
|
||||
EXPECT_NE(glCreateShader, nullptr);
|
||||
EXPECT_NE(glCullFace, nullptr);
|
||||
EXPECT_NE(glDeleteBuffers, nullptr);
|
||||
EXPECT_NE(glDeleteFramebuffers, nullptr);
|
||||
EXPECT_NE(glDeleteProgram, nullptr);
|
||||
EXPECT_NE(glDeleteRenderbuffers, nullptr);
|
||||
EXPECT_NE(glDeleteShader, nullptr);
|
||||
EXPECT_NE(glDeleteTextures, nullptr);
|
||||
EXPECT_NE(glDepthFunc, nullptr);
|
||||
EXPECT_NE(glDepthMask, nullptr);
|
||||
EXPECT_NE(glDepthRangef, nullptr);
|
||||
EXPECT_NE(glDetachShader, nullptr);
|
||||
EXPECT_NE(glDisable, nullptr);
|
||||
EXPECT_NE(glDisableVertexAttribArray, nullptr);
|
||||
EXPECT_NE(glDrawArrays, nullptr);
|
||||
EXPECT_NE(glDrawElements, nullptr);
|
||||
EXPECT_NE(glEnable, nullptr);
|
||||
EXPECT_NE(glEnableVertexAttribArray, nullptr);
|
||||
EXPECT_NE(glFinish, nullptr);
|
||||
EXPECT_NE(glFlush, nullptr);
|
||||
EXPECT_NE(glFramebufferRenderbuffer, nullptr);
|
||||
EXPECT_NE(glFramebufferTexture2D, nullptr);
|
||||
EXPECT_NE(glFrontFace, nullptr);
|
||||
EXPECT_NE(glGenBuffers, nullptr);
|
||||
EXPECT_NE(glGenerateMipmap, nullptr);
|
||||
EXPECT_NE(glGenFramebuffers, nullptr);
|
||||
EXPECT_NE(glGenRenderbuffers, nullptr);
|
||||
EXPECT_NE(glGenTextures, nullptr);
|
||||
EXPECT_NE(glGetActiveAttrib, nullptr);
|
||||
EXPECT_NE(glGetActiveUniform, nullptr);
|
||||
EXPECT_NE(glGetAttachedShaders, nullptr);
|
||||
EXPECT_NE(glGetAttribLocation, nullptr);
|
||||
EXPECT_NE(glGetBooleanv, nullptr);
|
||||
EXPECT_NE(glGetBufferParameteriv, nullptr);
|
||||
EXPECT_NE(glGetError, nullptr);
|
||||
EXPECT_NE(glGetFloatv, nullptr);
|
||||
EXPECT_NE(glGetFramebufferAttachmentParameteriv, nullptr);
|
||||
EXPECT_NE(glGetIntegerv, nullptr);
|
||||
EXPECT_NE(glGetProgramInfoLog, nullptr);
|
||||
EXPECT_NE(glGetProgramiv, nullptr);
|
||||
EXPECT_NE(glGetRenderbufferParameteriv, nullptr);
|
||||
EXPECT_NE(glGetShaderInfoLog, nullptr);
|
||||
EXPECT_NE(glGetShaderiv, nullptr);
|
||||
EXPECT_NE(glGetShaderSource, nullptr);
|
||||
EXPECT_NE(glGetString, nullptr);
|
||||
EXPECT_NE(glGetTexParameterfv, nullptr);
|
||||
EXPECT_NE(glGetTexParameteriv, nullptr);
|
||||
EXPECT_NE(glGetUniformfv, nullptr);
|
||||
EXPECT_NE(glGetUniformiv, nullptr);
|
||||
EXPECT_NE(glGetUniformLocation, nullptr);
|
||||
EXPECT_NE(glGetVertexAttribfv, nullptr);
|
||||
EXPECT_NE(glGetVertexAttribiv, nullptr);
|
||||
EXPECT_NE(glGetVertexAttribPointerv, nullptr);
|
||||
EXPECT_NE(glHint, nullptr);
|
||||
EXPECT_NE(glIsBuffer, nullptr);
|
||||
EXPECT_NE(glIsEnabled, nullptr);
|
||||
EXPECT_NE(glIsFramebuffer, nullptr);
|
||||
EXPECT_NE(glIsProgram, nullptr);
|
||||
EXPECT_NE(glIsRenderbuffer, nullptr);
|
||||
EXPECT_NE(glIsShader, nullptr);
|
||||
EXPECT_NE(glIsTexture, nullptr);
|
||||
EXPECT_NE(glLineWidth, nullptr);
|
||||
EXPECT_NE(glLinkProgram, nullptr);
|
||||
EXPECT_NE(glPixelStorei, nullptr);
|
||||
EXPECT_NE(glPolygonOffset, nullptr);
|
||||
EXPECT_NE(glReadPixels, nullptr);
|
||||
EXPECT_NE(glRenderbufferStorage, nullptr);
|
||||
EXPECT_NE(glSampleCoverage, nullptr);
|
||||
EXPECT_NE(glScissor, nullptr);
|
||||
EXPECT_NE(glShaderSource, nullptr);
|
||||
EXPECT_NE(glStencilFunc, nullptr);
|
||||
EXPECT_NE(glStencilFuncSeparate, nullptr);
|
||||
EXPECT_NE(glStencilMask, nullptr);
|
||||
EXPECT_NE(glStencilMaskSeparate, nullptr);
|
||||
EXPECT_NE(glStencilOp, nullptr);
|
||||
EXPECT_NE(glStencilOpSeparate, nullptr);
|
||||
EXPECT_NE(glTexImage2D, nullptr);
|
||||
EXPECT_NE(glTexParameterf, nullptr);
|
||||
EXPECT_NE(glTexParameterfv, nullptr);
|
||||
EXPECT_NE(glTexParameteri, nullptr);
|
||||
EXPECT_NE(glTexParameteriv, nullptr);
|
||||
EXPECT_NE(glTexSubImage2D, nullptr);
|
||||
EXPECT_NE(glUniform1f, nullptr);
|
||||
EXPECT_NE(glUniform1fv, nullptr);
|
||||
EXPECT_NE(glUniform1i, nullptr);
|
||||
EXPECT_NE(glUniform1iv, nullptr);
|
||||
EXPECT_NE(glUniform2f, nullptr);
|
||||
EXPECT_NE(glUniform2fv, nullptr);
|
||||
EXPECT_NE(glUniform2i, nullptr);
|
||||
EXPECT_NE(glUniform2iv, nullptr);
|
||||
EXPECT_NE(glUniform3f, nullptr);
|
||||
EXPECT_NE(glUniform3fv, nullptr);
|
||||
EXPECT_NE(glUniform3i, nullptr);
|
||||
EXPECT_NE(glUniform3iv, nullptr);
|
||||
EXPECT_NE(glUniform4f, nullptr);
|
||||
EXPECT_NE(glUniform4fv, nullptr);
|
||||
EXPECT_NE(glUniform4i, nullptr);
|
||||
EXPECT_NE(glUniform4iv, nullptr);
|
||||
EXPECT_NE(glUniformMatrix2fv, nullptr);
|
||||
EXPECT_NE(glUniformMatrix3fv, nullptr);
|
||||
EXPECT_NE(glUniformMatrix4fv, nullptr);
|
||||
EXPECT_NE(glUseProgram, nullptr);
|
||||
EXPECT_NE(glValidateProgram, nullptr);
|
||||
EXPECT_NE(glVertexAttrib1f, nullptr);
|
||||
EXPECT_NE(glVertexAttrib1fv, nullptr);
|
||||
EXPECT_NE(glVertexAttrib2f, nullptr);
|
||||
EXPECT_NE(glVertexAttrib2fv, nullptr);
|
||||
EXPECT_NE(glVertexAttrib3f, nullptr);
|
||||
EXPECT_NE(glVertexAttrib3fv, nullptr);
|
||||
EXPECT_NE(glVertexAttrib4f, nullptr);
|
||||
EXPECT_NE(glVertexAttrib4fv, nullptr);
|
||||
EXPECT_NE(glVertexAttribPointer, nullptr);
|
||||
EXPECT_NE(glViewport, nullptr);
|
||||
}
|
||||
|
||||
#ifndef MBGL_USE_GLES2
|
||||
TEST(GLFunctions, OpenDesktop) {
|
||||
EXPECT_NE(glDrawPixels, nullptr);
|
||||
EXPECT_NE(glGetDoublev, nullptr);
|
||||
EXPECT_NE(glPixelTransferf, nullptr);
|
||||
EXPECT_NE(glPixelZoom, nullptr);
|
||||
EXPECT_NE(glPointSize, nullptr);
|
||||
EXPECT_NE(glRasterPos4d, nullptr);
|
||||
}
|
||||
#endif
|
||||
65
test/gl/object.test.cpp
Normal file
65
test/gl/object.test.cpp
Normal file
@@ -0,0 +1,65 @@
|
||||
#include <mbgl/test/util.hpp>
|
||||
|
||||
#include <mbgl/gfx/backend_scope.hpp>
|
||||
#include <mbgl/gl/headless_backend.hpp>
|
||||
#include <mbgl/gl/context.hpp>
|
||||
|
||||
#include <memory>
|
||||
|
||||
using namespace mbgl;
|
||||
|
||||
namespace {
|
||||
|
||||
static bool getFlag = false;
|
||||
static bool setFlag = false;
|
||||
|
||||
} // namespace
|
||||
|
||||
struct MockGLObject {
|
||||
using Type = bool;
|
||||
static const Type Default;
|
||||
static Type Get() { getFlag = true; return true; }
|
||||
static void Set(const Type&) { setFlag = true; }
|
||||
};
|
||||
|
||||
const bool MockGLObject::Default = false;
|
||||
|
||||
TEST(GLObject, Value) {
|
||||
setFlag = false;
|
||||
|
||||
auto object = std::make_unique<gl::State<MockGLObject>>();
|
||||
EXPECT_EQ(object->getCurrentValue(), false);
|
||||
EXPECT_TRUE(object->isDirty());
|
||||
EXPECT_FALSE(setFlag);
|
||||
|
||||
*object = false;
|
||||
EXPECT_EQ(object->getCurrentValue(), false);
|
||||
EXPECT_FALSE(object->isDirty());
|
||||
EXPECT_TRUE(setFlag);
|
||||
|
||||
setFlag = false;
|
||||
*object = true;
|
||||
EXPECT_EQ(object->getCurrentValue(), true);
|
||||
EXPECT_FALSE(object->isDirty());
|
||||
EXPECT_TRUE(setFlag);
|
||||
}
|
||||
|
||||
TEST(GLObject, Store) {
|
||||
gl::HeadlessBackend backend { { 256, 256 } };
|
||||
gfx::BackendScope scope { backend };
|
||||
|
||||
gl::Context context{ backend };
|
||||
EXPECT_TRUE(context.empty());
|
||||
|
||||
gl::UniqueTexture texture = context.createUniqueTexture();
|
||||
EXPECT_NE(texture.get(), 0u);
|
||||
texture.reset();
|
||||
EXPECT_FALSE(context.empty());
|
||||
context.performCleanup();
|
||||
EXPECT_FALSE(context.empty());
|
||||
context.reset();
|
||||
EXPECT_TRUE(context.empty());
|
||||
|
||||
context.reset();
|
||||
EXPECT_TRUE(context.empty());
|
||||
}
|
||||
Reference in New Issue
Block a user