# Patent

## Title
Method of and apparatus for encoding and decoding data

## Abstract

A texture map for use in graphics processing is encoded by first subdividing the texture map into a plurality of texture element blocks. The texture data elements in each texel block to be encoded are then divided into different partitions (sub sets) within the block. The partitioned block is then encoded in a compressed form as an encoded texture data block. Each encoded block is partitioned using a partitioning pattern generation function to generate the partitioning patterns. The partitioning pattern generation function sorts the texture data elements of the block into respective partitions based on their respective positions within the block. To do this the partitioning pattern generation function generates a series of sawtooth waves at various angles, phases and frequencies across the block of texture data elements to be encoded.

## Background
CLAIM OF PRIORITY
This application claims priority to UK Application No. 1107523.1 filed May 5, 2011 and UK Application No. 1118037.9 filed Oct. 19, 2011, both of which are incorporated herein by reference in their entirety.
BACKGROUND
The technology described herein relates to a method of and apparatus for encoding and decoding data, and in particular to such a method and apparatus for use to compress and decompress texture data in computer graphics systems.
It is common in computer graphics systems to generate colours for sampling positions in the image to be displayed by applying so-called textures or texture data to the surfaces to be drawn. For example, surface detail on objects may be generated by applying a predefined “texture” to a set of polygons representing the object, to give the rendered image of the object the appearance of the “texture”. Such textures are typically applied by storing an array of texture elements or “texels”, each representing given texture data (such as colour, luminance, and/or light/shadow, etc. values), and then mapping the texels onto the corresponding elements, such as (and, indeed, typically) a set of sampling positions, for the image to be displayed. The stored arrays of texture elements (data) are typically referred to as “texture maps”.
Such arrangements can provide high image quality, but have a number of drawbacks. In particular, the storage of the texture data and accessing it in use can place, e.g., high storage and bandwidth requirements on a graphics processing device (or conversely lead to a loss in performance where such requirements are not met). This is particularly significant for mobile and handheld devices that perform graphics processing, as such devices are inherently limited in their, e.g., storage, bandwidth and power resources and capabilities.
It is known therefore to try to encode such texture data in a “compressed” form so as to try to reduce, e.g., the storage and bandwidth burden that may be imposed on a device.
One known such texture data compression technique determines a set or palette of colours to be used for, e.g., a given texture map, and then stores for each texture element (texel) in the texture map an index into the set or palette of colours, indicating the colour to be used for that texel. This has the advantage that only an index, rather than a full (e.g.) colour value needs to be stored for each texel. This helps to reduce, e.g., the texture data storage requirements, but still has some drawbacks, such as in terms of reduced image quality and the necessary data processing.
Another known texture compression technique is to use so-called block truncation coding (BTC). In this technique the overall texture array (texture map) is subdivided into smaller blocks, e.g. of 4×4 texels, and a number (typically two) of base or primary colour values are determined for each such block, with each texel in the block being set to one of the base colour values. This again saves on the data that has to be stored and accessed, but at a cost of lower image quality.
U.S. Pat. No. 5,047,853 describes an improved block truncation coding technique. In this technique, two base colours are again stored for each texel block, but two additional colours to be used for the block are also derived from those two base colours (e.g. by linearly blending those colours). In this way, four colours are provided as a “palette” for the texel block, but only two colour values need to be stored for the block. Each texel in the block is then encoded using two bits, to indicate which of the four block “colours” should be used for the texel. This system provides improved image quality over basic block truncation coding, but requires more data per block.
It is also known in some texture compression schemes, such as BC6 and BC7, to divide the set of texture data elements that is encoded in a given texture data block into plural “sub-sets” or “partitions” of texture data elements.
In these arrangements, each texture data element partition for the texture data block (i.e. sub-set of the texture data elements that the texture data block encodes) may then, e.g., be reproduced independently of the other partitions of the block. This can help to enhance the reproduced image quality, e.g. where the block to be encoded includes distinct colour partitions.
In these arrangements, the encoding scheme typically uses a set of predetermined allowed partitioning patterns, e.g., that are specified for particular block sizes. The decoder then stores a set of look-up tables that indicate the relationship between a texture data element's position and the partition it belongs to for each respective partitioning pattern. However, this can lead to significant storage requirements for the decoder, particularly if it is desired to use large numbers of partitioning patterns (or conversely, the number of available partitioning patterns has to be limited to reduce the storage burden on the decoder).
The Applicants believe therefore that there remains scope for improved data encoding and compression techniques when using partitioning, particularly for use for texture data for graphics processing.



BRIEF DESCRIPTION OF THE DRAWINGS
A number of embodiments of the technology described herein will now be described by way of example only and with reference to the accompanying drawings, in which:
FIG. 1 shows schematically the encoding of an array of image data as a plurality of encoded data blocks in accordance with an embodiment of the technology described herein;
FIG. 2 shows schematically the encoding of a partitioned data block in the described embodiment of the technology described herein;
FIGS. 3 to 11 show encoded block layouts of the described embodiment of the technology described herein; and
FIG. 12 shows schematically a graphics processing system that can use texture data that has been encoded in the manner of the technology described herein.



