diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 87d04a2a82b0d..a5338d8ac80e9 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -3153,10 +3153,8 @@ ORIGIN: ../../../flutter/impeller/entity/shaders/conical_gradient_fill.frag + .. ORIGIN: ../../../flutter/impeller/entity/shaders/conical_gradient_ssbo_fill.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/debug/checkerboard.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/debug/checkerboard.vert + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/gaussian_blur/gaussian_blur.glsl + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/gaussian_blur/gaussian_blur.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/gaussian_blur/gaussian_blur.vert + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/gaussian_blur/gaussian_blur_noalpha_decal.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/gaussian_blur/gaussian_blur_noalpha_nodecal.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/geometry/points.comp + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/geometry/uv.comp + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/glyph_atlas.frag + ../../../flutter/LICENSE @@ -5907,10 +5905,8 @@ FILE: ../../../flutter/impeller/entity/shaders/conical_gradient_fill.frag FILE: ../../../flutter/impeller/entity/shaders/conical_gradient_ssbo_fill.frag FILE: ../../../flutter/impeller/entity/shaders/debug/checkerboard.frag FILE: ../../../flutter/impeller/entity/shaders/debug/checkerboard.vert -FILE: ../../../flutter/impeller/entity/shaders/gaussian_blur/gaussian_blur.glsl +FILE: ../../../flutter/impeller/entity/shaders/gaussian_blur/gaussian_blur.frag FILE: ../../../flutter/impeller/entity/shaders/gaussian_blur/gaussian_blur.vert -FILE: ../../../flutter/impeller/entity/shaders/gaussian_blur/gaussian_blur_noalpha_decal.frag -FILE: ../../../flutter/impeller/entity/shaders/gaussian_blur/gaussian_blur_noalpha_nodecal.frag FILE: ../../../flutter/impeller/entity/shaders/geometry/points.comp FILE: ../../../flutter/impeller/entity/shaders/geometry/uv.comp FILE: ../../../flutter/impeller/entity/shaders/glyph_atlas.frag diff --git a/impeller/entity/BUILD.gn b/impeller/entity/BUILD.gn index 4e1ce88280d4a..1aeb0ddda6eb0 100644 --- a/impeller/entity/BUILD.gn +++ b/impeller/entity/BUILD.gn @@ -26,8 +26,7 @@ impeller_shaders("entity_shaders") { "shaders/color_matrix_color_filter.vert", "shaders/conical_gradient_fill.frag", "shaders/gaussian_blur/gaussian_blur.vert", - "shaders/gaussian_blur/gaussian_blur_noalpha_decal.frag", - "shaders/gaussian_blur/gaussian_blur_noalpha_nodecal.frag", + "shaders/gaussian_blur/gaussian_blur.frag", "shaders/glyph_atlas.frag", "shaders/glyph_atlas_color.frag", "shaders/glyph_atlas.vert", diff --git a/impeller/entity/contents/content_context.cc b/impeller/entity/contents/content_context.cc index ec4725795eb31..e8e947d7916fd 100644 --- a/impeller/entity/contents/content_context.cc +++ b/impeller/entity/contents/content_context.cc @@ -317,10 +317,10 @@ ContentContext::ContentContext( texture_pipelines_.CreateDefault(*context_, options); position_uv_pipelines_.CreateDefault(*context_, options); tiled_texture_pipelines_.CreateDefault(*context_, options); - gaussian_blur_noalpha_decal_pipelines_.CreateDefault(*context_, - options_trianglestrip); - gaussian_blur_noalpha_nodecal_pipelines_.CreateDefault(*context_, - options_trianglestrip); + gaussian_blur_noalpha_decal_pipelines_.CreateDefault( + *context_, options_trianglestrip, {/*decal_specialization=*/1}); + gaussian_blur_noalpha_nodecal_pipelines_.CreateDefault( + *context_, options_trianglestrip, {/*decal_specialization=*/0}); border_mask_blur_pipelines_.CreateDefault(*context_, options_trianglestrip); morphology_filter_pipelines_.CreateDefault(*context_, options_trianglestrip); color_matrix_color_filter_pipelines_.CreateDefault(*context_, diff --git a/impeller/entity/contents/content_context.h b/impeller/entity/contents/content_context.h index 7fdcc6cbc74e8..5931abc1abd5c 100644 --- a/impeller/entity/contents/content_context.h +++ b/impeller/entity/contents/content_context.h @@ -63,9 +63,8 @@ #include "impeller/entity/yuv_to_rgb_filter.frag.h" #include "impeller/entity/yuv_to_rgb_filter.vert.h" +#include "impeller/entity/gaussian_blur.frag.h" #include "impeller/entity/gaussian_blur.vert.h" -#include "impeller/entity/gaussian_blur_noalpha_decal.frag.h" -#include "impeller/entity/gaussian_blur_noalpha_nodecal.frag.h" #include "impeller/entity/position_color.vert.h" @@ -130,11 +129,9 @@ using PositionUVPipeline = using TiledTexturePipeline = RenderPipelineT; using GaussianBlurDecalPipeline = - RenderPipelineT; + RenderPipelineT; using GaussianBlurPipeline = - RenderPipelineT; + RenderPipelineT; using BorderMaskBlurPipeline = RenderPipelineT; using MorphologyFilterPipeline = diff --git a/impeller/entity/entity_unittests.cc b/impeller/entity/entity_unittests.cc index 1eb9cf149ad77..ca1604ab3d6f7 100644 --- a/impeller/entity/entity_unittests.cc +++ b/impeller/entity/entity_unittests.cc @@ -2556,6 +2556,19 @@ TEST_P(EntityTest, SpecializationConstantsAreAppliedToVariants) { expected_constants); } +TEST_P(EntityTest, BlurSpecializationConstantValuesAreExpected) { + auto content_context = + ContentContext(GetContext(), TypographerContextSkia::Make()); + + auto decal_pipeline = content_context.GetGaussianBlurDecalPipeline({}); + auto nodecal_pipeline = content_context.GetGaussianBlurPipeline({}); + + ASSERT_EQ(decal_pipeline->GetDescriptor().GetSpecializationConstants()[0], + /*decal_specialization*/ 1); + ASSERT_EQ(nodecal_pipeline->GetDescriptor().GetSpecializationConstants()[0], + /*decal_specialization*/ 0); +} + } // namespace testing } // namespace impeller diff --git a/impeller/entity/shaders/gaussian_blur/gaussian_blur.glsl b/impeller/entity/shaders/gaussian_blur/gaussian_blur.frag similarity index 94% rename from impeller/entity/shaders/gaussian_blur/gaussian_blur.glsl rename to impeller/entity/shaders/gaussian_blur/gaussian_blur.frag index a40797aec125d..5e19d71fbf86e 100644 --- a/impeller/entity/shaders/gaussian_blur/gaussian_blur.glsl +++ b/impeller/entity/shaders/gaussian_blur/gaussian_blur.frag @@ -18,6 +18,8 @@ #include #include +layout(constant_id = 0) const int decal_specialization = 0; + uniform f16sampler2D texture_sampler; uniform BlurInfo { @@ -33,11 +35,10 @@ uniform BlurInfo { blur_info; f16vec4 Sample(f16sampler2D tex, vec2 coords) { -#if ENABLE_DECAL_SPECIALIZATION - return IPHalfSampleDecal(tex, coords); -#else + if (decal_specialization == 1) { + return IPHalfSampleDecal(tex, coords); + } return texture(tex, coords); -#endif } in vec2 v_texture_coords; diff --git a/impeller/entity/shaders/gaussian_blur/gaussian_blur_noalpha_decal.frag b/impeller/entity/shaders/gaussian_blur/gaussian_blur_noalpha_decal.frag deleted file mode 100644 index 7bb1045e19dbc..0000000000000 --- a/impeller/entity/shaders/gaussian_blur/gaussian_blur_noalpha_decal.frag +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -#define ENABLE_DECAL_SPECIALIZATION 1 - -#include "gaussian_blur.glsl" diff --git a/impeller/entity/shaders/gaussian_blur/gaussian_blur_noalpha_nodecal.frag b/impeller/entity/shaders/gaussian_blur/gaussian_blur_noalpha_nodecal.frag deleted file mode 100644 index 79d708e1dae36..0000000000000 --- a/impeller/entity/shaders/gaussian_blur/gaussian_blur_noalpha_nodecal.frag +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -#define ENABLE_DECAL_SPECIALIZATION 0 - -#include "gaussian_blur.glsl" diff --git a/impeller/tools/malioc.json b/impeller/tools/malioc.json index 1aa9b4e8a8242..bcf00df0a74fa 100644 --- a/impeller/tools/malioc.json +++ b/impeller/tools/malioc.json @@ -1153,6 +1153,79 @@ } } }, + "flutter/impeller/entity/gaussian_blur.frag.vkspv": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/gaussian_blur.frag.vkspv", + "has_side_effects": false, + "has_uniform_computation": true, + "modifies_coverage": false, + "reads_color_buffer": false, + "type": "Fragment", + "uses_late_zs_test": false, + "uses_late_zs_update": false, + "variants": { + "Main": { + "fp16_arithmetic": 0, + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + null + ], + "longest_path_cycles": [ + null, + null, + null, + null, + null, + null, + null + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "shortest_path_cycles": [ + 0.140625, + 0.0625, + 0.140625, + 0.0625, + 0.0, + 0.0, + 0.0 + ], + "total_bound_pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt" + ], + "total_cycles": [ + 0.265625, + 0.265625, + 0.265625, + 0.125, + 0.0, + 0.25, + 0.25 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 10, + "work_registers_used": 15 + } + } + } + }, "flutter/impeller/entity/gaussian_blur.vert.vkspv": { "Mali-G78": { "core": "Mali-G78", @@ -1265,151 +1338,6 @@ } } }, - "flutter/impeller/entity/gaussian_blur_noalpha_decal.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gaussian_blur_noalpha_decal.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 42, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - null - ], - "longest_path_cycles": [ - null, - null, - null, - null, - null, - null, - null - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "shortest_path_cycles": [ - 0.109375, - 0.03125, - 0.109375, - 0.0625, - 0.0, - 0.0, - 0.0 - ], - "total_bound_pipelines": [ - "arith_total", - "arith_cvt", - "arith_sfu" - ], - "total_cycles": [ - 0.3125, - 0.203125, - 0.3125, - 0.3125, - 0.0, - 0.25, - 0.25 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 10, - "work_registers_used": 16 - } - } - } - }, - "flutter/impeller/entity/gaussian_blur_noalpha_nodecal.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gaussian_blur_noalpha_nodecal.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 35, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - null - ], - "longest_path_cycles": [ - null, - null, - null, - null, - null, - null, - null - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "shortest_path_cycles": [ - 0.109375, - 0.03125, - 0.109375, - 0.0625, - 0.0, - 0.0, - 0.0 - ], - "total_bound_pipelines": [ - "varying", - "texture" - ], - "total_cycles": [ - 0.203125, - 0.203125, - 0.203125, - 0.125, - 0.0, - 0.25, - 0.25 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 10, - "work_registers_used": 13 - } - } - } - }, "flutter/impeller/entity/gles/advanced_blend.frag.gles": { "Mali-G78": { "core": "Mali-G78", @@ -3083,27 +3011,33 @@ } } }, - "flutter/impeller/entity/gles/gaussian_blur.vert.gles": { + "flutter/impeller/entity/gles/gaussian_blur.frag.gles": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/gaussian_blur.vert.gles", + "filename": "flutter/impeller/entity/gles/gaussian_blur.frag.gles", + "has_side_effects": false, "has_uniform_computation": true, - "type": "Vertex", + "modifies_coverage": false, + "reads_color_buffer": false, + "type": "Fragment", + "uses_late_zs_test": false, + "uses_late_zs_update": false, "variants": { - "Position": { + "Main": { "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "load_store" + null ], "longest_path_cycles": [ - 0.140625, - 0.140625, - 0.0, - 0.0, - 2.0, - 0.0 + null, + null, + null, + null, + null, + null, + null ], "pipelines": [ "arith_total", @@ -3111,105 +3045,59 @@ "arith_cvt", "arith_sfu", "load_store", + "varying", "texture" ], "shortest_path_bound_pipelines": [ - "load_store" + "arith_total", + "arith_cvt" ], "shortest_path_cycles": [ - 0.140625, - 0.140625, + 0.09375, + 0.0625, + 0.09375, + 0.0625, 0.0, 0.0, - 2.0, 0.0 ], "total_bound_pipelines": [ - "load_store" + "arith_total", + "arith_fma" ], "total_cycles": [ - 0.140625, - 0.140625, + 0.28125, + 0.28125, + 0.25, + 0.125, 0.0, - 0.0, - 2.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 22, - "work_registers_used": 32 - }, - "Varying": { - "fp16_arithmetic": 0, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 0.015625, - 0.015625, - 0.015625, - 0.0, - 3.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 0.015625, - 0.015625, - 0.015625, - 0.0, - 3.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 0.015625, - 0.015625, - 0.015625, - 0.0, - 3.0, - 0.0 + 0.25, + 0.25 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, "uniform_registers_used": 10, - "work_registers_used": 8 + "work_registers_used": 19 } } }, "Mali-T880": { "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/gaussian_blur.vert.gles", + "filename": "flutter/impeller/entity/gles/gaussian_blur.frag.gles", "has_uniform_computation": false, - "type": "Vertex", + "type": "Fragment", "variants": { "Main": { "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "load_store" + null ], "longest_path_cycles": [ - 2.9700000286102295, - 5.0, - 0.0 + null, + null, + null ], "pipelines": [ "arithmetic", @@ -3217,56 +3105,50 @@ "texture" ], "shortest_path_bound_pipelines": [ - "load_store" + "arithmetic" ], "shortest_path_cycles": [ - 2.9700000286102295, - 5.0, + 1.649999976158142, + 1.0, 0.0 ], "total_bound_pipelines": [ - "load_store" + "arithmetic" ], "total_cycles": [ - 3.0, - 5.0, - 0.0 + 3.6666667461395264, + 1.0, + 1.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 6, - "work_registers_used": 2 + "uniform_registers_used": 1, + "work_registers_used": 4 } } } }, - "flutter/impeller/entity/gles/gaussian_blur_noalpha_decal.frag.gles": { + "flutter/impeller/entity/gles/gaussian_blur.vert.gles": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/gaussian_blur_noalpha_decal.frag.gles", - "has_side_effects": false, + "filename": "flutter/impeller/entity/gles/gaussian_blur.vert.gles", "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, + "type": "Vertex", "variants": { - "Main": { - "fp16_arithmetic": 70, + "Position": { + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - null + "load_store" ], "longest_path_cycles": [ - null, - null, - null, - null, - null, - null, - null + 0.140625, + 0.140625, + 0.0, + 0.0, + 2.0, + 0.0 ], "pipelines": [ "arith_total", @@ -3274,178 +3156,105 @@ "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt", - "arith_sfu" + "load_store" ], "shortest_path_cycles": [ - 0.0625, - 0.03125, - 0.0625, - 0.0625, + 0.140625, + 0.140625, 0.0, 0.0, + 2.0, 0.0 ], "total_bound_pipelines": [ - "arith_total", - "arith_sfu" + "load_store" ], "total_cycles": [ - 0.3125, - 0.234375, - 0.296875, - 0.3125, + 0.140625, + 0.140625, 0.0, - 0.25, - 0.25 + 0.0, + 2.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 19 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/gaussian_blur_noalpha_decal.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { + "uniform_registers_used": 22, + "work_registers_used": 32 + }, + "Varying": { + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - null + "load_store" ], "longest_path_cycles": [ - null, - null, - null - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 1.649999976158142, - 1.0, + 0.015625, + 0.015625, + 0.015625, + 0.0, + 3.0, 0.0 ], - "total_bound_pipelines": [ - "arithmetic" - ], - "total_cycles": [ - 5.0, - 1.0, - 1.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 1, - "work_registers_used": 4 - } - } - } - }, - "flutter/impeller/entity/gles/gaussian_blur_noalpha_nodecal.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/gaussian_blur_noalpha_nodecal.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 66, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - null - ], - "longest_path_cycles": [ - null, - null, - null, - null, - null, - null, - null - ], "pipelines": [ "arith_total", "arith_fma", "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt", - "arith_sfu" + "load_store" ], "shortest_path_cycles": [ - 0.0625, - 0.03125, - 0.0625, - 0.0625, - 0.0, + 0.015625, + 0.015625, + 0.015625, 0.0, + 3.0, 0.0 ], "total_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "total_cycles": [ - 0.234375, - 0.234375, - 0.1875, - 0.125, + 0.015625, + 0.015625, + 0.015625, 0.0, - 0.25, - 0.25 + 3.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 19 + "uniform_registers_used": 10, + "work_registers_used": 8 } } }, "Mali-T880": { "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/gaussian_blur_noalpha_nodecal.frag.gles", + "filename": "flutter/impeller/entity/gles/gaussian_blur.vert.gles", "has_uniform_computation": false, - "type": "Fragment", + "type": "Vertex", "variants": { "Main": { "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - null + "load_store" ], "longest_path_cycles": [ - null, - null, - null + 2.9700000286102295, + 5.0, + 0.0 ], "pipelines": [ "arithmetic", @@ -3453,24 +3262,24 @@ "texture" ], "shortest_path_bound_pipelines": [ - "arithmetic" + "load_store" ], "shortest_path_cycles": [ - 1.649999976158142, - 1.0, + 2.9700000286102295, + 5.0, 0.0 ], "total_bound_pipelines": [ - "arithmetic" + "load_store" ], "total_cycles": [ - 3.6666667461395264, - 1.0, - 1.0 + 3.0, + 5.0, + 0.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 6, "work_registers_used": 2 } }