X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect_chain.h;h=9fb1d4ea6642a48ec38216a0c5a5b607b3f48015;hp=e07c2e9061b9b01f68d6baf753dacec03cead707;hb=831150846e1e79b53b02b07fbf12ec7cae289a3a;hpb=06ba8d86c019208682d8883dc7187df37b027814 diff --git a/effect_chain.h b/effect_chain.h index e07c2e9..9fb1d4e 100644 --- a/effect_chain.h +++ b/effect_chain.h @@ -83,6 +83,21 @@ enum YCbCrOutputSplitting { YCBCR_OUTPUT_PLANAR, }; +// Where (0,0) is taken to be in the output. If you want to render to an +// OpenGL screen, you should keep the default of bottom-left, as that is +// OpenGL's natural coordinate system. However, there are cases, such as if you +// render to an FBO and read the pixels back into some other system, where +// you'd want a top-left origin; if so, an additional flip step will be added +// at the very end (but done in a vertex shader, so it will have zero extra +// cost). +// +// Note that Movit's coordinate system in general consistently puts (0,0) in +// the top left for _input_, no matter what you set as output origin. +enum OutputOrigin { + OUTPUT_ORIGIN_BOTTOM_LEFT, + OUTPUT_ORIGIN_TOP_LEFT, +}; + // A node in the graph; basically an effect and some associated information. class Node { public: @@ -207,12 +222,17 @@ public: } Effect *add_effect(Effect *effect, const std::vector &inputs); - // Adds an RGB output. Note that you can only have one output. + // Adds an RGBA output. Note that you can have at most one RGBA output and one + // Y'CbCr output (see below for details). void add_output(const ImageFormat &format, OutputAlphaFormat alpha_format); // Adds an YCbCr output. Note that you can only have one output. // Currently, only chunked packed output is supported, and only 4:4:4 // (so chroma_subsampling_x and chroma_subsampling_y must both be 1). + // + // If you have both RGBA and Y'CbCr output, the RGBA output will come + // in the last draw buffer. Also, and must be + // identical between the two. void add_ycbcr_output(const ImageFormat &format, OutputAlphaFormat alpha_format, const YCbCrFormat &ycbcr_format, YCbCrOutputSplitting output_splitting = YCBCR_OUTPUT_INTERLEAVED); @@ -225,6 +245,14 @@ public: this->num_dither_bits = num_bits; } + // Set where (0,0) is taken to be in the output. The default is + // OUTPUT_ORIGIN_BOTTOM_LEFT, which is usually what you want + // (see OutputOrigin above for more details). + void set_output_origin(OutputOrigin output_origin) + { + this->output_origin = output_origin; + } + void finalize(); // Measure the GPU time used for each actual phase during rendering. @@ -365,10 +393,9 @@ private: ImageFormat output_format; OutputAlphaFormat output_alpha_format; - enum OutputColorType { OUTPUT_COLOR_RGB, OUTPUT_COLOR_YCBCR }; - OutputColorType output_color_type; - YCbCrFormat output_ycbcr_format; // If output_color_type == OUTPUT_COLOR_YCBCR. - YCbCrOutputSplitting output_ycbcr_splitting; // If output_color_type == OUTPUT_COLOR_YCBCR. + bool output_color_rgba, output_color_ycbcr; + YCbCrFormat output_ycbcr_format; // If output_color_ycbcr is true. + YCbCrOutputSplitting output_ycbcr_splitting; // If output_color_ycbcr is true. std::vector nodes; std::map node_map; @@ -378,6 +405,7 @@ private: std::vector phases; unsigned num_dither_bits; + OutputOrigin output_origin; bool finalized; ResourcePool *resource_pool;