DETAILED DESCRIPTION
A first embodiment of the technology described herein comprises a method of determining a partitioning pattern to be used to divide texture data elements of a block of texture data elements into separate partitions within the block for encoding and decoding purposes, the method comprising:
using a partitioning pattern generation function to generate one or more partitioning patterns to be used to divide texture data elements of a block of texture data elements into separate partitions within the block for encoding and decoding purposes;
testing the encoding of the block of texture data elements using one or more of the generated partitioning patterns; and
selecting a partitioning pattern to use when encoding the block on the basis of the testing.
A second embodiment of the technology described herein comprises an apparatus for determining a partitioning pattern to be used to divide texture data elements of a block of texture data elements into separate partitions within the block for encoding and decoding purposes, the apparatus comprising:
processing circuitry for using a partitioning pattern generation function to generate one or more partitioning patterns to be used to divide texture data elements of a block of texture data elements into separate partitions within the block for encoding and decoding purposes;
processing circuitry for testing the encoding of the block of texture data elements using one or more of the generated partitioning patterns; and
processing circuitry for selecting a partitioning pattern to use when encoding the block on the basis of the testing.
The technology described herein relates to encoding schemes in which the set of texture data elements that is encoded in a texture data block is divided into plural “partitions” or “sub-sets” of texture data elements.
In the technology described herein a partitioning pattern generating function is used to generate the partitioning patterns that can be and are applied to the texture data blocks that are being encoded. Using a partitioning pattern generating function for this process means that, as will be discussed further below, that function can then correspondingly be used to determine which partition a given texture data element that an encoded texture data block represents falls within (should be allocated to) when decoding the encoded texture data block. This can then avoid the need to derive and store decoding look-up tables for each partitioning pattern that is to be used. Furthermore, the Applicants have found that functions can be used to generate partitioning patterns suitable for use when encoding texture data, and that, moreover, such functions can be relatively easy to implement in hardware.
The use of a partitioning pattern generation function to derive partitioning patterns for use with encoded blocks of texture data elements is accordingly advantageous, as it can allow, for example, a large number of different partitioning patterns to be supported, but without the need, e.g., to store or specify each pattern individually in a look-up table. It can thus allow a large number of partitioning patterns to be supported, but at a significantly reduced cost. It accordingly can make it possible to use and support large sets of partitioning patterns, and for multiple block sizes, without significantly increasing hardware costs, for example. Indeed, it allows partitioning to be easily extended to volume (3D textures), as well as being used for 2D textures.
The partitioning pattern generation function can be any suitable and desired such function, i.e. a function that can divide the texture data elements of a block of texture data elements to be encoded into a (suitable) set of partitions (sub-sets). It is in an embodiment a function that generates partitioning patterns that correspond to patterns or features that may be seen or encountered or that occur in “real” images and textures, such as stripes, edges, chequer-boards, lines, etc. In an embodiment 2, 3, or 4 partitions can be supported.
In an embodiment, the partitioning pattern generation function sorts (allocates) the texture data elements into respective partitions (sub-sets), based on their respective positions within the block (e.g., and in an embodiment, based on the (x, y), or (x, y, z) position of the texture data element relative to a corner, such as the upper left corner, of a block)). In an embodiment the x, y, z position is used, with z being set to 0 for a 2D block. Thus, the partitioning pattern generation function in an embodiment defines the relationship between the position of a texture data element within the block of texture data elements to be partitioned and the partition within the block of texture data elements that it will belong to.
The partitioning pattern generation function accordingly in an embodiment functions so as to allocate a texture data element to a particular partition within the block on the basis of the position of the texture data element within the block of texture data elements being partitioned (encoded). If this is done for all the texture data elements of the block, that will accordingly generate a partitioning pattern for the block (i.e. assign the texture data elements to respective partitions in the block). In an embodiment the function can do this for patterns containing differing numbers of partitions, such as, and in an embodiment, 2, 3 or 4 partitions.
Any suitable function that generates suitable partitioning patterns could be used. In an embodiment, a function that implements sawtooth functions (in an embodiment 2 to 4 sawtooth functions) with pseudo-randomly selected directions and frequencies is used. This has been found to produce sufficiently useful partitioning patterns, while being particularly cheap to implement in hardware. Thus the partitioning pattern generation function can in an embodiment generate, and in an embodiment generates, a series of, in an embodiment sawtooth, waves at various angles, phases and frequencies across the block of texture data elements to be encoded.
Other arrangements could be used, if desired. For example, curve functions could also or instead be used.
A suitable partitioning pattern generation function could, e.g., be derived by analysing actual textures (e.g. game content) to determine a suitable set of partitioning patterns, and then deriving a partitioning pattern generation function that will (tend to) generate the so-determined set of partitioning patterns in an appropriate manner.
As discussed above, the partitioning pattern generation function in an embodiment takes as an argument (as an input), the position of a texture data element. This is in an embodiment the relative position of the element within the block, e.g., and in an embodiment, relative to a corner of the block. (This then allows the function to allocate the texture data elements to particular partitions within the overall pattern that the function will create based on their position in the block.)
The partitioning pattern generation function also in an embodiment has as an input, the number of partitions that the pattern (being generated) is to have (the “partition count” for the pattern).
In an embodiment, the partitioning pattern generation function is such that by providing different values of an input to that function, different partitioning patterns will be generated. This input value can then be used as (and thought of as) a “seed” or “index” for the partitioning pattern generation function, that will then control (at least in part) the partitioning pattern that is generated. Thus, by using different input seed values, different partitioning patterns can be generated by the same “base” partitioning pattern generation function. Thus, in an embodiment, the partitioning pattern generation function has as an input, a seed or index value, that will determine (at least in part) the partitioning pattern that will be generated.
In an embodiment, the seed value is used to generate the parameters for the in an embodiment (sawtooth) wave generation by the function. Each different seed value in an embodiment gives a different combination of waves.
In an embodiment, a, in an embodiment selected, and in an embodiment predefined, bit mask, is used in the partitioning pattern generation function. This mask is in an embodiment used to generate a sawtooth function by changing a continuously increasing set of values into a repeating set of values. (In this case, the base partitioning pattern generation function in an embodiment includes functions that will generate a continuously increasing set of values and a “mask” is then applied to this to generate a desired sawtooth pattern.) This has been found to be a particularly good mechanism for generating sawtooth waves in hardware.
The partitioning pattern generation function should be used to generate one or more, and in an embodiment plural, “candidate” partitioning patterns for use when encoding the block of texture data elements. This can be done, e.g., by varying the “seed” input to the partitioning pattern generation function, and/or by varying the number of partitions to be generated by the partitioning pattern generation function.
The so-generated “candidate” partitioning patterns are then tested, to select the pattern to use when encoding the block of texture data elements.
The testing of the partitioning patterns in the technology described herein can comprise, e.g., and as is known in the art, encoding the block using some or all of the generated “candidate” patterns, and then reproducing the encoded block, and determining the relative error in comparison to the original texture data (and then, e.g., and in an embodiment, selecting the partitioning pattern giving the least error as the pattern to use). One suitable testing and selection scheme would be to measure the peak signal-to-noise ratio between the encoded version of the texture data and the original block of texture data. Other arrangements would, of course, be possible.
Once the partitioning pattern to use for the block to be encoded has been selected, the block of texture data elements can then be encoded using that partitioning pattern. The technology described herein also extends to, and in an embodiment includes, encoding the set of texture data elements as a block of texture data representing the texture data elements using the selected partitioning pattern.
A third embodiment of the technology described herein comprises a method of encoding a block of texture data elements to provide an encoded block of texture data representing the block of texture data elements for use in a graphics processing system, the method comprising:
using a partitioning pattern generation function to generate one or more partitioning patterns to be used to divide the texture data elements of the block of texture data elements into separate partitions within the block for encoding and decoding purposes;
testing the encoding of the block of texture data elements using one or more of the generated partitioning patterns;
selecting a partitioning pattern to use when encoding the block on the basis of the testing; and
encoding the block of texture data elements as a block of texture data representing the texture data elements using the selected partitioning pattern.
A fourth embodiment of the technology described herein comprises an apparatus for encoding a block of texture data elements to provide an encoded block of texture data representing the block of texture data elements for use in a graphics processing system, the apparatus comprising:
processing circuitry for using a partitioning pattern generation function to generate one or more partitioning patterns to be used to divide the texture data elements of a block of texture data elements into separate partitions within the block for encoding and decoding purposes;
processing circuitry for testing the encoding of the block of texture data elements using one or more of the generated partitioning patterns;
processing circuitry for selecting a partitioning pattern to use when encoding the block on the basis of the testing; and
processing circuitry for encoding the set of texture data elements as a block of texture data representing the texture data elements using the selected partitioning pattern.
As will be appreciated by those skilled in the art, these embodiments of the technology described herein can and in an embodiment do include any one or more or all of the preferred and optional features of the technology described herein described herein, as appropriate. Thus, for example, the partitioning pattern generation function is in an embodiment in accordance with the arrangements described above.
The encoded texture data block should include all the information that is necessary for, and/or expected by, a decoder, to allow the decoder to decode the encoded texture data block to reproduce (at least approximately) the original set of texture data elements. The data that should be included in the encoded texture data block to achieve this will depend upon the exact nature of the texture data encoding (compression) scheme in question. This data can be arranged in any suitable and desired manner in the encoded texture data block (i.e. in practice in the manner that a decoder can recognise and correctly interpret).
In one embodiment, each encoded block of texture data includes, inter alia, data indicating, or indicating how to generate, a base set of data values (e.g. colour endpoint values) to be used to generate data values for a set of the texture data elements that the block represents, and data indicating how to use the set of base data values (e.g. colour endpoint values) to generate data values for texture data elements of the set of texture data elements that the set of base data values is to be used for.
The base set of data values (e.g. endpoint colours) to be used for an encoded block can be determined as desired, for example, by, as is known in the art, assessing the data values present in the original texture data (i.e. the data which is to be encoded and compressed) and deriving therefrom a set of data values that are representative of and/or can be used to derive, the original data values. Any suitable technique can be used for this, such as, for example, using error comparison techniques to determine a reduced set of values that best matches the original set of data values.
Where data is included in the encoded texture data block for indicating how to generate a set of base data values (e.g. colours) to be used to generate the data values for a set of the texture data elements that the block represents, then that data could, e.g., indicate a calculation or algorithm that is to be used to generate the base data values.
In an embodiment, this data indicates how the set of base data values is to be generated from one or more data values that are included explicitly in the encoded texture data block, e.g., by blending or adjusting those values.
In an embodiment each texture data element partition for the texture data block has its own base value(s) (e.g. colour endpoint value(s)). Thus, the encoded texture data block in an embodiment includes a separate set of data indicating, or indicating how to generate, a base set of data values to be used to generate data values for each partition of the texture data elements that the block has been divided into.
Similarly, each texture data element partition for the texture data block (i.e. sub-set of the texture data elements that the texture data block encodes) in an embodiment has its own set of data indicating, or indicating how to generate, a base set of data values to be used to generate data values for the particular sub-set of the texture data elements that the partition corresponds to (i.e. for the sub-set that the partition corresponds to of the overall set of the texture data elements for the block).
For example, each partition of a texture data block could, and in an embodiment does, have its own colour endpoints or colour endpoints encoding, which can be specified independently of the colour endpoints or colour endpoint encodings for the other texture data element partitions in the encoded block. For example, one partition could have a full RGB colour encoding scheme but another partition could use a grayscale encoding scheme, within the same encoded texture data block.
This then allows each partition of a given texture data block to be reproduced using its own particular base data value generation method and/or set of base data values. This has the advantage that different partitions can use, in effect, different encoding schemes (and in an embodiment, this is done).
This then provides a very flexible system, that allows, for example, multiple different types of content to be encoded in (and mixed within) the same texture and in the same encoded texture data block. This can also help to reduce the number of different separate texture compression (encoding) formats that need to be used.
It is believed that such arrangements may be new and advantageous in their own right.
Thus, an embodiment of the technology described herein comprises a method of encoding a set of texture data elements to be used in a graphics processing system, in which the set of texture data elements is encoded as a block of texture data representing the texture data elements, the method comprising:
dividing the set of texture data elements to be encoded in the block into a plurality of sub-sets of such elements; and,
including in the texture data block for each respective sub-set of the texture data elements, data indicating, and/or data indicating how to generate, a set of base data values to be used to generate data values for the respective sub-set of the texture data elements.
An embodiment of the technology described herein comprises an apparatus for encoding a set of texture data elements to be used in a graphics processing system, in which the set of texture data elements is encoded as a block of texture data representing the texture data elements, the apparatus comprising:
processing circuitry for dividing the set of texture data elements to be encoded in the block into a plurality of sub-sets of such elements; and,
processing circuitry for including in the texture data block for each respective sub-set of the texture data elements data indicating, and/or data indicating how to generate, a set of base data values to be used to generate data values for the respective sub-set of the texture data elements.
An embodiment of the technology described herein comprises a block of encoded texture data representing a set of texture data elements to be used in a graphics processing system, in which the set of texture data elements encoded in the block is divided into a plurality of sub-sets of such elements, and the block comprises:
for each respective sub-set of the texture data elements, data indicating, and/or data indicating how to generate, a set of base data values to be used to generate data values for the respective sub-set of the texture data elements.
As will be appreciated by those skilled in the art, these embodiments of the technology described herein can, and in an embodiment do, include any one or more or all of the preferred and optional features of the technology described herein described herein, as appropriate. Thus, for example, the base data values for each respective sub-set (partition) in an embodiment comprise a pair of endpoint data values for the texture data element sub-set (partition) in question.
In these arrangements, the decoding process will accordingly use the data value generation method specified for a given sub-set of the encoded texture data elements when reproducing those texture data elements from the encoded block. Thus, the texture data elements of a given sub-set (partition) of the texture data elements will effectively be reproduced independently of the texture data elements of the other sub-sets (partitions) of the texture data elements that the block encodes.
The base sets of data values are in an embodiment determined on a block-by-block and/or partition-by-partition basis. For example, in the case of colour data, as in conventional block truncation encoding techniques, one or two (or more) base representative colours could be determined for each different partition of a texture block, which colours would then serve as the base colour palette to be used when generating the set of colours to be used when reproducing the respective partitions of the texture block.
In an embodiment, the set of base data values for a partition comprises a pair of data values. In an embodiment it comprises a pair of endpoint data values, such as a pair of endpoint colour values, from which, e.g., data (e.g. colour) values for texture data elements of the partition in an embodiment can be interpolated (and in an embodiment can be derived by determining a weighted sum of the endpoint values for the partition). The base data values could instead comprise, e.g., a base value and a difference value that can then be combined to give values for the texture data elements, if desired.
Although in these arrangements, separate base data values (e.g. endpoint colours) are specified for each respective texture data element partition, in an embodiment the partitions of the encoded texture data block do share (use in common) some data that is encoded in the block. This has the advantage that the “partitions” within the texture data block can effectively share some of the block information, thereby facilitating higher data compression rates.
As discussed above, the encoded texture data block in an embodiment further includes data indicating how to use the respective sets of base data values (e.g. endpoint colours), or generated sets of base data values, for the block and/or for each partition, to generate data values for the texture data elements of the partitions that the block is divided into.
The data that is included in the encoded texture data block for indicating how to use the set of base data values (e.g. colour endpoint values) to generate the data values for the individual texture data elements of the block or partition can be any suitable such data. In an embodiment, it comprises index data, indicating indexes for the texture data elements in question. These indexes can in an embodiment be used to derive the data values for the texture data elements from the base data values, in an embodiment by interpolating the data value for a given texture data element from the base (e.g. endpoint) data values based on a respective index value. In an embodiment an index is given or can be derived for each texture data element, which index is to be used as or to derive a weight to compute a weighted sum of the base data values (e.g. endpoint values), which weighted sum is then to be used as the data value for the texture data element to which the index relates.
Thus, for example, where two endpoint data values are generated, the index for a given texture data element that the two endpoint data values are to be used for is in an embodiment then used to derive the data value for the texture data element from the two endpoint values, in an embodiment by interpolation between the two endpoint data values based on the index value.
The encoded texture data block in an embodiment includes, and/or allows to be derived, an index for each individual texture data element that the encoded texture data block represents. In some arrangements, this is done by providing (explicitly) in the encoded texture data block an index value for each and every texture data element that the encoded texture data block represents. In other arrangements, the encoded texture data block only encodes (explicitly includes) a limited number of index values, from which the indexes to be used for the texture data elements that the encoded block represents are to be derived in use (at decode time), in an embodiment by appropriate interpolation from the provided index values.
The encoded texture data block in an embodiment further includes information to allow or assist the decoder to determine which partition a given texture data element that the block represents belongs to. Similarly, the encoding process in an embodiment comprises including in the encoded texture data block information to allow or assist the decoder to determine which partition a given texture data element that the block represents belongs to (and the decoding process in an embodiment comprises the decoder using information included in the encoded texture data block to allow or assist the decoder to determine which partition a given texture data element that the block represents belongs to, to determine which partition a given texture data element that the block represents belongs to).
An embodiment of the technology described herein comprises a method of encoding a set of texture data elements to be used in a graphics processing system, in which the set of texture data elements is encoded as a block of texture data representing the texture data elements, the method comprising:
dividing the set of texture data elements to be encoded in the block into a plurality of sub-sets or partitions of such elements; and
including in the texture data block information to allow the decoder to determine which sub-set or partition of texture data elements a given texture data element that the block represents belongs to.
An embodiment of the technology described herein comprises an apparatus for encoding a set of texture data elements to be used in a graphics processing system, in which the set of texture data elements is encoded as a block of texture data representing the texture data elements, the apparatus comprising:
processing circuitry for dividing the set of texture data elements to be encoded in the block into a plurality of sub-sets of such elements; and
processing circuitry for including in the texture data block information to allow the decoder to determine which sub-set of texture data elements a given texture data element that the block represents belongs to.
An embodiment of the technology described herein comprises a block of encoded texture data representing a set of texture data elements to be used in a graphics processing system, in which the set of texture data elements encoded in the block is divided into a plurality of sub-sets of such elements; and the block comprises:
information to allow the decoder to determine which sub-set of texture data elements a given texture data element that the block represents belongs to.
As will be appreciated by those skilled in the art, these embodiments of the technology described herein can, and in an embodiment do, include any one or more or all of the preferred and optional features of the technology described herein described herein, as appropriate.
The information that is included in the encoded texture data block to allow or assist the decoder to determine which partition (sub-set) a given texture data element belongs to (i.e. that, in effect, indicates to the decoder the partitioning pattern that has been used for the block) can take any suitable and desired form.
In an embodiment, this information comprises data that will allow the decoder to generate the appropriate partitioning pattern using the partitioning pattern generation function that was used when encoding the texture data. The decoder in an embodiment then uses this information to configure (e.g. as inputs to) the partitioning pattern generation function.
Thus, the encoded texture data block in an embodiment includes information to be used by the decoder to configure a partitioning pattern generation function so as to allow the decoder to generate the particular predefined partitioning pattern that has been used. This information in an embodiment comprises a partitioning pattern generation function index or seed, and the number of partitions, that were used as inputs to the partitioning pattern generation function at the encoding stage for generating the partitioning pattern that was used for the block.
The decoder in an embodiment then uses this information, together with the position of the texture data element to be decoded (i.e. whose value is to be determined), as inputs to the partitioning pattern generation function, to determine which partition of the encoded texture data block (which sub-set of the set of texture data elements that the encoded block represents), the texture data element in question belongs to. Once this has been done, the decoder can then, e.g., and in an embodiment, determine the base data values (e.g. endpoint colours) to be used for the partition (sub-set) that the texture data element has been determined to belong to, and then use those data values to determine the data value (e.g. colour value) for the texture data element itself.
It will be appreciated from the above that in an embodiment the encoded texture data block will include at least some information to allow the decoder to identify the partitioning pattern that has been used for the encoded texture data block, data indicating or allowing to be derived a base data (e.g. colour) value or values (such as colour endpoint values) for the encoded texture data block (and in an embodiment for each respective partition that the encoded texture data block has been divided into), and information to allow the decoder to determine (at least an approximation to) the value of a given texture data element from the base data value or values (e.g. endpoint colours) for the texture data block (e.g. and in an embodiment from the base data value or values (e.g. endpoint colours) for the partition that the texture data element belongs to).
In an embodiment of the technology described herein, the encoded texture data block includes data indicating how to generate a set of data values to be used to generate data values for a set of the texture data elements that the block represents (which data is in an embodiment in the form of an index or other indication which indicates which of a plurality of predefined data value set generation techniques or methods is to be used); a set of integer values to be used to generate the set of data values to be used to generate data values for a set of the texture data elements that the block represents; a set of index values indicating how to use the generated set of values to generate data values for texture elements of the set of texture data elements that the generated set of data values is to be used for (which index values are in an embodiment used to interpolate the data value for a given texture data element from the generated data values); information to allow the indexing scheme for the block to be determined (which information is in an embodiment in the form of an index or flag indicating a predetermined “index mode” to be used for the block); and information to allow the partition that a particular texture data element belongs to, to be determined (which partition information is in an embodiment in the form of an indication of the number of partitions that the block has been divided into, and a partition index or seed value to be used as an input to a partitioning pattern generating function to be used when decoding the block to determine which partition of the block a given texture data element that the block represents belongs to).
The encoded texture data block in an embodiment includes, as discussed above, a separate set of data indicating how to generate a set of data values to be used to generate the data values for a set of the texture data elements that the block represents for each partition that the texture data elements of the block have been divided into, in an embodiment together with appropriate integer values to be used for each respective partition.
The information can be included in the encoded texture data block in any desired order and arrangement, but in an embodiment a particular (and in an embodiment common) format and organisation is used for each encoded texture data block.
In an embodiment this format comprises including the index mode and data indicating how to generate a set of data values to be used to generate data values for a set of texture data elements that the block represents in a particular portion (e.g. at the beginning) of the block, together with the partition count and partition index or seed.
The remaining space of the block is in an embodiment then used to hold the index data, the integer value data for use to generate the set of data values to be used to generate data values for the set of texture data elements that the block represents, and any needed further data indicating how to generate a set of data values to be used to generate data values for a set of the texture data elements that the block represents where there is insufficient space in the portion of the block predefined for that data.
In an embodiment, the index data is stored in the remaining space by adding the index data from the top down, and the integer values and any further data indicating how to generate a set of data values to be used is stored in the remaining space from the bottom up (or vice-versa).
The technology described herein can be used to encode any suitable form of texture data. As discussed above, such data, in its original, raw or unencoded form, is typically arranged in the form of arrays of texture elements or texels, and thus in an embodiment, the technology described herein is used to encode an array of texture data elements (texels). Such arrays are typically, as is known in the art, 2-dimensional, although it is also possible to use the technology described herein to encode a 3-dimensional array (and, indeed, it is an advantage of the technology described herein that it can be used to encode 3-dimensional textures in an efficient manner).
The texture to be encoded and the texture data elements can represent any suitable texture data. In one embodiment the texture is a texture that is to be used for graphics processing, e.g., and in an embodiment, when rendering an image and/or frame for display, such as for example an image to be applied to primitives to be rendered, colours (including grayscale), luminances, bump-maps, shadow-maps (light-maps), etc., as is known in the art.
However, the technology described herein can also be used to process and encode (and decode) textures to be used to process, and that represent, other forms of data, e.g. where it is desired to use a graphics texture (and graphics texture processing) to represent and process other forms of data. As is known in the art, textures can be and are used in graphics processing to represent and process many different kinds of data, such as, 3D fog, flow fields, etc. as well as for “traditional” graphics purposes. The technology described herein can equally be applied to, and extends to, these kinds and uses of textures in, and for, graphics processing systems. Thus the texture of the technology described herein may represent other forms of data that are to be processed as a texture in a graphics processing system, if desired.
In an embodiment, the texture data elements each represent a colour value for a texture element, but this is not essential. In an embodiment the texture data elements represent: low dynamic range (LDR) texture data with 1, 2, 3 or 4 components per texel (luminance, luminance-alpha, RGB and RGB-alpha, respectively) or high dynamic range (HDR) texture data with 1, 3 or 4 components per texel.
As will be appreciated by those skilled in the art, the actual data values accorded to the texture elements, both in their original, unencoded raw form, and in their encoded form (or at least when the encoded data has been decoded to reproduce a representation of the original data) will depend on the form of “texture” that the texture elements are intended to define or represent.
Thus, for example, where the texture elements define colours to be used, the texture data elements in their original, unencoded form may each comprise a set of colour values (Red, Green, Blue (RGB), a set of colour and transparency values (Red, Green, Blue, Alpha (RGBa)), or a set of luminance and chrominance values, and the encoded data, when decoded (reproduced), will generate a corresponding set of colour values.
In the case of shadow (light)-maps, for example, the texture data elements, will each comprise or represent a set of data values indicating, e.g., whether the texture element is in light or in shadow, and the amount (and/or colour) of the light or shadow for that texture element. Similarly, for a normal-map (bump-map), the data for each texture element will be a set of values indicating the direction in which light will be reflected at that texture element.
The texture data elements could also, e.g., represent z values (depth values), stencil values, luminance values (luminance textures), luminance-alpha-textures, and/or gloss-maps (i.e. whether a surface is shiny at the texture element position or not), etc.
It would be possible, where appropriate for each texture data block to only encode data necessary to generate some, but not all, of the data values necessary to reproduce the original data, with the remaining data values being derived (e.g. therefrom) as part of the data reproduction process. Thus, in one embodiment, the encoded texture data block encodes data representative of some of the original texture data, with data representative of other parts of the original data being derived from the encoded data during the decoding process.
For example, in the case of normal-maps, it would be possible for the encoded texture data to, e.g., only encode two of the normal direction components (e.g. dx and dy), with the third component (dz) being derived from these two values when the data is decoded (since it is known that the sum of the squares of the components must be 1 (as they define a normal vector of length 1): 1=dx2+dy2+dz2).
It should be noted here that references herein to “colours” or “luminances”, etc., accordingly refer to, as will be appreciated by those skilled in the art, a set of data values that allow the colour or luminance, etc., in question to be reproduced, e.g., on a display. These data values may comprise any suitable set of colour or luminance, etc., data, such as a set of RGBa values as discussed above. Equally, references to generating a set of data values for an encoded texture data block, and to data values for individual texture elements, encompass data values that each comprise or include a combination of values, such as a set of colour values (RGB or RGBa), as appropriate.
The set or array of texture data elements that is encoded in accordance with the technology described herein can be any suitable or desired such set. For example, the encoded texture data block could, if desired, represent the entire texture map to be reproduced.
However, in an embodiment, each texture data block encodes a smaller portion (or block) of the texture map in question, as in traditional block encoding techniques. In such a case, the texture data block will encode and represent a selected set or array of the original texture data elements. Each texture data block in an embodiment encodes a 4×4, 5×5, 6×6, 8×8, 10×10, 12×12, 3×3×3, 4×4×4, 5×5×5 or 6×6×6 array of texels. (It is an advantage of the technology described herein that it can support many different block sizes.)
It will be appreciated that in such arrangements, a plurality of such individual texture data blocks will be needed to encode the overall set of original texture data (texture data elements), e.g. make-up the entire texture map. Thus, in an embodiment, the technology described herein further includes subdividing a set of texture data elements (e.g. for a texture map) into a plurality of smaller blocks or sub-sets of texture data elements, and then encoding each block (sub-set) of texture data elements as a separate encoded texture data block. In an embodiment the texture map being encoded is divided into blocks of equal size, i.e. each block of the texture map represents the same number (and, e.g., array) of texture data elements. This can, e.g., simplify the task of finding which block a given texture data element lies in. In an embodiment each encoded texture data block has the same size, i.e. a fixed rate encoding scheme is used for the texture map in question. This facilitates the encoding and decoding processes, as is known in the art. Thus, for example, a texture map could be divided into a plurality of 4×4 texel arrays, with each such array being encoded as a separate texture data block.
Where plural texture data blocks are used to encode a larger texture map (or set or array of texture elements) (or part thereof), the actual subdividing of the array into smaller blocks, and the order of encoding into texture blocks can be selected as desired. In an embodiment the blocks (sub-sets of data) are encoded in raster order, although other arrangements, such as the use of Morton order, would, of course, be possible.
The encoding process of the technology described herein (i.e. to produce a set of encoded data blocks of the form discussed above) can be carried out in any suitable manner on or using the original texture data that is to be encoded. For example, as in known prior art processes, the original data for the block could be encoded using some or all of the various different encoding and partitioning possibilities that are available (i.e. that, in effect, an encoded texture data block can represent). This will provide a set of possible encoded blocks that can then be compared with the original data, so as to determine, e.g., which encoded version (block) of the data gives the least error (on reproduction) when compared to the original data (which encoding arrangement can then be selected as the one to use for that original texture data block when it is encoded).
This will be repeated for each different block that the original data (e.g. texture map) has been divided into, to produce a stream or set of encoded texture data blocks representing, and corresponding to, the original set of data (e.g. texture map). (It should be noted here that the set of encoded texture data blocks generated for a texture may (and typically will) include some partitioned blocks and some non-partitioned blocks).
This set of encoded texture data blocks can then be stored, e.g. on a portable storage device such as a DVD, for later use, e.g. when it is desired to apply the texture to an image to be rendered. In an embodiment a texture is encoded as a set of mipmaps, with each mipmap in an embodiment being generated in the manner of the technology described herein.
Each block that the original data (e.g. texture map) is divided into is in an embodiment the same size and configuration. The block size that is being used is in an embodiment provided to the decoder. The block size is in an embodiment not included in the encoded texture data blocks themselves, but is in an embodiment provided to the decoder separately. For example, the block size could be implicitly indicated by another parameter that is provided to the decoder, such as the image type, or included in (and indicated in) a (global) data header that is associated with (attached to) the set of encoded texture data blocks.
The above primarily describes the encoding of the texture data in the technology described herein. As will be appreciated by those skilled in the art, the technology described herein also extends to the reverse, decoding, process, i.e. in which the encoded texture data block is used to produce one or more or an array of texture data elements for use.
The decoding process in an embodiment first comprises determining which encoded texture data block in the set of encoded texture data blocks representing the texture map to be used represents (contains) the texture data element whose value is required (i.e. that is to be decoded). This may be done, e.g., and in an embodiment, based on the position of the texture data element (and, e.g., knowledge of the block size and size of the texture). The identified encoded texture data block can then be used to determine the value to be used for the texture data element in question.
The so-generated, decoded texel values can then be applied, as is known in the art, to sampling positions and/or fragments that are being rendered to generate rendered data for those sampling positions and/or fragments, which rendered data is then, e.g. written to a frame buffer for a display to display the “textured” sampling positions and/or fragments.
Thus, the technology described herein also extends to a decoder and a decoding apparatus configured to decode a texture that has been encoded in the manner of the technology described herein.
The decoding process should be essentially the reverse of the encoding process, and thus comprise, e.g., determining the partitioning pattern to be used (that has been used) for the block, and the set of base data values (e.g. endpoint colours) to be used for a partition of the block, and then generating the data value (e.g. colour) for an individual texture data element or elements accordingly. The so-generated, decoded texel values can then be applied, as is known in the art, to sampling positions and/or fragments that are being rendered to generate rendered data for those sampling positions and/or fragments, which rendered data is then, e.g. written to a frame buffer for a display to display the “textured” sampling positions and/or fragments.
The decoding process can, and indeed in an embodiment does, include one or more or all of the various preferred and optional features of the technology described herein discussed herein, as appropriate.
Thus, in an embodiment, the decoding process of the technology described herein uses a partitioning pattern generation function to determine which partition (sub-set) a given texture data element of a block to be decoded falls within. This is particularly advantageous, because, as discussed above, it avoids the need to store large numbers of look-up tables representing the different partitioning patterns that could be being used.
Thus, in an embodiment, when decoding an encoded texture data block, the partition for a texture data block that a texture data element that the block represents belongs to is derived in use, using a predetermined partitioning pattern generation function (and in practice, and in an embodiment, using the predetermined partitioning pattern generation function that was used when encoding the block).
Another embodiment of the technology described herein comprises a method of determining the partition within a partitioned block of texture data elements to be used in a graphics processing system that a texture data element belongs to when decoding an encoded texture data block that represents the block of texture data elements, the method comprising:
using a, in an embodiment predetermined, partitioning pattern generation function to determine the partition that the texture data element belongs to.
Another embodiment of the technology described herein comprises an apparatus for determining the partition within a partitioned block of texture data elements to be used in a graphics processing system that a texture data element belongs to when decoding an encoded texture data block that represents the block of texture data elements, apparatus comprising:
processing circuitry for using a, in an embodiment predetermined, partitioning pattern generation function to determine the partition that the texture data element belongs to.
As will be appreciated by those skilled in the art, these embodiments of the technology described herein can, and in an embodiment do, include any one or more or all of the preferred and optional features of the technology described herein described herein, as appropriate. Thus, for example, the partitioning pattern generation function is in an embodiment of the form discussed above.
Thus, the partitioning pattern generation function in an embodiment defines the relationship between the position of a texture data element within the block of texture data elements to be partitioned and the partition within the block of texture data elements that it will belong to. In an embodiment the function can do this for patterns containing differing numbers of partitions, such as, and in an embodiment, 2, 3 or 4 partitions.
Similarly, the partitioning pattern generation function is in an embodiment a function that implements sawtooth functions (in an embodiment 2 to 4 sawtooth functions) with pseudo-randomly selected directions and frequencies. Thus the partitioning pattern generation function in an embodiment generates a series of, in an embodiment sawtooth, waves at various angles, phases and frequencies across the block of texture data elements to be encoded.
Equally, the partitioning pattern generation function in an embodiment takes as an argument (as an input), the position of a texture data element. This is in an embodiment the relative position of the element within the block, e.g., and in an embodiment, relative to a corner of the block.
Thus, the partitioning pattern generation function in an embodiment takes as an input the position of the texture data element in question within the texture data block being decoded (e.g., and in an embodiment, its (x, y) (or (x, y, z) position relative to a corner of the block), and, in an embodiment, returns an indication of, e.g., and in an embodiment, an index for, the partition to which the texture data element belongs.
The partitioning pattern generation function also in an embodiment has as an input, the number of partitions that the pattern (being generated) is to have (the partition count for the pattern).
Similarly, in an embodiment, the partitioning pattern generation function is such that by providing different values of a “seed” or “index” input to that function, different partitioning patterns will be generated. Thus, in an embodiment, the partitioning pattern generation function has as an input, a seed or index value, that will determine (at least in part) the partitioning pattern that will be generated.
In an embodiment, the seed value is used to generate the parameters for the (in an embodiment sawtooth) wave generation by the function. Each different seed value in an embodiment gives a different combination of waves.
Similarly, in an embodiment, a bit mask, that is in an embodiment dependent on the size of the block being encoded, is also used as an input to the partitioning pattern generation function. This mask is in an embodiment used to generate a sawtooth function by changing a continuously increasing set of values into a repeating set of values.
As discussed above, the decoding process in an embodiment comprises using information included in the encoded texture data block (such as, and in an embodiment, a partitioning pattern generation function seed or index value, and/or a partition count), as inputs to the partitioning pattern generation function, to determine which partition a given texture data element that the block represents belongs to.
Another embodiment of the technology described herein comprises a method of decoding a texture data block that encodes a set of texture data elements to be used in a graphics processing system, in which the set of texture data elements encoded in the block is divided into a plurality of partitions or sub-sets of such elements, the method comprising:
determining from the encoded texture data block information to be used to determine which partition or sub-set of texture data elements a given texture data element that the block represents belongs to; and
using the information to determine which partition or sub-set of texture data elements a given texture data element that the block represents belongs to.
An embodiment of the technology described herein comprises an apparatus for decoding a texture data block that encodes a set of texture data elements to be used in a graphics processing system, in which the set of texture data elements encoded in the block is divided into a plurality of sub-sets of such elements, the apparatus comprising:
processing circuitry for determining from the encoded texture data block information to be used to determine which sub-set of texture data elements a given texture data element that the block represents belongs to; and
processing circuitry for using the information to determine which sub-set of texture data elements a given texture data element that the block represents belongs to.
As will be appreciated by those skilled in the art, all of these embodiments of the technology described herein can, and in an embodiment do, include any one or more or all of the preferred and optional features of the technology described herein described herein, as appropriate.
The decoding process similarly in an embodiment comprises determining a set of base data values for the respective partition (sub-set) that texture data element in question has been determined to belong to. Thus, in an embodiment, the decoding process comprises determining from the encoded texture data block a set of, or how to generate a set of, base data values to be used to generate data values for the texture data elements for the respective partition that the texture data element has been determined to belong to.
Another embodiment of the technology described herein comprises a method of decoding a texture data block that encodes a set of texture data elements to be used in a graphics processing system, in which the set of texture data elements encoded in the block is divided into a plurality of partitions or sub-sets of such elements, the method comprising:
determining from the encoded texture data block for a or each respective partition or sub-set of the texture data elements, a set of, or how to generate a set of, base data values to be used to generate data values for the respective partition or sub-set of the texture data elements.
An embodiment of the technology described herein comprises an apparatus for decoding a texture data block that encodes a set of texture data elements to be used in a graphics processing system, in which the set of texture data elements encoded in the block is divided into a plurality of partitions or sub-sets of such elements, the apparatus comprising:
processing circuitry for determining from the encoded texture data block for a or each respective partition or sub-set of the texture data elements, a set of, or how to generate a set of, base data values to be used to generate data values for the respective partition or sub-set of the texture data elements.
As will be appreciated by those skilled in the art, all of these embodiments of the technology described herein can, and in an embodiment do, include any one or more or all of the preferred and optional features of the technology described herein described herein, as appropriate.
Thus, in an embodiment, the decoding process uses the (relative) position of the texture data element to be decoded (i.e. whose value is to be determined) as an input to a partitioning pattern generation function to determine which partition of the encoded texture data block the texture data element in question belongs to, and then determines a set of base data values (e.g. endpoint colours) to be used for that partition, and then uses those data values to determine the data value (e.g. colour value) to use for the texture data element itself.
Another embodiment of the technology described herein comprises a method of determining the value of a texture data element that is represented by an encoded texture data block that encodes a set of texture data elements to be used in a graphics processing system, the method comprising:
determining the position of the texture data element to be decoded, relative to a corner of the block of texture data elements that the encoded texture data block encodes;
passing the determined texture data element position through a partitioning pattern generation function to determine a partition within the block that the texture data element belongs to;
determining a set of base data values for the partition that the texture data element has been determined to belong to be used to derive the data value for the texture data element; and
using the determined set of base data values to determine the decoded texture data element data value.
An embodiment of the technology described herein comprises an apparatus for determining the value of a texture data element that is represented by an encoded texture data block that encodes a set of texture data elements to be used in a graphics processing system, the apparatus comprising:
processing circuitry for determining the position of the texture data element to be decoded, relative to a corner of the block of texture data elements that the encoded texture data block encodes;
processing circuitry for passing the determined texture data element position through a partitioning pattern generation function to determine a partition within the block that the texture data element belongs to;
processing circuitry for determining a set of base data values for the partition that the texture data element has been determined to belong to be used to derive the data value for the texture data element; and
processing circuitry for using the determined set of base data values to determine the decoded texture data element data value.
As will be appreciated by those skilled in the art, all of these embodiments of the technology described herein can, and in an embodiment do, include any one or more or all of the preferred and optional features of the technology described herein described herein, as appropriate.
Thus, the decoding process in an embodiment uses information included in the encoded texture data block to configure the partitioning pattern generation function so as to allow the decoder to generate the particular predefined partitioning pattern that has been used. This information in an embodiment comprises a partitioning pattern generation function index or seed, and the number of partitions, that were used as inputs to the partitioning pattern generation function at the encoding stage for generating the partitioning pattern that was used for the block.
Similarly, a partition count (number of partitions) indicated in the encoded texture data block is in an embodiment also input to the partitioning pattern generation function, and an index value for the texture data element is in an embodiment determined using an index mode and/or index range and number of index planes specified for the texture data element in the encoded texture data block.
The encoded texture block that represents a texture data element whose value is required is in an embodiment determined based on the position of the texture data element (and, e.g., knowledge of the block size and size of the texture).
The generated, decoded texture data element values are in an embodiment applied to, or used for, as is known in the art, sampling positions and/or fragments that are being rendered to generate rendered data for those sampling positions and/or fragments, which rendered data is then in an embodiment written to a frame buffer for a display to display the “textured” sampling positions and/or fragments.
As will be appreciated from the above, in an embodiment, the decoding process for an individual texture data element of given encoded texture data block comprises first finding the x, y, z position of the texture data element to be decoded, relative to the corner of the block of texture data elements that the encoded texture data block encodes, passing the texture data element position in an embodiment together with a partitioning pattern index or seed value (in an embodiment obtained from the encoded texture data block), in an embodiment also with a partition count (again in an embodiment obtained from the encoded texture data block), through a partitioning pattern generation function to determine the partition that the texture data element belongs to; reading and decoding data for generating a set of base data values to be used to derive the data value for the texture data element; reading and decoding integer values to be used for that process and thereby generating the set of base data values (e.g., and in an embodiment endpoint colour values) to be used to determine the data value for the texture data element in question; determining an index value for the texture data element (in an embodiment using a defined index mode and/or index range and number of index planes specified for the partition in question in the encoded texture data block); and interpolating between the generated base data values (e.g. endpoint colours) using the index value, to thereby obtain a decoded texture data element data value (e.g. colour).
Another embodiment of the technology described herein comprises a method of determining the value of a texture data element that is represented by an encoded texture data block that encodes a set of texture data elements to be used in a graphics processing system, the method comprising:
determining the position of the texture data element to be decoded, relative to a corner of the block of texture data elements that the encoded texture data block encodes;
reading and decoding from the encoded texture data block a partitioning pattern index value for the encoded texture data block;
passing the determined texture data element position and partitioning pattern index value through a partitioning pattern generation function to determine a partition within the block that the texture data element belongs to;
reading and decoding from the encoded texture data block data for generating a set of base data values to be used to derive the data value for the texture data element for the partition that the texture data element has been determined to belong to;
reading and decoding from the encoded texture data block a set of integer values to be used for generating the set of base data values to be used to derive the data value for the texture data element;
generating the set of base data values to be used to determine the data value for the texture data element;
determining an index value for the texture data element, using index data specified for the texture data element in the encoded texture data block; and
interpolating between the generated data values of the generated set of base data values using the index value to determine the decoded texture data element data value.
An embodiment of the technology described herein comprises an apparatus for determining the value of a texture data element that is represented by an encoded texture data block that encodes a set of texture data elements to be used in a graphics processing system, the apparatus comprising:
processing circuitry for determining the position of the texture data element to be decoded, relative to a corner of the block of texture data elements that the encoded texture data block encodes;
processing circuitry for reading and decoding from the encoded texture data block a partitioning pattern index value for the encoded texture data block;
processing circuitry for passing the determined texture data element position and partitioning pattern index value through a partitioning pattern generation function to determine a partition within the block that the texture data element belongs to;
processing circuitry for reading and decoding from the encoded texture data block data for generating a set of base data values to be used to derive the data value for the texture data element for the partition that the texture data element has been determined to belong to;
processing circuitry for reading and decoding from the encoded texture data block a set of integer values to be used for generating the set of base data values to be used to derive the data value for the texture data element;
processing circuitry for generating the set of base data values to be used to determine the data value for the texture data element;
processing circuitry for determining an index value for the texture data element, using index data specified for the texture data element in the encoded texture data block; and
processing circuitry for interpolating between the generated data values of the generated set of base data values using the index value to determine the decoded texture data element data value.
As will be appreciated by those skilled in the art, all of these embodiments of the technology described herein can, and in an embodiment do, include any one or more or all of the preferred and optional features of the technology described herein described herein, as appropriate.
Thus, for example, a partition count (number of partitions) indicated in the encoded texture data block is in an embodiment also input to the partitioning pattern generation function, and the index value for the texture data element is in an embodiment determined using an index mode and/or index range and number of index planes specified for the texture data element in the encoded texture data block.
The decoding process may be repeated for each texture data element of the block whose value is required (and for texture data elements in other encoded blocks).
In an embodiment, the decoder (decoding apparatus) is implemented in the device that is to use the encoded textures, such as a graphics processor. The decoder (or at least the partitioning pattern generation function) is in an embodiment implemented as a dedicated hardware element that is configured to carry out the decoding process (or at least the partitioning pattern generation function).
Although the technology described herein has been described above with particular reference to the encoding (and decoding) of texture data in a graphics processing system, as will be appreciated by those skilled in the art, it would equally be applicable to the encoding and decoding of data in other forms of data processing system, and in particular to data that is in the form of (or can be expressed in the form of) arrays or blocks of (similar) data elements (e.g. data elements whose values follow a common or similar format and/or that will be or can be used for a similar or the same purpose or that represent similar information). It is in particular applicable to the encoding of such data where random access to the data is desired.
Such data could comprise, for example, vector-fields used for simulations, data representing flow-directions for fluids or bounce directions for impacts, etc. (which data would, for example, be analogous to the normal-maps (bump-maps) discussed above in relation to graphics data), heat-maps, or sound data, etc.
In such arrangements, the data can be encoded and decoded in an analogous manner to the texture data as described herein.
Another embodiment of the technology described herein comprises a method of determining a partitioning pattern to be used to divide data elements of a block of data elements into separate partitions within the block for encoding and decoding purposes, the method comprising:
using a partitioning pattern generation function to generate one or more partitioning patterns to be used to divide data elements of a block of data elements into separate partitions within the block for encoding and decoding purposes;
testing the encoding of the block of data elements when using one or more of the generated partitioning patterns; and
selecting the partitioning pattern to use when encoding the block on the basis of the testing.
Another embodiment of the technology described herein comprises an apparatus for determining a partitioning pattern to be used to divide data elements of a block of data elements into separate partitions within the block for encoding and decoding purposes, the apparatus comprising:
processing circuitry for using a partitioning pattern generation function to generate one or more partitioning patterns to be used to divide data elements of a block of data elements into separate partitions within the block for encoding and decoding purposes;
processing circuitry for testing the encoding of the block of data elements when using one or more of the generated partitioning patterns; and
processing circuitry for selecting the partitioning pattern to use when encoding the block on the basis of the testing.
An embodiment of the technology described herein comprises a method of encoding a block of data elements to provide an encoded block of data representing the block of data elements, the method comprising:
using a partitioning pattern generation function to generate one or more partitioning patterns to be used to divide the data elements of the block of data elements into separate partitions within the block for encoding and decoding purposes;
testing the encoding of the block of data elements using one or more of the generated partitioning patterns;
selecting a partitioning pattern to use when encoding the block on the basis of the testing; and
encoding the block of data elements as a block of data representing the data elements using the selected partitioning pattern.
An embodiment of the technology described herein comprises an apparatus for encoding a block of data elements to provide an encoded block of data representing the block of data elements, the apparatus comprising:
processing circuitry for using a partitioning pattern generation function to generate one or more partitioning patterns to be used to divide the data elements of a block of data elements into separate partitions within the block for encoding and decoding purposes;
processing circuitry for testing the encoding of the block of data elements using one or more of the generated partitioning patterns;
processing circuitry for selecting a partitioning pattern to use when encoding the block on the basis of the testing; and
processing circuitry for encoding the set of data elements as a block of data representing the data elements using the selected partitioning pattern.
An embodiment of the technology described herein comprises a method of encoding a set of data elements, in which the set of data elements is encoded as a block of data representing the data elements, the method comprising:
dividing the set of data elements to be encoded in the block into a plurality of sub-sets of such elements; and,
including in the data block for each respective sub-set of the data elements, data indicating, and/or data indicating how to generate, a set of data values to be used to generate data values for the respective sub-set of the data elements.
An embodiment of the technology described herein comprises an apparatus for encoding a set of data elements, in which the set of data elements is encoded as a block of data representing the data elements, the apparatus comprising:
processing circuitry for dividing the set of data elements to be encoded in the block into a plurality of sub-sets of such elements; and,
processing circuitry for including in the data block for each respective sub-set of the data elements data indicating, and/or data indicating how to generate, a set of data values to be used to generate data values for the respective sub-set of the data elements.
An embodiment of the technology described herein comprises a block of encoded data representing a set of data elements, in which the set of data elements encoded in the block is divided into a plurality of sub-sets of such elements, and the block comprises:
for each respective sub-set of the data elements, data indicating, and/or data indicating how to generate, a set of data values to be used to generate data values for the respective sub-set of the data elements.
An embodiment of the technology described herein comprises a method of encoding a set of data elements, in which the set of data elements is encoded as a block of data representing the data elements, the method comprising:
dividing the set of data elements to be encoded in the block into a plurality of sub-sets of such elements; and
including in the data block information to allow a decoder to determine which sub-set of data elements a given data element that the block represents belongs to.
An embodiment of the technology described herein comprises an apparatus for encoding a set of data elements, in which the set of data elements is encoded as a block of data representing the data elements, the apparatus comprising:
processing circuitry for dividing the set of data elements to be encoded in the block into a plurality of sub-sets of such elements; and
processing circuitry for including in the data block information to allow a decoder to determine which sub-set of data elements a given data element that the block represents belongs to.
An embodiment of the technology described herein comprises a block of encoded data representing a set of data elements, in which the set of data elements encoded in the block is divided into a plurality of sub-sets of such elements; and the block comprises:
information to allow a decoder to determine which sub-set of data elements a given data element that the block represents belongs to.
Another embodiment of the technology described herein comprises a method of determining the partition within a partitioned block of data elements that a data element belongs to when decoding an encoded data block that represents the block of data elements, comprising:
using a, in an embodiment predetermined, partitioning pattern generation function to determine the partition that the data element belongs to.
Another embodiment of the technology described herein comprises an apparatus for determining the partition within a partitioned block of data elements that a data element belongs to when decoding an encoded data block that represents the block of data elements, comprising:
processing circuitry for using a, in an embodiment predetermined, partitioning pattern generation function to determine the partition that the data element belongs to.
An embodiment of the technology described herein comprises a method of decoding a data block that encodes a set of data elements, in which the set of data elements encoded in the block is divided into a plurality of sub-sets of such elements, the method comprising:
determining from the encoded data block for a or each respective sub-set of the data elements, a set of, or how to generate a set of, data values to be used to generate data values for the respective sub-set of the data elements.
An embodiment of the technology described herein comprises an apparatus for decoding a data block that encodes a set of data elements to be used for graphics processing, in which the set of data elements encoded in the block is divided into a plurality of sub-sets of such elements, the apparatus comprising:
processing circuitry for determining from the encoded data block for a or each respective sub-set of the data elements, a set of, or how to generate a set of, data values to be used to generate data values for the respective sub-set of the data elements.
An embodiment of the technology described herein comprises a method of decoding a data block that encodes a set of data elements, in which the set of data elements encoded in the block is divided into a plurality of sub-sets of such elements, the method comprising:
determining from the encoded data block information to be used to determine which sub-set of data elements a given data element that the block represents belongs to; and
using the information to determine which sub-set of data elements a given data element that the block represents belongs to.
An embodiment of the technology described herein comprises an apparatus for decoding a data block that encodes a set of data elements, in which the set of data elements encoded in the block is divided into a plurality of sub-sets of such elements, the apparatus comprising:
processing circuitry for determining from the encoded data block information to be used to determine which sub-set of data elements a given data element that the block represents belongs to; and
processing circuitry for using the information to determine which sub-set of data elements a given data element that the block represents belongs to.
An embodiment of the technology described herein comprises a method of determining the value of a data element that is represented by an encoded data block that encodes a set of data elements, the method comprising:
determining the position of the data element to be decoded, relative to a corner of the block of data elements that the encoded data block encodes;
passing the determined data element position through a partitioning pattern generation function to determine a partition within the block that the data element belongs to;
determining a set of base data values for the partition that the data element has been determined to belong to be used to derive the data value for the data element; and
using the determined set of base data values to determine the decoded data element data value.
An embodiment of the technology described herein comprises an apparatus for determining the value of a data element that is represented by an encoded data block that encodes a set of data elements, the apparatus comprising:
processing circuitry for determining the position of the data element to be decoded, relative to a corner of the block of data elements that the encoded data block encodes;
processing circuitry for passing the determined data element position through a partitioning pattern generation function to determine a partition within the block that the data element belongs to;
processing circuitry for determining a set of base data values for the partition that the data element has been determined to belong to be used to derive the data value for the data element; and
processing circuitry for using the determined set of base data values to determine the decoded data element data value.
An embodiment of the technology described herein comprises a method of determining the value of a data element that is represented by an encoded data block that encodes a set of data elements, the method comprising:
determining the position of the data element to be decoded, relative to a corner of the block of data elements that the encoded data block encodes;
reading and decoding from the encoded texture data block a partitioning pattern index value for the encoded texture data block;
passing the determined texture data element position and partitioning pattern index value through a partitioning pattern generation function to determine a partition within the block that the texture data element belongs to;
reading and decoding from the encoded data block data for generating a set of base data values to be used to derive the data value for the data element;
reading and decoding from the encoded data block a set of integer values to be used for generating the set of base data values to be used to derive the data value for the data element;
generating the set of base data values to be used to determine the data value for the data element;
determining an index value for the data element, using index data specified for the data element in the encoded data block; and
interpolating between the generated data values of the generated set of base data values using the index value to determine the decoded data element data value.
An embodiment of the technology described herein comprises an apparatus for determining the value of a data element that is represented by an encoded data block that encodes a set of data elements, the apparatus comprising:
processing circuitry for determining the position of the data element to be decoded, relative to a corner of the block of data elements that the encoded data block encodes;
processing circuitry for reading and decoding from the encoded texture data block a partitioning pattern index value for the encoded texture data block;
processing circuitry for passing the determined texture data element position and partitioning pattern index value through a partitioning pattern generation function to determine a partition within the block that the texture data element belongs to;
processing circuitry for reading and decoding from the encoded data block data for generating a set of base data values to be used to derive the data value for the data element;
processing circuitry for reading and decoding from the encoded data block a set of integer values to be used for generating the set of base data values to be used to derive the data value for the data element;
processing circuitry for generating the set of base data values to be used to determine the data value for the data element;
processing circuitry for determining an index value for the data element, using index data specified for the data element in the encoded data block; and
processing circuitry for interpolating between the generated data values of the generated set of base data values using the index value to determine the decoded data element data value.
As will be appreciated by those skilled in the art, all of these embodiments and embodiments of the technology described herein can, and in an embodiment do, include any one or more or all of the preferred and optional features of the technology described herein described herein, as appropriate.
The methods and apparatus of the technology described herein can be implemented in any appropriate manner, e.g. in hardware or software, and in (and be included in) any appropriate device or component. In an embodiment they are implemented in a graphics processor, and thus the technology described herein also extends to a graphics processor configured to use the methods of the technology described herein, or that includes the apparatus of the technology described herein. In an embodiment, the methods and apparatus of the technology described herein are implemented in hardware, in an embodiment on a single semi-conductor platform.
The technology described herein can be implemented in any suitable system, such as a suitably configured micro-processor based system. In an embodiment, the technology described herein is implemented in computer and/or micro-processor based system.
The various functions of the technology described herein can be carried out in any desired and suitable manner. For example, the functions of the technology described herein can be implemented in hardware or software, as desired. Thus, for example, the various functional elements and “means” of the technology described herein may comprise a suitable processor or processors, controller or controllers, functional units, circuitry, processing logic, microprocessor arrangements, etc., that are operable to perform the various functions, etc., such as appropriately dedicated hardware elements and processing circuitry and/or programmable hardware elements and processing circuitry that can be programmed to operate in the desired manner. The various functional elements, etc., may be separate to each other or may share circuitry (e.g. be performed by the same processor), as desired.
It should also be noted here that, as will be appreciated by those skilled in the art, the various functions, etc., of the technology described herein may be duplicated and/or carried out in parallel on a given processor.
The technology described herein is applicable to any suitable form or configuration of graphics processor and renderer, such as tile-based graphics processors, immediate mode renderers, processors having a “pipelined” rendering arrangement, etc.
As will be appreciated from the above, the technology described herein is particularly, although not exclusively, applicable to graphics processors and processing devices, and accordingly extends to a graphics processor and a graphics processing platform including the apparatus of, or operated in accordance with the method of, any one or more of the embodiments of the technology described herein described herein. Subject to any hardware necessary to carry out the specific functions discussed above, such a graphics processor can otherwise include any one or more or all of the usual functional units, etc., that graphics processors include.
It will also be appreciated by those skilled in the art that all of the described embodiments of the technology described herein can include, as appropriate, any one or more or all of the preferred and optional features described herein.
The methods in accordance with the technology described herein may be implemented at least partially using software e.g. computer programs. It will thus be seen that when viewed from further embodiments the technology described herein comprises computer software specifically adapted to carry out the methods herein described when installed on a data processor, a computer program element comprising computer software code portions for performing the methods herein described when the program element is run on a data processor, and a computer program comprising code adapted to perform all the steps of a method or of the methods herein described when the program is run on a data processing system. The data processing system may be a microprocessor, a programmable FPGA (Field Programmable Gate Array), etc.
The technology described herein also extends to a computer software carrier comprising such software which when used to operate a graphics processor, renderer or other system comprising a data processor causes in conjunction with said data processor said processor, renderer or system to carry out the steps of the methods of the technology described herein. Such a computer software carrier could be a physical storage medium such as a ROM chip, CD ROM or disk, or could be a signal such as an electronic signal over wires, an optical signal or a radio signal such as to a satellite or the like.
It will further be appreciated that not all steps of the methods of the technology described herein need be carried out by computer software and thus from a further broad embodiment the technology described herein provides computer software and such software installed on a computer software carrier for carrying out at least one of the steps of the methods set out herein.
The technology described herein may accordingly suitably be embodied as a computer program product for use with a computer system. Such an implementation may comprise a series of computer readable instructions either fixed on a tangible, non-transitory medium, such as a computer readable medium, for example, diskette, CD ROM, ROM, or hard disk, or transmittable to a computer system, via a modem or other interface device, over either a tangible medium, including but not limited to optical or analogue communications lines, or intangibly using wireless techniques, including but not limited to microwave, infrared or other transmission techniques. The series of computer readable instructions embodies all or part of the functionality previously described herein.
Those skilled in the art will appreciate that such computer readable instructions can be written in a number of programming languages for use with many computer architectures or operating systems. Further, such instructions may be stored using any memory technology, present or future, including but not limited to, semiconductor, magnetic, or optical, or transmitted using any communications technology, present or future, including but not limited to optical, infrared, or microwave. It is contemplated that such a computer program product may be distributed as a removable medium with accompanying printed or electronic documentation, for example, shrink wrapped software, pre loaded with a computer system, for example, on a system ROM or fixed disk, or distributed from a server or electronic bulletin board over a network, for example, the Internet or World Wide Web.
An embodiment of the technology described herein will now be described with reference to the encoding of texture data for use in graphics processing that is in the form of a colour map (i.e. colour data). However, as discussed above, and as will be appreciated by those skilled in the art, the technology described herein is applicable to data encoding and decoding in general, and so therefore should not be considered to be limited to the present example of texture colour data encoding.
FIG. 1 illustrates the basic encoding process of this embodiment. As shown in FIG. 1, an original image or array 1 of texture data elements (texels) (a texture “map”) is subdivided into a plurality of 4×4 texture element blocks 2. (Other block sizes can be used, as will be discussed further below.)
In the present embodiment, as shown in FIG. 1, the original image (texture map) 1 is divided into blocks of equal size. This simplifies the task of finding which block a given texture data element lies in, and gives a constant data rate.
In this embodiment, each texture element (texel) in the original texture map data array (image) represents the colour to be used at the position of the respective texture element, and accordingly has allocated to it a data value comprising a set of colour values (e.g. red, green, blue (RGB), and, optionally alpha (transparency) values. In other words, in this embodiment, the data values that are encoded and generated, etc., each correspond to and represent a colour (a set of colour values). For convenience, the following description will therefore refer primarily to “colours” but it should be understood that such references indicate a data value comprising a set of colour values that represent the colour in question.
In the present embodiment, rather than storing the array of colour data in its full, original form, each 4×4 texture element block 2 is encoded as a texture data block 5 that has a reduced size as compared to the texture data in its original, unencoded form. This, in effect, compresses the original texture data, thereby making its storage and processing easier and more efficient. In the present embodiment, each encoded texture data block 5 uses 128 bits. (Other arrangements would, of course, be possible.)
Each encoded, reduced size, texture data block 5 contains, as will be discussed further below, sufficient and appropriate data to allow data corresponding to or representing the original, unencoded, data of the 4×4 texture element block in question to be reproduced.
For each block 2 of the original image (texture map) 1, a corresponding encoded texture data block 5 is generated. The individual texture data blocks making up the texture map are encoded in the present embodiment in raster order. Other arrangements, such as the use of Morton order, would, of course, be possible.
Thus, in the present embodiment, each encoded texture data file comprises a sequence of individual texture data blocks encoding the array of texture data elements (the image data).
The number of texture data blocks in the file will depend on the size of the texture map (texture data array) that is being encoded, and, e.g., whether the data is being stored in mip-map form. If mip-maps are used, then if the first level of texture map resolution is encoded using “n” texture data blocks, there will be “n/4” texture data blocks for the mip-map level above, “n/16” blocks for the next mip-map, “n/64” for the next, “n/256” for the next again, and so on (but no less than one block for each level) until the mip-map level with size 1×1 is reached.
(In the present embodiment, the encoded texture data can be and in an embodiment is stored in the form of mip-maps (i.e. where multiple versions of the original texture data array, each having different levels of detail (resolution), are stored for use). The mip-maps are in an embodiment stored one after each other in memory, with each mip-map level being, as is known in the art, a downscaled (by a factor of 2) representation (image) of the original array (image). The mip-maps are stored in order of descending resolution, i.e. n×n, . . . , 16×16, 8×8, 4×4, 2×2, 1×1. The smaller mip-maps (<8×8) are each stored individually in a separate encoded data block.)
As discussed above, the technology described herein is directed to arrangements in which the texture data elements (texels) in a given texel block to be encoded are divided into different partitions (sub-sets) within the block. FIG. 2 illustrates this, and shows a 4×4 texel block 2 which has been divided into three partitions 10, 11 and 12. Thus the texels labelled “a” in FIG. 2 belong to a first partition 10, the texels labelled “b” belong to a second partition 11, and the texels labelled “c” belong to a third partition 12. This block is then encoded in a compressed form as an encoded texture data block 13, but with, as will be explained in more detail below, additional information relating to the partitioning of the original 4×4 texel block.
The texture encoding scheme of the present embodiment supports the use of a set of predefined partitioning patterns for texel blocks to be encoded. In the present embodiment, this set of predefined partitioning patterns is derived and determined by, as will be discussed further below, a partitioning pattern generation function (which will be described in more detail below).
When a given texel block is to be encoded, the partitioning pattern to use for the block is first selected.
This is done by using the partitioning pattern generation function of the present embodiment to partition the texels in the block 20 into a number of different “candidate” partitioning patterns, e.g. by using different seed values and/or partition counts as inputs to the partitioning pattern generation function.
The block of texture data elements is then encoded using each candidate partitioning pattern, and each so-encoded block then decoded and the error between the decoded texels as compared to the original input block determined. This is done for each candidate partitioning pattern, and the candidate partitioning pattern found to have the lowest error as compared to the original texel block is selected as being the partitioning pattern to use when encoding the texel block.
In this embodiment, the error between the encoded block using the candidate partitioning pattern and the original texel block is determined using a measure of the peak signal to noise ratio or a perceptually weighted noise measure. Other arrangements would, of course, be possible.
The above describes the process of the embodiment for determining the partitioning patterns to be used for a given texel block to be encoded. As will be appreciated by those skilled in the art, as well as determining which partitioning patterns to use, the texel block will otherwise need to be encoded in a suitable manner to allow a decoder to decode the texel block to reproduce (at least an approximation to) the original texel values.
The format for encoding (and decoding) a block of texture data elements (texels) that is used in the present embodiment will accordingly now be described, along with a more detailed description of the partitioning pattern generation function and technique that is used in the present embodiment.
Overview
The present embodiment uses a texture compression format designed to provide lossy texture compression suitable for a wide range of different types of content and a wide range of quality/bitrate tradeoffs. The format has the following main features:

    
    
        128-bit block size
        an encoded block is self-contained (any given texel is completely defined by the contents of a single block)
        Designed for compression of the following types of texture data:
        
            LDR (low dynamic range) texture data with 1, 2, 3 or 4 components per texel (Luminance, Luminance-Alpha, RGB and RGB-Alpha, respectively)
            HDR (high dynamic range) texture data with 1, 3 or 4 components per texel
        
        
        Fine-grained per-block adjustable bit-allocation between index bits and color endpoint bits.
        2D and 3D variants.
        Each block represents a rectangular or cuboidal footprint of texels. The footprint size determines the bit-rate of this texture format and is global for the texture as a whole.
    
    


Supported footprint sizes for 2D variants are:

    
    
        4×4 (8 bpp)
        5×4 (6.40 bpp)
        5×5 (5.12 bpp)
        6×5 (4.27 bpp)
        6×6 (3.56 bpp)
        8×5 (3.20 bpp)
        8×6 (2.67 bpp)
        10×5 (2.56 bpp)
        10×6 (2.13 bpp)
        8×8 (2 bpp)
        10×8 (1.60 bpp)
        10×10 (1.28 bpp)
        12×10 (1.07 bpp)
        12×12 (0.88 bpp)
    
    


Supported footprint sizes for 3D variants are:

    
    
        3×3×3 (4.74 bpp)
        4×3×3 (3.56 bpp)
        4×4×3 (2.67 bpp)
        4×4×4 (2 bpp)
        5×4×4 (1.60 bpp)
        5×5×4 (1.28 bpp)
        5×5×5 (1.02 bpp)
        6×5×5 (0.85 bpp)
        6×6×5 (0.71 bpp)
        6×6×6 (0.59 bpp)
        The types of texture data supported (component count, LDR vs HDR) is not dependent on footprint size; all types are available at all sizes.
        Block partitioning, with a partitioning pattern generation function; each partition has a separate pair of endpoint colors. The format allows different partitions within a single block to have different endpoint types. The format supports 1 to 4 partitions per block.
        Index decimation: The format allows indices to be specified for only some texels, with an infill procedure used for the remaining texels; this is especially useful at lower bitrates.
        Void extents: The format offers an encoding to indicate large empty regions within the texture.
        The ability to use different data rates for different mipmap levels.

Layout of the Block

    
    


If partitioning is disabled for the block, then the encoded block has the following format:











Bits
Usage







10:0 
Index Bits Mode


12:11
“00”


16:13
Color Endpoint Mode


127:17 
Remaining Space









If partitioning is enabled, the encoded block has the following format:











Bits
Usage







10:0 
Index Bits Mode


12:11
Partition count minus 1


22:13
Partition index


28:23
Color Endpoint Mode, initial six bits


127:29 
Remaining Space









The “Remaining Space” is used to hold Index Data (from the top down), Color Endpoint Data (from the bottom up) and Color Endpoint Mode bits (if more than 6 bits are needed). The sizes of the Index Data, the Color Endpoint Data and the Color Endpoint Mode bits are not fixed, but are instead computed based on Index Bit Mode and the initial six bits of Color Endpoint Mode.
As a special case, if bits[8:0] of the encoded block are “111111100”, then the block does not encode ordinary compressed content; instead, it encodes a Void-Extent Block.
Partitioning
An encoded block is subdivided into 1, 2, 3 or 4 partitions, with a separate color endpoint pair for each partition. The number of partitions is specified by the “Partition count minus 1” bits.
If 2 or more partitions are used, then the partition index is used to select one of 1024 partitioning patterns; the set of patterns supported depends on the partition count and block size.
The partitioning patterns are produced with a generator function; this enables a very large set of partitioning patterns for different block sizes to be implented with a minimal number of gates. The details on how the generator works in this embodiment are given below.
Index Modes
The “Index Bits Mode” field controls the number of indexes present, as well as the range used for them. The set of possible combinations depend on the block dimensionality (2D or 3D).
The actual indexes in the block are stored are follows:

    
    
        First, they are encoded using the Integer Sequence Encoding method described below.
        The resulting bit-sequence is then bit-reversed, and stored from the top of the block downwards.

Usage of Indexes

    
    


The indexes are used to interpolate between two endpoint colors for each texel. First, they are scaled from whatever interval (range) they were supplied in to the range 0 . . . 1; the resulting value is then used as a weight to compute a weighted sum of the two endpoints. Any suitable unquantization procedure for the scaling to the 0 . . . 1 range can be used.
Index Infill
Each texel that the block encodes has a corresponding index to be used for that texel. In some of the index modes, one index is supplied for every texel in the block; in others, the number of indexes is less than the number of texels. In the latter case, the indexes that are actually to be used for the texels are derived by bilinear (or simplex or trilinear, for 3D blocks) interpolation from the indexes that are supplied (encoded) in the block. Thus, when the index count is smaller than the number of texels in the block, the actual indexes to be used for the texels of the block are derived by bilinear (or simplex or trilinear) interpolation from the index values supplied in the encoded block, i.e. the index for a texel will be computed as an appropriately weighted sum of 2, 3 or 4 (or more) of the indexes supplied (included) in the encoded block.
Thus, in the present embodiment, where an encoded texture data block includes fewer indices than the number of texels the block represents, the encoded texture data block will include a set of index values representing an array of index values at a given resolution that is less than the resolution of the array of texture data elements that the block represents, and then the index values to use for the array of texture data elements that the block represents are derived in use by bilinear (or simplex or trilinear) interpolation from the array of index values that is encoded (included) in the encoded texture data block. For example, an encoded block encoding an 8×8 array of texels may encode (include) only a 5×5 array of index values.
Other arrangements, such as using look-up tables, and/or using predefined index infill patterns (which may be derived, e.g. using a predefined infill pattern generation function, or stored explicitly, e.g. in look-up tables), to derive any “missing” texel indexes can also or instead be used if desired.
Index Planes
Depending on the Index Bits mode selected, the format may offer 1 or 2 index planes. In the case of 2 index planes, two indexes rather than just one are supplied for each texel that receives indexes. Of these two indexes, the first one is used for a weighted sum of three of the color components; the second is used for a weighted sum of the fourth color component. If only 1 index plane is present, it applies to all four color components.
If two index planes are used, then a 2-bit bitfield is used to indicate which of the color components the second index plane applies to. These two bits are stored just below the index bits, except in the case where leftover color endpoint type bits are present; in that case, these two bits are stored just below the leftover color endpoint type bits.
This two-bit bitfield has the following layout:











Value
Meaning







0
Red


1
Green


2
Blue


3
Alpha









If index infill is present while two index planes are being used, then index infill is performed on each index plane separately.
Index Modes
The Index Mode field specifies the width, height and depth of the grid of indices, what range of values they use, and whether dual index planes are present. Since some these are not represented using powers of two (there are 12 possible index widths, for example), and not all combinations are allowed, this is not a simple bit packing. However, it can be unpacked quickly in hardware.
The index ranges are encoded using a 3 bit value R, which is interpreted together with a precision bit H, as follows:














R
Index Range
Trits
Quints
Bits















Low Precision Range (H = 0)











000
Invalid





001
Invalid


010
0 . . . 1


1


011
0 . . . 2
1


100
0 . . . 3


2


101
0 . . . 4

1


110
0 . . . 5
1

1


111
0 . . . 7


3







High Precision Range (H = 1)











000
Invalid





001
Invalid


010
0 . . . 9

1
1


011
0 . . . 11
1

2


100
0 . . . 15


4


101
0 . . . 19

1
2


110
0 . . . 23
1

3


111
0 . . . 31


5









For 2D blocks, the index mode field is laid out as follows:


































Width
Height



10
9
8
7
6
5
4
3
2
1
0
N
M
Notes


























D
H
B
A
R0
0
0
R2
R1
B + 4
A + 2



D
H
B
A
R0
0
1
R2
R1
B + 8
A + 2


D
H
B
A
R0
1
0
R2
R1
A + 2
B + 8



















D
H
0
B
A
R0
1
1
R2
R1
A + 2
B + 6



D
H
1
B
A
R0
1
1
R2
R1
B + 2
A + 2


D
H
0
0
A
R0
R2
R1
0
0
12
A + 2


D
H
0
1
A
R0
R2
R1
0
0
A + 2
12




















D
H
1
1
0
0
R0
R2
R1
0
0
 6
10



D
H
1
1
0
1
R0
R2
R1
0
0
10
 6


















B
1
0
A
R0
R2
R1
0
0
A + 6
B + 6
D = 0, H = 0




















x
x
1
1
1
1
1
1
1
0
0
—
—
Void-extent


x
x
1
1
1
x
x
x
x
0
0
—
—
Reserved


x
x
x
x
x
x
x
0
0
0
0
—
—
Reserved









Note that, due to the encoding of the R field, as described in the previous page, bits R2 and R1 cannot both be zero, which disambiguates the first five rows from the rest of the table.
For 3D blocks, the index mode field is laid out as follows:



































Width
Height
Depth



10
9
8
7
6
5
4
3
2
1
0
N
M
Q
Notes


























D
H
B
A
R0
C
R2
R1
A + 2
B + 2
C + 2




















B
0
0
A
R0
R2
R1
0
0
6
B + 2
A + 2
D = 0, H = 0


B
0
1
A
R0
R2
R1
0
0
A + 2
6
B + 2
D = 0, H = 0


B
1
0
A
R0
R2
R1
0
0
A + 2
B + 2
6
D = 0, H = 0





















D
H
1
1
0
0
R0
R2
R1
0
0
6
2
2



D
H
1
1
0
1
R0
R2
R1
0
0
2
6
2


D
H
1
1
1
0
R0
R2
R1
0
0
2
2
6


x
x
1
1
1
1
1
1
1
0
0
—
—
—
Void-extent


x
x
1
1
1
1
x
x
x
0
0
—
—
—
Reserved (except
















for valid void
















extent encodings)


x
x
x
x
x
x
x
0
0
0
0
—
—
—
Reserved









The D bit is set to indicate dual-plane mode. In this mode, the maximum allowed number of partitions is 3.
The size of the grid in each dimension must be less than or equal to the corresponding dimension of the block footprint. If the grid size is greater than the footprint dimension in any axis, then this is an illegal block encoding and all texels will decode to an error color.
The index range specifies how the index values are used to compute the weightings. In all cases, the value 0 will generate an interpolated value with the value of endpoint 1, and the maximum value (the selected range) generates an interpolated value equal to endpoint 2's value.
For LDR endpoint values, the interpolation is linear. So if M is the maximum allowed value in the range, the actual interpolated value is equal to (1−index/M)*(endpoint value 1)+(index/M)*(endpoint value 2). The division by M is what scales the input values in the range 0 . . . M into weighting values in the range 0 . . . 1. The range therefore selects how many intermediate steps there are between these two values. The more range, the more likely one is able to represent a value closely, but the more bits needed to encode it.
In the present embodiment, the index value is first rescaled so that M is a power of two (in an embodiment 64), so that the costly division by M can be replaced with a relatively cheap multiplication by 64/M, and then a division by 64.
For HDR endpoint values, the interpolation is a logarithmic function, or an approximation thereof. The endpoint values are encoded as logarithms to the base 2 of the original endpoint values. So if M is the maximum allowed value in the range, the interpolated value is the logarithm of the final decoded values, and is equal to (1−index/M)*(endpoint value 1)+(index/M)*(endpoint value 2). The final decoded value is therefore 2 to the power of the interpolated value.
In the present embodiment, the HDR endpoint values are stored as values with a 12 bit floating point representation, and interpolation occurs in a piecewise-approximate logarithmic manner as follows.
The HDR color components from each endpoint, C0 and C1, are initially shifted left 4 bits to become 16-bit integer values and these are first interpolated in the same way as LDR, using the rescaled index value i. The resulting 16-bit value C is then decomposed into the top five bits, e, and the bottom 11 bits m, which are then processed and recombined with e to form the final value Cf:

C=floor((C0*(64−i)+C1*i+32)/64)

E=(C&0xF800)>>11;m=C& 0x7FF; 

if(m<512){mt=3*m;}

else if(m>=1536){mt=5*m−2048;}

else {mt=4*m−512;}

Cf=(e<<10)+(mt>>3)

This interpolation is simple to implement in hardware, and is a considerably closer approximation to a logarithmic interpolation than interpolating the integer interpretation of the bit pattern of a floating-point value.
The final value Cf is interpreted as an IEEE FP16 value. If the result is +Inf or NaN, it is converted to the bit pattern 0x7BFF, which is the largest representable finite value.
The index count is used in larger block sizes to indicate how many indexes are actually present in the encoded block. This may be less than the size of the block, in which case the “missing” indexes have to be derived (as discussed above). (For example, a block encoding an 8×8 texel array may only specify a 4×4 grid of indexes, in which case the remaining indexes will be generated using “index infill”, as discussed above.)
Color Endpoint Modes
The format of the present embodiment supports 16 Color Endpoint Modes, which are described in more detail later. These endpoint modes are subdivided into 4 classes:

    
    
        class 0: one color endpoint pair is specified by 2 integers
        class 1: one color endpont pair is specified by 4 integers
        class 2: one color endpoint pair is specified with 6 integers
        class 3: one color endpoint pair is specified with 8 integers

Each of these classes contains 4 Color Endpoint Modes.

    
    


In 1-partition mode, the 4-bit Color Endpoint Mode field has the following encoding:











Bits
Usage







1:0
Endpoint Mode Class


3:2
Endpoint Mode within class









In modes with more than 1 partition, the color endpoint mode coding is more elaborate:
First, we have a 2-bit Endpoint Mode Class Pair Selector; this selector is encoded as follows:











Value
Meaning







00
All endpoint pairs are of same type,



this type follows


01
All endpoint pairs are of class 0 or



class 1


10
All endpoint pairs are of class 1 or



class 2


11
All endpoint pairs are of class 2 or



class 3









If all endpoints are of same type, then this field is followed by a 4-bit field, containing the Color Endpoint Mode used for all partitions. Otherwise, the field is followed by:

    
    
        First, one bit per partition indicating which class its endpoint pair belongs to.
        Then, two bits per partition indicating which mode within the class it belongs to.
    
    


Thus, for multi-partition modes, the endpoint mode representation may take from 6 to 14 bits. Of these, the 6 first bits are stored just after the partition indexes, and the remaining bits are stored just below the index bits (variable position).
This data layout ensures that the bits that indicate endpoint pair class always appear in fixed locations; this helps decode performance in hardware.
Color Endpoint Representation
The color endpoints themselves are also represented using the Integer Sequence Encoding. The actual range being used is not directly encoded in the block; instead, the following is done:

    
    
        From the partition-count and color-mode encodings, the number of integers actually needed for the color encodings is computed. This may be from 2 to 32, in increments of 2. (The lowest count, 2, occurs when using the Two-Luminance endpoint type with a single partition; the highest count, 32, occurs when using the Two-RGBA endpoint type with 4 partitions).
        From the partition-count, color-mode encoding and index-bits-mode, the number of bits needed to represent these data fields is computed; this bit count is then subtracted from the block size in order to obtain the number of bits actually available for the color encodings.
        Then, the largest range whose Integer Sequence Encoding will fit into the available number of bits is determined (and used).
    
    


For example, if the space available for color endpoints is 35 bits, and the number of integers actually needed for the color encodings is ten, then the range used will be 0 . . . 9: the Integer Sequence Encoding of ten integers of such a range takes 34 bits, which fits. The next step up would be to use the range 0 . . . 11; for this range, the Integer Sequence Encoding would take 36 bits to encode ten integers, which would not fit.
Integer Sequence Encoding
The Integer Sequence Encoding is a data encoding that is used to encode most of the data in the compressed (encoded) texture data block.
In order to use space efficiently, the encoding format is able to use a non-integer number of bits for its color endpoint and index fields. This is achieved by using trits (items that can take the values 0, 1, 2 (whereas bits can only take the values 0 and 1)), and quints (which can take the values 0, 1, 2, 3, 4). As trits and quints cannot be represented directly in a binary computer the encoding format instead stores trits and quints in a bit representation that allows n trits to be represented with




  ⌈
  
    
      8
      ⁢
      
        
      
      ⁢
      n
    
    5
  
  ⌉




bits and n quints to be represented with





  ⌈
  
    
      7
      ⁢
      
        
      
      ⁢
      n
    
    3
  
  ⌉




bits.

The Integer Sequence Encoding is used to store a sequence of integers within a bounded range. The range used determines how many bits, trits and quints are used to store each integer. The set of supported ranges and their bit/trit/quint allocation is:















Range
Bits
Trits/Quints









0 . . . 1
1
0



0 . . . 2
0
1 trit



0 . . . 3
2
0



0 . . . 4
0
1 quint



0 . . . 5
1
1 trit



0 . . . 7
3
0



0 . . . 9
1
1 quint



0 . . . 11
2
1 trit



0 . . . 15
4
0



0 . . . 19
2
1 quint



0 . . . 23
3
1 trit



0 . . . 31
5
0



0 . . . 39
3
1 quint



0 . . . 47
4
1 trit



0 . . . 63
6
0



0 . . . 79
4
1 quint



0 . . . 95
5
1 trit



0 . . . 127
7
0



0 . . . 159
5
1 quint



0 . . . 191
6
1 trit



0 . . . 255
8
0










Encoding with Bits Only

If the range selected only uses bits, then integers are stored sequentially, with the lowest bit appearing first in the sequence encoding. For example, if you want to encode a sequence of four numbers (a, b, c, d) whose range is 0 . . . 7 and whose bit-representation is (a=a2a1a0, b=b2b1b0, c=c2c1c0, d=d2d1d0), then the resulting sequence is the 12-bit pattern d2d1d0c2c1c0b2b1b0a2a1a0 
Encoding with Trits
If the range selected uses trits, then each integer is broken into two parts before encoding: if the selected range has b bits, then the low part of a given integer x is given by L=X mod 2b and the high part is given by




  H
  =
  
    
      ⌊
      
        X
        
          2
          b
        
      
      ⌋
    
    .
  




The L portion is represented by zero or more bits; the H portion is represented by one trit. The integers are then stored in groups of 5, as follows:

    
    
        First, a trit H is collected from every integer; this results in 5 trits. These are encoded into a trit-block; the full size of the trit-block is 8 bits.
        Then, bits are stored in the sequence in the following order:
        
            First, the low bits for the first integer are stored.
            Then, bits[1:0] of the trit-block are stored.
            Then, the low bits for the second integer are stored.
            Then, bits[3:2] of the trit-block are stored.
            Then, the low bits for the third integer are stored.
            Then, bit[4] of the trit-block is stored.
            Then, the low bits for the fourth integer are stored.
            Then bits[6:5] of the trit-block are stored.
            Then, the low bits for the fifth integer are stored.
            Then, bit [7] of the trit-block is stored.
        
        
    
    


This operation is repeated for every group of 5 integers, until all the integers in the sequence have been consumed. At encode time, if the number of integers is not a multiple of 5, the integer sequence is padded with 0s until its size becomes a multiple of 5. At decode time, if the number of integers to extract from the sequence is not a multiple of 5, then the sequence's bit representation has a (notionally infinite) string of zero-bits appended. This way, the format only stores bits for the integers actually needed, instead of storing bits for a multiple-of-5 integers.
Decoding of a Trit-Block
Let the trit-block be denoted by b[7:0]. Now, proceed as follows:













•
First, we check whether b[4:2] is equal to 3′ b 1 1 1 . If it is, then:










 -
Set c= { b[7:5], b[1:0]}



 -
Set t4= 2 and t3= 2








•
Else










 -
Set c= b[4:0]



 -
If b[6:5]=2′ b 1 1 then




□ Set t4= 2 and t3= { 1′ b 0 , b[7]}



 -
Else




□ Set t4= { 1′ b 0, b[7]} and t3= b[6:5]








•
If c[1:0]= 2′ b 1 1 then










 -
t2= 2 , t1= { 1′ b 0, c[4]} , t0={c[3], c[2]&~c[3]}








•
Else if c[3:2]= 2′ b 1 1 then










 -
t2= 2 , t1= 2 , t0= c[1:0]








•
Else










 -
t2 = { 1′ b 0, c[4]} , t1= c[3:2] , t0={c[1], c[0]&~c[1]}










This encoding is chosen based on two criteria:

    
    
        1. It has the property that if only the n lowest trits are nonzero, then only the
    
    






  ⌈
  
    
      8
      ⁢
      
        
      
      ⁢
      n
    
    5
  
  ⌉




lowest bits of the trit-block can actually be nonzero.

    
    
        2. The decoding process has a particularly efficient hardware implementation.

The AND-NOT operation on the lowest bit of t0 ensures that the trit-block unpacks to a tuple of 5 valid trits for all the 256 possible input values, even though there are only 35=243 such tuples.

Example Integer Sequence with Trits

    
    


As an example, it will be assumed that 8 integers in the range 0 . . . 11 are to be encoded using the Integer Sequence Encoding scheme of the present embodiment, and that these eight integers are {2, 9, 3, 5, 11, 8, 0, 4}. First, the integers need to be split them into bits and trits; given that the 0 . . . 11 range has one trit and two bits, the result of this splitting is:

    
    
        Trits (high part of the numbers): {0, 2, 0, 1, 2, 2, 0, 1}
        Bits (low part of the numbers): {01, 01, 11, 01, 11, 00, 00, 00}
    
    


Given that there are 8 trits and 16 bits, the encoded Integer Sequence will have




  
    16
    +
    
      ⌈
      
        
          8
          *
          8
        
        5
      
      ⌉
    
  
  =
  
    29
    ⁢
    
      
    
    ⁢
    
      bits
      .
    
  




The trits now need to be encoded into two trit-blocks. The low 5 trits are encoded into one trit-block; the high 3 trits are encoded into a second trit-block.
Encoding with Quints
If the range selected uses quints, then each integer is broken into two parts before encoding: if the selected range has b bits, then the low part of a given integer X is given by L=X mod 2b and the high part is given by




  H
  =
  
    
      ⌊
      
        X
        
          2
          b
        
      
      ⌋
    
    .
  




The L portion is represented by zero or more bits; the H portion is represented by one quint. The integers are then stored in groups of 3, as follows:

    
    
        First, a quint H is collected from every integer; this results in 3 quints. These are encoded into a quint-block; the full size of the quint-block is 7 bits.
        Then, bits are stored in the sequence in the following order:
        
            First, the low bits for the first integer are stored.
            Then, bits[2:0] of the quint-block are stored.
            Then, the low bits for the second integer are stored.
            Then, bits[4:3] of the quint-block are stored.
            Then, the low bits for the third integer are stored.
            Then, bit[6:5] of the quint-block is stored.
        
        
    
    


This operation is repeated for every group of 3 integers, until all the integers in the sequence have been consumed. At encode time, if the number of integers is not a multiple of 3, the integer sequence is padded with 0s until its size becomes a multiple of 3. At decode time, if the number of integers to extract from the sequence is not a multiple of 3, then the sequence's bit representation has a (notionally infinite) string of zero-bits appended. This way, the format only stores bits for the integers actually needed, instead of storing bits for a multiple-of-3 integers.
Decoding of a Quint-Block
Let the quint-block be denoted by b[6:0] Now, proceed as follows:
















•
If b[2:1]= 2′ b 1 1 and b[6:5]= 2′ b 0 0 then










 -
Set t2= {b[0], b[4]&~ b[0], b[3]&~ b[0]}, t1= 4 , t0= 4










•
Else










 -
If b[2:1]= 2′ b 1 1 then




□ Set t2= 4 and c={b[4:3], ~ b[6:5], b[0]}



 -
Else




□ Set t2= { 1′ b 0, b[6:5]} and c=b[4:0]



 -
If c[2:0]= 3′ b 1 0 1 then




□ Set t1= 4 and t0= { 1′ b 0, c[4:3]}



 -
Else




□ Set t1= { 1′ b 0, c[4:3]} and t0= c[2:0]










This encoding is chosen by two criteria:

    
    
        3. It has the property that if only the n lowest quints are nonzero, then only the
    
    






  ⌈
  
    
      7
      ⁢
      
        
      
      ⁢
      n
    
    3
  
  ⌉




lowest bits of the quint-block can actually be nonzero.

    
    
        4. The decoding process has a particularly efficient hardware implementation.
    
    


The AND-NOT operation in the first rule ensures that all 128 possible values decode to valid quint-triplets, even though there exists only 53=125 distinct quint-triplet values; four of the values (of the form 7′b00xx111) represent the quint-triplet <4, 4, 4>.
The above decoding arrangement when using trits or quints effectively, for a stream of values, first emit the bits for each value, and then emit sufficient bits from the packed trit- or quint-block to make up 8n/5 (rounded up) bits or 7n/3 (rounded up) bits, respectively. This ensures that the bitstream can be terminated after any value without losing data.
The above trit/quint unpacking functions have a relatively low hardware cost.
Other arrangements would, of course, be possible. For example, there are a fairly large number of possible unpacking functions as such; some of these can be obtained by e.g. just inverting or swapping input or output bits relative to what is described above; other ones can be obtained by more elaborate sub-case approaches or by arithmetic (repeated division/modulo gives one particularly-easy-to-understand unpacking; however this approach is expensive in HW) or by look-up tables (which allow arbitrary unpacking functions albeit at a higher cost).
Color Endpoint Unquantization
The color endpoints, after having been extracted from their Integer Sequence Encoding, need to be unquantized so that they end up in the range 0 . . . 255 instead of whatever range was used in the Integer Sequence Encoding.
For bit-only ranges, the unquantization is done using simple bit replication.
In the case of a number composed of a trit/quint and one or more bits, a more elaborate procedure is performed:

    
    
        First, the lowest bit b0 is cut off.
        Based on the range used, a constant C is selected; the trit or quint is multiplied by this constant, resulting in the 9-bit value T.
        Based on the range used, a swizzle is performed on the remaining bits; this 9-bit value is called B.
        The addition T+B is then performed, then every bit of the addition result is XORed with the bit b0.
        The result is a 9-bit number; b0 is prepended to this number, then the two lowest bits are discarded; this leaves 8 bits, which is the unquantization result.
    
    


Below are tables that specify the swizzles and C values to use for the various ranges. Note that the lowest bit b0 is not part of the input bits.
Swizzles and C values for the case where a trit component is present:













Range
Input bits
Swizzle
C


















0 . . . 5 
none
000000000
204


0 . . . 11
a
a000a0aa0
93


0 . . . 23
ab
ab000abab
44


0 . . . 47
abc
abc000abc
22


0 . . . 95
abcd
abcd000ab
11


 0 . . . 191
abcde
abcde000a
5









Swizzles and C values for the case where a quint component is present:













Range
Input bits
Swizzle
C


















0 . . . 9 
none
000000000
113


0 . . . 19
a
a0000aa00
54


0 . . . 39
ab
ab0000aba
26


0 . . . 79
abc
abc0000ab
13


 0 . . . 159
abcd
abcd0000a
6









This procedure produces an unquantization result with an error that is never greater than off-by-1 relative to a correctly-rounding unquantization, while imposing a much lesser hardware cost (the “correctly rounding” unquantization procedure requires a multiplier, while the procedure presented here does not). It can have the side effect of scrambling the code point order, but this does not adversely affect image quality and is therefore considered acceptable (the encoder can easily compensate for this scrambling with a simple table lookup).
In this unquantisation procedure, the constant C is based on 1023/M where M is the maximum value in the range, and is selected so that the trit or quint makes a low-order contribution to the final unquantized result (while the bits make a high-order contribution, which is what the swizzle ultimately tries to achieve), such that the representable codepoints are as evenly distributed as possible.
The swizzle patterns are related to the bit patterns of the reciprocal of M, so that the swizzle effectively does a truncated multiplication.
The manipulation using b0 is done in order to obtain codepoint symmetry, so that if there exists a value that unquantizes to X, there also always exists a value that unquantizes to 255−X. (This symmetry does not quite hold for the 0 . . . 2 and 0 . . . 4 ranges, which do not allow for the b0 bit at all; these have an odd number of codepoints and therefore cannot be made symmetric.)
Color Endpoint Modes
The format of the present embodiment supports a total of 16 Color Endpoint Modes; these modes control how the color endpoint integers are converted into actual endpoint colors. The integers are the 0.255 range integers that are present after the Color Endpoint Unquantization.
Several procedures are used repeatedly for several color conversion modes; below, C++ implementations of these procedures are given:
The Bit_Transfer_Signed Procedure
The bit_transfer procedure is used when one of the integers in an endpoint representation is deemed to require more precision than the other ones. It is used instead of independently assigning ranges to some sets of values, to skew the bit distribution more favourably.
Assuming two integers A and B, the bit-transfer works from A to B as follows:















void bit_transfer_signed( uin8_t &a, uint8_t &b )









{



b >>= 1;



b |= a & 0x80;



a >>= 1;



a &= 0x3F;



if( (a & 0x20) != 0 ) a −= 0x40;



}










Where necessary, the encoding should specify which values are the donors and which the receivers of the transferred bits.
The Blue-Contraction Procedure
The blue_contract procedure is used to provide 1 extra bit of effective precision for the red and green components of RGB colors that are close to gray. The procedure works as follows:















void blue_contract( uint8_t &r, uint8_t &g, uint8_t &b )









{



r = (r+b) >> 1;



g = (g+b) >> 1;



}










This procedure is used, because the Applicants have recognised that if the texels in a block to be encoded are close to grey, then the endpoint r, g, and b values will be close to one another, and it is advantageous in that case to encode the r and g components with more precision than the blue. The encoder may decide in this case to transfer precision from the blue by expanding the endpoint's green and red components according to the following blue-expansion transformation:

G=(g<<1)−b 

R=(r<<1)−b 

B=b 

(It can be determined that the endpoints are sufficiently close to the gray line by, for example, testing if the gray expansion transform results in values that can be properly represented, i.e. they are still in the range 0 . . . 1. Other arrangements would, of course, be possible.)
The resulting R and G and B values are encoded as the endpoint values.
If this has been applied during encoding, the inverse “blue contraction” transformation described above must be applied to the endpoint values after decoding:

g=(G+B)>>1

r=(R+B)>>1

b=B 

The encoder could use an additional bit to indicate to the decoder that this is required, but in the present embodiment it takes advantage of the fact that the order of endpoints is not important. A comparison function between the two endpoint colors (e.g. by comparing the total of r, g and b for each endpoint) is therefore defined. The encoder then orders the endpoints such that that the results of the comparison between the color values at endpoint 1 and endpoint 2 reflects whether blue contraction should be applied during the decoding process or not. The decoder will then use the same comparison function to conditionally apply blue contraction on the endpoint values after decoding (as discussed below).
Colour Endpoint Mode 0: Two Luminance or Alpha endpoints
This mode takes as input two integers (v0, v1). If v0 is less than or equal to v1, then these integers form two RGBA colors (r0,g0,b0,a0)=(v0,v0,v0,0xFF) and (r1,g1,b1,a1)=(v1,v1,v1,0xFF). Otherwise, they form two RGBA colors (r0,g0,b0,a0)=(0,0,0,v1) and (r1,g1,b1,a1)=(0,0,0,v0).
Mode 1: Luminance, Base+Offset
This mode takes as input two integers (v0,v1). Two integers l0 and l1 are then formed according to the following procedure:















void mode1_unpack( int v0, int v1, int &l0, int &l1 )









{



l0 = (v0 >> 2) | (v1 & 0xC0);



l1 = l0 + (v1 & 0x3f);



if(l1 > 0xFF) l1 = 0xFF;



}










After this, two RGBA colors are formed as (r0,g0,b0,a0)=(l0,l0,l0,0xFF) and (r1,g1,b1,a1)=(l1,l1,l1,0xFF)
Mode 2: HDR Luminance, Large Range
This mode takes as input two integers (v0,v1). These two integers are then unpacked into a pair of HDR luminance values, as follows:















void mode2_unpack_y( int v0, int v1, int &y0, int &y1 )









{









if(v1 >= v0)



{









y0 = (v0 << 4);



y1 = (v1 << 4);









}



else



{









y0 = (v1 << 4) + 8;



y1 = (v0 << 4) − 8;









}









}










This mode is intended for use when there are large luminance changes in a small region or there is a need to represent very large/small luminance values.
Mode 3: HDR Luminance, Small Range
This mode takes as input two integers (v0,v1). These two integers are then unpacked into a pair of HDR luminance values, as follows:















void mode3_unpack_y( int v0, int v1, int &y0, int &y1 )









{









if((v0&0x80) !=0)



{









y0 = ((v1 & 0xE0) << 4) | ((v0 & 0x7F) << 2);



d = (v1 & 0x1F) << 2;









}



else



{









y0 = ((v1 & 0xF0) << 4) | ((v0 & 0x7F) << 1);



d = (v1 & 0x0F) << 1;









}



y1 = y0 + d;



if(y1 > 0xFFF) { y1 = 0xFFF; }









}










Mode 4: Two Luminance-Alpha Endpoints

This mode takes as input four integers (v0, v1, v2, v3). These integers form two RGBA colors (r0,g0,g0,a0)=(v0,v0,v0,v2) and (r1,g1,b1,a1)=(v1,v1,v1,v3)
Mode 5: Luminance-Alpha, Base+Offset
This mode takes as input four integers (v0, v1, v2, v3). From these integers, a base value (lb, ab)=(v0, v2) and an offset value (lo,ao)=(v1,v3) are formed; the bit_transfer_signed procedure is then performed to transfer one bit from lo to lb, and one bit from ao to ab; the two endpoints then form two RGBA colors as (r0,g0,b0,a0)=(lb,lb,lb,ab) and (r1,g1,b1,a1)=(lb+lo,lb+lo,lb+lo,ab+ao). The RGB values are clamped to the range 0x00 . . . 0xFF.
Mode 6: RGB and Scale
This mode takes as input four integers (v0, v1, v2, v3). From these integers, two endpoint colors are formed:

    
    
        Endpoint color 0 is given by (r0,g0,b0,a0)=((v0*v3)>>8, (v1*v3)>>8, (v2*v3)>>8, 0xFF)
        Endpoint color 1 is given by (r1,g1,b1,a1)=(v0,v1,v2,0xFF)

Mode 7: Two HDR RGB Endpoints, Base and Scale

    
    


This mode takes as input four integers (v0, v1, v2, v3). These are a complex packing allowing bits to be transferred from one color component to another. The integers are unpacked into two HDR RGBA endpoint colors e0 and e1 as follows:












void mode7_unpack_y( int v0, int v1, color &e0, color &e1 )


{









int modeval = ((v0 & 0xC0) >> 6) | ((v1 & 0x80) >> 5) | ((v2



& 0x80) >> 4);



int majcomp;



int mode;



if( (modeval & 0xC ) != 0xC )









{ majcomp = modeval >> 2; mode = modeval & 3; }









else if( modeval != 0xF )









{ majcomp = modeval & 3; mode = 4; }









else









{ majcomp = 0; mode = 5; }









int red = v0 & 0x3f;



int green = v1 & 0x1f;



int blue = v2 & 0x1f;



int scale = v3 & 0x1f;



int x0 = (v1 >> 6) & 1; int x1 = (v1 >> 5) & 1;



int x2 = (v2 >> 6) & 1; int x3 = (v2 >> 5) & 1;



int x4 = (v3 >> 7) & 1; int x5 = (v3 >> 6) & 1; int x6 = (v3 >>



5) & 1;



int ohm = 1 << mode;



if( ohm & 0x30 ) green |= x0 << 6;



if( ohm & 0x3A ) green |= x1 << 5;



if( ohm & 0x30 ) blue |= x2 << 6;



if( ohm & 0x3A ) blue |= x3 << 5;



if( ohm & 0x3D ) scale |= x6 << 5;



if( ohm & 0x2D ) scale |= x5 << 6;



if( ohm & 0x04 ) scale |= x4 << 7;



if( ohm & 0x3B ) red |= x4 << 6;



if( ohm & 0x04 ) red |= x3 << 6;



if( ohm & 0x10 ) red |= x5 << 7;



if( ohm & 0x0F ) red |= x2 << 7;



if( ohm & 0x05 ) red |= x1 << 8;



if( ohm & 0x0A ) red |= x0 << 8;



if( ohm & 0x05 ) red |= x0 << 9;



if( ohm & 0x02 ) red |= x6 << 9;



if( ohm & 0x01 ) red |= x3 << 10;



if( ohm & 0x02 ) red |= x5 << 10;



static const int shamts[6] = { 1,1,2,3,4,5 };



int shamt = shamts[mode];



red <<= shamt; green <<= shamt; blue <<= shamt; scale <<=



shamt;



if( mode != 5 ) { green = red - green; blue = red - blue; }



if( majcomp == 1 ) swap( red, green );



if( majcomp == 2 ) swap( red, blue );



e1.r = clamp( red, 0, 0xFFF );



e1.g = clamp( green, 0, 0xFFF );



e1.b = clamp( blue, 0, 0xFFF );



e1.alpha = 0x780;



e0.r = clamp( red - scale, 0, 0xFFF );



e0.g = clamp( green - scale, 0, 0xFFF );



e0.b = clamp( blue - scale, 0, 0xFFF );



e0.alpha = 0x780;







}









Mode 8: Two RGB Endpoints

This mode takes as input six integers (v0, v1, v2, v3, v4, v5). From these integers, two sums: s0=(v0+v2+v4), s1=(v1+v3+v5) are computed. These two sums are then compared:

    
    
        If s1>=s0, then the two endpoint colors are obtained as (r0,g0,b0,a0)=(v0,v2,v4,0xFF) and (r1,g1,b1,a1)=(v1,v3,v5,0xFF)
        If s1<s0, then the two endpoint colors are obtained as (r0,g0,b0,a0)=(v1,v3,v5,0xFF) and (r1,g1,b1,a1)=(v0,v2,v4,0xFF); both of these two endpoint colors are then subjected to the blue_contraction procedure.

Mode 9: RGB Base+Offset

    
    


This mode takes as input six integers (v0, v2, v2, v3, v4, v5). These integers form an RGB base (rb, gb, bb)=(v0, v2, v4) and an RGB offset (ro, go, bo)=(v1,v3,v5). The base and offset values are then modified by having the bit_transfer_signed procedure applied to them to move one bit from the offset to the base (that is, from ro to rb, from go to gb and from bo to bb).
The two endpoint colors are then given by (rb,gb,bb,0xFF) and (rb+ro, gb+go, bb+bo, 0xFF).
If the offset sum s=(ro+go+bo) is negative, then the two endpoint numbers are swapped and have the blue_contraction procedure applied to them.). The RGB values are clamped to the range 0x00 . . . 0xFF.
Mode 10: RGB, Scale, and Two Alpha Endpoints
This mode takes as input six integers (v0, v1, v2, v3, v4, v5). First, use (v0,v1,v2,v3) to produce two endpoint colors just as in Mode 6. Then replace the alpha of the first endpoint color with v4 and the alpha of the second endpoint color with v5.
Mode 11: Two HDR RGB Endpoints
This mode takes as input six integers (v0, v1, v2, v3, v4, v5). These are a complex packing allowing bits to be transferred from one color component to another. The integers are unpacked into two HDR RGBA endpoint colors e0 and e1 as follows:












void mode11_unpack_rgb( int v0, int v1, int v2, int v3, int v4, int v5,


color &e0, color &e1)









{









int majcomp = ((v4 & 0x80) >> 7) | ((v5 & 0x80) >> 6);



if( majcomp == 3 )



{









e0 = (v0 << 4, v2 << 4, (v4 & 0x7f) << 5, 0x780);



e1 = (v1 << 4, v3 << 4, (v5 & 0x7f) << 5, 0x780);



return;









}



int mode = ((v1 & 0x80) >> 7) | ((v2 & 0x80) >> 6) |









((v3 & 0x80) >> 5);









int va = v0 | ((v1 & 0x40) << 2);



int vb0 = v2 & 0x3f;



int vb1 = v3 & 0x3f;



int vc = v1 & 0x3f;



int vd0 = v4 & 0x7f;



int vd1 = v5 & 0x7f;



static const int dbitstab[8] = {7,6,7,6,5,6,5,6};



vd0 = signextend( vd0, dbitstab[mode] );



vd1 = signextend( vd1, dbitstab[mode] );



int x0 = (v2 >> 6) & 1;



int x1 = (v3 >> 6) & 1;



int x2 = (v4 >> 6) & 1;



int x3 = (v5 >> 6) & 1;



int x4 = (v4 >> 5) & 1;



int x5 = (v5 >> 5) & 1;



int ohm = 1 << mode;



if( ohm & 0xA4 ) va |= x0 << 9;



if( ohm & 0x08 ) va |= x2 << 9;



if( ohm & 0x50 ) va |= x4 << 9;



if( ohm & 0x50 ) va |= x5 << 10;



if( ohm & 0xA0 ) va |= x1 << 10;



if( ohm & 0xC0 ) va |= x2 << 11;



if( ohm & 0x04 ) vc |= x1 << 6;



if( ohm & 0xE8 ) vc |= x3 << 6;



if( ohm & 0x20 ) vc |= x2 << 7;



if( ohm & 0x5B ) vb0 |= x0 << 6;



if( ohm & 0x5B ) vb1 |= x1 << 6;



if( ohm & 0x12 ) vb0 |= x2 << 7;



if( ohm & 0x12 ) vb1 |= x3 << 7;



int shamt = (modeval >> 1 ) {circumflex over ( )} 3;



va <<= shamt; vb0 <<= shamt; vb1 <<= shamt;



vc <<= shamt; vd0 <<= shamt; vd1 <<= shamt;



e1.r = clamp( va, 0, 0xFFF );



e1.g = clamp( va - vb0, 0, 0xFFF );



e1.b = clamp( va - vb1, 0, 0xFFF );



e1.alpha = 0x780;



e0.r = clamp( va - vc, 0, 0xFFF );



e0.g = clamp( va - vb0 - vc - vd0, 0, 0xFFF );



e0.b = clamp( va - vb1 - vc - vd1, 0, 0xFFF );



e0.alpha = 0x780;



if( majcomp == 1 ) { swap( e0.r, e0.g ); swap( e1.r, e1.g ); }



else if( majcomp == 2 ) { swap( e0.r, e0.b ); swap( e1.r, e1.b



); }









}



Unlike mode 7, this mode is able to represent the full HDR range.










Mode 12: Two RGBA Endpoints

This mode takes as input eight integers (v0, v1, v2, v3, v4, v5, v6, v7). From these integers, two sums: s0=(v0+v2+v4), s1=(v1+v3+v5) are computed. These two sums are then compared:

    
    
        If s1>=s0, then the two endpoint colors are obtained as (r0,g0,b0,a0)=(v0,v2,v4,v6) and (r1,g1,b1,a1)=(v1,v3,v5,v7)
        If s1<s0, then the two endpoint colors are obtained as (r0,g0,b0,a0)=(v1,v3,v5,v7) and (r1,g1,b1,a1)=(v0,v2,v4,v6); both of these two endpoint colors are then subjected to the blue_contraction procedure.

Mode 13: RGBA Base+Offset

    
    


This mode takes as input eight integers (v0, v1, v2, v3, v4, v5, v6, v7). These integers form an RGBA base (rb, gb, bb, ab)=(v0,v2,v4,v6) and an RGB offset (ro, go, bo, ao)=(v1,v3,v5,v7). The bit_transfer_signed procedure is then used to transfer a bit from the offset value to the base values. The two endpoint colors are then given by (rb,gb,bb,ab) and (rb+ro, gb+go, bb+bo, ab+ao). If (ro+go+bo) is negative, then the blue_contraction procedure is applied to the RGB portion of each endpoint.
Mode 14: Two HDR RGBA Endpoints with LDR Alpha
This mode takes as input eight integers (v0, v1, v2, v3, v4, v5, v6, v7). The RGB components are decoded from values (v0 . . . v5) in the manner of Mode 11 discussed above. The alpha components for endpoints 0 and 1 are then filled in from values v6 and v7 respectively.
Mode 15: Two HDR RGBA Endpoints with HDR Alpha
This mode takes as input eight integers (v0, v1, v2, v3, v4, v5, v6, v7). The RGB components are decoded from values (v0 . . . v5) in the manner of Mode 11 discussed above. The alpha components are then decoded as follows from values v6 and v7 as follows:












void mode15_ unpack_alpha(int v6, int v6, int& alpha0, int& alpha1)









{









mode = ((v6 >> 7) & 1 ) | ((v7 >> 6) & 2);



v6 &= 0x7F;



v7 &= 0x7F;



if(mode==3)



{









alpha0 = v6 << 5;



alpha1 = v7 << 5;









}



else



{









v6 |= (v7 << (mode+1))) & 0x780;



v7 &= (0x3F >> mode);



v7 {circumflex over ( )}= 0x20 >> mode;



v7 −= 0x20 >> mode;



v6 <<= (4-mode);



v7 <<= (4-mode);



v7 += v6;



v7 = clamp(v7, 0, 0xFFF);



alpha0 = v6;



alpha1 = v7;









}









}










The Void-Extent Block

A Void-Extent block is an encoded texture data block that specifies a region within the texture in which every texture data element should be allocated the same data value when decoded and in which every sample look-up within the encoded texture will only use texture data elements having that same data value (in the present embodiment). If bits[8:0] of the compressed (encoded) block are “111111100”, then the compressed block is a Void-Extent Block. This means that the block has a constant color that is common for all texels in the block, and the block additionally specifies a region within the texture (for a 2D block) in which every bilinear-sampled lookup within the texture will only touch texels whose color is identical to this constant color.
The Void-Extent feature is intended to enable specific texturing optimizations:

    
    
        If a texture mapper uses a multipass method for trilinear filtering or anisotropic mapping, it may use the information in the Void-Extent block to ascertain that all its passes will only ever access texels of the same value, and thus return that value as the final texturing result immediately after the first pass without running any further passes.
        A texture mapper may additionally keep a cache of recently-seen Void-Extent blocks and use them to suppress actual texture-cache line fills from memory for subsequent texturing operations.
        Using the Void-Extent information is not mandatory; a texture mapper that does not implement these optimizations may ignore the Void-Extent and just treat the block as a constant-color block.

The following rules and observations apply:

        If the Void-Extent coordinates are all 1s, then it is interpreted as if the block has no Void-Extent at all and is simply a constant-color block.
        
            Encoders that cannot compute Void-Extents properly but still wish to use constant-color blocks thus always have the option to just specify an all-1s pattern for the Void-Extent in order to produce a straight constant-color block.
        
        
        If a Void-Extent appears in a mipmap other than the most detailed (lowest) one, then the Void-Extent applies to all more detailed (lower) mipmap levels as well. As such, a texture mapper that implements mipmapping as a multipass method may sample the least detailed (highest) mipmap first, then upon encountering a Void-Extent, it may abstain from sampling the more detailed (lower) mipmap.
        
            A consequence of this rule is that if a block has a constant color but the corresponding region in any of the more detailed (lower) mipmaps do not have a constant color, then the Void-Extent coordinates must be set to all 0s to signal the absence of a Void-Extent block. This situation is always the case for the top 1×1 level of any mipmap pyramid, and may be the case for more detailed (lower) levels as well, in case of e.g. checkerboard textures.
        
        
        The constant-color itself is specified using IEEE-754-2008 compliant FP16 values; this is the way in the format of the present embodiment to specify floating-point content that can hold negative values.
        If a Void-Extent extends all the way to the edge of a texture, the filtered texturing result may not necessarily be equal to the texel value specified in the Void-Extent block; this may happen if data sources other than the texture surface itself contributes to the final filtered result. In such cases, the texture mapper must include such data into its filtering process in the same manner as if the Void-Extent were not present. Examples of such data sources are:
        
            Texture border color, when the border color is different from the color specified in the Void-Extent block.
            Adjacent-face textures in case of Seamless Cube-Mapping
            Neighboring texture repeat in the case of the “Repeat” texture wrap mode
        
        
        If the texture mapper is keeping a cache of recently-seen Void-Extent blocks, it must guarantee that the presence of this cache does not produce texture filtering results that are different from the result it would have produced without the cache; depending on the specifics of the filtering unit, this may limit caching to Void-Extent blocks with very specific color values (e.g. all components are 0 or 1).
        The Void-Extent specified by a Void-Extent block does not need to actually overlap the block itself; such non-overlap is unlikely to be useful, though.
        Invalid Void-Extents—that is, a Void-Extent specified across a region of a texture that does not actually have a constant color—will result in undefined texturing results.

2D Textures

    
    


For 2D textures, the Void-Extent Block has the following layout:











Bits
Usage







8:0
“111111100”


9
Dynamic range flag


11:10
Reserved, set to “11”.


24:12
Void Extent: Low S coordinate


37:25
Void Extent: High S coordinate


50:38
Void Extent: Low T coordinate


63:51
Void Extent: High T coordinate


79:64
Block color R component


95:80
Block color G component


111:96 
Block color B component


127:112
Block color A component









The Void Extent is defined by a (low,high) interval for the S and T texture coordinates. The interval endpoints are represented as UNORM13 values; as such, to get normalized coordinates in the [0, 1] range, the values stored in the block must be divided by 213−1
The Dynamic Range flag indicates the format in which the block color is stored. A 0 indicates LDR colors, in which case the color components are stored as normalized 16-bit integer values. A 1 indicates HDR color, in which case the color components are stored as FP16 values.
3D Textures
For 3D textures, the Void-Extent Block has the following layout:











Bits
Usage







8:0
“111111100”


9
Dynamic range flag


18:10
Void Extent: Low S coordinate


27:19
Void Extent: High S coordinate


36:28
Void Extent: Low T coordinate


45:37
Void Extent: High T coordinate


54:46
Void Extent: Low P coordinate


63:55
Void Extent: High P coordinate


79:64
Block color R component


95:80
Block color G component


111:96 
Block color B component


127:112
Block color A component









The Void-Extent is defined by a (low,high) interval for the S, T and P texture coordinates. The interval endpoints are represented as UNORM9 values; as such, to get normalized coordinates in the [0, 1] range, the values stored in the block must be divided by 29−1.
The Dynamic Range flag indicates the format in which the block color is stored. A 0 indicates LDR colors, in which case the color components are stored as normalized 16-bit integer values. A 1 indicates HDR color, in which case the color components are stored as FP16 values.
Partitioning Pattern Generator
As discussed above, the encoding scheme of the present embodiment uses a partitioning pattern generator (a partitioning pattern generation function) in order to produce its partitioning patterns; this allows a large number of partitioning patterns to be supported at minimal hardware cost. (This comes at a slight quality cost compared to using optimized partition tables, however this cost has been measured to be only about 0.2 dB, which does not justify the large hardware cost of providing a full set of optimized tables.)
The generator itself is specified in the form of a C99 function. The arguments to this function are:

    
    
        a seed: this is the partition index specified at bits 17:8 in the 128-bit compressed block. This seed may take values from 0 to 1023.
        a partition count; this may be 2, 3 or 4.
        x, y and z positions; these are x, y and z texel position relative to the upper-left corner of the compressed block (for a 2D block, z is set to zero (0)).
        a flag indicating small blocks; its value depends on the block size being used. The value of this flag is chosen to be 1 if the number of texels in the block is less than 31, otherwise it is set to 0.
    
    


The function returns an integer value in the range 0.3 specifying which partition the specified texel belongs to. The actual function is defined as follows:















int select_partition( int seed, int x, int y, int z, int partitioncount, int







small_block )









{



// first, scale up coordinates for small blocks.



if(small_block) { x <<= 1; y <<= 1; z <<= 1; }



// then, compute eight pseudoranom numbers, all of uniform distribution.



// They need to be at least approximately statistically independent,



// so that they can cover a reasonably wide parameter space.



// the random-seed is modified with the partition-count, so that the



// partitionings we generate for 2, 3 and 4 partitions are distinct.



seed += (partitioncount−1) * 1024;



// we need reproducibility of the pseudorandom numbers, which calls for



// a hash function. The hash52( ) function is designed specifically to







provide









// a strong pseudorandom distribution at a modest hardware cost.



uint32_t rnum = hash52(seed);



// construct the seed values from the hash value. While it is important that



// the seeds are independent, it is not important that they have great







precision;









// in fact, no error improvement was seen when using seeds wider than 4







bits.









int seed1 = rnum & 0xF;



int seed2 = (rnum >> 4) & 0xF;



int seed3 = (rnum >> 8) & 0xF;



int seed4 = (rnum >> 12) & 0xF;



int seed5 = (rnum >> 16) & 0xF;



int seed6 = (rnum >> 20) & 0xF;



int seed7 = (rnum >> 24) & 0xF;



int seed8 = (rnum >> 28) & 0xF;



int seed9 = (rnum >> 18) & 0xF;



int seed10 = (rnum >> 22) & 0xF;



int seed11 = (rnum >> 26) & 0xF;



int seed12 = ((rnum >> 30) | (rnum << 2)) & 0xF;



// square the seeds. This biases them, so that they are more likely to



// take small rather than large values. The seed values represent



// frequencies for a 2D sawtooth function; squaring them causes



// low frequencies to be more heavily represented than high freqeuncies.



// For the partition function, this causes partitionings with low frequencies



// (large, cleanly-divided regions) to appear more frequently than



// partitionings with high frequencies (lots of detail), while not entirely



// blocking the latter.



seed1 *= seed1;



seed2 *= seed2;



seed3 *= seed3;



seed4 *= seed4;



seed5 *= seed3;



seed6 *= seed6;



seed7 *= seed7;



seed8 *= seed8;



seed9 *= seed9;



seed10 *= seed 10;



seed11 *= seed11;



seed12 *= seed 12;



// perform shifting of the seed values



// this causes the sawtooth functions to get increased high-frequency







content along either









// the X axis or the Y axis or neither; the result is an increase in the







amount of









// partitionings that are dominated by horizontal/vertical stripes; these are



// relatively important for overall psnr.



int sh1, sh2, sh3;



// use the bottom bit of the seed to toggle horiz/vert direction.



if( seed & 1 )









{



sh1 = (seed & 2 ? 4 : 5);



sh2 = (partitioncount == 3 ? 6 : 5);



}









else









{



sh1 = (partitioncount == 3 ? 6 : 5);



sh2 = (seed & 2 ? 4 : 5);



}



sh3 = (seed & 0x10) ? sh1 : sh2;









seed1 >>= sh1;



seed2 >>= sh2;



seed3 >>= sh1;



seed4 >>= sh2;



seed5 >>= sh1;



seed6 >>= sh2;



seed7 >>= sh1;



seed8 >>= sh2;



seed9 >>= sh3;



seed10 >>=sh3;



seed11 >>=sh3;



seed12 >>=sh3;



// combine the seed values with the XYZ coordinates to produce 3D







planar functions









// Each of them also has an offset added; this offset itself needs to be







pseudorandom









// and unbiased for optimal quality. Unlike the seeds themselves, this







offset









// needs to have a uniform distribution.



int a = seed1*x + seed2*y + seed11*z + (rnum >> 14);



int b = seed3*x + seed4*y + seed12*z + (rnum >> 10);



int c = seed5*x + seed6*y + seed9*z + (rnum >> 6);



int d = seed7*x + seed8*y + seed10*z + (rnum >> 2);



// bitwise “AND” with a mask turns planar functions into sawtooth







functions.









a &= 0x3F;



b &= 0x3F;



c &= 0x3F;



d &= 0x3F;



// remove some of the functions if we are using less than 4 partitions.



if( partitioncount < 4 ) d = 0;



if( partitioncount < 3 ) c = 0;



// then, compare the resulting sawtooth-function values in order to select



// a partition.



if( a >= b && a >= c && a >= d )









return 0;









else if( b >= c && b >= d )









return 1;









else if( c >= d )









return 2;









else









return 3;









}










The generator relies on an auxiliary function called hash52( ) this function itself is defined as follows:















// autogenerated hash function. This hash function was produced by







generating









// random instruction sequences (from the set: add-shift, xor-shift,







multiply-by-odd-constant;









// these operations have in common that they are all invertible and







therefore cannot lose data)









