From 2a2bce8d4dda4f31098ccb6acc6ccfafb2f86eda Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Thu, 28 Aug 2025 17:42:34 +0300 Subject: [PATCH] Tweak layer depth distribution (#3738) --- src/mbgl/renderer/paint_parameters.hpp | 2 +- src/mbgl/shaders/vulkan/shader_program.cpp | 9 +-- .../line/expected.png | Bin 0 -> 41453 bytes test/map/map.test.cpp | 52 ++++++++++++++++++ 4 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/map/layer_depth_distribution/line/expected.png diff --git a/src/mbgl/renderer/paint_parameters.hpp b/src/mbgl/renderer/paint_parameters.hpp index 4f4be3b2c..9a0c94c67 100644 --- a/src/mbgl/renderer/paint_parameters.hpp +++ b/src/mbgl/renderer/paint_parameters.hpp @@ -130,7 +130,7 @@ public: #if MLN_RENDER_BACKEND_OPENGL static constexpr float depthEpsilon = 1.0f / (1 << 16); #else - static constexpr float depthEpsilon = 1.0f / (1 << 12); + static constexpr float depthEpsilon = 1.0f / (1 << 11); #endif static constexpr int maxStencilValue = 255; diff --git a/src/mbgl/shaders/vulkan/shader_program.cpp b/src/mbgl/shaders/vulkan/shader_program.cpp index 15207646f..04d99d6e5 100644 --- a/src/mbgl/shaders/vulkan/shader_program.cpp +++ b/src/mbgl/shaders/vulkan/shader_program.cpp @@ -49,7 +49,7 @@ ShaderProgram::ShaderProgram(shaders::BuiltIn shaderID, defineStr += "#define USE_SURFACE_TRANSFORM"; } - observer.onPreCompileShader(shaderID, gfx::Backend::Type::Metal, defineStr); + observer.onPreCompileShader(shaderID, gfx::Backend::Type::Vulkan, defineStr); constexpr auto targetClientVersion = glslang::EShTargetVulkan_1_0; constexpr auto targetLanguageVersion = glslang::EShTargetSpv_1_0; @@ -61,8 +61,9 @@ ShaderProgram::ShaderProgram(shaders::BuiltIn shaderID, glslang::TShader glslShader(language); const auto preamble = defineStr + "\n" + prelude; - const char* shaderData = data.data(); - const int shaderDataSize = static_cast(data.size()); + const std::string shaderStr = std::string("#version ") + std::to_string(defaultVersion) + "\n" + data.data(); + const char* shaderData = shaderStr.data(); + const int shaderDataSize = static_cast(shaderStr.size()); glslShader.setPreamble(preamble.c_str()); glslShader.setStringsWithLengths(&shaderData, &shaderDataSize, 1); @@ -115,7 +116,7 @@ ShaderProgram::ShaderProgram(shaders::BuiltIn shaderID, backend.setDebugName(vertexShader.get(), shaderName + ".vert"); backend.setDebugName(fragmentShader.get(), shaderName + ".frag"); - observer.onPostCompileShader(shaderID, gfx::Backend::Type::Metal, defineStr); + observer.onPostCompileShader(shaderID, gfx::Backend::Type::Vulkan, defineStr); } ShaderProgram::~ShaderProgram() noexcept { diff --git a/test/fixtures/map/layer_depth_distribution/line/expected.png b/test/fixtures/map/layer_depth_distribution/line/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..b599bb565172f6be33e21147e559b98823ec8e01 GIT binary patch literal 41453 zcmeF2RaYEeu=WQZbZ{Nq3Bldn-QC?a!5Q3w1_&)T5-Y@Xp zoV&C7qW4Aj+P$lP_3WzZ>NpKGc}z4?GynjAsi+{M1pvUk4dDPlOxlKaTU#*Nxj1*v4Y_-EEVJ zdU7`;_|(}v+4%oP|Eo4QA7Xz^qJ)hcU-Fud-h=O38-jx~GukVhp

~J&Y!^$Abh< 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 literal 0 HcmV?d00001 diff --git a/test/map/map.test.cpp b/test/map/map.test.cpp index 342f4fb94..a44273b13 100644 --- a/test/map/map.test.cpp +++ b/test/map/map.test.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -1968,3 +1969,54 @@ TEST(BackgroundLayer, StyleUpdateZoomDependency) { 0.0006, 0.1); } + +TEST(Map, LineLayerDepthDistribution) { + MapTest<> test; + + test.map.getStyle().loadJSON(util::read_file("test/fixtures/api/empty.json")); + + test.map.jumpTo(CameraOptions().withZoom(0.0).withPitch(45.0)); + + auto backgroundLayer = std::make_unique("Background"); + backgroundLayer->setBackgroundColor(Color(1.0f, 1.0f, 0.0f, 1.0f)); + test.map.getStyle().addLayer(std::move(backgroundLayer)); + + constexpr uint32_t layerCount = 1 << 11; + const std::vector colors = {Color::red(), Color::green(), Color::blue()}; + const auto& bounds = test.map.latLngBoundsForCamera(test.map.getCameraOptions()); + + const auto getSource = [&](uint32_t index) { + FeatureCollection features; + + mapbox::geojson::line_string geo; + + double y = (bounds.north() - bounds.south()) * 0.95 / layerCount * (index + 1) / 2.0; + double x = (bounds.east() - bounds.west()) * 0.95 / layerCount * (index + 1) / 2.0; + + geo.emplace_back(-x, y); + geo.emplace_back(x, y); + geo.emplace_back(x, -y); + geo.emplace_back(-x, -y); + geo.emplace_back(-x, y); + + features.emplace_back(geo); + + auto source = std::make_unique("GeoJSONSource_" + std::to_string(index)); + source->setGeoJSON(features); + + return source; + }; + + for (uint32_t i = 0; i < layerCount; ++i) { + // add one source per layer + test.map.getStyle().addSource(getSource(i)); + + auto layer = std::make_unique("LineLayer" + std::to_string(i), "GeoJSONSource_" + std::to_string(i)); + layer->setLineColor(colors[i % colors.size()]); + + test.map.getStyle().addLayer(std::move(layer)); + } + + test::checkImage( + "test/fixtures/map/layer_depth_distribution/line", test.frontend.render(test.map).image, 0.0006, 0.1); +}