diff --git a/include/mbgl/shaders/webgpu/common.hpp b/include/mbgl/shaders/webgpu/common.hpp index 4f1843642..4194182bc 100644 --- a/include/mbgl/shaders/webgpu/common.hpp +++ b/include/mbgl/shaders/webgpu/common.hpp @@ -21,6 +21,29 @@ const LINE_NORMAL_SCALE: f32 = 1.0 / 63.0; // 1.0 / (127 / 2) const MAX_LINE_DISTANCE: f32 = 32767.0; const SDF_PX: f32 = 8.0; +// WebGPU equivalent of GLSL mod function +fn glMod(x: f32, y: f32) -> f32 { + return x - y * floor(x / y); +} + +fn glMod2(x: vec2, y: f32) -> vec2 { + return x - y * floor(x / y); +} + +fn glMod2v(x: vec2, y: vec2) -> vec2 { + return x - y * floor(x / y); +} + +// GLSL compatibility helpers +fn gl_mod(x: vec2, y: vec2) -> vec2 { + return glMod2v(x, y); +} + +// Radians conversion +fn radians(degrees: f32) -> f32 { + return PI * degrees / 180.0; +} + // Helper functions for unpacking data fn unpack_float(packedValue: f32) -> vec2 { let packedIntValue = i32(packedValue); @@ -30,7 +53,7 @@ fn unpack_float(packedValue: f32) -> vec2 { fn unpack_opacity(packedOpacity: f32) -> vec2 { let intOpacity = i32(packedOpacity) / 2; - return vec2(f32(intOpacity) / 127.0, packedOpacity % 2.0); + return vec2(f32(intOpacity) / 127.0, glMod(packedOpacity, 2.0)); } // Decode a color that has been packed into two floats @@ -55,34 +78,11 @@ fn unpack_mix_color(packedColors: vec4, t: f32) -> vec4 { // Get pattern position for texture atlas lookups fn get_pattern_pos(pixel_coord_upper: vec2, pixel_coord_lower: vec2, pattern_size: vec2, tile_units_to_pixels: f32, pos: vec2) -> vec2 { - let offset_a = (pixel_coord_upper % pattern_size) * 256.0; - let offset_b = (offset_a % pattern_size) * 256.0 + pixel_coord_lower; - let offset = offset_b % pattern_size; + let offset_a = gl_mod(pixel_coord_upper, pattern_size) * 256.0; + let offset_b = gl_mod(offset_a, pattern_size) * 256.0 + pixel_coord_lower; + let offset = gl_mod(offset_b, pattern_size); return (tile_units_to_pixels * pos + offset) / pattern_size; } - -// Radians conversion -fn radians(degrees: f32) -> f32 { - return PI * degrees / 180.0; -} - -// WebGPU equivalent of GLSL mod function -fn glMod(x: f32, y: f32) -> f32 { - return x - y * floor(x / y); -} - -fn glMod2(x: vec2, y: f32) -> vec2 { - return x - y * floor(x / y); -} - -fn glMod2v(x: vec2, y: vec2) -> vec2 { - return x - y * floor(x / y); -} - -// GLSL compatibility helpers -fn gl_mod(x: vec2, y: vec2) -> vec2 { - return glMod2v(x, y); -} )"; }; diff --git a/include/mbgl/shaders/webgpu/fill_extrusion.hpp b/include/mbgl/shaders/webgpu/fill_extrusion.hpp index e3cddf5fc..b0f4c5559 100644 --- a/include/mbgl/shaders/webgpu/fill_extrusion.hpp +++ b/include/mbgl/shaders/webgpu/fill_extrusion.hpp @@ -189,10 +189,10 @@ struct FillExtrusionPatternDrawableUBO { tile_ratio: f32, base_t: f32, height_t: f32, + color_t: f32, pattern_from_t: f32, pattern_to_t: f32, pad1: f32, - pad2: f32, }; struct FillExtrusionPatternTilePropsUBO { diff --git a/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/feature-expression/expected.png b/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/feature-expression/expected.png new file mode 100644 index 000000000..ffe2b18e1 Binary files /dev/null and b/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/feature-expression/expected.png differ diff --git a/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/function/expected.png b/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/function/expected.png new file mode 100644 index 000000000..584ecee10 Binary files /dev/null and b/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/function/expected.png differ diff --git a/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/literal/expected.png b/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/literal/expected.png new file mode 100644 index 000000000..584ecee10 Binary files /dev/null and b/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/literal/expected.png differ diff --git a/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/opacity/expected.png b/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/opacity/expected.png new file mode 100644 index 000000000..326d0f227 Binary files /dev/null and b/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/opacity/expected.png differ diff --git a/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/tile-buffer/expected-pixel4a.png b/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/tile-buffer/expected-pixel4a.png new file mode 100644 index 000000000..9b78a472c Binary files /dev/null and b/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/tile-buffer/expected-pixel4a.png differ diff --git a/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/tile-buffer/expected.png b/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/tile-buffer/expected.png new file mode 100644 index 000000000..1054c7030 Binary files /dev/null and b/metrics/expectations/platform-android-vulkan/render-tests/fill-extrusion-pattern/tile-buffer/expected.png differ diff --git a/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/feature-expression/expected.png b/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/feature-expression/expected.png new file mode 100644 index 000000000..6df7620cb Binary files /dev/null and b/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/feature-expression/expected.png differ diff --git a/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/function/expected.png b/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/function/expected.png new file mode 100644 index 000000000..c13dd6a22 Binary files /dev/null and b/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/function/expected.png differ diff --git a/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/literal/expected.png b/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/literal/expected.png new file mode 100644 index 000000000..c13dd6a22 Binary files /dev/null and b/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/literal/expected.png differ diff --git a/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/opacity/expected.png b/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/opacity/expected.png new file mode 100644 index 000000000..d311dc39f Binary files /dev/null and b/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/opacity/expected.png differ diff --git a/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/tile-buffer/expected.png b/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/tile-buffer/expected.png new file mode 100644 index 000000000..4fbba908c Binary files /dev/null and b/metrics/expectations/platform-ios-metal/render-tests/fill-extrusion-pattern/tile-buffer/expected.png differ diff --git a/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/feature-expression/expected-vulkan.png b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/feature-expression/expected-vulkan.png new file mode 100644 index 000000000..0fd8d4296 Binary files /dev/null and b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/feature-expression/expected-vulkan.png differ diff --git a/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/feature-expression/expected.png b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/feature-expression/expected.png new file mode 100644 index 000000000..c6e89323f Binary files /dev/null and b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/feature-expression/expected.png differ diff --git a/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/function/expected-vulkan.png b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/function/expected-vulkan.png new file mode 100644 index 000000000..e791dd499 Binary files /dev/null and b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/function/expected-vulkan.png differ diff --git a/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/function/expected.png b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/function/expected.png new file mode 100644 index 000000000..4609cd0b4 Binary files /dev/null and b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/function/expected.png differ diff --git a/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/literal/expected-vulkan.png b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/literal/expected-vulkan.png new file mode 100644 index 000000000..e791dd499 Binary files /dev/null and b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/literal/expected-vulkan.png differ diff --git a/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/literal/expected.png b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/literal/expected.png new file mode 100644 index 000000000..4609cd0b4 Binary files /dev/null and b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/literal/expected.png differ diff --git a/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/opacity/expected-vulkan.png b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/opacity/expected-vulkan.png new file mode 100644 index 000000000..3244178e0 Binary files /dev/null and b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/opacity/expected-vulkan.png differ diff --git a/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/opacity/expected.png b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/opacity/expected.png new file mode 100644 index 000000000..05724251d Binary files /dev/null and b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/opacity/expected.png differ diff --git a/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/tile-buffer/expected-vulkan.png b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/tile-buffer/expected-vulkan.png new file mode 100644 index 000000000..0ed569ce9 Binary files /dev/null and b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/tile-buffer/expected-vulkan.png differ diff --git a/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/tile-buffer/expected.png b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/tile-buffer/expected.png new file mode 100644 index 000000000..1e2f0302f Binary files /dev/null and b/metrics/expectations/platform-linux/render-tests/fill-extrusion-pattern/tile-buffer/expected.png differ diff --git a/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/feature-expression/expected.png b/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/feature-expression/expected.png new file mode 100644 index 000000000..6df7620cb Binary files /dev/null and b/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/feature-expression/expected.png differ diff --git a/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/function/expected.png b/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/function/expected.png new file mode 100644 index 000000000..c13dd6a22 Binary files /dev/null and b/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/function/expected.png differ diff --git a/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/literal/expected.png b/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/literal/expected.png new file mode 100644 index 000000000..c13dd6a22 Binary files /dev/null and b/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/literal/expected.png differ diff --git a/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/opacity/expected.png b/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/opacity/expected.png new file mode 100644 index 000000000..d311dc39f Binary files /dev/null and b/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/opacity/expected.png differ diff --git a/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/tile-buffer/expected.png b/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/tile-buffer/expected.png new file mode 100644 index 000000000..4fbba908c Binary files /dev/null and b/metrics/expectations/platform-macos/render-tests/fill-extrusion-pattern/tile-buffer/expected.png differ diff --git a/metrics/ignores/platform-all.json b/metrics/ignores/platform-all.json index d5df7879b..2439ec215 100644 --- a/metrics/ignores/platform-all.json +++ b/metrics/ignores/platform-all.json @@ -75,13 +75,6 @@ "render-tests/extent/1024-circle": "needs investigation", "render-tests/feature-state/promote-id": "https://github.com/mapbox/mapbox-gl-native/issues/16016", "render-tests/fill-extrusion-geometry/linestring": "https://github.com/mapbox/mapbox-gl-native/pull/14240", - "render-tests/fill-extrusion-pattern/@2x": "https://github.com/mapbox/mapbox-gl-js/issues/3327", - "render-tests/fill-extrusion-pattern/feature-expression": "https://github.com/mapbox/mapbox-gl-js/issues/3327", - "render-tests/fill-extrusion-pattern/function": "https://github.com/mapbox/mapbox-gl-js/issues/3327", - "render-tests/fill-extrusion-pattern/function-2": "https://github.com/mapbox/mapbox-gl-js/issues/3327", - "render-tests/fill-extrusion-pattern/literal": "https://github.com/mapbox/mapbox-gl-js/issues/3327", - "render-tests/fill-extrusion-pattern/opacity": "https://github.com/mapbox/mapbox-gl-js/issues/3327", - "render-tests/fill-extrusion-pattern/tile-buffer": "https://github.com/mapbox/mapbox-gl-js/issues/3327", "render-tests/fill-pattern/update-feature-state": "https://github.com/mapbox/mapbox-gl-native/issues/15895", "render-tests/geojson/inline-linestring-fill": "current behavior is arbitrary", "render-tests/icon-text-fit/text-variable-anchor-overlap": "https://github.com/mapbox/mapbox-gl-native/issues/15809", diff --git a/metrics/ignores/platform-macos-webgpu.json b/metrics/ignores/platform-macos-webgpu.json index 3e9bbfe89..a14c4a9cc 100644 --- a/metrics/ignores/platform-macos-webgpu.json +++ b/metrics/ignores/platform-macos-webgpu.json @@ -4,5 +4,12 @@ "render-tests/regressions/mapbox-gl-js#7066": "Failing with mbgl-render-test", "render-tests/fill-outline-color/zoom-and-property-function": "It will be fixed after triangulated lines will support data driven properties", "render-tests/fill-outline-color/property-function": "It will be fixed after triangulated lines will support data driven properties", - "render-tests/fill-extrusion-color/function": "Layer Z Fighting: https://github.com/maplibre/maplibre-native/issues/1847" + "render-tests/fill-extrusion-color/function": "Layer Z Fighting: https://github.com/maplibre/maplibre-native/issues/1847", + "render-tests/fill-extrusion-pattern/@2x": "https://github.com/mapbox/mapbox-gl-js/issues/3327", + "render-tests/fill-extrusion-pattern/feature-expression": "https://github.com/mapbox/mapbox-gl-js/issues/3327", + "render-tests/fill-extrusion-pattern/function": "https://github.com/mapbox/mapbox-gl-js/issues/3327", + "render-tests/fill-extrusion-pattern/function-2": "https://github.com/mapbox/mapbox-gl-js/issues/3327", + "render-tests/fill-extrusion-pattern/literal": "https://github.com/mapbox/mapbox-gl-js/issues/3327", + "render-tests/fill-extrusion-pattern/opacity": "https://github.com/mapbox/mapbox-gl-js/issues/3327", + "render-tests/fill-extrusion-pattern/tile-buffer": "https://github.com/mapbox/mapbox-gl-js/issues/3327" } diff --git a/metrics/integration/render-tests/fill-extrusion-pattern/@2x/expected-pixel4a.png b/metrics/integration/render-tests/fill-extrusion-pattern/@2x/expected-pixel4a.png new file mode 100644 index 000000000..de79136ac Binary files /dev/null and b/metrics/integration/render-tests/fill-extrusion-pattern/@2x/expected-pixel4a.png differ diff --git a/metrics/integration/render-tests/fill-extrusion-pattern/@2x/expected.png b/metrics/integration/render-tests/fill-extrusion-pattern/@2x/expected.png index 2994ade87..3d1864895 100644 Binary files a/metrics/integration/render-tests/fill-extrusion-pattern/@2x/expected.png and b/metrics/integration/render-tests/fill-extrusion-pattern/@2x/expected.png differ diff --git a/metrics/integration/render-tests/fill-extrusion-pattern/feature-expression/expected.png b/metrics/integration/render-tests/fill-extrusion-pattern/feature-expression/expected.png index e8051b28c..c6e89323f 100644 Binary files a/metrics/integration/render-tests/fill-extrusion-pattern/feature-expression/expected.png and b/metrics/integration/render-tests/fill-extrusion-pattern/feature-expression/expected.png differ diff --git a/metrics/integration/render-tests/fill-extrusion-pattern/function-2/expected-pixel4a.png b/metrics/integration/render-tests/fill-extrusion-pattern/function-2/expected-pixel4a.png new file mode 100644 index 000000000..5a3766b96 Binary files /dev/null and b/metrics/integration/render-tests/fill-extrusion-pattern/function-2/expected-pixel4a.png differ diff --git a/metrics/integration/render-tests/fill-extrusion-pattern/function-2/expected.png b/metrics/integration/render-tests/fill-extrusion-pattern/function-2/expected.png index cd86e8dcc..9c157728a 100644 Binary files a/metrics/integration/render-tests/fill-extrusion-pattern/function-2/expected.png and b/metrics/integration/render-tests/fill-extrusion-pattern/function-2/expected.png differ diff --git a/metrics/integration/render-tests/fill-extrusion-pattern/function/expected.png b/metrics/integration/render-tests/fill-extrusion-pattern/function/expected.png index 4d7505564..4609cd0b4 100644 Binary files a/metrics/integration/render-tests/fill-extrusion-pattern/function/expected.png and b/metrics/integration/render-tests/fill-extrusion-pattern/function/expected.png differ diff --git a/metrics/integration/render-tests/fill-extrusion-pattern/literal/expected.png b/metrics/integration/render-tests/fill-extrusion-pattern/literal/expected.png index 4d7505564..4609cd0b4 100644 Binary files a/metrics/integration/render-tests/fill-extrusion-pattern/literal/expected.png and b/metrics/integration/render-tests/fill-extrusion-pattern/literal/expected.png differ diff --git a/metrics/integration/render-tests/fill-extrusion-pattern/opacity/expected.png b/metrics/integration/render-tests/fill-extrusion-pattern/opacity/expected.png index 7b38bfdfb..05724251d 100644 Binary files a/metrics/integration/render-tests/fill-extrusion-pattern/opacity/expected.png and b/metrics/integration/render-tests/fill-extrusion-pattern/opacity/expected.png differ diff --git a/metrics/integration/render-tests/fill-extrusion-pattern/tile-buffer/expected-pixel4a.png b/metrics/integration/render-tests/fill-extrusion-pattern/tile-buffer/expected-pixel4a.png new file mode 100644 index 000000000..cfeee32bf Binary files /dev/null and b/metrics/integration/render-tests/fill-extrusion-pattern/tile-buffer/expected-pixel4a.png differ diff --git a/metrics/integration/render-tests/fill-extrusion-pattern/tile-buffer/expected.png b/metrics/integration/render-tests/fill-extrusion-pattern/tile-buffer/expected.png index 8b08b54ea..8fba0b779 100644 Binary files a/metrics/integration/render-tests/fill-extrusion-pattern/tile-buffer/expected.png and b/metrics/integration/render-tests/fill-extrusion-pattern/tile-buffer/expected.png differ