// and then checking whether the instruction sequence, when fed the







input data sequence









// 0,1,2,3, ... produces a good pseudorandom output data sequence.







The randomness tests run









// were George Marsaglia's “Some Difficult-to-pass Tests Of



Randomness”.



// Several hundred sunch instruction sequences were generated;







“hash52” below was the









// one that appeared to have the most compact hardware







representation.









// the multiply-by-odd-constant steps had their constants specifically







selected so that they









// could be implemented with three shift-add operations, which are







much cheaper in hardware









// than general multiplications.



uint32_t hash52( uint32_t p )









{



p {circumflex over ( )}= p >> 15;



p *= 0xEEDE0891; // (2{circumflex over ( )}4+1)*(2{circumflex over ( )}7+1)*(2{circumflex over ( )}17−1)



p {circumflex over ( )}= p >> 5;



p += p << 16;



p {circumflex over ( )}= p >> 7;



p {circumflex over ( )}= p >> 3;



p {circumflex over ( )}= p << 6;



p {circumflex over ( )}= p >> 17;



return p;



}










Note that the arithmetic in hash52( ) must be implemented using unsigned integers that are exactly 32 bits wide. Also note that the multiply may be implemented as a series of three addition/subtraction operations.
The above partition generation function basically works by implementing 2 to 4 sawtooth functions with pseudorandomly-selected directions and frequencies; this is particularly cheap to implement in hardware while being able to produce nearly all partition shapes of interest.
The seed (partition index) is used to generate the parameters for the sawtooth wave generation. As each different seed gives a different combination of waves, it can be thought of as a “pattern index”. (The seed is accordingly, effectively equivalent to the index into the pattern table in a lookup-table based design.)
A mask is used to generate the sawtooth function. It effectively changes a continuously increasing set of values (e.g. 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160 . . . ) into a repeating set. A mask of 0x3F applied to the previous sequence would give a sawtooth of (0, 16, 32, 48, 0, 16, 32, 48, 0, 16, 32, 48, 0, 16, 32 . . . ). This is equivalent to the remainder when dividing by 64, but only works when the divisor is a power of two. It is also very much cheaper to implement in hardware than a division circuit.
Other arrangements for determining the partitioning patterns could be used, if desired. For example, the function could be configured to generate curved partitioning shapes. For example, x^2 and y^ 2 terms could be added into the sawtooth functions. This will yield partitionings with curved shapes (which the “basic” version of the sawtooth function is unable to provide). However, testing with actual content did not actually show any image quality improvement from these shapes. This kind of curve support will also increase the hardware cost.
The partitioning pattern generation function is in an embodiment implemented as a dedicated hardware element in the decoder.
FIG. 12 shows schematically an arrangement of a graphics processing system 20 that can use textures that have been encoded in accordance with the present embodiment. In this embodiment, the graphics processing system 20 is a tile-based rendering system. However, other arrangements are, of course, possible.
As shown in FIG. 12, the graphics processing system 20 includes a state management system 21, a rasterising stage 22, and a rendering stage 23 in the form of a rendering pipeline. It will be appreciated that each of the stages, elements, and units, etc., of the graphics processor 20 as shown in FIG. 12 may be implemented as desired and will accordingly comprise, e.g., appropriate circuitry, and/or processing logic, etc., for performing the necessary operation and functions.
The state management system 21 stores and controls state data and the state of the graphics processing units to control the graphics processing operation, as is known in the art.
The rasteriser 22 takes as its input primitives to be displayed, and rasterises those primitives to sampling positions and generates fragments to be rendered, as is known in the art.
The rendering pipeline 23 takes fragments from the rasteriser 22 and renders those fragments for display. As is known in the art, the rendering pipeline 23 will include a number of different processing units, such as fragment shaders, blenders, texture mappers, etc.
The output from the rendering pipeline 23 (the rendered fragments) is output to tile buffers 24 (since the present embodiment is a tile-based system). The tile buffers' outputs are then finally output to a frame buffer 25 for display.
FIG. 12 also shows schematically particular features of the graphics processing system 20 that are provided in order for it to use textures encoded in the manner of the present embodiment.
In particular, as shown in FIG. 12, the rendering pipeline 23 includes a texture mapping stage 26 configured to be able to access a texture list buffer 27 to determine a texture needed for texturing a fragment that it receives for rendering.
The texture list buffer 27 will indicate the texture that is required, and then, as is known in the art, the texture mapper 26 will fetch the relevant texture data from a memory 28 and used the fetched texture data to process the fragment in question.
The textures stored in the texture memory 28 are stored using the encoding format of the present embodiment. Thus, when the texture mapper 26 needs a given texel or texels for applying to a fragment being rendered, it will determine the texture map and encoded block within that map that it needs for the texel in question (e.g. based on the position of the texel, as is known in the art), retrieve that block from the memory 28 and then determine the texel's value (e.g. colours) from the encoded block in the manner described above.
The texture mapper 26 includes a suitable decoder (decoding circuitry) to do this. This decoder may, e.g., be in the form of a dedicated hardware element that is configured to decode textures encoded in the form of the present embodiment, or it may, e.g., comprise programmable processing circuitry that has been programmed appropriately to be able to decode textures encoded in the form of the present embodiment. In an embodiment a dedicated hardware decoder is used. This decoder will, inter alia, implement the partitioning pattern generation function of the present embodiment.
In the present embodiment, the decoding process comprises first determining whether the position of a texture data element to be decoded is within a previously encountered and stored constant data value region (void extent). If it is, the stored corresponding constant data value for the constant data value region (void extent) in question is then returned as the data value to use for the texture data element immediately (i.e. without accessing and decoding any encoded texture data block).
On the other hand, if the position of a texture data element to be decoded is not within a previously encountered and stored constant data value region (void extent), then it is determined which encoded texture data block in the set of encoded texture data blocks representing the texture map to be decoded represents (contains) the texel whose value is required (i.e. that is to be decoded). This is done based on the position of the texel and knowledge of the block size and size of the texture. The identified encoded texture data block is then accessed (e.g. fetched) from memory.
It is then determined whether the encoded block is a Void Extent block (i.e. indicates a constant data value region) or not, by determining whether the block contains the void extent flag (and also that the block is not simply a “constant colour” block).
If the block is a Void Extent block, the decoder determines the constant data value indicated in the Void Extent block and uses that value as the data value for the texel in question.
The decoder also determines from the encoded Void Extent block the extent of the constant data value region specified by the block, and stores that information together with the constant data value for the region (void extent) in question for future use. This information is stored for the most recent Void Extent blocks that the decoder has accessed, on a first-in, first out basis. Other arrangements would, of course, be possible.
The decoding process in an embodiment also comprises, where the encoded texture data block to be decoded is indicated (flagged) as being a Void Extent block, then determining from the information in the block indicating the extent of the constant data value region whether the block is a true “Void Extent” block, or whether it is in fact only a “constant colour” block. In the latter case, it is in an embodiment also determined whether the constant data value applies to more detailed mipmaps or not. If the block is a “constant colour” block, the decoder determines the constant data value indicated in the block and uses that value as the data value for the texel in question.
Where the encoded texture data block is not a Void Extent or a “constant colour” block (i.e. is a “normal” block), the decoder determines the value for the texel from the encoded block of texture data as follows:
1. Find the x,y,z position of the texel to be decoded, relative to the corner of the block (for 2D blocks, z=0).
2. If there is more than one partition, pass the x,y,z position and the seed (partition index) through the partition generation function to determine the partition number for the texel.
3. Read and decode the endpoint values for the partition selected in step 2. This process depends on the colour endpoint mode.
4. Read and decode the index for the texel. Where to find the index data, and how to decode it, is determined by the index range, index count, and number of index planes.
5. Interpolate between the endpoint colors using the index value, as specified above.
6. If there are two index planes, repeat steps 4-5 for the second index, and combine the color components from the separate planes (e.g. RGB from one, A from another into a single RGBA value).
7. The final color is the decoded texel color.
Thus, in the present embodiment, the decoding process for a given texel whose value is required will comprise the following steps:
Determine the position of the texel being looked up

    
    
        If it is inside a cached void-extent
        
            return the constant colour value for that extent immediately
        
        
        else
        
            calculate which block the texel is in
            load the block
            if the block is a constant-colour block
            
                return the constant colour value
                if its a void extent block
                
                    cache the void extend bounds and the colour
                
                
            
            
            if its not a constant-colour block
            
                decode as normal
            
            
        
        
    
    


