Neither of these are properly supported by GLES3, so just give in
more standard, boring formats, and then do the swizzles in the shader.
string FFTInput::output_fragment_shader()
{
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()
}
void FFTInput::invalidate_pixel_data()
-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),
: image_format(image_format),
- pixel_format(pixel_format),
type(type),
pbo(0),
texture_num(0),
type(type),
pbo(0),
texture_num(0),
width(width),
height(height),
pitch(width),
width(width),
height(height),
pitch(width),
+ 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);
{
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()
}
FlatInput::~FlatInput()
} else if (pixel_format == FORMAT_RGBA_PREMULTIPLIED_ALPHA ||
pixel_format == FORMAT_RGBA_POSTMULTIPLIED_ALPHA) {
format = GL_RGBA;
} 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_RG) {
format = GL_RG;
+ } else if (pixel_format == FORMAT_R) {
+ format = GL_RED;
} else {
assert(false);
}
} else {
assert(false);
}
string FlatInput::output_fragment_shader()
{
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()
}
void FlatInput::invalidate_pixel_data()
// we flip the y coordinate.
tc.y = 1.0 - tc.y;
// 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
virtual AlphaHandling alpha_handling() const {
switch (pixel_format) {
case FORMAT_RGBA_PREMULTIPLIED_ALPHA:
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:
return INPUT_AND_OUTPUT_PREMULTIPLIED_ALPHA;
case FORMAT_RGBA_POSTMULTIPLIED_ALPHA:
- case FORMAT_BGRA_POSTMULTIPLIED_ALPHA:
return OUTPUT_POSTMULTIPLIED_ALPHA;
return OUTPUT_POSTMULTIPLIED_ALPHA;
case FORMAT_RG:
case FORMAT_RGB:
case FORMAT_RG:
case FORMAT_RGB:
- case FORMAT_BGR:
- case FORMAT_GRAYSCALE:
return OUTPUT_BLANK_ALPHA;
default:
assert(false);
return OUTPUT_BLANK_ALPHA;
default:
assert(false);
unsigned width, height, pitch;
const void *pixel_data;
ResourcePool *resource_pool;
unsigned width, height, pitch;
const void *pixel_data;
ResourcePool *resource_pool;
+ bool fixup_swap_rb, fixup_red_to_grayscale;