+ if (_mesa_base_format_has_channel(img->_BaseFormat, pname))
+ *params = _mesa_get_format_datatype(texFormat);
+ else
+ *params = GL_NONE;
+ break;
+
+ default:
+ goto invalid_pname;
+ }
+
+ /* no error if we get here */
+ return;
+
+invalid_pname:
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetTexLevelParameter[if]v(pname=%s)",
+ _mesa_lookup_enum_by_nr(pname));
+}
+
+
+static void
+get_tex_level_parameter_buffer(struct gl_context *ctx,
+ const struct gl_texture_object *texObj,
+ GLenum pname, GLint *params)
+{
+ const struct gl_buffer_object *bo = texObj->BufferObject;
+ gl_format texFormat = texObj->_BufferObjectFormat;
+ GLenum internalFormat = texObj->BufferObjectFormat;
+ GLenum baseFormat = _mesa_get_format_base_format(texFormat);
+
+ if (!bo) {
+ /* undefined texture buffer object */
+ *params = pname == GL_TEXTURE_COMPONENTS ? 1 : 0;
+ return;
+ }
+
+ switch (pname) {
+ case GL_TEXTURE_BUFFER_DATA_STORE_BINDING:
+ *params = bo->Name;
+ break;
+ case GL_TEXTURE_WIDTH:
+ *params = bo->Size;
+ break;
+ case GL_TEXTURE_HEIGHT:
+ case GL_TEXTURE_DEPTH:
+ case GL_TEXTURE_BORDER:
+ case GL_TEXTURE_SHARED_SIZE:
+ case GL_TEXTURE_COMPRESSED:
+ *params = 0;
+ break;
+ case GL_TEXTURE_INTERNAL_FORMAT:
+ *params = internalFormat;
+ break;
+ case GL_TEXTURE_RED_SIZE:
+ case GL_TEXTURE_GREEN_SIZE:
+ case GL_TEXTURE_BLUE_SIZE:
+ case GL_TEXTURE_ALPHA_SIZE:
+ if (_mesa_base_format_has_channel(baseFormat, pname))
+ *params = _mesa_get_format_bits(texFormat, pname);
+ else
+ *params = 0;
+ break;
+ case GL_TEXTURE_INTENSITY_SIZE:
+ case GL_TEXTURE_LUMINANCE_SIZE:
+ if (_mesa_base_format_has_channel(baseFormat, pname)) {
+ *params = _mesa_get_format_bits(texFormat, pname);
+ if (*params == 0) {
+ /* intensity or luminance is probably stored as RGB[A] */
+ *params = MIN2(_mesa_get_format_bits(texFormat,
+ GL_TEXTURE_RED_SIZE),
+ _mesa_get_format_bits(texFormat,
+ GL_TEXTURE_GREEN_SIZE));
+ }
+ } else {
+ *params = 0;
+ }