diff --git a/impeller/entity/contents/atlas_contents.cc b/impeller/entity/contents/atlas_contents.cc index f92c3dbd3449b..34030ac95a9f0 100644 --- a/impeller/entity/contents/atlas_contents.cc +++ b/impeller/entity/contents/atlas_contents.cc @@ -262,6 +262,8 @@ bool AtlasContents::Render(const ContentContext& renderer, dst_sampler_descriptor.width_address_mode = SamplerAddressMode::kDecal; dst_sampler_descriptor.height_address_mode = SamplerAddressMode::kDecal; } + frag_info.supports_decal_sampler_address_mode = + renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode(); auto dst_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler( dst_sampler_descriptor); FS::BindTextureSamplerDst(cmd, texture_, dst_sampler); diff --git a/impeller/entity/contents/filters/blend_filter_contents.cc b/impeller/entity/contents/filters/blend_filter_contents.cc index 7525bda593f43..44c33c5d38e91 100644 --- a/impeller/entity/contents/filters/blend_filter_contents.cc +++ b/impeller/entity/contents/filters/blend_filter_contents.cc @@ -181,6 +181,8 @@ static std::optional AdvancedBlend( dst_sampler_descriptor.width_address_mode = SamplerAddressMode::kDecal; dst_sampler_descriptor.height_address_mode = SamplerAddressMode::kDecal; } + blend_info.supports_decal_sampler_address_mode = + renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode(); auto dst_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler( dst_sampler_descriptor); FS::BindTextureSamplerDst(cmd, dst_snapshot->texture, dst_sampler); @@ -355,6 +357,8 @@ std::optional BlendFilterContents::CreateForegroundAdvancedBlend( dst_sampler_descriptor.width_address_mode = SamplerAddressMode::kDecal; dst_sampler_descriptor.height_address_mode = SamplerAddressMode::kDecal; } + blend_info.supports_decal_sampler_address_mode = + renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode(); auto dst_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler( dst_sampler_descriptor); FS::BindTextureSamplerDst(cmd, dst_snapshot->texture, dst_sampler); @@ -479,6 +483,8 @@ std::optional BlendFilterContents::CreateForegroundPorterDuffBlend( dst_sampler_descriptor.width_address_mode = SamplerAddressMode::kDecal; dst_sampler_descriptor.height_address_mode = SamplerAddressMode::kDecal; } + frag_info.supports_decal_sampler_address_mode = + renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode(); auto dst_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler( dst_sampler_descriptor); FS::BindTextureSamplerDst(cmd, dst_snapshot->texture, dst_sampler); diff --git a/impeller/entity/contents/filters/morphology_filter_contents.cc b/impeller/entity/contents/filters/morphology_filter_contents.cc index bf7a69e15ef0a..d8f087a49cb57 100644 --- a/impeller/entity/contents/filters/morphology_filter_contents.cc +++ b/impeller/entity/contents/filters/morphology_filter_contents.cc @@ -127,6 +127,8 @@ std::optional DirectionalMorphologyFilterContents::RenderFilter( sampler_descriptor.width_address_mode = SamplerAddressMode::kDecal; sampler_descriptor.height_address_mode = SamplerAddressMode::kDecal; } + frag_info.supports_decal_sampler_address_mode = + renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode(); FS::BindTextureSampler( cmd, input_snapshot->texture, diff --git a/impeller/entity/shaders/blending/advanced_blend.glsl b/impeller/entity/shaders/blending/advanced_blend.glsl index c2e26d59bf7b3..9a11dce29f789 100644 --- a/impeller/entity/shaders/blending/advanced_blend.glsl +++ b/impeller/entity/shaders/blending/advanced_blend.glsl @@ -12,6 +12,7 @@ uniform BlendInfo { float16_t src_input_alpha; float16_t color_factor; f16vec4 color; // This color input is expected to be unpremultiplied. + float supports_decal_sampler_address_mode; } blend_info; @@ -24,9 +25,12 @@ in vec2 v_src_texture_coords; out f16vec4 frag_color; f16vec4 Sample(f16sampler2D texture_sampler, vec2 texture_coords) { -// gles 2.0 is the only backend without native decal support. #ifdef IMPELLER_TARGET_OPENGLES - return IPSampleDecal(texture_sampler, texture_coords); + if (blend_info.supports_decal_sampler_address_mode > 0.0) { + return texture(texture_sampler, texture_coords); + } else { + return IPHalfSampleDecal(texture_sampler, texture_coords); + } #else return texture(texture_sampler, texture_coords); #endif diff --git a/impeller/entity/shaders/blending/porter_duff_blend.frag b/impeller/entity/shaders/blending/porter_duff_blend.frag index a24b523c07005..7e3498ff0d33c 100644 --- a/impeller/entity/shaders/blending/porter_duff_blend.frag +++ b/impeller/entity/shaders/blending/porter_duff_blend.frag @@ -19,6 +19,7 @@ uniform FragInfo { float16_t dst_coeff_src_color; float16_t input_alpha; float16_t output_alpha; + float supports_decal_sampler_address_mode; } frag_info; @@ -28,9 +29,12 @@ in f16vec4 v_color; out f16vec4 frag_color; f16vec4 Sample(f16sampler2D texture_sampler, vec2 texture_coords) { -// gles 2.0 is the only backend without native decal support. #ifdef IMPELLER_TARGET_OPENGLES - return IPSampleDecal(texture_sampler, texture_coords); + if (frag_info.supports_decal_sampler_address_mode > 0.0) { + return texture(texture_sampler, texture_coords); + } else { + return IPHalfSampleDecal(texture_sampler, texture_coords); + } #else return texture(texture_sampler, texture_coords); #endif diff --git a/impeller/entity/shaders/morphology_filter.frag b/impeller/entity/shaders/morphology_filter.frag index 8f2d01f98ee0d..29428d0774b7f 100644 --- a/impeller/entity/shaders/morphology_filter.frag +++ b/impeller/entity/shaders/morphology_filter.frag @@ -19,6 +19,7 @@ uniform FragInfo { f16vec2 uv_offset; float16_t radius; float16_t morph_type; + float supports_decal_sampler_address_mode; } frag_info; @@ -32,11 +33,15 @@ void main() { for (float16_t i = -frag_info.radius; i <= frag_info.radius; i++) { vec2 texture_coords = v_texture_coords + frag_info.uv_offset * i; -// gles 2.0 is the only backend without native decal support. + f16vec4 color; #ifdef IMPELLER_TARGET_OPENGLES - f16vec4 color = IPHalfSampleDecal(texture_sampler, texture_coords); + if (frag_info.supports_decal_sampler_address_mode > 0.0) { + color = texture(texture_sampler, texture_coords); + } else { + color = IPHalfSampleDecal(texture_sampler, texture_coords); + } #else - f16vec4 color = texture(texture_sampler, texture_coords); + color = texture(texture_sampler, texture_coords); #endif if (frag_info.morph_type == kMorphTypeDilate) { diff --git a/impeller/renderer/backend/gles/capabilities_gles.cc b/impeller/renderer/backend/gles/capabilities_gles.cc index e639b1428bf86..45ad42e5ba447 100644 --- a/impeller/renderer/backend/gles/capabilities_gles.cc +++ b/impeller/renderer/backend/gles/capabilities_gles.cc @@ -86,6 +86,12 @@ CapabilitiesGLES::CapabilitiesGLES(const ProcTableGLES& gl) { gl.GetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &value); num_shader_binary_formats = value; } + + if (gl.GetDescription()->HasExtension("GL_EXT_texture_border_clamp") || + gl.GetDescription()->HasExtension("GL_NV_texture_border_clamp") || + gl.GetDescription()->HasExtension("GL_OES_texture_border_clamp")) { + supports_decal_sampler_address_mode_ = true; + } } size_t CapabilitiesGLES::GetMaxTextureUnits(ShaderStage stage) const { @@ -140,7 +146,7 @@ bool CapabilitiesGLES::SupportsReadFromResolve() const { } bool CapabilitiesGLES::SupportsDecalSamplerAddressMode() const { - return false; + return supports_decal_sampler_address_mode_; } bool CapabilitiesGLES::SupportsDeviceTransientTextures() const { diff --git a/impeller/renderer/backend/gles/capabilities_gles.h b/impeller/renderer/backend/gles/capabilities_gles.h index b6ba0850c7b67..20685f1565422 100644 --- a/impeller/renderer/backend/gles/capabilities_gles.h +++ b/impeller/renderer/backend/gles/capabilities_gles.h @@ -114,6 +114,9 @@ class CapabilitiesGLES final // |Capabilities| PixelFormat GetDefaultDepthStencilFormat() const override; + + private: + bool supports_decal_sampler_address_mode_ = false; }; } // namespace impeller diff --git a/impeller/renderer/backend/gles/context_gles.cc b/impeller/renderer/backend/gles/context_gles.cc index 8d98d41144133..6896d6609777e 100644 --- a/impeller/renderer/backend/gles/context_gles.cc +++ b/impeller/renderer/backend/gles/context_gles.cc @@ -53,13 +53,15 @@ ContextGLES::ContextGLES(std::unique_ptr gl, } } + device_capabilities_ = reactor_->GetProcTable().GetCapabilities(); + // Create the sampler library. { sampler_library_ = - std::shared_ptr(new SamplerLibraryGLES()); + std::shared_ptr(new SamplerLibraryGLES( + device_capabilities_->SupportsDecalSamplerAddressMode())); } - device_capabilities_ = reactor_->GetProcTable().GetCapabilities(); is_valid_ = true; } diff --git a/impeller/renderer/backend/gles/gles.h b/impeller/renderer/backend/gles/gles.h index 9bacfc87db4b3..e14116ef52b50 100644 --- a/impeller/renderer/backend/gles/gles.h +++ b/impeller/renderer/backend/gles/gles.h @@ -6,6 +6,7 @@ // IWYU pragma: begin_exports #include "GLES3/gl3.h" +#define GL_CLAMP_TO_BORDER 0x812D #define GL_GLEXT_PROTOTYPES #include "GLES2/gl2ext.h" // IWYU pragma: end_exports diff --git a/impeller/renderer/backend/gles/sampler_gles.cc b/impeller/renderer/backend/gles/sampler_gles.cc index f1a54debcbc19..19d4e0ff8f623 100644 --- a/impeller/renderer/backend/gles/sampler_gles.cc +++ b/impeller/renderer/backend/gles/sampler_gles.cc @@ -53,7 +53,8 @@ static GLint ToParam(MinMagFilter minmag_filter, FML_UNREACHABLE(); } -static GLint ToAddressMode(SamplerAddressMode mode) { +static GLint ToAddressMode(SamplerAddressMode mode, + bool supports_decal_sampler_address_mode) { switch (mode) { case SamplerAddressMode::kClampToEdge: return GL_CLAMP_TO_EDGE; @@ -62,7 +63,10 @@ static GLint ToAddressMode(SamplerAddressMode mode) { case SamplerAddressMode::kMirror: return GL_MIRRORED_REPEAT; case SamplerAddressMode::kDecal: - break; // Unsupported. + if (supports_decal_sampler_address_mode) { + return GL_CLAMP_TO_BORDER; + } + break; } FML_UNREACHABLE(); } @@ -96,10 +100,14 @@ bool SamplerGLES::ConfigureBoundTexture(const TextureGLES& texture, ToParam(desc.min_filter, mip_filter)); gl.TexParameteri(target.value(), GL_TEXTURE_MAG_FILTER, ToParam(desc.mag_filter)); - gl.TexParameteri(target.value(), GL_TEXTURE_WRAP_S, - ToAddressMode(desc.width_address_mode)); - gl.TexParameteri(target.value(), GL_TEXTURE_WRAP_T, - ToAddressMode(desc.height_address_mode)); + gl.TexParameteri( + target.value(), GL_TEXTURE_WRAP_S, + ToAddressMode(desc.width_address_mode, + gl.GetCapabilities()->SupportsDecalSamplerAddressMode())); + gl.TexParameteri( + target.value(), GL_TEXTURE_WRAP_T, + ToAddressMode(desc.height_address_mode, + gl.GetCapabilities()->SupportsDecalSamplerAddressMode())); return true; } diff --git a/impeller/renderer/backend/gles/sampler_library_gles.cc b/impeller/renderer/backend/gles/sampler_library_gles.cc index 7f4cd3d243180..6012203897a2b 100644 --- a/impeller/renderer/backend/gles/sampler_library_gles.cc +++ b/impeller/renderer/backend/gles/sampler_library_gles.cc @@ -11,7 +11,9 @@ namespace impeller { -SamplerLibraryGLES::SamplerLibraryGLES() = default; +SamplerLibraryGLES::SamplerLibraryGLES(bool supports_decal_sampler_address_mode) + : supports_decal_sampler_address_mode_( + supports_decal_sampler_address_mode) {} // |SamplerLibrary| SamplerLibraryGLES::~SamplerLibraryGLES() = default; @@ -19,14 +21,12 @@ SamplerLibraryGLES::~SamplerLibraryGLES() = default; // |SamplerLibrary| std::shared_ptr SamplerLibraryGLES::GetSampler( SamplerDescriptor descriptor) { - // TODO(bdero): Change this validation once optional support for kDecal is - // added to the OpenGLES backend: - // https://github.com/flutter/flutter/issues/129358 - if (descriptor.width_address_mode == SamplerAddressMode::kDecal || - descriptor.height_address_mode == SamplerAddressMode::kDecal || - descriptor.depth_address_mode == SamplerAddressMode::kDecal) { + if (!supports_decal_sampler_address_mode_ && + (descriptor.width_address_mode == SamplerAddressMode::kDecal || + descriptor.height_address_mode == SamplerAddressMode::kDecal || + descriptor.depth_address_mode == SamplerAddressMode::kDecal)) { VALIDATION_LOG << "SamplerAddressMode::kDecal is not supported by the " - "OpenGLES backend."; + "current OpenGLES backend."; return nullptr; } diff --git a/impeller/renderer/backend/gles/sampler_library_gles.h b/impeller/renderer/backend/gles/sampler_library_gles.h index 43794426d9ed5..e23af540731f3 100644 --- a/impeller/renderer/backend/gles/sampler_library_gles.h +++ b/impeller/renderer/backend/gles/sampler_library_gles.h @@ -12,6 +12,7 @@ namespace impeller { class SamplerLibraryGLES final : public SamplerLibrary { public: + explicit SamplerLibraryGLES(bool supports_decal_sampler_address_mode); // |SamplerLibrary| ~SamplerLibraryGLES() override; @@ -26,6 +27,8 @@ class SamplerLibraryGLES final : public SamplerLibrary { std::shared_ptr GetSampler( SamplerDescriptor descriptor) override; + bool supports_decal_sampler_address_mode_ = false; + FML_DISALLOW_COPY_AND_ASSIGN(SamplerLibraryGLES); }; diff --git a/impeller/renderer/backend/gles/test/capabilities_unittests.cc b/impeller/renderer/backend/gles/test/capabilities_unittests.cc index 0bbc1b93e9775..189f54caf69f8 100644 --- a/impeller/renderer/backend/gles/test/capabilities_unittests.cc +++ b/impeller/renderer/backend/gles/test/capabilities_unittests.cc @@ -34,5 +34,15 @@ TEST(CapabilitiesGLES, CanInitializeWithDefaults) { PixelFormat::kD24UnormS8Uint); } +TEST(CapabilitiesGLES, SupportsDecalSamplerAddressMode) { + auto const extensions = std::vector{ + reinterpret_cast("GL_KHR_debug"), // + reinterpret_cast("GL_EXT_texture_border_clamp"), // + }; + auto mock_gles = MockGLES::Init(extensions); + auto capabilities = mock_gles->GetProcTable().GetCapabilities(); + EXPECT_TRUE(capabilities->SupportsDecalSamplerAddressMode()); +} + } // namespace testing } // namespace impeller diff --git a/impeller/renderer/backend/gles/test/mock_gles.cc b/impeller/renderer/backend/gles/test/mock_gles.cc index 3d4f9802b92fb..1abf7e8721d46 100644 --- a/impeller/renderer/backend/gles/test/mock_gles.cc +++ b/impeller/renderer/backend/gles/test/mock_gles.cc @@ -19,6 +19,8 @@ static std::mutex g_test_lock; static std::weak_ptr g_mock_gles; +static std::vector g_extensions; + // Has friend visibility into MockGLES to record calls. void RecordGLCall(const char* name) { if (auto mock_gles = g_mock_gles.lock()) { @@ -37,7 +39,7 @@ void doNothing() {} auto const kMockVendor = (unsigned char*)"MockGLES"; auto const kMockVersion = (unsigned char*)"3.0"; -auto const kExtensions = std::vector{ +auto const kExtensions = std::vector{ (unsigned char*)"GL_KHR_debug" // }; @@ -60,7 +62,7 @@ static_assert(CheckSameSignature::value); -std::shared_ptr MockGLES::Init() { +std::shared_ptr MockGLES::Init( + const std::optional>& extensions) { // If we cannot obtain a lock, MockGLES is already being used elsewhere. FML_CHECK(g_test_lock.try_lock()) << "MockGLES is already being used by another test."; + g_extensions = extensions.value_or(kExtensions); auto mock_gles = std::shared_ptr(new MockGLES()); g_mock_gles = mock_gles; return mock_gles; diff --git a/impeller/renderer/backend/gles/test/mock_gles.h b/impeller/renderer/backend/gles/test/mock_gles.h index ec548edce16d3..fb2971500ff85 100644 --- a/impeller/renderer/backend/gles/test/mock_gles.h +++ b/impeller/renderer/backend/gles/test/mock_gles.h @@ -3,6 +3,7 @@ // found in the LICENSE file. #include +#include #include "fml/macros.h" #include "impeller/renderer/backend/gles/proc_table_gles.h" @@ -24,7 +25,9 @@ class MockGLES final { /// This method overwrites mocked global GLES function pointers to record /// invocations on this instance of |MockGLES|. As such, it should only be /// called once per test. - static std::shared_ptr Init(); + static std::shared_ptr Init( + const std::optional>& extensions = + std::nullopt); /// @brief Returns a configured |ProcTableGLES| instance. const ProcTableGLES& GetProcTable() const { return proc_table_; } diff --git a/impeller/tools/malioc.json b/impeller/tools/malioc.json index 392449302a8c0..3f20eb41b8865 100644 --- a/impeller/tools/malioc.json +++ b/impeller/tools/malioc.json @@ -3820,7 +3820,7 @@ "longest_path_cycles": [ 0.609375, 0.609375, - 0.4375, + 0.46875, 0.5, 0.0, 0.5, @@ -3842,24 +3842,23 @@ "shortest_path_cycles": [ 0.34375, 0.34375, - 0.3125, - 0.1875, + 0.265625, + 0.0, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "arith_total", - "arith_fma" + "texture" ], "total_cycles": [ 0.609375, 0.609375, - 0.484375, + 0.578125, 0.5, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -3882,7 +3881,7 @@ "arithmetic" ], "longest_path_cycles": [ - 8.90999984741211, + 9.569999694824219, 2.0, 2.0 ], @@ -3895,7 +3894,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 5.28000020980835, + 4.949999809265137, 1.0, 0.0 ], @@ -3903,13 +3902,13 @@ "arithmetic" ], "total_cycles": [ - 9.666666984558105, + 11.0, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 3 } } @@ -3936,9 +3935,9 @@ "arith_cvt" ], "longest_path_cycles": [ - 0.578125, + 0.637499988079071, 0.28125, - 0.578125, + 0.637499988079071, 0.5625, 0.0, 0.5, @@ -3958,26 +3957,25 @@ "arith_cvt" ], "shortest_path_cycles": [ - 0.453125, + 0.40625, 0.25, - 0.453125, - 0.375, + 0.40625, + 0.1875, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "arith_total", - "arith_cvt" + "texture" ], "total_cycles": [ - 0.625, + 0.75, 0.28125, - 0.625, + 0.75, 0.5625, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -4000,7 +3998,7 @@ "arithmetic" ], "longest_path_cycles": [ - 9.569999694824219, + 10.229999542236328, 2.0, 2.0 ], @@ -4013,7 +4011,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 7.920000076293945, + 7.590000152587891, 1.0, 0.0 ], @@ -4021,13 +4019,13 @@ "arithmetic" ], "total_cycles": [ - 10.333333015441895, + 11.666666984558105, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 2 } } @@ -4051,13 +4049,12 @@ "performance": { "longest_path_bound_pipelines": [ "arith_total", - "arith_cvt", - "arith_sfu" + "arith_cvt" ], "longest_path_cycles": [ - 0.5625, + 0.625, 0.25, - 0.5625, + 0.625, 0.5625, 0.0, 0.5, @@ -4077,26 +4074,25 @@ "arith_cvt" ], "shortest_path_cycles": [ - 0.4375, + 0.390625, 0.21875, - 0.4375, - 0.375, + 0.390625, + 0.1875, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "arith_total", - "arith_cvt" + "texture" ], "total_cycles": [ - 0.609375, + 0.737500011920929, 0.25, - 0.609375, + 0.737500011920929, 0.5625, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -4119,7 +4115,7 @@ "arithmetic" ], "longest_path_cycles": [ - 9.569999694824219, + 10.229999542236328, 2.0, 2.0 ], @@ -4132,7 +4128,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 7.920000076293945, + 7.590000152587891, 1.0, 0.0 ], @@ -4140,13 +4136,13 @@ "arithmetic" ], "total_cycles": [ - 10.333333015441895, + 11.666666984558105, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 2 } } @@ -4173,9 +4169,9 @@ "texture" ], "longest_path_cycles": [ - 0.375, + 0.40625, 0.1875, - 0.34375, + 0.40625, 0.375, 0.0, 0.5, @@ -4191,29 +4187,29 @@ "texture" ], "shortest_path_bound_pipelines": [ - "varying" + "varying", + "texture" ], "shortest_path_cycles": [ - 0.21875, + 0.171875, 0.15625, - 0.21875, - 0.1875, + 0.171875, + 0.0, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "varying", "texture" ], "total_cycles": [ - 0.390625, + 0.515625, 0.1875, - 0.390625, + 0.515625, 0.375, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -4236,7 +4232,7 @@ "arithmetic" ], "longest_path_cycles": [ - 4.619999885559082, + 5.28000020980835, 2.0, 2.0 ], @@ -4249,7 +4245,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 2.640000104904175, + 2.309999942779541, 1.0, 0.0 ], @@ -4257,13 +4253,13 @@ "arithmetic" ], "total_cycles": [ - 5.0, + 6.333333492279053, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 2 } } @@ -4292,7 +4288,7 @@ "longest_path_cycles": [ 0.375, 0.234375, - 0.3125, + 0.375, 0.375, 0.0, 0.5, @@ -4308,29 +4304,29 @@ "texture" ], "shortest_path_bound_pipelines": [ - "varying" + "varying", + "texture" ], "shortest_path_cycles": [ 0.203125, 0.203125, - 0.1875, - 0.1875, + 0.140625, + 0.0, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "varying", "texture" ], "total_cycles": [ - 0.375, + 0.484375, 0.234375, - 0.359375, + 0.484375, 0.375, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -4353,7 +4349,7 @@ "arithmetic" ], "longest_path_cycles": [ - 4.949999809265137, + 5.610000133514404, 2.0, 2.0 ], @@ -4366,7 +4362,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 2.9700000286102295, + 2.640000104904175, 1.0, 0.0 ], @@ -4374,13 +4370,13 @@ "arithmetic" ], "total_cycles": [ - 5.333333492279053, + 6.666666507720947, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 2 } } @@ -4409,7 +4405,7 @@ "longest_path_cycles": [ 0.375, 0.28125, - 0.3125, + 0.375, 0.375, 0.0, 0.5, @@ -4427,29 +4423,29 @@ "shortest_path_bound_pipelines": [ "arith_total", "arith_fma", - "varying" + "varying", + "texture" ], "shortest_path_cycles": [ 0.25, 0.25, - 0.1875, - 0.1875, + 0.140625, + 0.0, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "varying", "texture" ], "total_cycles": [ - 0.375, + 0.484375, 0.28125, - 0.359375, + 0.484375, 0.375, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -4472,7 +4468,7 @@ "arithmetic" ], "longest_path_cycles": [ - 4.949999809265137, + 5.610000133514404, 2.0, 2.0 ], @@ -4485,7 +4481,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 2.9700000286102295, + 2.640000104904175, 1.0, 0.0 ], @@ -4493,13 +4489,13 @@ "arithmetic" ], "total_cycles": [ - 5.333333492279053, + 6.666666507720947, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 2 } } @@ -4528,7 +4524,7 @@ "longest_path_cycles": [ 0.453125, 0.453125, - 0.359375, + 0.421875, 0.375, 0.0, 0.5, @@ -4550,24 +4546,23 @@ "shortest_path_cycles": [ 0.421875, 0.421875, - 0.234375, 0.1875, 0.0, + 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "varying", "texture" ], "total_cycles": [ + 0.53125, 0.453125, - 0.453125, - 0.40625, + 0.53125, 0.375, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -4590,7 +4585,7 @@ "arithmetic" ], "longest_path_cycles": [ - 5.940000057220459, + 6.599999904632568, 2.0, 2.0 ], @@ -4603,7 +4598,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 4.289999961853027, + 3.9600000381469727, 1.0, 0.0 ], @@ -4611,13 +4606,13 @@ "arithmetic" ], "total_cycles": [ - 6.666666507720947, + 8.0, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 4 } } @@ -4646,7 +4641,7 @@ "longest_path_cycles": [ 0.71875, 0.71875, - 0.59375, + 0.625, 0.5625, 0.0, 0.5, @@ -4666,26 +4661,25 @@ "arith_cvt" ], "shortest_path_cycles": [ - 0.453125, + 0.40625, 0.34375, - 0.453125, - 0.1875, + 0.40625, + 0.0, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "arith_total", - "arith_fma" + "texture" ], "total_cycles": [ + 0.78125, 0.71875, - 0.71875, - 0.6875, + 0.78125, 0.5625, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -4708,7 +4702,7 @@ "arithmetic" ], "longest_path_cycles": [ - 10.5600004196167, + 11.220000267028809, 2.0, 2.0 ], @@ -4721,7 +4715,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 5.940000057220459, + 5.610000133514404, 1.0, 0.0 ], @@ -4729,13 +4723,13 @@ "arithmetic" ], "total_cycles": [ - 11.666666984558105, + 13.0, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 3 } } @@ -4762,9 +4756,9 @@ "texture" ], "longest_path_cycles": [ - 0.375, + 0.40625, 0.1875, - 0.34375, + 0.40625, 0.375, 0.0, 0.5, @@ -4780,29 +4774,29 @@ "texture" ], "shortest_path_bound_pipelines": [ - "varying" + "varying", + "texture" ], "shortest_path_cycles": [ - 0.21875, + 0.171875, 0.15625, - 0.21875, - 0.1875, + 0.171875, + 0.0, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "varying", "texture" ], "total_cycles": [ - 0.390625, + 0.515625, 0.1875, - 0.390625, + 0.515625, 0.375, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -4825,7 +4819,7 @@ "arithmetic" ], "longest_path_cycles": [ - 4.619999885559082, + 5.28000020980835, 2.0, 2.0 ], @@ -4838,7 +4832,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 2.640000104904175, + 2.309999942779541, 1.0, 0.0 ], @@ -4846,13 +4840,13 @@ "arithmetic" ], "total_cycles": [ - 5.0, + 6.333333492279053, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 2 } } @@ -4881,7 +4875,7 @@ "longest_path_cycles": [ 0.609375, 0.609375, - 0.4375, + 0.46875, 0.5, 0.0, 0.5, @@ -4903,24 +4897,23 @@ "shortest_path_cycles": [ 0.34375, 0.34375, - 0.3125, - 0.1875, + 0.265625, + 0.0, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "arith_total", - "arith_fma" + "texture" ], "total_cycles": [ 0.609375, 0.609375, - 0.484375, + 0.578125, 0.5, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -4943,7 +4936,7 @@ "arithmetic" ], "longest_path_cycles": [ - 8.90999984741211, + 9.569999694824219, 2.0, 2.0 ], @@ -4956,7 +4949,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 5.28000020980835, + 4.949999809265137, 1.0, 0.0 ], @@ -4964,13 +4957,13 @@ "arithmetic" ], "total_cycles": [ - 9.666666984558105, + 11.0, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 3 } } @@ -4999,7 +4992,7 @@ "longest_path_cycles": [ 0.375, 0.203125, - 0.3125, + 0.375, 0.375, 0.0, 0.5, @@ -5015,29 +5008,29 @@ "texture" ], "shortest_path_bound_pipelines": [ - "varying" + "varying", + "texture" ], "shortest_path_cycles": [ - 0.1875, 0.171875, - 0.1875, - 0.1875, + 0.171875, + 0.140625, + 0.0, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "varying", "texture" ], "total_cycles": [ - 0.375, + 0.484375, 0.203125, - 0.359375, + 0.484375, 0.375, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -5060,7 +5053,7 @@ "arithmetic" ], "longest_path_cycles": [ - 4.949999809265137, + 5.610000133514404, 2.0, 2.0 ], @@ -5073,7 +5066,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 2.9700000286102295, + 2.640000104904175, 1.0, 0.0 ], @@ -5081,13 +5074,13 @@ "arithmetic" ], "total_cycles": [ - 5.333333492279053, + 6.666666507720947, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 2 } } @@ -5116,7 +5109,7 @@ "longest_path_cycles": [ 0.453125, 0.453125, - 0.375, + 0.4375, 0.375, 0.0, 0.5, @@ -5138,24 +5131,23 @@ "shortest_path_cycles": [ 0.421875, 0.421875, - 0.25, - 0.1875, + 0.203125, + 0.0, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "varying", "texture" ], "total_cycles": [ + 0.546875, 0.453125, - 0.453125, - 0.421875, + 0.546875, 0.375, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -5178,7 +5170,7 @@ "arithmetic" ], "longest_path_cycles": [ - 6.269999980926514, + 6.929999828338623, 2.0, 2.0 ], @@ -5191,7 +5183,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 4.289999961853027, + 3.9600000381469727, 1.0, 0.0 ], @@ -5199,13 +5191,13 @@ "arithmetic" ], "total_cycles": [ - 6.666666507720947, + 8.0, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 4 } } @@ -5234,7 +5226,7 @@ "longest_path_cycles": [ 0.71875, 0.71875, - 0.59375, + 0.625, 0.5625, 0.0, 0.5, @@ -5254,26 +5246,25 @@ "arith_cvt" ], "shortest_path_cycles": [ - 0.453125, + 0.40625, 0.34375, - 0.453125, - 0.1875, + 0.40625, + 0.0, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "arith_total", - "arith_fma" + "texture" ], "total_cycles": [ + 0.78125, 0.71875, - 0.71875, - 0.6875, + 0.78125, 0.5625, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -5296,7 +5287,7 @@ "arithmetic" ], "longest_path_cycles": [ - 10.890000343322754, + 11.550000190734863, 2.0, 2.0 ], @@ -5309,7 +5300,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 5.940000057220459, + 5.610000133514404, 1.0, 0.0 ], @@ -5317,13 +5308,13 @@ "arithmetic" ], "total_cycles": [ - 11.666666984558105, + 13.0, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 3 } } @@ -5352,7 +5343,7 @@ "longest_path_cycles": [ 0.375, 0.25, - 0.3125, + 0.375, 0.375, 0.0, 0.5, @@ -5368,29 +5359,29 @@ "texture" ], "shortest_path_bound_pipelines": [ - "varying" + "varying", + "texture" ], "shortest_path_cycles": [ 0.21875, 0.21875, - 0.1875, - 0.1875, + 0.140625, + 0.0, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "varying", "texture" ], "total_cycles": [ - 0.375, + 0.484375, 0.25, - 0.359375, + 0.484375, 0.375, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -5413,7 +5404,7 @@ "arithmetic" ], "longest_path_cycles": [ - 4.949999809265137, + 5.610000133514404, 2.0, 2.0 ], @@ -5426,7 +5417,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 2.9700000286102295, + 2.640000104904175, 1.0, 0.0 ], @@ -5434,13 +5425,13 @@ "arithmetic" ], "total_cycles": [ - 5.333333492279053, + 6.666666507720947, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 2 } } @@ -5469,7 +5460,7 @@ "longest_path_cycles": [ 0.75, 0.75, - 0.515625, + 0.578125, 0.5625, 0.0, 0.5, @@ -5491,24 +5482,23 @@ "shortest_path_cycles": [ 0.71875, 0.71875, - 0.390625, - 0.375, + 0.34375, + 0.1875, 0.0, 0.25, - 0.0 + 0.25 ], "total_bound_pipelines": [ - "arith_total", - "arith_fma" + "texture" ], "total_cycles": [ 0.75, 0.75, - 0.5625, + 0.6875, 0.5625, 0.0, 0.5, - 0.5 + 1.0 ] }, "stack_spill_bytes": 0, @@ -5531,7 +5521,7 @@ "arithmetic" ], "longest_path_cycles": [ - 8.90999984741211, + 9.569999694824219, 2.0, 2.0 ], @@ -5544,7 +5534,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 6.929999828338623, + 6.599999904632568, 1.0, 0.0 ], @@ -5552,13 +5542,13 @@ "arithmetic" ], "total_cycles": [ - 9.333333015441895, + 10.666666984558105, 2.0, - 2.0 + 4.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 1, + "uniform_registers_used": 2, "work_registers_used": 4 } } @@ -8354,17 +8344,16 @@ 0.0 ], "total_bound_pipelines": [ - "arith_total", - "arith_cvt" + "texture" ], "total_cycles": [ - 0.359375, + 0.390625, 0.078125, - 0.359375, + 0.390625, 0.0625, 0.0, 0.25, - 0.25 + 0.5 ] }, "stack_spill_bytes": 0, @@ -8409,14 +8398,14 @@ "arithmetic" ], "total_cycles": [ - 4.0, + 4.666666507720947, 1.0, - 1.0 + 2.0 ] }, "thread_occupancy": 100, "uniform_registers_used": 1, - "work_registers_used": 4 + "work_registers_used": 3 } } }