[general] moving ios and android project under ./platform folder

This commit is contained in:
Petr Pokorny
2020-12-20 12:38:56 +01:00
parent 8e759a51e4
commit 41f0be34e7
9877 changed files with 141 additions and 2889 deletions

354
test/gl/bucket.test.cpp Normal file
View 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
View 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);
}

View 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
View 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());
}