summaryrefslogtreecommitdiff
path: root/tests/util/piglit_ktx.h
diff options
context:
space:
mode:
authorChad Versace <chad.versace@linux.intel.com>2012-06-27 18:45:41 -0700
committerChad Versace <chad.versace@linux.intel.com>2012-07-15 21:16:36 -0700
commit7d3de04264b9dcf553b530099a5cc89d06648ff3 (patch)
treeea9dafb514c5875837fb241808bb430c7388ea22 /tests/util/piglit_ktx.h
parent5a5b599eebfa98d98b5f201704373ed4c7d1d11f (diff)
util: Add utilities for KTX file format
The KTX (Khronos texture) file format specifies a simple format for storing texture miptrees. This patch adds utility functions for reading and inspecting KTX files, iterating over the contained images, and easily loading the miptree with glTexImage(). A future test (oes_compressed_etc1_rgb8_test-miptree) will use this to load an ETC1 miptree and a reference RGB miptree. Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
Diffstat (limited to 'tests/util/piglit_ktx.h')
-rw-r--r--tests/util/piglit_ktx.h270
1 files changed, 270 insertions, 0 deletions
diff --git a/tests/util/piglit_ktx.h b/tests/util/piglit_ktx.h
new file mode 100644
index 000000000..d15042357
--- /dev/null
+++ b/tests/util/piglit_ktx.h
@@ -0,0 +1,270 @@
+/*
+ * Copyright 2012 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+/**
+ * \file
+ *
+ * \brief Utilities for the KTX file format.
+ *
+ * The KTX (Khronos texture) file format specifies a simple format for
+ * storing texture miptrees. The file format allows texture data for any
+ * GL texture format and any GL texture target.
+ *
+ * \see http://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/
+ */
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdint.h>
+
+#include <piglit/gl_wrap.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct piglit_ktx;
+
+struct piglit_ktx_info {
+ /** \brief Size in bytes of the raw KTX data. */
+ size_t size;
+
+ /**
+ * \brief GL texture target.
+ *
+ * This is the `target` agument passed to glTexImage() It is
+ * completely determined by pixel_size, array_length, and num_faces.
+ * Valid values are
+ * - GL_TEXTURE_1D
+ * - GL_TEXTURE_1D_ARRAY
+ * - GL_TEXTURE_2D
+ * - GL_TEXTURE_2D_ARRAY
+ * - GL_TEXTURE_3D
+ * - GL_TEXTURE_CUBE_MAP
+ * - GL_TEXTURE_CUBE_MAP_ARRAY
+ */
+ GLenum target;
+
+ /**
+ * For compressed textures, gl_type is 0. For non-compressed textures,
+ * gl_type is the 'type' argument passed to glTexImage(). For example,
+ * GL_FLOAT.
+ */
+ uint32_t gl_type;
+
+ /**
+ * For compressed textures, gl_type_size is 1. For non-compressed
+ * textures, gl_type_size is the size in bytes of gl_type. For example,
+ * if gl_type is GL_FLOAT, gl_type_size is 4.
+ */
+ uint32_t gl_type_size;
+
+ /**
+ * For compressed textures, gl_format is 0. For non-compressed textures,
+ * gl_format is the 'format' argument passed to glTexImage(). For
+ * example, GL_RGBA.
+ */
+ uint32_t gl_format;
+
+ /**
+ * For compressed and non-compressed textures, gl_internal_format is the
+ * 'internal_format' argument passed to glTexImage(). For
+ * non-compressed textures, this is always a sized format. For example,
+ * GL_RGBA32F.
+ */
+ uint32_t gl_internal_format;
+
+ /**
+ * For compressed textures, gl_base_internal_format is the same as
+ * gl_internal_format. For non-compressed textures,
+ * gl_base_internal_format is the same as gl_internal_format.
+ *
+ * (I (chadv) dont' understand what purpose this field serves, But
+ * the KTX spec requires it in the header).
+ */
+ uint32_t gl_base_internal_format;
+
+ /**
+ * \name Size of texture, in pixels.
+ * \{
+ *
+ * For 1D textures, height and depth are 0. For 2D and cube textures,
+ * depth is 0. For block compressed textures, the sizes are not
+ * rounded to block size.
+ *
+ * Note: The sizes here are those in the KTX header, which differ from
+ * the sizes passed to glTexImage().
+ */
+ uint32_t pixel_width;
+ uint32_t pixel_height;
+ uint32_t pixel_depth;
+ /** \} */
+
+ /**
+ * If the texture is not an array texture, then array_lengthis 0.
+ */
+ uint32_t array_length;
+
+ /**
+ * For cubemaps and cubemap arrays, num_faces is 6. For all other
+ * textures, it is 1.
+ */
+ uint32_t num_faces;
+
+ /**
+ * For non-mipmapped textures, num_miplevels is 1.
+ */
+ uint32_t num_miplevels;
+
+ /**
+ * For non-array cubemaps, the number of images is 6 * num_miplevels.
+ * For all other textures, the number of images and miplevels is the
+ * same.
+ */
+ uint32_t num_images;
+};
+
+struct piglit_ktx_image {
+ /**
+ * \brief The raw image data.
+ *
+ * This points to the image located in piglit_ktx_info::data. It may
+ * be passed as the 'data' argument to glTexImage().
+ */
+ const void *data;
+
+ /**
+ * \brief Size of image, in bytes.
+ *
+ * This is 'imageSize' argument passed to glTexImage(). It does not
+ * include any padding which may be present in ktx_info::bytes.
+ */
+ size_t size;
+
+ /**
+ * In range [0, num_miplevels).
+ */
+ uint32_t miplevel;
+
+ /**
+ * For non-array cubemap textures, `face` is in range [0, 6). For all
+ * other textures, it is 0.
+ */
+ uint32_t face;
+
+ /**
+ * \name Size of image, in pixels.
+ * \{
+ *
+ * These are the sizes passed to glTexImage().
+ * Note: These sizes differ from those in the KTX header.
+ */
+ uint32_t pixel_width;
+ uint32_t pixel_height;
+ uint32_t pixel_depth;
+ /** \} */
+};
+
+void
+piglit_ktx_destroy(struct piglit_ktx *self);
+
+/**
+ * \brief Read KTX data from a file.
+ *
+ * The file is read until EOF.
+ *
+ * Return null on error, including I/O error and invalid data.
+ */
+struct piglit_ktx*
+piglit_ktx_read_file(const char *filename);
+
+/**
+ * \brief Read KTX data from a byte array.
+ *
+ * Read at most \a size bytes.
+ *
+ * The given \a size is not used to calculate the expected length of the KTX
+ * data; that is completely determined by the content of the KTX header.
+ * Instead, the given \a size is a safeguard against reading out-of-bounds
+ * memory when incorrect data is present into the header.
+ *
+ * Return null on error, including invalid data and insufficient \a size.
+ */
+struct piglit_ktx*
+piglit_ktx_read_bytes(const void *bytes, size_t size);
+
+/**
+ * \brief Write KTX data to a file.
+ *
+ * The number of bytes written is `piglit_ktx_get_info()->size`.
+ */
+bool
+piglit_ktx_write_file(struct piglit_ktx *self, const char *filename);
+
+/**
+ * \brief Write KTX data to a byte array.
+ *
+ * The number of bytes written is `piglit_ktx_get_info()->size`.
+ */
+bool
+piglit_ktx_write_bytes(struct piglit_ktx *self, void *bytes);
+
+const struct piglit_ktx_info*
+piglit_ktx_get_info(struct piglit_ktx *self);
+
+/**
+ * \brief Get a texture image from a KTX file.
+ *
+ * The given \a miplevel must be in the range `[0,
+ * piglit_ktx_info::num_miplevels)`. For cubemap non-array textures, \a
+ * cube_face must be in the range [0, 5]. For all other textures, \a
+ * cube_face must be 0. If the above is not satisfied, an error is produced.
+ *
+ * Note: For cubemap array textures, \a cube_face must be 0 because
+ * piglit_ktx_image::data is the data that would be passed to glTexImage3D(),
+ * which is not separated into individual faces.
+ */
+const struct piglit_ktx_image*
+piglit_ktx_get_image(struct piglit_ktx *self,
+ int miplevel,
+ int cube_face);
+
+/**
+ * \brief Load texture into the GL with glTexImage().
+ *
+ * If \a *tex_name is non-zero, then that texture is bound to
+ * `piglit_ktx_info::target` and the texture images are loaded into it with
+ * glTexImage(). If \a *tex_name is 0, then a new texture is first created.
+ * The new texture name is returned \a tex_name.
+ *
+ * Return false on failure. If failure is due to a GL error and \a gl_error is
+ * not null, then the value of glGetError() is returned in \a gl_error.
+ */
+bool
+piglit_ktx_load_texture(struct piglit_ktx *self,
+ GLuint *tex_name,
+ GLenum *gl_error);
+
+#ifdef __cplusplus
+}
+#endif