10648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson/*
20648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
33c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * Copyright 2010 Marek Olšák <maraeo@gmail.com>
40648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson *
50648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * Permission is hereby granted, free of charge, to any person obtaining a
60648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * copy of this software and associated documentation files (the "Software"),
70648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * to deal in the Software without restriction, including without limitation
80648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * on the rights to use, copy, modify, merge, publish, distribute, sub
90648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * license, and/or sell copies of the Software, and to permit persons to whom
100648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * the Software is furnished to do so, subject to the following conditions:
110648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson *
120648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * The above copyright notice and this permission notice (including the next
130648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * paragraph) shall be included in all copies or substantial portions of the
140648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * Software.
150648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson *
160648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
170648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
180648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
190648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
200648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
210648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
220648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * USE OR OTHER DEALINGS IN THE SOFTWARE. */
230648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson
246e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák/* Always include headers in the reverse order!! ~ M. */
256e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "r300_texture.h"
266a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson
276a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "r300_context.h"
281c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák#include "r300_reg.h"
29d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák#include "r300_texture_desc.h"
30287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "r300_transfer.h"
31827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák#include "r300_screen.h"
32b7a002df1e06504ff1ed0dc005c9b10aa4be54f7Marek Olšák
336e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "util/u_format.h"
346e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "util/u_format_s3tc.h"
356e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "util/u_math.h"
366e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "util/u_memory.h"
376eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie#include "util/u_mm.h"
386e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák
396e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "pipe/p_screen.h"
4046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák
41172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák/* These formats are supported by swapping their bytes.
42172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák * The swizzles must be set exactly like their non-swapped counterparts,
43172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák * because byte-swapping is what reverses the component order, not swizzling.
44172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák *
45172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák * This function returns the format that must be used to program CB and TX
46172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák * swizzles.
47172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák */
48172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšákstatic enum pipe_format r300_unbyteswap_array_format(enum pipe_format format)
49172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák{
50b75c0bf73a9f7944fef4f983419b0daf875456f9Grazvydas Ignotas    /* FIXME: Disabled on little endian because of a reported regression:
51b75c0bf73a9f7944fef4f983419b0daf875456f9Grazvydas Ignotas     * https://bugs.freedesktop.org/show_bug.cgi?id=98869 */
52b75c0bf73a9f7944fef4f983419b0daf875456f9Grazvydas Ignotas    if (PIPE_ENDIAN_NATIVE != PIPE_ENDIAN_BIG)
53b75c0bf73a9f7944fef4f983419b0daf875456f9Grazvydas Ignotas        return format;
54b75c0bf73a9f7944fef4f983419b0daf875456f9Grazvydas Ignotas
55172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    /* Only BGRA 8888 array formats are supported for simplicity of
56172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák     * the implementation. */
57172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    switch (format) {
58172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    case PIPE_FORMAT_A8R8G8B8_UNORM:
59172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák        return PIPE_FORMAT_B8G8R8A8_UNORM;
60172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    case PIPE_FORMAT_A8R8G8B8_SRGB:
61172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák        return PIPE_FORMAT_B8G8R8A8_SRGB;
62172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    case PIPE_FORMAT_X8R8G8B8_UNORM:
63172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák        return PIPE_FORMAT_B8G8R8X8_UNORM;
64172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    case PIPE_FORMAT_X8R8G8B8_SRGB:
65172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák        return PIPE_FORMAT_B8G8R8X8_SRGB;
66172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    default:
67172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák        return format;
68172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    }
69172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák}
70172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák
71172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšákstatic unsigned r300_get_endian_swap(enum pipe_format format)
72172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák{
73172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    const struct util_format_description *desc;
74172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    unsigned swap_size;
75172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák
76172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    if (r300_unbyteswap_array_format(format) != format)
77172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák        return R300_SURF_DWORD_SWAP;
78172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák
79172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    if (PIPE_ENDIAN_NATIVE != PIPE_ENDIAN_BIG)
80172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák        return R300_SURF_NO_SWAP;
81172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák
82172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    desc = util_format_description(format);
83172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    if (!desc)
84172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák        return R300_SURF_NO_SWAP;
85172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák
86172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    /* Compressed formats should be in the little endian format. */
87172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    if (desc->block.width != 1 || desc->block.height != 1)
88172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák        return R300_SURF_NO_SWAP;
89172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák
90172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    swap_size = desc->is_array ? desc->channel[0].size : desc->block.bits;
91172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák
92172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    switch (swap_size) {
93172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    default: /* shouldn't happen? */
94172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    case 8:
95172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák        return R300_SURF_NO_SWAP;
96172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    case 16:
97172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák        return R300_SURF_WORD_SWAP;
98172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    case 32:
99172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák        return R300_SURF_DWORD_SWAP;
100172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    }
101172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák}
102172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák
10371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšákunsigned r300_get_swizzle_combined(const unsigned char *swizzle_format,
1046478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                                   const unsigned char *swizzle_view,
1056478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                                   boolean dxtc_swizzle)
10671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák{
10771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    unsigned i;
10871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    unsigned char swizzle[4];
10971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    unsigned result = 0;
11071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    const uint32_t swizzle_shift[4] = {
11171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_R_SHIFT,
11271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_G_SHIFT,
11371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_B_SHIFT,
11471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_A_SHIFT
11571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    };
1166478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák    uint32_t swizzle_bit[4] = {
1176478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák        dxtc_swizzle ? R300_TX_FORMAT_Z : R300_TX_FORMAT_X,
11871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_Y,
1196478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák        dxtc_swizzle ? R300_TX_FORMAT_X : R300_TX_FORMAT_Z,
12071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_W
12171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    };
12271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák
12371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    if (swizzle_view) {
12471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        /* Combine two sets of swizzles. */
125be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák        util_format_compose_swizzles(swizzle_format, swizzle_view, swizzle);
12671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    } else {
12771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        memcpy(swizzle, swizzle_format, 4);
12871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    }
12971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák
13071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    /* Get swizzle. */
13171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    for (i = 0; i < 4; i++) {
13271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        switch (swizzle[i]) {
133fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák            case PIPE_SWIZZLE_Y:
13471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= swizzle_bit[1] << swizzle_shift[i];
13571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
136fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák            case PIPE_SWIZZLE_Z:
13771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= swizzle_bit[2] << swizzle_shift[i];
13871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
139fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák            case PIPE_SWIZZLE_W:
14071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= swizzle_bit[3] << swizzle_shift[i];
14171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
142fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák            case PIPE_SWIZZLE_0:
14371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= R300_TX_FORMAT_ZERO << swizzle_shift[i];
14471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
145fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák            case PIPE_SWIZZLE_1:
14671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= R300_TX_FORMAT_ONE << swizzle_shift[i];
14771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
148fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák            default: /* PIPE_SWIZZLE_X */
14971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= swizzle_bit[0] << swizzle_shift[i];
15071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        }
15171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    }
15271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    return result;
15371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák}
15471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák
1555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák/* Translate a pipe_format into a useful texture format for sampling.
1565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák *
1575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Some special formats are translated directly using R300_EASY_TX_FORMAT,
1585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * but the majority of them is translated in a generic way, automatically
1595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * supporting all the formats hw can support.
1605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák *
1615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT swizzles the texture.
1625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Note the signature of R300_EASY_TX_FORMAT:
1635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák *   R300_EASY_TX_FORMAT(B, G, R, A, FORMAT);
1645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák *
1655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * The FORMAT specifies how the texture sampler will treat the texture, and
1665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * makes available X, Y, Z, W, ZERO, and ONE for swizzling. */
1671c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r300_translate_texformat(enum pipe_format format,
1686f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                                  const unsigned char *swizzle_view,
1696478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                                  boolean is_r500,
1706478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                                  boolean dxtc_swizzle)
1715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{
1725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    uint32_t result = 0;
1735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    const struct util_format_description *desc;
17439e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák    unsigned i;
1755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    boolean uniform = TRUE;
1765c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    const uint32_t sign_bit[4] = {
1775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        R300_TX_FORMAT_SIGNED_W,
1782e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        R300_TX_FORMAT_SIGNED_Z,
1792e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        R300_TX_FORMAT_SIGNED_Y,
1802e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        R300_TX_FORMAT_SIGNED_X,
1815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    };
1825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
183172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    format = r300_unbyteswap_array_format(format);
1845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    desc = util_format_description(format);
1855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* Colorspace (return non-RGB formats directly). */
1875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    switch (desc->colorspace) {
18871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        /* Depth stencil formats.
18971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák         * Swizzles are added in r300_merge_textures_and_samplers. */
1905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_COLORSPACE_ZS:
1915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            switch (format) {
1925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case PIPE_FORMAT_Z16_UNORM:
19371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                    return R300_TX_FORMAT_X16;
194b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca                case PIPE_FORMAT_X8Z24_UNORM:
195866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie                case PIPE_FORMAT_S8_UINT_Z24_UNORM:
1966f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                    if (is_r500)
1976f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                        return R500_TX_FORMAT_Y8X24;
1986f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                    else
1996f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                        return R300_TX_FORMAT_Y16X16;
2005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                default:
2015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0; /* Unsupported. */
2025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
2035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        /* YUV formats. */
2055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_COLORSPACE_YUV:
2065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            result |= R300_TX_FORMAT_YUV_TO_RGB;
2075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            switch (format) {
209b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca                case PIPE_FORMAT_UYVY:
2105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result;
211b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca                case PIPE_FORMAT_YUYV:
2125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result;
2135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                default:
2145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0; /* Unsupported/unknown. */
2155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
2165c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        /* Add gamma correction. */
2185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_COLORSPACE_SRGB:
2195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            result |= R300_TX_FORMAT_GAMMA;
2205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            break;
2215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
222e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák        default:
223e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák            switch (format) {
224e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                /* Same as YUV but without the YUR->RGB conversion. */
225e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                case PIPE_FORMAT_R8G8_B8G8_UNORM:
226e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                    return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result;
227e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                case PIPE_FORMAT_G8R8_G8B8_UNORM:
228e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                    return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result;
229e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                default:;
230e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák            }
2315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
2325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
233b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák    /* Add swizzling. */
234b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák    /* The RGTC1_SNORM and LATC1_SNORM swizzle is done in the shader. */
23574a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák    if (util_format_is_compressed(format) &&
23674a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        dxtc_swizzle &&
23774a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_RGTC2_UNORM &&
23874a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_RGTC2_SNORM &&
23974a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_LATC2_UNORM &&
24074a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_LATC2_SNORM &&
24174a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_RGTC1_UNORM &&
24274a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_RGTC1_SNORM &&
24374a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_LATC1_UNORM &&
244b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák        format != PIPE_FORMAT_LATC1_SNORM) {
24574a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view,
24674a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák                                            TRUE);
24774a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák    } else {
24874a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view,
24974a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák                                            FALSE);
2507a61957424a457f416d20c2b366232fb4bbc7761Marek Olšák    }
2515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2523252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    /* S3TC formats. */
25328cf5e1191077e063fe2a81d9d35934b71d001e2José Fonseca    if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
25488512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák        if (!util_format_s3tc_enabled) {
25588512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák            return ~0; /* Unsupported. */
25688512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák        }
25788512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák
2585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        switch (format) {
2595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_RGB:
2605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_RGBA:
2615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_SRGB:
2625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_SRGBA:
2635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return R300_TX_FORMAT_DXT1 | result;
2645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT3_RGBA:
2655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT3_SRGBA:
2665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return R300_TX_FORMAT_DXT3 | result;
2675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT5_RGBA:
2685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT5_SRGBA:
2695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return R300_TX_FORMAT_DXT5 | result;
2705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            default:
2715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return ~0; /* Unsupported/unknown. */
2725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        }
2735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
2745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2753252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    /* RGTC formats. */
2763252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) {
2773252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        switch (format) {
2783252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            case PIPE_FORMAT_RGTC1_SNORM:
2795ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák            case PIPE_FORMAT_LATC1_SNORM:
28074a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák                result |= sign_bit[0];
2815ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák            case PIPE_FORMAT_LATC1_UNORM:
28279ad6f5375253faff89bbc7eb6dc5949ba63e0efDave Airlie            case PIPE_FORMAT_RGTC1_UNORM:
2833252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák                return R500_TX_FORMAT_ATI1N | result;
2845ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák
2853252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            case PIPE_FORMAT_RGTC2_SNORM:
2865ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák            case PIPE_FORMAT_LATC2_SNORM:
2872e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák                result |= sign_bit[1] | sign_bit[0];
28879ad6f5375253faff89bbc7eb6dc5949ba63e0efDave Airlie            case PIPE_FORMAT_RGTC2_UNORM:
2895ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák            case PIPE_FORMAT_LATC2_UNORM:
2903252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák                return R400_TX_FORMAT_ATI2N | result;
2915ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák
2923252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            default:
2933252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák                return ~0; /* Unsupported/unknown. */
2943252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        }
2953252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    }
2963252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák
29766d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    /* This is truly a special format.
29866d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák     * It stores R8G8 and B is computed using sqrt(1 - R^2 - G^2)
29966d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák     * in the sampler unit. Also known as D3DFMT_CxV8U8. */
30066d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    if (format == PIPE_FORMAT_R8G8Bx_SNORM) {
30166d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák        return R300_TX_FORMAT_CxV8U8 | result;
30266d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    }
30366d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák
3044298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák    /* Integer and fixed-point 16.16 textures are not supported. */
3054298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák    for (i = 0; i < 4; i++) {
3064298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák        if (desc->channel[i].type == UTIL_FORMAT_TYPE_FIXED ||
3074298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák            ((desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED ||
3084298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák              desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) &&
3094298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák             (!desc->channel[i].normalized ||
3104298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák              desc->channel[i].pure_integer))) {
3114298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák            return ~0; /* Unsupported/unknown. */
3124298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák        }
3134298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák    }
3144298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák
31566d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    /* Add sign. */
31666d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    for (i = 0; i < desc->nr_channels; i++) {
31766d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák        if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
31866d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák            result |= sign_bit[i];
31966d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák        }
32066d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    }
32166d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák
3225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* See whether the components are of the same size. */
32339e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák    for (i = 1; i < desc->nr_channels; i++) {
3245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        uniform = uniform && desc->channel[0].size == desc->channel[i].size;
3255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
3265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* Non-uniform formats. */
3285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    if (!uniform) {
32939e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák        switch (desc->nr_channels) {
3305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case 3:
3315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 5 &&
3325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 6 &&
3335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 5) {
3345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_Z5Y6X5 | result;
3355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
3365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 5 &&
3375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 5 &&
3385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 6) {
3395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_Z6Y5X5 | result;
3405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
341c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                if (desc->channel[0].size == 2 &&
342c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                    desc->channel[1].size == 3 &&
343c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                    desc->channel[2].size == 3) {
344c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                    return R300_TX_FORMAT_Z3Y3X2 | result;
345c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                }
3465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return ~0; /* Unsupported/unknown. */
3475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case 4:
3495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 5 &&
3505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 5 &&
3515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 5 &&
3525c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[3].size == 1) {
3535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_W1Z5Y5X5 | result;
3545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
3555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 10 &&
3565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 10 &&
3575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 10 &&
3585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[3].size == 2) {
3595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_W2Z10Y10X10 | result;
3605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
3615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        }
3625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        return ~0; /* Unsupported/unknown. */
3635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
3645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
36594e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    /* Find the first non-VOID channel. */
36694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    for (i = 0; i < 4; i++) {
36794e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
36894e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            break;
36994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        }
37094e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    }
37194e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
37294e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    if (i == 4)
37394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        return ~0; /* Unsupported/unknown. */
37494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
3755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* And finally, uniform formats. */
37694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    switch (desc->channel[i].type) {
3775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_TYPE_UNSIGNED:
3785c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_TYPE_SIGNED:
37994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            if (!desc->channel[i].normalized &&
3805c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) {
3815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return ~0;
3825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
3835c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
38494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            switch (desc->channel[i].size) {
3855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 4:
38639e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_Y4X4 | result;
3895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_W4Z4Y4X4 | result;
3915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0;
3935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 8:
39539e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_X8 | result;
3985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_Y8X8 | result;
4005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
4015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_W8Z8Y8X8 | result;
4025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
4035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0;
4045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
4055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 16:
40639e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
4075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
4085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_X16 | result;
4095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
4105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_Y16X16 | result;
4115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
4125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_W16Z16Y16X16 | result;
4135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
4145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
4155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            return ~0;
4165c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
4175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_TYPE_FLOAT:
41894e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            switch (desc->channel[i].size) {
4195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 16:
42039e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
4215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
4225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_16F | result;
4235c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
4245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_16F_16F | result;
4255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
4265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_16F_16F_16F_16F | result;
4275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
4285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0;
4295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
4305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 32:
43139e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
4325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
4335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_32F | result;
4345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
4355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_32F_32F | result;
4365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
4375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_32F_32F_32F_32F | result;
4385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
4395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
4405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
4415c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
4425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    return ~0; /* Unsupported/unknown. */
4435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák}
4445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
4451c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r500_tx_format_msb_bit(enum pipe_format format)
4463252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák{
4473252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    switch (format) {
4483252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        case PIPE_FORMAT_RGTC1_UNORM:
4493252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        case PIPE_FORMAT_RGTC1_SNORM:
4505ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák        case PIPE_FORMAT_LATC1_UNORM:
4515ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák        case PIPE_FORMAT_LATC1_SNORM:
452b4483823d9c1205fb9ab8cf5b4c36ee610347a36Marek Olšák        case PIPE_FORMAT_X8Z24_UNORM:
453866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie        case PIPE_FORMAT_S8_UINT_Z24_UNORM:
4543252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            return R500_TXFORMAT_MSB;
4553252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        default:
4563252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            return 0;
4573252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    }
4583252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák}
4593252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák
4603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Buffer formats. */
4613c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Colorbuffer formats. This is the unswizzled format of the RB3D block's
4633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * output. For the swizzling of the targets, check the shader's format. */
4643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_colorformat(enum pipe_format format)
4653c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
466172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    format = r300_unbyteswap_array_format(format);
467172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák
4683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    switch (format) {
4693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 8-bit buffers. */
4703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_A8_UNORM:
4712e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_A8_SNORM:
4723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_I8_UNORM:
4732e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_I8_SNORM:
4743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_L8_UNORM:
4752e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_L8_SNORM:
4763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_UNORM:
4773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_SNORM:
4783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_I8;
4793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4803c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 16-bit buffers. */
4818f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák        case PIPE_FORMAT_L8A8_UNORM:
4822e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_L8A8_SNORM:
483e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_UNORM:
484e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_SNORM:
485ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R8A8_UNORM:
486ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R8A8_SNORM:
4870420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* These formats work fine with UV88 if US_OUT_FMT is set correctly. */
4880420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A16_UNORM:
4890420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A16_SNORM:
490faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_A16_FLOAT:
4910420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16_UNORM:
4920420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16_SNORM:
493faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L16_FLOAT:
4940420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_I16_UNORM:
4950420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_I16_SNORM:
496faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_I16_FLOAT:
4970420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_UNORM:
4980420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_SNORM:
4990420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_FLOAT:
500e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák            return R300_COLOR_FORMAT_UV88;
501e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák
502b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G6R5_UNORM:
5033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_RGB565;
50426a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák
505b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G5R5A1_UNORM:
506f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        case PIPE_FORMAT_B5G5R5X1_UNORM:
5073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB1555;
50826a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák
509b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B4G4R4A4_UNORM:
51026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B4G4R4X4_UNORM:
5113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB4444;
5123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 32-bit buffers. */
5143c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_B8G8R8A8_UNORM:
51591eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
5163c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_B8G8R8X8_UNORM:
51791eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
51891eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        case PIPE_FORMAT_R8G8B8A8_UNORM:
5193c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8G8B8A8_SNORM:
52026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R8G8B8X8_UNORM:
52127e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R8G8B8X8_SNORM:
5220420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* These formats work fine with ARGB8888 if US_OUT_FMT is set
5230420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * correctly. */
5240420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_UNORM:
5250420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_SNORM:
5260420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_FLOAT:
5270420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16A16_UNORM:
5280420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16A16_SNORM:
529faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L16A16_FLOAT:
530ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R16A16_UNORM:
531ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R16A16_SNORM:
532ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R16A16_FLOAT:
5330420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A32_FLOAT:
5340420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L32_FLOAT:
535faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_I32_FLOAT:
5360420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R32_FLOAT:
5373c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB8888;
53826a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák
539b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_R10G10B10A2_UNORM:
54026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R10G10B10X2_SNORM:
54126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B10G10R10A2_UNORM:
54227e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_B10G10R10X2_UNORM:
5433c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R500_COLOR_FORMAT_ARGB2101010;  /* R5xx-only? */
5443c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5453c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 64-bit buffers. */
5463c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_UNORM:
5473c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_SNORM:
5482ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák        case PIPE_FORMAT_R16G16B16A16_FLOAT:
54927e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R16G16B16X16_UNORM:
55027e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R16G16B16X16_SNORM:
55127e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R16G16B16X16_FLOAT:
5520420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* These formats work fine with ARGB16161616 if US_OUT_FMT is set
5530420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * correctly. */
5540420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R32G32_FLOAT:
555faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L32A32_FLOAT:
556ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R32A32_FLOAT:
5573c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB16161616;
5583c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5593c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 128-bit buffers. */
5603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R32G32B32A32_FLOAT:
56127e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R32G32B32X32_FLOAT:
5623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB32323232;
5633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* YUV buffers. */
565b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_UYVY:
5663c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_YVYU;
567b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_YUYV:
5683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_VYUY;
5693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        default:
5703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return ~0; /* Unsupported. */
5713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
5723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
5733c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Depthbuffer and stencilbuffer. Thankfully, we only support two flavors. */
5753c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_zsformat(enum pipe_format format)
5763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
5773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    switch (format) {
5783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 16-bit depth, no stencil */
5793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_Z16_UNORM:
5803c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_DEPTHFORMAT_16BIT_INT_Z;
5813c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 24-bit depth, ignored stencil */
582b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_X8Z24_UNORM:
5833c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 24-bit depth, 8-bit stencil */
584866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie        case PIPE_FORMAT_S8_UINT_Z24_UNORM:
5853c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
5863c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        default:
5873c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return ~0; /* Unsupported. */
5883c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
5893c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
5903c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Shader output formats. This is essentially the swizzle from the shader
5923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * to the RB3D block.
5933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák *
5943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * Note that formats are stored from C3 to C0. */
5953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_out_fmt(enum pipe_format format)
5963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
5973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    uint32_t modifier = 0;
5983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    unsigned i;
5993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    const struct util_format_description *desc;
6000420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    boolean uniform_sign;
6013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
602172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    format = r300_unbyteswap_array_format(format);
6033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    desc = util_format_description(format);
6043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
60594e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    /* Find the first non-VOID channel. */
60694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    for (i = 0; i < 4; i++) {
60794e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
60894e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            break;
60994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        }
61094e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    }
61194e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
61294e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    if (i == 4)
61394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        return ~0; /* Unsupported/unknown. */
61494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
6153c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Specifies how the shader output is written to the fog unit. */
6160420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    switch (desc->channel[i].type) {
6170420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    case UTIL_FORMAT_TYPE_FLOAT:
6180420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        switch (desc->channel[i].size) {
6190420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case 32:
6200420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            switch (desc->nr_channels) {
6210420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 1:
6220420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C_32_FP;
6230420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
6240420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 2:
6250420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C2_32_FP;
6260420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
6270420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 4:
6280420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C4_32_FP;
6290420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
6300420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            }
6310420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
6320420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6330420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case 16:
6340420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            switch (desc->nr_channels) {
6350420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 1:
6360420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C_16_FP;
6370420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
6380420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 2:
6390420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C2_16_FP;
6400420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
6410420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 4:
6420420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C4_16_FP;
6430420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
6440420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            }
6450420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
6463c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        }
6470420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        break;
6480420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6490420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    default:
6500420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        switch (desc->channel[i].size) {
6510420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case 16:
6520420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            switch (desc->nr_channels) {
6530420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 1:
6540420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C_16;
6550420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
6560420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 2:
6570420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C2_16;
6580420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
6590420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 4:
6600420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C4_16;
6610420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
6620420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            }
6630420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
6640420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6650420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case 10:
666cb4f367b268b6fbedc6673b2c6e51d107e929370Marek Olšák            modifier |= R300_US_OUT_FMT_C4_10;
6670420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
6680420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6690420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        default:
6703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            /* C4_8 seems to be used for the formats whose pixel size
6713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák             * is <= 32 bits. */
6723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            modifier |= R300_US_OUT_FMT_C4_8;
6730420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
6743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        }
6753c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
6763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
6773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Add sign. */
6780420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    uniform_sign = TRUE;
6790420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    for (i = 0; i < desc->nr_channels; i++)
6800420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        if (desc->channel[i].type != UTIL_FORMAT_TYPE_SIGNED)
6810420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            uniform_sign = FALSE;
6820420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6830420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    if (uniform_sign)
6840420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        modifier |= R300_OUT_SIGN(0xf);
6853c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
6863c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Add swizzles and return. */
6873c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    switch (format) {
6880420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /*** Special cases (non-standard channel mapping) ***/
6890420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6900420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* X8
6910420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * COLORFORMAT_I8 stores the Z component (C2). */
6923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_A8_UNORM:
6932e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_A8_SNORM:
6943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier | R300_C2_SEL_A;
6953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_I8_UNORM:
6962e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_I8_SNORM:
6973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_L8_UNORM:
6982e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_L8_SNORM:
6993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_UNORM:
7003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_SNORM:
7013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier | R300_C2_SEL_R;
7023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
7030420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* X8Y8
7040420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * COLORFORMAT_UV88 stores ZX (C2 and C0). */
7052e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_L8A8_SNORM:
7068f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák        case PIPE_FORMAT_L8A8_UNORM:
707ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R8A8_SNORM:
708ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R8A8_UNORM:
7098f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák            return modifier | R300_C0_SEL_A | R300_C2_SEL_R;
710e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_SNORM:
7112e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_R8G8_UNORM:
712e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák            return modifier | R300_C0_SEL_G | R300_C2_SEL_R;
713e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák
7140420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* X32Y32
7150420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * ARGB16161616 stores XZ for RG32F */
7160420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R32G32_FLOAT:
7170420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            return modifier | R300_C0_SEL_R | R300_C2_SEL_G;
7180420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
7190420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /*** Generic cases (standard channel mapping) ***/
7200420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
721f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* BGRA outputs. */
722b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G6R5_UNORM:
723b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G5R5A1_UNORM:
724f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        case PIPE_FORMAT_B5G5R5X1_UNORM:
725b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B4G4R4A4_UNORM:
72626a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B4G4R4X4_UNORM:
727b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B8G8R8A8_UNORM:
72891eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
729b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B8G8R8X8_UNORM:
73091eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
73126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B10G10R10A2_UNORM:
73227e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_B10G10R10X2_UNORM:
7333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
7343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_B | R300_C1_SEL_G |
7353c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_R | R300_C3_SEL_A;
7363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
737f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* ARGB outputs. */
7380420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A16_UNORM:
7390420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A16_SNORM:
740faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_A16_FLOAT:
741faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_A32_FLOAT:
7423c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
7433c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_A | R300_C1_SEL_R |
7443c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_G | R300_C3_SEL_B;
7453c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
746f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* RGBA outputs. */
74726a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R8G8B8X8_UNORM:
74827e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R8G8B8X8_SNORM:
74991eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        case PIPE_FORMAT_R8G8B8A8_UNORM:
750f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        case PIPE_FORMAT_R8G8B8A8_SNORM:
751b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_R10G10B10A2_UNORM:
75226a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R10G10B10X2_SNORM:
7530420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_UNORM:
7540420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_UNORM:
7553c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_UNORM:
7560420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_SNORM:
7570420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_SNORM:
7583c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_SNORM:
7590420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_FLOAT:
7600420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_FLOAT:
7612ba0c64c26d3ec9b2806f577020d4fde826a858dMarek Olšák        case PIPE_FORMAT_R16G16B16A16_FLOAT:
7620420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R32_FLOAT:
7633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R32G32B32A32_FLOAT:
76427e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R32G32B32X32_FLOAT:
7650420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16_UNORM:
7660420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16_SNORM:
767faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L16_FLOAT:
768faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L32_FLOAT:
7690420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_I16_UNORM:
7700420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_I16_SNORM:
771faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_I16_FLOAT:
772faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_I32_FLOAT:
77327e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R16G16B16X16_UNORM:
77427e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R16G16B16X16_SNORM:
77527e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R16G16B16X16_FLOAT:
7763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
7773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_R | R300_C1_SEL_G |
7783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_B | R300_C3_SEL_A;
7793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
7800420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* LA outputs. */
7810420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16A16_UNORM:
7820420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16A16_SNORM:
783faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L16A16_FLOAT:
784ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R16A16_UNORM:
785ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R16A16_SNORM:
786ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R16A16_FLOAT:
787faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L32A32_FLOAT:
788ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R32A32_FLOAT:
7890420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            return modifier |
7900420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                R300_C0_SEL_R | R300_C1_SEL_A;
7910420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
7923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        default:
7933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return ~0; /* Unsupported. */
7943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
7953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
7963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
7971e51d368eb5360378218217ff35731896f48512fMarek Olšákstatic uint32_t r300_translate_colormask_swizzle(enum pipe_format format)
7981e51d368eb5360378218217ff35731896f48512fMarek Olšák{
799172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák    format = r300_unbyteswap_array_format(format);
800172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák
8011e51d368eb5360378218217ff35731896f48512fMarek Olšák    switch (format) {
8021e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_A8_UNORM:
8031e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_A8_SNORM:
8041e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_A16_UNORM:
8051e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_A16_SNORM:
8061e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_A16_FLOAT:
8071e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_A32_FLOAT:
8081e51d368eb5360378218217ff35731896f48512fMarek Olšák        return COLORMASK_AAAA;
8091e51d368eb5360378218217ff35731896f48512fMarek Olšák
8101e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_I8_UNORM:
8111e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_I8_SNORM:
8121e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L8_UNORM:
8131e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L8_SNORM:
8141e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8_UNORM:
8151e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8_SNORM:
8161e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R32_FLOAT:
8171e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L32_FLOAT:
8181e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_I32_FLOAT:
8191e51d368eb5360378218217ff35731896f48512fMarek Olšák        return COLORMASK_RRRR;
8201e51d368eb5360378218217ff35731896f48512fMarek Olšák
8211e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L8A8_SNORM:
8221e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L8A8_UNORM:
823ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák    case PIPE_FORMAT_R8A8_UNORM:
824ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák    case PIPE_FORMAT_R8A8_SNORM:
8251e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L16A16_UNORM:
8261e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L16A16_SNORM:
8271e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L16A16_FLOAT:
828ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák    case PIPE_FORMAT_R16A16_UNORM:
829ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák    case PIPE_FORMAT_R16A16_SNORM:
830ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák    case PIPE_FORMAT_R16A16_FLOAT:
8311e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L32A32_FLOAT:
832ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák    case PIPE_FORMAT_R32A32_FLOAT:
8331e51d368eb5360378218217ff35731896f48512fMarek Olšák        return COLORMASK_ARRA;
8341e51d368eb5360378218217ff35731896f48512fMarek Olšák
8351e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8G8_SNORM:
8361e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8G8_UNORM:
8371e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16G16_UNORM:
8381e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16G16_SNORM:
8391e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16G16_FLOAT:
8401e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R32G32_FLOAT:
8411e51d368eb5360378218217ff35731896f48512fMarek Olšák        return COLORMASK_GRRG;
8421e51d368eb5360378218217ff35731896f48512fMarek Olšák
843499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák    case PIPE_FORMAT_B5G5R5X1_UNORM:
844499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák    case PIPE_FORMAT_B4G4R4X4_UNORM:
845499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák    case PIPE_FORMAT_B8G8R8X8_UNORM:
846499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák    /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
84727e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    case PIPE_FORMAT_B10G10R10X2_UNORM:
848499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák        return COLORMASK_BGRX;
849499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák
8501e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_B5G6R5_UNORM:
8511e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_B5G5R5A1_UNORM:
8521e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_B4G4R4A4_UNORM:
8531e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_B8G8R8A8_UNORM:
8541e51d368eb5360378218217ff35731896f48512fMarek Olšák    /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
8551e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_B10G10R10A2_UNORM:
8561e51d368eb5360378218217ff35731896f48512fMarek Olšák        return COLORMASK_BGRA;
8571e51d368eb5360378218217ff35731896f48512fMarek Olšák
8581e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8G8B8X8_UNORM:
85927e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    /* RGBX_SNORM formats are broken for an unknown reason */
8601e51d368eb5360378218217ff35731896f48512fMarek Olšák    /*case PIPE_FORMAT_R8G8B8X8_SNORM:*/
86127e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    /*case PIPE_FORMAT_R10G10B10X2_SNORM:*/
86227e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    case PIPE_FORMAT_R16G16B16X16_UNORM:
86327e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    /*case PIPE_FORMAT_R16G16B16X16_SNORM:*/
86427e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    case PIPE_FORMAT_R16G16B16X16_FLOAT:
86527e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    case PIPE_FORMAT_R32G32B32X32_FLOAT:
866499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák        return COLORMASK_RGBX;
867499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák
8681e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8G8B8A8_UNORM:
8691e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8G8B8A8_SNORM:
8701e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R10G10B10A2_UNORM:
8711e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16_UNORM:
8721e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16G16B16A16_UNORM:
8731e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16_SNORM:
8741e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16G16B16A16_SNORM:
8751e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16_FLOAT:
8761e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16G16B16A16_FLOAT:
8771e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R32G32B32A32_FLOAT:
8781e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L16_UNORM:
8791e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L16_SNORM:
8801e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L16_FLOAT:
8811e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_I16_UNORM:
8821e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_I16_SNORM:
8831e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_I16_FLOAT:
8841e51d368eb5360378218217ff35731896f48512fMarek Olšák        return COLORMASK_RGBA;
8851e51d368eb5360378218217ff35731896f48512fMarek Olšák
8861e51d368eb5360378218217ff35731896f48512fMarek Olšák    default:
8871e51d368eb5360378218217ff35731896f48512fMarek Olšák        return ~0; /* Unsupported. */
8881e51d368eb5360378218217ff35731896f48512fMarek Olšák    }
8891e51d368eb5360378218217ff35731896f48512fMarek Olšák}
8901e51d368eb5360378218217ff35731896f48512fMarek Olšák
8913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_colorbuffer_format_supported(enum pipe_format format)
8923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
8933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    return r300_translate_colorformat(format) != ~0 &&
8941e51d368eb5360378218217ff35731896f48512fMarek Olšák           r300_translate_out_fmt(format) != ~0 &&
8951e51d368eb5360378218217ff35731896f48512fMarek Olšák           r300_translate_colormask_swizzle(format) != ~0;
8963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
8973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
8983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_zs_format_supported(enum pipe_format format)
8993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
9003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    return r300_translate_zsformat(format) != ~0;
9013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
9023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
9035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšákboolean r300_is_sampler_format_supported(enum pipe_format format)
9045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{
9056478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák    return r300_translate_texformat(format, 0, TRUE, FALSE) != ~0;
9065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák}
9075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
908c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšákvoid r300_texture_setup_format_state(struct r300_screen *screen,
90956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                     struct r300_resource *tex,
910ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                     enum pipe_format format,
911c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák                                     unsigned level,
912ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                     unsigned width0_override,
913ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                     unsigned height0_override,
914c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák                                     struct r300_texture_format_state *out)
9159d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson{
916a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    struct pipe_resource *pt = &tex->b.b;
91756ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_texture_desc *desc = &tex->tex;
918b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák    boolean is_r500 = screen->caps.is_r500;
91910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    unsigned width, height, depth;
92010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    unsigned txwidth, txheight, txdepth;
92110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
922ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák    width = u_minify(width0_override, level);
923ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák    height = u_minify(height0_override, level);
92410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    depth = u_minify(desc->depth0, level);
92510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
92610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    txwidth = (width - 1) & 0x7ff;
92710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    txheight = (height - 1) & 0x7ff;
92810ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    txdepth = util_logbase2(depth) & 0xf;
9299d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
930c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    /* Mask out all the fields we change. */
931c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->format0 = 0;
932c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->format1 &= ~R300_TX_FORMAT_TEX_COORD_TYPE_MASK;
933c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->format2 &= R500_TXFORMAT_MSB;
934c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->tile_config = 0;
935c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák
9363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Set sampler state. */
93713359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák    out->format0 =
93810ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        R300_TX_WIDTH(txwidth) |
93910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        R300_TX_HEIGHT(txheight) |
94010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        R300_TX_DEPTH(txdepth);
941827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák
942c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    if (desc->uses_stride_addressing) {
943ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        unsigned stride =
944ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák            r300_stride_to_width(format, desc->stride_in_bytes[level]);
945827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák        /* rectangles love this */
946c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format0 |= R300_TX_PITCH_EN;
947ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        out->format2 = (stride - 1) & 0x1fff;
948827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    }
9499d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
950eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    if (pt->target == PIPE_TEXTURE_CUBE) {
951c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format1 |= R300_TX_FORMAT_CUBIC_MAP;
952eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    }
953eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    if (pt->target == PIPE_TEXTURE_3D) {
954c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format1 |= R300_TX_FORMAT_3D;
955eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    }
9569d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
957827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    /* large textures on r500 */
958827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    if (is_r500)
959827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    {
96010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        unsigned us_width = txwidth;
96110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        unsigned us_height = txheight;
96210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        unsigned us_depth = txdepth;
96310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
96410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        if (width > 2048) {
965c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák            out->format2 |= R500_TXWIDTH_BIT11;
966827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák        }
96710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        if (height > 2048) {
968c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák            out->format2 |= R500_TXHEIGHT_BIT11;
969827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák        }
97010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
97110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        /* The US_FORMAT register fixes an R500 TX addressing bug.
97210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák         * Don't ask why it must be set like this. I don't know it either. */
97310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        if (width > 2048) {
97410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            us_width = (0x000007FF + us_width) >> 1;
97510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            us_depth |= 0x0000000D;
97610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        }
97710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        if (height > 2048) {
97810ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            us_height = (0x000007FF + us_height) >> 1;
97910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            us_depth |= 0x0000000E;
98010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        }
98110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
98210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        out->us_format0 =
98310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            R300_TX_WIDTH(us_width) |
98410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            R300_TX_HEIGHT(us_height) |
98510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            R300_TX_DEPTH(us_depth);
9861aa38b2c2d80b67fe2eefe468f90aeb44bc20259Corbin Simpson    }
9872cbd5ecfb666a757c4abef85dbe40fb53d647ec9Corbin Simpson
988c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->tile_config = R300_TXO_MACRO_TILE(desc->macrotile[level]) |
989172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák                       R300_TXO_MICRO_TILE(desc->microtile) |
990172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák                       R300_TXO_ENDIAN(r300_get_endian_swap(format));
9911c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák}
9921c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák
993fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšákstatic void r300_texture_setup_fb_state(struct r300_surface *surf)
9941c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák{
99556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource *tex = r300_resource(surf->base.texture);
996fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák    unsigned level = surf->base.u.tex.level;
997ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák    unsigned stride =
998ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák      r300_stride_to_width(surf->base.format, tex->tex.stride_in_bytes[level]);
9993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
10003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Set framebuffer state. */
1001fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák    if (util_format_is_depth_or_stencil(surf->base.format)) {
1002fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->pitch =
1003ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                stride |
100456ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                R300_DEPTHMACROTILE(tex->tex.macrotile[level]) |
1005172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák                R300_DEPTHMICROTILE(tex->tex.microtile) |
1006172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák                R300_DEPTHENDIAN(r300_get_endian_swap(surf->base.format));
1007fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->format = r300_translate_zsformat(surf->base.format);
1008d99ec708afbb785ce05031661222b38c9447059fMarek Olšák        surf->pitch_zmask = tex->tex.zmask_stride_in_pixels[level];
1009d99ec708afbb785ce05031661222b38c9447059fMarek Olšák        surf->pitch_hiz = tex->tex.hiz_stride_in_pixels[level];
10103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    } else {
10119953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák        enum pipe_format format = util_format_linear(surf->base.format);
10129953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák
1013fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->pitch =
1014ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                stride |
10159953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák                r300_translate_colorformat(format) |
101656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                R300_COLOR_TILE(tex->tex.macrotile[level]) |
1017172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák                R300_COLOR_MICROTILE(tex->tex.microtile) |
1018172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák                R300_COLOR_ENDIAN(r300_get_endian_swap(format));
10199953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák        surf->format = r300_translate_out_fmt(format);
10201e51d368eb5360378218217ff35731896f48512fMarek Olšák        surf->colormask_swizzle =
10219953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák            r300_translate_colormask_swizzle(format);
1022ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák        surf->pitch_cmask = tex->tex.cmask_stride_in_pixels;
10233c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
10243cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle}
10253cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle
1026287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic void r300_texture_destroy(struct pipe_screen *screen,
10274c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                 struct pipe_resource* texture)
1028287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
1029ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák    struct r300_screen *rscreen = r300_screen(screen);
103056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource* tex = (struct r300_resource*)texture;
1031287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
1032ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák    if (tex->tex.cmask_dwords) {
1033ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák        pipe_mutex_lock(rscreen->cmask_mutex);
1034ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák        if (texture == rscreen->cmask_resource) {
1035ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák            rscreen->cmask_resource = NULL;
1036ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák        }
1037ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák        pipe_mutex_unlock(rscreen->cmask_mutex);
1038ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák    }
1039d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    pb_reference(&tex->buf, NULL);
1040287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    FREE(tex);
1041287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}
1042287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
104356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšákboolean r300_resource_get_handle(struct pipe_screen* screen,
10449daaa6f5a66ab6cc99c6f0af37fc1007ab3d09afMarek Olšák                                 struct pipe_context *ctx,
104556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                 struct pipe_resource *texture,
104682db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                                 struct winsys_handle *whandle,
104782db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                                 unsigned usage)
1048287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
1049e05bc52b9ccbbf0ca7fa25196c5137b35d2c5c2eMarek Olšák    struct radeon_winsys *rws = r300_screen(screen)->rws;
105056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource* tex = (struct r300_resource*)texture;
1051287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
1052287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    if (!tex) {
1053287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell        return FALSE;
1054287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    }
1055287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
105604bc082f6a8bfc3b3774bb102d3200317609432eChristian König    return rws->buffer_get_handle(tex->buf, tex->tex.stride_in_bytes[0],
105784b961dd53a0509a6865d8417301838b34a40096Brian Paul                                  0, 0, whandle);
1058287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}
1059287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
1060d17d03a8dccb4bad25211693320459420409d997Henri Verbeetstatic const struct u_resource_vtbl r300_texture_vtbl =
1061287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
106256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    NULL,                           /* get_handle */
106356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    r300_texture_destroy,           /* resource_destroy */
106456ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    r300_texture_transfer_map,      /* transfer_map */
106556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    NULL,                           /* transfer_flush_region */
106656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    r300_texture_transfer_unmap,    /* transfer_unmap */
1067287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell};
1068287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
1069d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák/* The common texture constructor. */
107056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšákstatic struct r300_resource*
1071d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákr300_texture_create_object(struct r300_screen *rscreen,
1072d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                           const struct pipe_resource *base,
1073d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák                           enum radeon_bo_layout microtile,
1074d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák                           enum radeon_bo_layout macrotile,
1075d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                           unsigned stride_in_bytes_override,
1076d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák                           struct pb_buffer *buffer)
10774ce26210842176c4b280b7db85639ced40d4083dMarek Olšák{
1078d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    struct radeon_winsys *rws = rscreen->rws;
1079e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    struct r300_resource *tex = NULL;
1080260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák    struct radeon_bo_metadata tiling = {};
1081e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák
1082e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    tex = CALLOC_STRUCT(r300_resource);
1083e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    if (!tex) {
1084e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák        goto fail;
1085e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    }
10866cd9159cea628c542d2233b54f6babb74e45f83cMarek Olšák
1087a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    pipe_reference_init(&tex->b.b.reference, 1);
1088a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.b.screen = &rscreen->screen;
1089a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.b.usage = base->usage;
1090a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.b.bind = base->bind;
1091a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.b.flags = base->flags;
1092a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.vtbl = &r300_texture_vtbl;
10937c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák    tex->tex.microtile = microtile;
10947c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák    tex->tex.macrotile[0] = macrotile;
10957c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák    tex->tex.stride_in_bytes_override = stride_in_bytes_override;
109674a17a764dc2ad20d9d6f56afee963b23b597132Marek Olšák    tex->domain = (base->flags & R300_RESOURCE_FLAG_TRANSFER ||
109774a17a764dc2ad20d9d6f56afee963b23b597132Marek Olšák                   base->usage == PIPE_USAGE_STAGING) ? RADEON_DOMAIN_GTT :
1098a06f03d795153ce060d99aafb61d10c27a47efc1Marek Olšák                  base->nr_samples > 1 ? RADEON_DOMAIN_VRAM :
1099a06f03d795153ce060d99aafb61d10c27a47efc1Marek Olšák                                         RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT;
11007b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák    tex->buf = buffer;
11017c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák
11022cd7e5b737e1384bb6d27f3cc2c8524b07230d56Marek Olšák    r300_texture_desc_init(rscreen, tex, base);
1103d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
11048ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    /* Figure out the ideal placement for the texture.. */
11058ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    if (tex->domain & RADEON_DOMAIN_VRAM &&
11068ad9d42b338c6684930b7898734f9070b6368172Marek Olšák        tex->tex.size_in_bytes >= rscreen->info.vram_size) {
11078ad9d42b338c6684930b7898734f9070b6368172Marek Olšák        tex->domain &= ~RADEON_DOMAIN_VRAM;
11088ad9d42b338c6684930b7898734f9070b6368172Marek Olšák        tex->domain |= RADEON_DOMAIN_GTT;
11098ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    }
11108ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    if (tex->domain & RADEON_DOMAIN_GTT &&
11118ad9d42b338c6684930b7898734f9070b6368172Marek Olšák        tex->tex.size_in_bytes >= rscreen->info.gart_size) {
11128ad9d42b338c6684930b7898734f9070b6368172Marek Olšák        tex->domain &= ~RADEON_DOMAIN_GTT;
11138ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    }
11148ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    /* Just fail if the texture is too large. */
11158ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    if (!tex->domain) {
11168ad9d42b338c6684930b7898734f9070b6368172Marek Olšák        goto fail;
11178ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    }
11188ad9d42b338c6684930b7898734f9070b6368172Marek Olšák
1119d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Create the backing buffer if needed. */
11207b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák    if (!tex->buf) {
1121562c4a17b7e4fb56c7db679233b4a48f8b80b0f2Nicolai Hähnle        tex->buf = rws->buffer_create(rws, tex->tex.size_in_bytes, 2048,
11226d89a4067627fdf568c6c4e3d9a201fd45d5352bNicolai Hähnle                                      tex->domain, RADEON_FLAG_HANDLE);
1123d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1124ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        if (!tex->buf) {
1125e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák            goto fail;
1126d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        }
1127d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    }
1128d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1129f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák    if (SCREEN_DBG_ON(rscreen, DBG_MSAA) && base->nr_samples > 1) {
11302f89949b666889a61196657511b1dee4418ae865Marek Olšák        fprintf(stderr, "r300: %ix MSAA %s buffer created\n",
1131f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák                base->nr_samples,
1132f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák                util_format_is_depth_or_stencil(base->format) ? "depth" : "color");
1133f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák    }
1134f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák
1135260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák    tiling.microtile = tex->tex.microtile;
1136260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák    tiling.macrotile = tex->tex.macrotile[0];
1137260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák    tiling.stride = tex->tex.stride_in_bytes[0];
1138bd1feb28273e8d7047304e5a2a02ca3d71de5533Marek Olšák    rws->buffer_set_metadata(tex->buf, &tiling);
1139d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1140d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    return tex;
1141e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák
1142e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšákfail:
1143e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    FREE(tex);
1144e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    if (buffer)
1145e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák        pb_reference(&buffer, NULL);
1146e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    return NULL;
11474ce26210842176c4b280b7db85639ced40d4083dMarek Olšák}
11484ce26210842176c4b280b7db85639ced40d4083dMarek Olšák
11490648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson/* Create a new texture. */
1150d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákstruct pipe_resource *r300_texture_create(struct pipe_screen *screen,
1151d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                          const struct pipe_resource *base)
11520648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson{
1153d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    struct r300_screen *rscreen = r300_screen(screen);
1154d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    enum radeon_bo_layout microtile, macrotile;
11555cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák
1156d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if ((base->flags & R300_RESOURCE_FLAG_TRANSFER) ||
1157e8f9195e5fb34a45783d6491d2e0305a0b137439Axel Davy        (base->bind & (PIPE_BIND_SCANOUT | PIPE_BIND_LINEAR))) {
1158d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        microtile = RADEON_LAYOUT_LINEAR;
1159d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        macrotile = RADEON_LAYOUT_LINEAR;
1160d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    } else {
1161d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        /* This will make the texture_create_function select the layout. */
1162d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        microtile = RADEON_LAYOUT_UNKNOWN;
1163d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        macrotile = RADEON_LAYOUT_UNKNOWN;
1164b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák    }
11659d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
1166d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    return (struct pipe_resource*)
1167d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák           r300_texture_create_object(rscreen, base, microtile, macrotile,
11687b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák                                      0, NULL);
1169d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák}
1170d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1171d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákstruct pipe_resource *r300_texture_from_handle(struct pipe_screen *screen,
1172d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                               const struct pipe_resource *base,
117382db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                                               struct winsys_handle *whandle,
117482db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                                               unsigned usage)
1175d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák{
1176d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    struct r300_screen *rscreen = r300_screen(screen);
1177e05bc52b9ccbbf0ca7fa25196c5137b35d2c5c2eMarek Olšák    struct radeon_winsys *rws = rscreen->rws;
1178d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    struct pb_buffer *buffer;
11797b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák    unsigned stride;
1180260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák    struct radeon_bo_metadata tiling = {};
1181d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1182d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Support only 2D textures without mipmaps */
1183ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri    if ((base->target != PIPE_TEXTURE_2D &&
1184ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri          base->target != PIPE_TEXTURE_RECT) ||
1185d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        base->depth0 != 1 ||
1186d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        base->last_level != 0) {
1187d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        return NULL;
11884ce26210842176c4b280b7db85639ced40d4083dMarek Olšák    }
11890bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák
119004bc082f6a8bfc3b3774bb102d3200317609432eChristian König    buffer = rws->buffer_from_handle(rws, whandle, &stride, NULL);
1191d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if (!buffer)
1192d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        return NULL;
119319498be935328e284c7f0e456fc04cca8d465d4cMarek Olšák
1194bd1feb28273e8d7047304e5a2a02ca3d71de5533Marek Olšák    rws->buffer_get_metadata(buffer, &tiling);
119537f3454eb3afa1297126a8d77a563d734c292a37Marek Olšák
1196d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Enforce a microtiled zbuffer. */
1197d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if (util_format_is_depth_or_stencil(base->format) &&
1198260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák        tiling.microtile == RADEON_LAYOUT_LINEAR) {
1199d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        switch (util_format_get_blocksize(base->format)) {
1200d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            case 4:
1201260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák                tiling.microtile = RADEON_LAYOUT_TILED;
1202d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                break;
1203950be3fa3c22d67f3b80e7ed5d274d957f0bff93Marek Olšák
1204d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            case 2:
1205260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák                tiling.microtile = RADEON_LAYOUT_SQUARETILED;
1206d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                break;
1207d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        }
1208d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    }
12098e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson
1210d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    return (struct pipe_resource*)
1211260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák           r300_texture_create_object(rscreen, base, tiling.microtile, tiling.macrotile,
12127b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák                                      stride, buffer);
12138e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson}
12148e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson
1215287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file:
1216287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */
1217ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšákstruct pipe_surface* r300_create_surface_custom(struct pipe_context * ctx,
12184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                         struct pipe_resource* texture,
1219ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                         const struct pipe_surface *surf_tmpl,
1220ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                         unsigned width0_override,
1221ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák					 unsigned height0_override)
1222471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{
122356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource* tex = r300_resource(texture);
12248874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák    struct r300_surface* surface = CALLOC_STRUCT(r300_surface);
12254c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    unsigned level = surf_tmpl->u.tex.level;
12264c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
12274c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer);
1228471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson
1229471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson    if (surface) {
1230d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        uint32_t offset, tile_height;
12318c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
12328874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        pipe_reference_init(&surface->base.reference, 1);
12338874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        pipe_resource_reference(&surface->base.texture, texture);
12344c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.context = ctx;
12354c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.format = surf_tmpl->format;
1236ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        surface->base.width = u_minify(width0_override, level);
1237ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        surface->base.height = u_minify(height0_override, level);
12384c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.u.tex.level = level;
12394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.u.tex.first_layer = surf_tmpl->u.tex.first_layer;
12404c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.u.tex.last_layer = surf_tmpl->u.tex.last_layer;
12418874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák
1242ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        surface->buf = tex->buf;
1243cf811faeff1eaa1aef817ae45314cc3419c44222Marek Olšák        surface->buf = tex->buf;
1244347c00c46e9ecf858a8c21abf58a706b658b5b37Marek Olšák
124593f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák        /* Prefer VRAM if there are multiple domains to choose from. */
124693f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák        surface->domain = tex->domain;
124793f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák        if (surface->domain & RADEON_DOMAIN_VRAM)
124893f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák            surface->domain &= ~RADEON_DOMAIN_GTT;
124993f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák
125056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák        surface->offset = r300_texture_get_offset(tex, level,
12514c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                                  surf_tmpl->u.tex.first_layer);
1252fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        r300_texture_setup_fb_state(surface);
12538c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
12548c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        /* Parameters for the CBZB clear. */
125556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák        surface->cbzb_allowed = tex->tex.cbzb_allowed[level];
12568c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_width = align(surface->base.width, 64);
12578c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
12588c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        /* Height must be aligned to the size of a tile. */
1259ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        tile_height = r300_get_pixel_alignment(surface->base.format,
1260a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák                                               tex->b.b.nr_samples,
126156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                               tex->tex.microtile,
126256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                               tex->tex.macrotile[level],
1263d19b5cbd317620f3977e68fffb7a74793436b7e2Dave Airlie                                               DIM_HEIGHT, 0);
1264d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
12658c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_height = align((surface->base.height + 1) / 2,
12668c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák                                     tile_height);
12678c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
12688c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        /* Offset must be aligned to 2K and must point at the beginning
12698c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák         * of a scanline. */
1270d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        offset = surface->offset +
127156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                 tex->tex.stride_in_bytes[level] * surface->cbzb_height;
12728c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_midpoint_offset = offset & ~2047;
12738c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
12748c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_pitch = surface->pitch & 0x1ffffc;
12758c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
12768c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        if (util_format_get_blocksizebits(surface->base.format) == 32)
12778c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák            surface->cbzb_format = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
12788c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        else
12798c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák            surface->cbzb_format = R300_DEPTHFORMAT_16BIT_INT_Z;
12808c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
12814c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        DBG(r300_context(ctx), DBG_CBZB,
12824c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            "CBZB Allowed: %s, Dim: %ix%i, Misalignment: %i, Micro: %s, Macro: %s\n",
12834c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            surface->cbzb_allowed ? "YES" : " NO",
12844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            surface->cbzb_width, surface->cbzb_height,
12854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            offset & 2047,
128656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex->tex.microtile ? "YES" : " NO",
128756ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex->tex.macrotile[level] ? "YES" : " NO");
1288471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson    }
1289471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson
12908874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák    return &surface->base;
1291471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson}
1292471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson
1293ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšákstruct pipe_surface* r300_create_surface(struct pipe_context * ctx,
1294ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                         struct pipe_resource* texture,
1295ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                         const struct pipe_surface *surf_tmpl)
1296ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák{
1297ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák    return r300_create_surface_custom(ctx, texture, surf_tmpl,
1298ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                      texture->width0,
1299ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                      texture->height0);
1300ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák}
1301ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák
1302287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file:
1303287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */
13044c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheideggervoid r300_surface_destroy(struct pipe_context *ctx, struct pipe_surface* s)
1305471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{
1306287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    pipe_resource_reference(&s->texture, NULL);
13075e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer    FREE(s);
1308471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson}
1309