From 67b2debafd624d3be66588171d6ec677b54247ba Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Thu, 20 Mar 2014 22:42:53 +0100 Subject: [PATCH 1/1] Stop using BGR, BGRA and grayscale formats. Neither of these are properly supported by GLES3, so just give in more standard, boring formats, and then do the swizzles in the shader. --- fft_input.cpp | 3 ++- flat_input.cpp | 45 ++++++++++++++++++++++++++++++++++----------- flat_input.frag | 14 +++++++++++++- flat_input.h | 6 ++---- 4 files changed, 51 insertions(+), 17 deletions(-) diff --git a/fft_input.cpp b/fft_input.cpp index 76e77d6..c88a7c4 100644 --- a/fft_input.cpp +++ b/fft_input.cpp @@ -104,7 +104,8 @@ void FFTInput::set_gl_state(GLuint glsl_program_num, const string& prefix, unsig string FFTInput::output_fragment_shader() { - return read_file("flat_input.frag"); + return string("#define FIXUP_SWAP_RB 0\n#define FIXUP_RED_TO_GRAYSCALE 0\n") + + read_file("flat_input.frag"); } void FFTInput::invalidate_pixel_data() diff --git a/flat_input.cpp b/flat_input.cpp index 24b5709..e99eba3 100644 --- a/flat_input.cpp +++ b/flat_input.cpp @@ -11,9 +11,8 @@ using namespace std; namespace movit { -FlatInput::FlatInput(ImageFormat image_format, MovitPixelFormat pixel_format, GLenum type, unsigned width, unsigned height) +FlatInput::FlatInput(ImageFormat image_format, MovitPixelFormat pixel_format_in, GLenum type, unsigned width, unsigned height) : image_format(image_format), - pixel_format(pixel_format), type(type), pbo(0), texture_num(0), @@ -22,11 +21,37 @@ FlatInput::FlatInput(ImageFormat image_format, MovitPixelFormat pixel_format, GL width(width), height(height), pitch(width), - pixel_data(NULL) + pixel_data(NULL), + fixup_swap_rb(false), + fixup_red_to_grayscale(false) { assert(type == GL_FLOAT || type == GL_HALF_FLOAT || type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_BYTE); register_int("output_linear_gamma", &output_linear_gamma); register_int("needs_mipmaps", &needs_mipmaps); + + // Some types are not supported in all GL versions (e.g. GLES), + // and will corrected into the right format in the shader. + switch (pixel_format_in) { + case FORMAT_BGRA_PREMULTIPLIED_ALPHA: + pixel_format = FORMAT_RGBA_PREMULTIPLIED_ALPHA; + fixup_swap_rb = true; + break; + case FORMAT_BGRA_POSTMULTIPLIED_ALPHA: + pixel_format = FORMAT_RGBA_POSTMULTIPLIED_ALPHA; + fixup_swap_rb = true; + break; + case FORMAT_BGR: + pixel_format = FORMAT_RGB; + fixup_swap_rb = true; + break; + case FORMAT_GRAYSCALE: + pixel_format = FORMAT_R; + fixup_red_to_grayscale = true; + break; + default: + pixel_format = pixel_format_in; + break; + } } FlatInput::~FlatInput() @@ -95,15 +120,10 @@ void FlatInput::set_gl_state(GLuint glsl_program_num, const string& prefix, unsi } else if (pixel_format == FORMAT_RGBA_PREMULTIPLIED_ALPHA || pixel_format == FORMAT_RGBA_POSTMULTIPLIED_ALPHA) { format = GL_RGBA; - } else if (pixel_format == FORMAT_BGR) { - format = GL_BGR; - } else if (pixel_format == FORMAT_BGRA_PREMULTIPLIED_ALPHA || - pixel_format == FORMAT_BGRA_POSTMULTIPLIED_ALPHA) { - format = GL_BGRA; - } else if (pixel_format == FORMAT_GRAYSCALE) { - format = GL_LUMINANCE; } else if (pixel_format == FORMAT_RG) { format = GL_RG; + } else if (pixel_format == FORMAT_R) { + format = GL_RED; } else { assert(false); } @@ -148,7 +168,10 @@ void FlatInput::set_gl_state(GLuint glsl_program_num, const string& prefix, unsi string FlatInput::output_fragment_shader() { - return read_file("flat_input.frag"); + char buf[256]; + sprintf(buf, "#define FIXUP_SWAP_RB %d\n#define FIXUP_RED_TO_GRAYSCALE %d\n", + fixup_swap_rb, fixup_red_to_grayscale); + return buf + read_file("flat_input.frag"); } void FlatInput::invalidate_pixel_data() diff --git a/flat_input.frag b/flat_input.frag index d7c04cc..007675e 100644 --- a/flat_input.frag +++ b/flat_input.frag @@ -6,5 +6,17 @@ vec4 FUNCNAME(vec2 tc) { // we flip the y coordinate. tc.y = 1.0 - tc.y; - return texture2D(PREFIX(tex), tc); + vec4 pixel = texture2D(PREFIX(tex), tc); + + // These two are #defined to 0 or 1 in flat_input.cpp. +#if FIXUP_SWAP_RB + pixel.rb = pixel.br; +#endif +#if FIXUP_RED_TO_GRAYSCALE + pixel.gb = pixel.rr; +#endif + return pixel; } + +#undef FIXUP_SWAP_RB +#undef FIXUP_RED_TO_GRAYSCALE diff --git a/flat_input.h b/flat_input.h index 8ac98ba..8c88989 100644 --- a/flat_input.h +++ b/flat_input.h @@ -34,15 +34,12 @@ public: virtual AlphaHandling alpha_handling() const { switch (pixel_format) { case FORMAT_RGBA_PREMULTIPLIED_ALPHA: - case FORMAT_BGRA_PREMULTIPLIED_ALPHA: return INPUT_AND_OUTPUT_PREMULTIPLIED_ALPHA; case FORMAT_RGBA_POSTMULTIPLIED_ALPHA: - case FORMAT_BGRA_POSTMULTIPLIED_ALPHA: return OUTPUT_POSTMULTIPLIED_ALPHA; + case FORMAT_R: case FORMAT_RG: case FORMAT_RGB: - case FORMAT_BGR: - case FORMAT_GRAYSCALE: return OUTPUT_BLANK_ALPHA; default: assert(false); @@ -123,6 +120,7 @@ private: unsigned width, height, pitch; const void *pixel_data; ResourcePool *resource_pool; + bool fixup_swap_rb, fixup_red_to_grayscale; }; } // namespace movit -- 2.39.2