]> git.sesse.net Git - movit/blobdiff - effect_chain_test.cpp
Support sqrt-transformed intermediates with compute shaders.
[movit] / effect_chain_test.cpp
index 120087615f03106b65dfa7d33eff28d899d79cc4..63f574be615d2bb80ccbadfd9b56328173470db3 100644 (file)
@@ -1304,6 +1304,21 @@ TEST(EffectChainTest, StringStreamLocalesWork) {
        free(saved_locale);
 }
 
+// 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"); }
+};
+
+class WithAndWithoutComputeShaderTest : public testing::TestWithParam<string> {
+};
+INSTANTIATE_TEST_CASE_P(WithAndWithoutComputeShaderTest,
+                        WithAndWithoutComputeShaderTest,
+                        testing::Values("fragment", "compute"));
+
 TEST(EffectChainTest, sRGBIntermediate) {
        float data[] = {
                0.0f, 0.5f, 0.0f, 1.0f,
@@ -1371,7 +1386,7 @@ TEST(EffectChainTest, Linear10bitIntermediateAccuracy) {
        expect_equal(linear_data, out_data, size, 1, 7.5e-3, 2e-5);
 }
 
-TEST(EffectChainTest, SquareRoot10bitIntermediateAccuracy) {
+TEST_P(WithAndWithoutComputeShaderTest, SquareRoot10bitIntermediateAccuracy) {
        // Note that we do the comparison in sRGB space, which is what we
        // typically would want; however, we do the sRGB conversion ourself
        // to avoid compounding errors from shader conversions into the
@@ -1386,7 +1401,11 @@ TEST(EffectChainTest, SquareRoot10bitIntermediateAccuracy) {
 
        EffectChainTester tester(data, size, 1, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_LINEAR, GL_RGBA32F);
        tester.get_chain()->set_intermediate_format(GL_RGB10_A2, SQUARE_ROOT_FRAMEBUFFER_TRANSFORMATION);
-       tester.get_chain()->add_effect(new IdentityEffect());
+       if (GetParam() == "compute") {
+               tester.get_chain()->add_effect(new IdentityComputeEffect());
+       } else {
+               tester.get_chain()->add_effect(new IdentityEffect());
+       }
        tester.get_chain()->add_effect(new BouncingIdentityEffect());
        tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR);
 
@@ -1467,4 +1486,63 @@ TEST(EffectChainTest, ProgramsAreClonedForMultipleThreads) {
        expect_equal(data, out_data, 3, 2);
 }
 
+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