X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=test_util.cpp;h=a5cd44cf251ed514697c79d567b15f037b620aa7;hb=3a36e34bd2b4e374bc501606ec28111eb3822334;hp=ea3a0110ce6e509da802e0d3d9a0eb9deaa1aaf2;hpb=8ea03db1932e4a76f457e0ecdfe31a4c8be0e0eb;p=movit diff --git a/test_util.cpp b/test_util.cpp index ea3a011..a5cd44c 100644 --- a/test_util.cpp +++ b/test_util.cpp @@ -59,7 +59,7 @@ EffectChainTester::EffectChainTester(const float *data, unsigned width, unsigned check_error(); glBindTexture(GL_TEXTURE_2D, texnum); check_error(); - glTexImage2D(GL_TEXTURE_2D, 0, framebuffer_format, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, framebuffer_format, width, height, 0, GL_RGBA, GL_FLOAT, NULL); check_error(); glGenFramebuffers(1, &fbo); @@ -85,25 +85,39 @@ EffectChainTester::~EffectChainTester() check_error(); } -Input *EffectChainTester::add_input(const float *data, MovitPixelFormat pixel_format, Colorspace color_space, GammaCurve gamma_curve) +Input *EffectChainTester::add_input(const float *data, MovitPixelFormat pixel_format, Colorspace color_space, GammaCurve gamma_curve, int input_width, int input_height) { ImageFormat format; format.color_space = color_space; format.gamma_curve = gamma_curve; - FlatInput *input = new FlatInput(format, pixel_format, GL_FLOAT, width, height); + if (input_width == -1) { + input_width = width; + } + if (input_height == -1) { + input_height = height; + } + + FlatInput *input = new FlatInput(format, pixel_format, GL_FLOAT, input_width, input_height); input->set_pixel_data(data); chain.add_input(input); return input; } -Input *EffectChainTester::add_input(const unsigned char *data, MovitPixelFormat pixel_format, Colorspace color_space, GammaCurve gamma_curve) +Input *EffectChainTester::add_input(const unsigned char *data, MovitPixelFormat pixel_format, Colorspace color_space, GammaCurve gamma_curve, int input_width, int input_height) { ImageFormat format; format.color_space = color_space; format.gamma_curve = gamma_curve; - FlatInput *input = new FlatInput(format, pixel_format, GL_UNSIGNED_BYTE, width, height); + if (input_width == -1) { + input_width = width; + } + if (input_height == -1) { + input_height = height; + } + + FlatInput *input = new FlatInput(format, pixel_format, GL_UNSIGNED_BYTE, input_width, input_height); input->set_pixel_data(data); chain.add_input(input); return input; @@ -118,7 +132,20 @@ void EffectChainTester::run(float *out_data, GLenum format, Colorspace color_spa chain.render_to_fbo(fbo, width, height); glBindFramebuffer(GL_FRAMEBUFFER, fbo); - glReadPixels(0, 0, width, height, format, GL_FLOAT, out_data); + check_error(); + if (!epoxy_is_desktop_gl() && format == GL_RED) { + // GLES will only read GL_RGBA. + float *temp = new float[width * height * 4]; + glReadPixels(0, 0, width, height, GL_RGBA, GL_FLOAT, temp); + check_error(); + for (int i = 0; i < width * height; ++i) { + out_data[i] = temp[i * 4]; + } + delete[] temp; + } else { + glReadPixels(0, 0, width, height, format, GL_FLOAT, out_data); + check_error(); + } if (format == GL_RGBA) { width *= 4; @@ -136,7 +163,20 @@ void EffectChainTester::run(unsigned char *out_data, GLenum format, Colorspace c chain.render_to_fbo(fbo, width, height); glBindFramebuffer(GL_FRAMEBUFFER, fbo); - glReadPixels(0, 0, width, height, format, GL_UNSIGNED_BYTE, out_data); + check_error(); + if (!epoxy_is_desktop_gl() && format == GL_RED) { + // GLES will only read GL_RGBA. + unsigned char *temp = new unsigned char[width * height * 4]; + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, temp); + check_error(); + for (int i = 0; i < width * height; ++i) { + out_data[i] = temp[i * 4]; + } + delete[] temp; + } else { + glReadPixels(0, 0, width, height, format, GL_UNSIGNED_BYTE, out_data); + check_error(); + } if (format == GL_RGBA) { width *= 4;