X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=input.cpp;h=ae591062862526d127a85586e28cb6e424760a1d;hp=453620c41df023353fc943c920cd117673c0f1b2;hb=fe785e6f62ab58ef05972850d9275005794505b7;hpb=6a31570f6a85004d33a83bbe2f77642614361da6 diff --git a/input.cpp b/input.cpp index 453620c..ae59106 100644 --- a/input.cpp +++ b/input.cpp @@ -11,10 +11,12 @@ Input::Input(ImageFormat image_format, unsigned width, unsigned height) : image_format(image_format), needs_update(false), + finalized(false), use_srgb_texture_format(false), needs_mipmaps(false), width(width), - height(height) + height(height), + pitch(width) { register_int("use_srgb_texture_format", &use_srgb_texture_format); register_int("needs_mipmaps", &needs_mipmaps); @@ -41,6 +43,9 @@ void Input::finalize() } else if (image_format.pixel_format == FORMAT_BGRA) { format = GL_BGRA; bytes_per_pixel = 4; + } else if (image_format.pixel_format == FORMAT_GRAYSCALE) { + format = GL_LUMINANCE; + bytes_per_pixel = 1; } else { assert(false); } @@ -50,7 +55,7 @@ void Input::finalize() check_error(); glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, pbo); check_error(); - glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, width * height * bytes_per_pixel, NULL, GL_STREAM_DRAW); + glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, pitch * height * bytes_per_pixel, NULL, GL_STREAM_DRAW); check_error(); glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0); check_error(); @@ -61,14 +66,19 @@ void Input::finalize() check_error(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); check_error(); + glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch); + check_error(); // Intel/Mesa seems to have a broken glGenerateMipmap() for non-FBO textures, so do it here // instead of calling glGenerateMipmap(). glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, needs_mipmaps); check_error(); glTexImage2D(GL_TEXTURE_2D, 0, internal_format, width, height, 0, format, GL_UNSIGNED_BYTE, NULL); check_error(); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + check_error(); needs_update = false; + finalized = true; } void Input::set_gl_state(GLuint glsl_program_num, const std::string& prefix, unsigned *sampler_num) @@ -78,7 +88,7 @@ void Input::set_gl_state(GLuint glsl_program_num, const std::string& prefix, uns glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, pbo); check_error(); void *mapped_pbo = glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY); - memcpy(mapped_pbo, pixel_data, width * height * bytes_per_pixel); + memcpy(mapped_pbo, pixel_data, pitch * height * bytes_per_pixel); glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB); check_error(); @@ -87,8 +97,12 @@ void Input::set_gl_state(GLuint glsl_program_num, const std::string& prefix, uns check_error(); glBindTexture(GL_TEXTURE_2D, texture_num); check_error(); + glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch); + check_error(); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, format, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0)); check_error(); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + check_error(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); check_error(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);