static inline size_t _glClearBufferData_size(GLenum format, GLenum type) { unsigned bits_per_element; unsigned bits_per_pixel; _gl_format_size(format, type, bits_per_element, bits_per_pixel); return (bits_per_pixel + 7)/8; }
static inline size_t _gl_image_size(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsizei depth, GLboolean has_unpack_subimage) { unsigned bits_per_element; unsigned bits_per_pixel; _gl_format_size(format, type, bits_per_element, bits_per_pixel); GLint alignment = 4; GLint row_length = 0; GLint image_height = 0; GLint skip_rows = 0; GLint skip_pixels = 0; GLint skip_images = 0; _glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment); if (has_unpack_subimage) { _glGetIntegerv(GL_UNPACK_ROW_LENGTH, &row_length); _glGetIntegerv(GL_UNPACK_IMAGE_HEIGHT, &image_height); _glGetIntegerv(GL_UNPACK_SKIP_ROWS, &skip_rows); _glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &skip_pixels); _glGetIntegerv(GL_UNPACK_SKIP_IMAGES, &skip_images); } if (row_length <= 0) { row_length = width; } size_t row_stride = (row_length*bits_per_pixel + 7)/8; if ((bits_per_element == 1*8 || bits_per_element == 2*8 || bits_per_element == 4*8 || bits_per_element == 8*8) && (GLint)bits_per_element < alignment*8) { row_stride = _align(row_stride, alignment); } if (image_height <= 0) { image_height = height; } /* XXX: GL_UNPACK_IMAGE_HEIGHT and GL_UNPACK_SKIP_IMAGES should probably * not be considered for pixel rectangles. */ size_t image_stride = image_height*row_stride; size_t size = depth*image_stride; size += (skip_pixels*bits_per_pixel + 7)/8; size += skip_rows*row_stride; size += skip_images*image_stride; return size; }
static inline size_t _gl_image_size(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsizei depth, GLboolean has_unpack_subimage) { unsigned bits_per_pixel = _gl_format_size(format, type); GLint alignment = 4; GLint row_length = 0; GLint image_height = 0; GLint skip_rows = 0; GLint skip_pixels = 0; GLint skip_images = 0; _glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment); if (has_unpack_subimage) { _glGetIntegerv(GL_UNPACK_ROW_LENGTH, &row_length); _glGetIntegerv(GL_UNPACK_IMAGE_HEIGHT, &image_height); _glGetIntegerv(GL_UNPACK_SKIP_ROWS, &skip_rows); _glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &skip_pixels); _glGetIntegerv(GL_UNPACK_SKIP_IMAGES, &skip_images); } if (row_length <= 0) { row_length = width; } size_t row_stride = (row_length*bits_per_pixel + 7)/8; /* * The OpenGL specification states that the unpack alignment should be * ignored if the number of bits per element is not 1, 2, 4, or 8 times the * number of bits in a GL ubyte, but the matter of fact is that the number * of bits per element is always one of those. */ if (_is_pot(alignment)) { row_stride = _align(row_stride, alignment); } if (image_height <= 0) { image_height = height; } size_t image_stride = image_height*row_stride; /* * We can't just do * * size = depth*image_stride * * here as that could result in reading beyond the end of the buffer when * selecting sub-rectangles via GL_UNPACK_SKIP_*. */ size_t size = (width*bits_per_pixel + 7)/8; if (height > 1) { size += (height - 1)*row_stride; } if (depth > 1) { size += (depth - 1)*image_stride; } /* XXX: GL_UNPACK_IMAGE_HEIGHT and GL_UNPACK_SKIP_IMAGES should probably * not be considered for pixel rectangles. */ size += (skip_pixels*bits_per_pixel + 7)/8; size += skip_rows*row_stride; size += skip_images*image_stride; return size; }