X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect.h;h=67e64238beb2bdc590f75ed83327b045d3e80c29;hp=9d81a562e0aa8f53b18c8e0d6e8e5990076f0cfd;hb=refs%2Fheads%2F1.3.x-release;hpb=9c12e38b7cd88a77ef297d080b7c41e6bd6326fb diff --git a/effect.h b/effect.h index 9d81a56..67e6423 100644 --- a/effect.h +++ b/effect.h @@ -217,6 +217,20 @@ public: // and allow dependent effects to change that sampler state. virtual bool is_single_texture() const { return false; } + // If set, this effect should never be bounced to an output, even if a + // dependent effect demands texture bounce. + // + // Note that setting this can invoke undefined behavior, up to and including crashing, + // so you should only use it if you have deep understanding of your entire chain + // and Movit's processing of it. The most likely use case is if you have an input + // that's cheap to compute but not a single texture (e.g. YCbCrInput), and want + // to run a ResampleEffect directly from it. Normally, this would require a bounce, + // but it's faster not to. (However, also note that in this case, effective texel + // subpixel precision will be too optimistic, since chroma is already subsampled.) + // + // Has no effect if is_single_texture() is set. + virtual bool override_disable_bounce() const { return false; } + // If changes_output_size() is true, you must implement this to tell // the framework what output size you want. Also, you can set a // virtual width/height, which is the size the next effect (if any) @@ -302,11 +316,8 @@ protected: // // Neither of these take ownership of the pointer. - // int is special since GLSL pre-1.30 doesn't have integer uniforms. - // Thus, ints that you register will _not_ be converted to GLSL uniforms. + // These correspond directly to int/float/vec2/vec3/vec4 in GLSL. void register_int(const std::string &key, int *value); - - // These correspond directly to float/vec2/vec3/vec4 in GLSL. void register_float(const std::string &key, float *value); void register_vec2(const std::string &key, float *values); void register_vec3(const std::string &key, float *values); @@ -332,14 +343,16 @@ protected: // // Calling register_* will automatically imply register_uniform_*, // except for register_int as noted above. + void register_uniform_sampler2d(const std::string &key, const int *value); void register_uniform_bool(const std::string &key, const bool *value); void register_uniform_int(const std::string &key, const int *value); // Note: Requires GLSL 1.30 or newer. - void register_uniform_sampler2d(const std::string &key, const int *value); void register_uniform_float(const std::string &key, const float *value); void register_uniform_vec2(const std::string &key, const float *values); void register_uniform_vec3(const std::string &key, const float *values); void register_uniform_vec4(const std::string &key, const float *values); + void register_uniform_float_array(const std::string &key, const float *values, size_t num_values); void register_uniform_vec2_array(const std::string &key, const float *values, size_t num_values); + void register_uniform_vec3_array(const std::string &key, const float *values, size_t num_values); void register_uniform_vec4_array(const std::string &key, const float *values, size_t num_values); void register_uniform_mat3(const std::string &key, const Eigen::Matrix3d *matrix); @@ -351,14 +364,16 @@ private: std::map params_vec4; // Picked out by EffectChain during finalization. + std::vector > uniforms_sampler2d; std::vector > uniforms_bool; std::vector > uniforms_int; - std::vector > uniforms_sampler2d; std::vector > uniforms_float; std::vector > uniforms_vec2; std::vector > uniforms_vec3; std::vector > uniforms_vec4; + std::vector > uniforms_float_array; std::vector > uniforms_vec2_array; + std::vector > uniforms_vec3_array; std::vector > uniforms_vec4_array; std::vector > uniforms_mat3; friend class EffectChain;