This is repeated for each texel value that is required, and the so-generated, decoded texel values are then applied to sampling positions (fragments) that are being rendered to generate rendered data for those sampling positions (fragments), which rendered data is then, e.g., written to the frame buffer for a display to display the “textured” sampling positions and/or fragments.
As discussed above, the decoder (the texture mapping process) is also configured, in response to recognition of a “constant data value” region indicating Void Extent block to: not perform (avoid) subsequent passes in a multi-pass texture mapping process once such a block has been identified; not sample (avoid sampling) more detailed mipmaps in a multi-pass mip-mapping process once such a constant data value region indicating block has been identified; cache recently loaded/processed constant data value region indicating (Void Extent) blocks and use them to suppress (texture) cache filling from memory for subsequent decoding (texturing) operations; and/or not load (avoid loading) adjacent encoded texture data blocks, where a constant data value region indicating (Void Extent) block has been recognised.
As will be appreciated from the above, in the decoding arrangements, the actual data values (e.g. in terms of their format and what they represent) that are generated for the set of data values to be used for a texture data block and for the individual texture data elements will depend on the nature of the texture data that is being encoded. Thus, for example, as discussed above, in the case of colour data and colour maps, each data value will represent a given colour, and, e.g., comprise a set of colour values, such as RGB or RGBa values. On the other hand, for a luminance map, each data value may comprise and represent a single luminance value. For normal-maps (bump maps), each data value will comprise a set of components representing a normal vector, and for shadow maps (light maps), each data value will comprise and represent a set of values indicating, e.g., the presence or absence, and amount of, light or shadow, and so on.
The above primarily describes the decoding process used in the embodiment of the technology described herein. As will be appreciated by those skilled in the art, the encoding process will be carried out in a corresponding converse manner.
Thus, to encode a given texture map using the above encoding format in the present embodiment, the original texture map is first divided into blocks of a selected size.
Each block of texture data elements is then tested to see whether the set of texture data elements of the block can be encoded as having the same, constant data value. This is done by determining whether all the texture data elements of the block have sufficiently similar data values to be encoded as a constant data value block (based, e.g., and in an embodiment, on some selected, in an embodiment predetermined, similarity margin or threshold)
Where it is determined that the texture data elements of a block of texture data elements to be encoded all have sufficiently similar data values, then the extent of a contiguous extended region within the texture including the block in which every texture data element has sufficiently similar data values is determined. This is done by attempting to extend a rectangular (for 2D) or rectangular cuboid (for 3D) region outwards from the edge of the block of texture data elements in question (while still only including texture data elements having sufficiently similar data (e.g. colour) values). Any suitable process, e.g. algorithm, can be used for this.
It should be noted here that the constant data value region does not need to align with the boundaries of the blocks the original texture has been divided into for encoding purposes, but can only partially cover or overlap blocks that the original texture has been divided into.
If an extended “constant data value” region is found, then the block of texture data elements in question is encoded as a Void Extent block, having the form discussed above.
The constant data value for an encoded Void Extent block may be selected as desired, based on the value of the texture data elements in the original texture in the region of the texture in question. For example, an average of the values of the texture data elements of the block (or void extent region) could be used as the constant data value for the encoded Void Extent texture data block. Other arrangements would, of course, be possible.
It should be noted here that where a given block of texture data elements is found to fall within a constant data value region in the texture (and is encoded as such), that does not mean that other, e.g. adjacent, blocks of texture data elements that also fall within the same constant data value region do not need to be encoded. Rather, every separate block of texture data elements that falls within the same constant data value region (void extent) is still encoded as a respective separate encoded Void Extent texture data block specifying that region. This facilitates random access into the encoded texture.
The encoding process may also comprise identifying blocks of texture data elements as being constant data value blocks but which do not also specify a greater constant data value region (as discussed above), if desired. These blocks of texture data elements should then be encoded as “constant colour” blocks having the form discussed above.
Where it is determined that the set of texture data elements of a block of texture data elements don't all have sufficiently similar data values, then a “non-void extent” encoded texture data block representing the block of texture data elements having the form discussed above is generated.
The encoding process for a “non-constant data value” block can be carried out in any suitable manner on or using the original texture data that is to be encoded. For example, as in known prior art processes, the original data for the block could be encoded using some or all of the various different encoding and partitioning possibilities that are available (i.e. that, in effect, a “non-constant data value” encoded texture data block can represent). This will provide a set of possible encoded blocks that can then be compared with the original data, so as to determine, e.g., which encoded version of the block gives the least error (on reproduction) when compared to the original data (which encoding arrangement can then be selected as the one to use for that original texture data block when it is encoded).
This is done for each different block that the original data (e.g. texture map) has been divided into. The process may then be repeated using a different block size, and so on, if desired, until the block size and encoding arrangements giving the least error (or at least a sufficiently small error) is found, which may then be selected as the encoding arrangement to use for the texture.
The original texture may then be encoded using the determined block size and the encoding arrangement determined for each block (or the already encoded blocks from the testing used, if they have been retained), to produce a stream or set of encoded texture data blocks representing, and corresponding to, the original set of data (e.g. texture map). This set of encoded texture data blocks can then be stored, e.g. on a portable storage device such as a DVD, for later use, e.g. when it is desired to apply the texture to an image to be rendered.
In an embodiment a set of mipmaps is generated to represent the texture, with each mipmap in an embodiment being generated in the above manner. Where mipmaps are used, the compression rate (and bit rate) is in an embodiment varied for (is different for) different mipmap levels, with higher bit rates (i.e. lower levels of data compression) being used for smaller mipmap levels (i.e. lower resolution mipmap levels).
Each block that the original data (e.g. texture map) is divided into is in an embodiment the same size and configuration. The block size that is being used is provided to the decoder. This may be done, for example, by including (indicating) the block size in a (global) data header that is associated with (attached to) the set of encoded texture data blocks, or in any other suitable manner.
The selection algorithm can use any desired (and many different) testing schemes such as, for example, measuring the peak signal-to-noise ratio between the encoded version of a block and the original version of the block.
The encoding can be carried out as desired, e.g. using a suitably programmed general-purpose processor that, e.g., has access to the original texture data in memory, or a suitable dedicated processor could be used.
Although the above embodiment has been described with reference to texture data in the form of colours, as discussed above, and as will be appreciated by those skilled in the art, the technology described herein is also applicable to other forms of texture data, such as luminance-maps or bump-maps, etc., and to other, non-texture data. In such arrangements the data can be encoded or decoded in an advantageous manner, but each data value will, e.g., represent a luminance value or normal vector, etc., rather than a colour.
Similarly, although the present embodiment has been described primarily with reference to the encoding of square or cubical blocks of texels, other texel block arrangements and configurations, such as the encoding of non-square rectangular blocks of texels and non-cubical rectangular cuboid blocks of texels would be possible, if desired.
FIGS. 3 to 11 illustrate the basic encoded block layouts that the format of the present embodiment will produce. Each encoded block comprises, as discussed above, 128-bits.
FIG. 3 shows an overview of the basic block layout. Thus it shows the index mode data in bits 0-10, the “partition count−1” data in bits 11-12, and the filling of the remaining space with any necessary extra configuration data, and the respective endpoint colour data and texel index data (which are both of variable width).
FIG. 4 shows the layout for a non-partitioned block. Thus in this case, the “partition-count−1” data in bits 11-12 is set to “00” and the colour endpoint mode data (shown as CEM in FIG. 4) is placed in bits 13-16.
FIG. 5 shows the layout for a non-partitioned block but which uses two index planes. In this case, as shown in FIG. 5, two bits are used to act as the colour component selector (CCS) for the second index plane. These bits appear immediately below the texel index data (which is variable width, as discussed above).
FIG. 6 shows the layout for a block encoding a block of texels (texture data elements) that has been divided into two partitions. In this case, the encoded block includes, as shown in FIG. 6, the “partition count−1” “01” (as there are two partitions) in bits 11-12, and the partition index (seed) for the partitioning pattern generation function in bits 13-22.
The encoded block also includes, as shown in FIG. 6, the colour endpoint mode pair selector (CPS) value in bits 23-24, and colour endpoint mode indicators (information) for each of the two partitions. The colour endpoint mode information comprises a respective colour endpoint class bit Cn and 2-bit colour endpoint mode field CMn for each partition n, and is arranged such that all the colour class bits for all the partitions are emitted first (in partition order), followed by the colour mode fields for each partition (in order). If this all requires more than 6 bits, then the additional bits are stored just below the texel index bits (which will be a variable position, as discussed above). It can be more efficient for a hardware decoder for the colour class bits to be at fixed positions in the encoded block.
Thus, as shown in FIG. 6, in the case of a two partition block, the colour endpoint mode pair selector (CPS) value is placed in bits 23-24, the respective colour class bits, C0, C1, for each partition (the first partition, partition 0, and the second partition, partition 1, respectively) are first placed in bits 25-26 (i.e. after the colour endpoint mode pair selector bits), and the 2-bit colour endpoint mode fields then follow (in partition order), up to the limit of 6-bits, with any remaining bits then being placed just below the texel index data. Thus, the colour endpoint mode indicator for the first partition (partition 0) is placed in bits 27-28 (CM0), and the colour endpoint mode for the second partition (partition 1) is placed in bits 53-54 (CM1). As shown, the additional bits required for the colour endpoint mode for the second partition (CM1) appear immediately below the texel index data. The block also includes appropriate sets of colour endpoint data for the two different partitions (endpoint colour data 0 and endpoint colour data 1, respectively).
FIG. 7 shows the layout for a block that encodes a block of texture data elements that has been divided into three partitions. In this case, as shown in FIG. 7, there are three sets of colour endpoint class and mode data (C0, C1, C2, M (CM0), CM1 and CM2), one for each partition, arranged as discussed above in relation to FIG. 6, together with corresponding sets of endpoint colour data (endpoint colour data 0, endpoint colour data 1 and endpoint colour data 2), one for each partition. In this case the two bits of CM0 (denoted by “M” in FIG. 7) are, as shown in FIG. 7, split between bit 28 and a variable position immediately below CM1. Also, as shown in FIG. 7, the “partition count−1” bits 11-12 are set accordingly to “10” to indicate that this is a three-partition block.
FIG. 8 shows the layout for a block that encodes a set of texture data elements that have been divided into four partitions. In this case, there is accordingly four sets of colour endpoint class and mode data and four sets of corresponding endpoint colour data, one for each partition. Also, as shown in FIG. 8, the “partition count−1” bits 11-12 are set accordingly to “11” to indicate that this is a four-partition block.
FIG. 9 shows the layout for a block that encodes a set of texture data elements that have been divided into two partitions and that also uses two index planes. In this case, as shown in FIG. 9, the block includes a colour component selector (CCS) field for the second index plane. In this case, this colour component selector appears directly below the additional colour endpoint mode bits (CM1) for the second partition, which are in turn directly below the texel index data bits. (The same layout rule (scheme) applies to three and four partition blocks with dual index planes.)
FIG. 10 shows the layout for a 2D void-extent block (i.e. a block indicating a constant colour value). Thus, as shown, bits 0 to 8 of the block are set to indicate that the block is a void-extent block.
As shown in FIG. 10, the void-extent block includes data indicating the constant colour for the block, and the extent over which that colour extends, in terms of low and high S and T values.
FIG. 11 shows the layout for a 3D void-extent block. This layout essentially corresponds to the 2D void-extent block layout shown in FIG. 10, but includes a further extent component P (as the encoded block represents a 3D block of texture data elements).
The ability to use different indexing schemes, data generation schemes, partitioning arrangements, etc., using a common encoding format in the present embodiment, provides the ability to provide different levels of compression (i.e. to vary the bit rate (the number of bits used per texture data element)) that is being used for a given encoded texture data block. For example, by varying the block size being used, the indexing scheme, data generation scheme, and/or partitioning arrangement, etc., different levels of relative compression can be provided for a given block encoding arrangement and/or for a given texture map or maps, for example.
The Applicants have recognised that such an arrangement may be particularly advantageous when using mipmaps that provide a given texture map for use at different levels of detail. Thus, in an embodiment, the compression rate (and bit rate) is varied for (is different for) different mipmap levels In an embodiment, higher bit rates (i.e. lower levels of data compression are used for smaller mipmap levels (i.e. lower resolution mipmap levels). The Applicants have found that smaller mipmap levels can benefit from higher bit rates (lower levels of compression).
As will be appreciated from the above, the technology described herein, in its embodiments at least, includes a number of new and particularly advantageous features.
For example, using a procedural method (a function) to generate the partitionings allows a much larger number of partition shapes to be provided and supported than would normally be the case. The procedural method enables large sets of partition shapes to be supplied for multiple block sizes without adding to the hardware cost. The procedural nature of the method also makes it easy to extend to volume textures.
The format also allows different partitions to have different color endpoint encodings (it allows, e.g., one partition to be specified with full RGB colors and another partition to be specified with only a grayscale color); these encodings can be specified independently.
The format similarly permits multiple types of content to be present in the same texture; for example, it has distinct color-endpoint encodings for grayscale, RGB, RGB-alpha and HDR colors, and allows these encodings to be freely mixed within a texture; this helps to reduce the number of different formats that need to be dealt with.
As can be seen from the above, the technology described herein can provide, in its embodiments at least, a data compression format for use, e.g., for texture maps in hardware graphics acceleration, that is in particular suited for applications where random access into the encoded data is desired. It can provide a high compression rate, which accordingly is particularly advantageous for portable and low power devices where power, bandwidth and storage space may be limited. Notwithstanding the relatively high compression rate and smaller compact nature of the data compression format of the technology described herein, it is still very capable of compressing, for example, different kinds of images, and in particular both real-world images and drawings, with little loss of quality.
Thus the technology described herein has particular application to the mobile gaming market, since it can provide a high compression rate and therefore is suitable for devices with limited memory resources and memory bandwidth. The high compression rate also facilitates, for example, downloading of games or other applications, since it can alleviate network bandwidth and end user cost issues which increase or are related to the download time.
Furthermore, this can be achieved whilst still providing high image quality (which, as is known in the art, is critical for small mobile devices that have a limited screen size (as is known in the art, the smaller the size and resolution of a screen, the more effect on the perceived image quality noise or other errors has)). The technique of the technology described herein can also be used for a wide range of texture maps, such as including high contrast scenarios (e.g. drawings) and textures with alpha (transparency) values.

## Claims

1. A method of determining a partitioning pattern used to divide texture data elements of a block of texture data elements into separate partitions within the block for encoding and decoding purposes, the method comprising:
when a given block of texture data elements is to be encoded, using by processing circuitry a partitioning pattern generation function to create one or more partitioning patterns to be used to divide texture data elements of the block of texture data elements into separate partitions within the block for encoding and decoding purposes, the partitioning pattern generation function creating the one or more partitioning patterns by sorting the texture data elements into respective partitions within the block of texture data elements without using one or more pre-defined partitioning patterns stored in memory;
testing by the processing circuitry the encoding of the block of texture data elements using one or more of the created partitioning patterns; and
selecting by the processing circuitry a partitioning pattern to use when encoding the block on the basis of the testing.

2. The method of claim 1, further comprising:
encoding by the processing circuitry the block of texture data elements as a block of texture data representing the texture data elements using the selected partitioning pattern.

3. The method of claim 1, further comprising:
storing by the processing circuitry in the texture data block for each respective partition of the texture data elements, data indicating, or data indicating how to generate, a set of base data values used to generate data values for the texture data elements of the respective partition.

4. The method of claim 1, wherein the partitions of the encoded texture data block share some but not all of the data that is encoded in the block.

5. The method of claim 1, further comprising storing by the processing circuitry in the encoded texture data block information used by a decoder to configure a partitioning pattern generation function so as to allow the decoder to create the particular partitioning pattern that has been used when encoding the set of texture data elements.

6. The method of claim 1, further comprising:
dividing by the processing circuitry the texture map into a plurality of equal-sized blocks of texture data elements;
encoding by the processing circuitry each block of texture data elements to generate an encoded texture data block representing the block of texture data elements; and
storing by the processing circuitry the encoded blocks as an encoded representation of the texture map for use by a graphics processor; wherein:
at least one of the blocks of texture data elements is encoded by performing the steps of using, testing and selecting.

7. The method of claim 1, wherein the partitioning pattern generation function sorts by the processing circuitry the texture data elements into respective partitions within the block of texture data elements based on the respective positions of the texture data elements within the block.

8. The method of claim 1, wherein the partitioning pattern generation function can create partitioning patterns containing different numbers of partitions.

9. The method of claim 1, wherein the partitioning pattern generation function takes as an input, the relative position of a texture data element within the block being encoded or decoded.

10. The method of claim 1 wherein
the partitioning pattern generation function has as an input, a seed or index value, that determines at least in part the partitioning pattern that will be created by the partitioning pattern generation function; and
the partitioning pattern generation function is such that if a different seed or index value is used as the input to that function, a different partitioning pattern is created.

11. An apparatus for determining a partitioning pattern used to divide texture data elements of a block of texture data elements into separate partitions within the block for encoding and decoding purposes, the apparatus comprising:
processing circuitry that, when a given block of texture data elements is to be encoded, uses a partitioning pattern generation function to create one or more partitioning patterns to be used to divide texture data elements of the block of texture data elements into separate partitions within the block for encoding and decoding purposes, the partitioning pattern generation function creating the one or more partitioning patterns by sorting the texture data elements into respective partitions within the block of texture data elements without using one or more pre-defined partitioning patterns stored in memory;
processing circuitry that tests the encoding of the block of texture data elements using one or more of the created partitioning patterns; and
processing circuitry that selects a partitioning pattern to use when encoding the block on the basis of the testing.

12. The apparatus of claim 11, further comprising:
processing circuitry that encodes the block of texture data elements as a block of texture data representing the texture data elements using the selected partitioning pattern.

13. The apparatus of claim 11, further comprising:
processing circuitry that stores in the texture data block for each respective partition of the texture data elements, data indicating, or data indicating how to generate, a set of base data values used to generate data values for the texture data elements of the respective partition.

14. The apparatus of claim 11, wherein the partitions of the encoded texture data block share some but not all of the data that is encoded in the block.

15. The apparatus of claim 11, further comprising processing circuitry that stores in the encoded texture data block information used by a decoder to configure a partitioning pattern generation function so as to allow the decoder to generate the particular partitioning pattern that has been used when encoding the set of texture data elements.

16. The apparatus of claim 11, wherein the partitioning pattern generation function sorts the texture data elements into respective partitions within the block of texture data elements based on the respective positions of the texture data elements within the block.

17. The apparatus of claim 11, wherein the partitioning pattern generation function can generate partitioning patterns containing different numbers of partitions.

18. The apparatus of claim 11, wherein the partitioning pattern generation function takes as an input, the relative position of a texture data element within the block being encoded or decoded.

19. The apparatus of claim 11, wherein
the partitioning pattern generation function has as an input, a seed or index value, that determines at least in part the partitioning pattern that will be created by the partitioning pattern generation function; and
the partitioning pattern generation function is such that if a different seed or index value is used as the input to that function, a different partitioning pattern is created.

20. An apparatus for encoding a texture map for use in a graphics processing system, the apparatus comprising:
processing circuitry that divides the texture map into a plurality of equal-sized blocks of texture data elements;
processing circuitry that encodes each block of texture data elements to generate an encoded texture data block representing the block of texture data elements; and
processing circuitry that stores the encoded blocks as an encoded representation of the texture map for use by a graphics processor;
processing circuitry that, when a given block of texture data elements is to be encoded, uses a partitioning pattern generation function to create one or more partitioning patterns to be used to divide texture data elements of the block of texture data elements into separate partitions within the block for encoding and decoding purposes, the partitioning pattern generation function creating the one or more partitioning patterns by sorting the texture data elements into respective partitions within the block of texture data elements without using one or more pre-defined partitioning patterns stored in memory, testing by the processing circuitry the encoding of the block of texture data elements using one or more of the created partitioning patterns and selecting by the processing circuitry a partitioning pattern to use when encoding the block on the basis of the testing.

21. The apparatus of claim 20 wherein the partitioning pattern generation function has as an input, a seed or index value, that determines at least in part the partitioning pattern that will be created by the partitioning pattern generation function, and is such that if a different seed or index value is used as the input to that function, a different partitioning pattern is created.

22. A non-transitory computer readable storage medium storing computer software code which when executing on one or more processors performs a method of determining a partitioning pattern used to divide texture data elements of a block of texture data elements into separate partitions within the block for encoding and decoding purposes, the method comprising:
when a given block of texture data elements is to be encoded, using by processing circuitry a partitioning pattern generation function to create one or more partitioning patterns to be used to divide texture data elements of the block of texture data elements into separate partitions within the block for encoding and decoding purposes, the partitioning pattern generation function creating the one or more partitioning patterns by sorting the texture data elements into respective partitions within the block of texture data elements without using one or more pre-defined partitioning patterns stored in memory;
testing by the processing circuitry the encoding of the block of texture data elements using one or more of the created partitioning patterns; and
selecting by the processing circuitry a partitioning pattern to use when encoding the block on the basis of the testing.

23. The non-transitory computer readable storage medium of claim 22 wherein the partitioning pattern generation function has as an input, a seed or index value, that determines at least in part the partitioning pattern that will be created by the partitioning pattern generation function; and
the partitioning pattern generation function is such that if a different seed or index value is used as the input to that function, a different partitioning pattern is created.

24. A method of determining a partitioning pattern used to divide texture data elements of a block of texture data elements into separate partitions within the block for encoding and decoding purposes, the method comprising:
when a given block of texture data elements is to be encoded, using by processing circuitry a partitioning pattern generation function to create one or more partitioning patterns to be used to divide texture data elements of the block of texture data elements in question into separate partitions within the block for encoding and decoding purposes;
testing by the processing circuitry the encoding of the block of texture data elements using one or more of the created partitioning patterns; and
selecting by the processing circuitry a partitioning pattern to use when encoding the block on the basis of the testing; wherein:
the partitioning pattern generation function takes as an input, a seed or index value, that determines at least in part the partitioning pattern that will be created by the partitioning pattern generation function and the partitioning pattern generation function is such that if a different seed or index value is used as the input to that function, a different partitioning pattern is created; and
the partitioning pattern generation function also takes as an input, the relative position of a texture data element within the block being encoded or decoded and sorts the texture data element into a respective partition within the block of texture data elements based on the input respective position of the texture data element within the block.