X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect_chain_test.cpp;fp=effect_chain_test.cpp;h=21403541827a4f48d630e8dee85403b6dc99b696;hp=120087615f03106b65dfa7d33eff28d899d79cc4;hb=e3306f2e63af4e9c1ac2b0781f67f50906574b97;hpb=3b9957afac0555a126d1941d7027fb52e29b309a diff --git a/effect_chain_test.cpp b/effect_chain_test.cpp index 1200876..2140354 100644 --- a/effect_chain_test.cpp +++ b/effect_chain_test.cpp @@ -1467,4 +1467,72 @@ TEST(EffectChainTest, ProgramsAreClonedForMultipleThreads) { expect_equal(data, out_data, 3, 2); } +// An effect that does nothing, but as a compute shader. +class IdentityComputeEffect : public Effect { +public: + IdentityComputeEffect() {} + virtual string effect_type_id() const { return "IdentityComputeEffect"; } + virtual bool is_compute_shader() const { return true; } + string output_fragment_shader() { return read_file("identity.comp"); } +}; + +TEST(ComputeShaderTest, Identity) { + float data[] = { + 0.0f, 0.25f, 0.3f, + 0.75f, 1.0f, 1.0f, + }; + float out_data[6]; + EffectChainTester tester(data, 3, 2, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_LINEAR); + if (!movit_compute_shaders_supported) { + fprintf(stderr, "Skipping test; no support for compile shaders.\n"); + return; + } + tester.get_chain()->add_effect(new IdentityComputeEffect()); + tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR); + + expect_equal(data, out_data, 3, 2); +} + +// Like IdentityComputeEffect, but due to the alpha handling, this will be +// the very last effect in the chain, which means we can't output it directly +// to the screen. +class IdentityAlphaComputeEffect : public IdentityComputeEffect { + AlphaHandling alpha_handling() const { return DONT_CARE_ALPHA_TYPE; } +}; + +TEST(ComputeShaderTest, LastEffectInChain) { + float data[] = { + 0.0f, 0.25f, 0.3f, + 0.75f, 1.0f, 1.0f, + }; + float out_data[6]; + EffectChainTester tester(data, 3, 2, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_LINEAR); + if (!movit_compute_shaders_supported) { + fprintf(stderr, "Skipping test; no support for compile shaders.\n"); + return; + } + tester.get_chain()->add_effect(new IdentityAlphaComputeEffect()); + tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR); + + expect_equal(data, out_data, 3, 2); +} + +TEST(ComputeShaderTest, Render8BitTo8Bit) { + uint8_t data[] = { + 14, 200, 80, + 90, 100, 110, + }; + uint8_t out_data[6]; + EffectChainTester tester(nullptr, 3, 2, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_LINEAR, GL_RGBA8); + if (!movit_compute_shaders_supported) { + fprintf(stderr, "Skipping test; no support for compile shaders.\n"); + return; + } + tester.add_input(data, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_LINEAR, 3, 2); + tester.get_chain()->add_effect(new IdentityAlphaComputeEffect()); + tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR); + + expect_equal(data, out_data, 3, 2); +} + } // namespace movit