]> git.sesse.net Git - movit/blobdiff - effect_chain_test.cpp
Don't use GL_RGBA32F/GL_RGBA16F with GL_UNSIGNED_BYTE.
[movit] / effect_chain_test.cpp
index c64c7b55311e25c81c333875015fa9e1ca6e3cc2..70701b35095511d19c45a5bf39a7e14668d004a0 100644 (file)
@@ -2,13 +2,14 @@
 //
 // Note that this also contains the tests for some of the simpler effects.
 
-#include <GL/glew.h>
+#include <epoxy/gl.h>
 #include <assert.h>
 
 #include "effect.h"
 #include "effect_chain.h"
 #include "flat_input.h"
 #include "gtest/gtest.h"
+#include "init.h"
 #include "input.h"
 #include "mirror_effect.h"
 #include "multiply_effect.h"
 #include "test_util.h"
 #include "util.h"
 
+using namespace std;
+
+namespace movit {
+
 TEST(EffectChainTest, EmptyChain) {
        float data[] = {
                0.0f, 0.25f, 0.3f,
@@ -32,8 +37,8 @@ TEST(EffectChainTest, EmptyChain) {
 class IdentityEffect : public Effect {
 public:
        IdentityEffect() {}
-       virtual std::string effect_type_id() const { return "IdentityEffect"; }
-       std::string output_fragment_shader() { return read_file("identity.frag"); }
+       virtual string effect_type_id() const { return "IdentityEffect"; }
+       string output_fragment_shader() { return read_file("identity.frag"); }
 };
 
 TEST(EffectChainTest, Identity) {
@@ -53,8 +58,8 @@ TEST(EffectChainTest, Identity) {
 class BouncingIdentityEffect : public Effect {
 public:
        BouncingIdentityEffect() {}
-       virtual std::string effect_type_id() const { return "IdentityEffect"; }
-       std::string output_fragment_shader() { return read_file("identity.frag"); }
+       virtual string effect_type_id() const { return "IdentityEffect"; }
+       string output_fragment_shader() { return read_file("identity.frag"); }
        bool needs_texture_bounce() const { return true; }
        AlphaHandling alpha_handling() const { return DONT_CARE_ALPHA_TYPE; }
 };
@@ -93,8 +98,8 @@ TEST(MirrorTest, BasicTest) {
 class InvertEffect : public Effect {
 public:
        InvertEffect() {}
-       virtual std::string effect_type_id() const { return "InvertEffect"; }
-       std::string output_fragment_shader() { return read_file("invert_effect.frag"); }
+       virtual string effect_type_id() const { return "InvertEffect"; }
+       string output_fragment_shader() { return read_file("invert_effect.frag"); }
 
        // A real invert would actually care about its alpha,
        // but in this unit test, it only complicates things.
@@ -108,8 +113,8 @@ template<class T>
 class RewritingEffect : public Effect {
 public:
        RewritingEffect() : effect(new T()), replaced_node(NULL) {}
-       virtual std::string effect_type_id() const { return "RewritingEffect[" + effect->effect_type_id() + "]"; }
-       std::string output_fragment_shader() { EXPECT_TRUE(false); return read_file("identity.frag"); }
+       virtual string effect_type_id() const { return "RewritingEffect[" + effect->effect_type_id() + "]"; }
+       string output_fragment_shader() { EXPECT_TRUE(false); return read_file("identity.frag"); }
        virtual void rewrite_graph(EffectChain *graph, Node *self) {
                replaced_node = graph->add_node(effect);
                graph->replace_receiver(self, replaced_node);
@@ -202,7 +207,7 @@ public:
            : FlatInput(format, pixel_format, type, width, height),
              overridden_color_space(format.color_space),
              overridden_gamma_curve(format.gamma_curve) {}
-       virtual std::string effect_type_id() const { return "UnknownColorspaceInput"; }
+       virtual string effect_type_id() const { return "UnknownColorspaceInput"; }
 
        void set_color_space(Colorspace colorspace) {
                overridden_color_space = colorspace;
@@ -387,8 +392,8 @@ TEST(EffectChainTest, NoAlphaConversionsWhenPremultipliedAlphaNotNeeded) {
 class BlueInput : public Input {
 public:
        BlueInput() { register_int("needs_mipmaps", &needs_mipmaps); }
-       virtual std::string effect_type_id() const { return "IdentityEffect"; }
-       std::string output_fragment_shader() { return read_file("blue.frag"); }
+       virtual string effect_type_id() const { return "IdentityEffect"; }
+       string output_fragment_shader() { return read_file("blue.frag"); }
        virtual AlphaHandling alpha_handling() const { return OUTPUT_BLANK_ALPHA; }
        virtual void finalize() {}
        virtual bool can_output_linear_gamma() const { return true; }
@@ -406,8 +411,8 @@ private:
 class RewritingToBlueInput : public Input {
 public:
        RewritingToBlueInput() : blue_node(NULL) { register_int("needs_mipmaps", &needs_mipmaps); }
-       virtual std::string effect_type_id() const { return "RewritingToBlueInput"; }
-       std::string output_fragment_shader() { EXPECT_TRUE(false); return read_file("identity.frag"); }
+       virtual string effect_type_id() const { return "RewritingToBlueInput"; }
+       string output_fragment_shader() { EXPECT_TRUE(false); return read_file("identity.frag"); }
        virtual void rewrite_graph(EffectChain *graph, Node *self) {
                Node *blue_node = graph->add_node(new BlueInput());
                graph->replace_receiver(self, blue_node);
@@ -457,8 +462,8 @@ TEST(EffectChainTest, NoAlphaConversionsWithBlankAlpha) {
 class BlankAlphaPreservingEffect : public Effect {
 public:
        BlankAlphaPreservingEffect() {}
-       virtual std::string effect_type_id() const { return "BlankAlphaPreservingEffect"; }
-       std::string output_fragment_shader() { return read_file("identity.frag"); }
+       virtual string effect_type_id() const { return "BlankAlphaPreservingEffect"; }
+       string output_fragment_shader() { return read_file("identity.frag"); }
        virtual AlphaHandling alpha_handling() const { return INPUT_PREMULTIPLIED_ALPHA_KEEP_BLANK; }
 };
 
@@ -517,17 +522,27 @@ class MipmapNeedingEffect : public Effect {
 public:
        MipmapNeedingEffect() {}
        virtual bool needs_mipmaps() const { return true; }
-       virtual std::string effect_type_id() const { return "MipmapNeedingEffect"; }
-       std::string output_fragment_shader() { return read_file("mipmap_needing_effect.frag"); }
-       void set_gl_state(GLuint glsl_program_num, const std::string& prefix, unsigned *sampler_num)
+
+       // To be allowed to mess with the sampler state.
+       virtual bool needs_texture_bounce() const { return true; }
+
+       virtual string effect_type_id() const { return "MipmapNeedingEffect"; }
+       string output_fragment_shader() { return read_file("mipmap_needing_effect.frag"); }
+       virtual void inform_added(EffectChain *chain) { this->chain = chain; }
+
+       void set_gl_state(GLuint glsl_program_num, const string& prefix, unsigned *sampler_num)
        {
-               glActiveTexture(GL_TEXTURE0);
+               Node *self = chain->find_node_for_effect(this);
+               glActiveTexture(chain->get_input_sampler(self, 0));
                check_error();
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
                check_error();
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
                check_error();
        }
+
+private:
+       EffectChain *chain;
 };
 
 TEST(EffectChainTest, MipmapGenerationWorks) {
@@ -643,8 +658,8 @@ TEST(EffectChainTest, ResizeDownByFourThenUpByFour) {
 class AddEffect : public Effect {
 public:
        AddEffect() {}
-       virtual std::string effect_type_id() const { return "AddEffect"; }
-       std::string output_fragment_shader() { return read_file("add.frag"); }
+       virtual string effect_type_id() const { return "AddEffect"; }
+       string output_fragment_shader() { return read_file("add.frag"); }
        virtual unsigned num_inputs() const { return 2; }
        virtual AlphaHandling alpha_handling() const { return DONT_CARE_ALPHA_TYPE; }
 };
@@ -824,7 +839,7 @@ public:
                input_width = width;
                input_height = height;
        }
-       virtual std::string effect_type_id() const { return "SizeStoringEffect"; }
+       virtual string effect_type_id() const { return "SizeStoringEffect"; }
 
        int input_width, input_height;
 };
@@ -913,8 +928,8 @@ public:
                  height(height),
                  virtual_width(virtual_width),
                  virtual_height(virtual_height) {}
-       virtual std::string effect_type_id() const { return "VirtualResizeEffect"; }
-       std::string output_fragment_shader() { return read_file("identity.frag"); }
+       virtual string effect_type_id() const { return "VirtualResizeEffect"; }
+       string output_fragment_shader() { return read_file("identity.frag"); }
 
        virtual bool changes_output_size() const { return true; }
 
@@ -955,8 +970,6 @@ TEST(EffectChainTest, VirtualSizeIsSentOnToInputs) {
        expect_equal(data, out_data, size, size);
 }
 
-extern bool movit_initialized;
-
 // Does not use EffectChainTest, so that it can construct an EffectChain without
 // a shared ResourcePool (which is also properly destroyed afterwards).
 // Also turns on debugging to test that code path.
@@ -973,8 +986,7 @@ TEST(EffectChainTest, IdentityWithOwnPool) {
        float out_data[6];
 
        EffectChain chain(width, height);
-       movit_initialized = false;
-       init_movit(".", MOVIT_DEBUG_ON);
+       movit_debug_level = MOVIT_DEBUG_ON;
 
        ImageFormat format;
        format.color_space = COLORSPACE_sRGB;
@@ -990,7 +1002,7 @@ TEST(EffectChainTest, IdentityWithOwnPool) {
        check_error();
        glBindTexture(GL_TEXTURE_2D, texnum);
        check_error();
-       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
        check_error();
 
        glGenFramebuffers(1, &fbo);
@@ -1017,6 +1029,7 @@ TEST(EffectChainTest, IdentityWithOwnPool) {
        expect_equal(expected_data, out_data, width, height);
 
        // Reset the debug status again.
-       movit_initialized = false;
-       init_movit(".", MOVIT_DEBUG_OFF);
+       movit_debug_level = MOVIT_DEBUG_OFF;
 }
+
+}  // namespace movit