X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect_chain.h;h=09b9aedc85ac78aa405b5c37042f5a56fa6feaf5;hp=992fb58da2e172969b178c3ac012746ab4673fe9;hb=fb1f4f2008f97c71248c0554d93e8d7c11347a8b;hpb=206d6ba316f94fdc3b7cbd16f23cdcaeb370ad9f diff --git a/effect_chain.h b/effect_chain.h index 992fb58..09b9aed 100644 --- a/effect_chain.h +++ b/effect_chain.h @@ -112,6 +112,12 @@ enum FramebufferTransformation { SQUARE_ROOT_FRAMEBUFFER_TRANSFORMATION, }; +// Whether a link is into another phase or not; see Node::incoming_link_type. +enum NodeLinkType { + IN_ANOTHER_PHASE, + IN_SAME_PHASE +}; + // A node in the graph; basically an effect and some associated information. class Node { public: @@ -143,16 +149,29 @@ private: // sampler state here. int bound_sampler_num; + // For each node in incoming_links, whether it comes from another phase + // or not. This is required because in some rather obscure cases, + // it is possible to have an input twice in the same phase; both by + // itself and as a bounced input. + // + // TODO: It is possible that we might even need to bounce multiple + // times and thus disambiguate also between different external phases, + // but we'll deal with that when we need to care about it, if ever. + std::vector incoming_link_type; + // Used during the building of the effect chain. Colorspace output_color_space; GammaCurve output_gamma_curve; AlphaType output_alpha_type; - bool needs_mipmaps; // Directly or indirectly. + Effect::MipmapRequirements needs_mipmaps; // Directly or indirectly. // Set if this effect, and all effects consuming output from this node // (in the same phase) have one_to_one_sampling() set. bool one_to_one_sampling; + // Same, for strong_one_to_one_sampling(). + bool strong_one_to_one_sampling; + friend class EffectChain; }; @@ -166,8 +185,6 @@ struct Phase { // which is which, because they contain the same data. std::set attribute_indexes; - bool input_needs_mipmaps; - // Inputs are only inputs from other phases (ie., those that come from RTT); // input textures are counted as part of . std::vector inputs; @@ -181,6 +198,7 @@ struct Phase { // Whether this phase is compiled as a compute shader, ie., the last effect is // marked as one. bool is_compute_shader; + Node *compute_shader_node; // If , which image unit the output buffer is bound to. // This is used as source for a Uniform below. @@ -188,17 +206,19 @@ struct Phase { // These are used in transforming from unnormalized to normalized coordinates // in compute shaders. + int uniform_output_size[2]; Point2D inv_output_size, output_texcoord_adjust; // Identifier used to create unique variables in GLSL. // Unique per-phase to increase cacheability of compiled shaders. - std::map effect_ids; + std::map, std::string> effect_ids; // Uniforms for this phase; combined from all the effects. std::vector> uniforms_image2d; std::vector> uniforms_sampler2d; std::vector> uniforms_bool; std::vector> uniforms_int; + std::vector> uniforms_ivec2; std::vector> uniforms_float; std::vector> uniforms_vec2; std::vector> uniforms_vec3; @@ -400,7 +420,10 @@ public: // All destination textures must be exactly of size x , // and must either come from the same ResourcePool the effect uses, or outlive // the EffectChain (otherwise, we could be allocating FBOs that end up being - // stale). width and height can not be zero. + // stale). Textures must also have valid state; in particular, they must either + // be mipmap complete or have a non-mipmapped minification mode. + // + // width and height can not be zero. struct DestinationTexture { GLuint texnum; GLenum format;