r300_texture.c revision 260ef9c9bec8695d5988a91443988516d39d0240
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
4171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšákunsigned r300_get_swizzle_combined(const unsigned char *swizzle_format,
426478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                                   const unsigned char *swizzle_view,
436478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                                   boolean dxtc_swizzle)
4471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák{
4571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    unsigned i;
4671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    unsigned char swizzle[4];
4771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    unsigned result = 0;
4871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    const uint32_t swizzle_shift[4] = {
4971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_R_SHIFT,
5071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_G_SHIFT,
5171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_B_SHIFT,
5271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_A_SHIFT
5371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    };
546478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák    uint32_t swizzle_bit[4] = {
556478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák        dxtc_swizzle ? R300_TX_FORMAT_Z : R300_TX_FORMAT_X,
5671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_Y,
576478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák        dxtc_swizzle ? R300_TX_FORMAT_X : R300_TX_FORMAT_Z,
5871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_W
5971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    };
6071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák
6171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    if (swizzle_view) {
6271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        /* Combine two sets of swizzles. */
63be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák        util_format_compose_swizzles(swizzle_format, swizzle_view, swizzle);
6471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    } else {
6571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        memcpy(swizzle, swizzle_format, 4);
6671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    }
6771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák
6871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    /* Get swizzle. */
6971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    for (i = 0; i < 4; i++) {
7071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        switch (swizzle[i]) {
7171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            case UTIL_FORMAT_SWIZZLE_Y:
7271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= swizzle_bit[1] << swizzle_shift[i];
7371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
7471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            case UTIL_FORMAT_SWIZZLE_Z:
7571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= swizzle_bit[2] << swizzle_shift[i];
7671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
7771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            case UTIL_FORMAT_SWIZZLE_W:
7871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= swizzle_bit[3] << swizzle_shift[i];
7971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
8071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            case UTIL_FORMAT_SWIZZLE_0:
8171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= R300_TX_FORMAT_ZERO << swizzle_shift[i];
8271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
8371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            case UTIL_FORMAT_SWIZZLE_1:
8471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= R300_TX_FORMAT_ONE << swizzle_shift[i];
8571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
8671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            default: /* UTIL_FORMAT_SWIZZLE_X */
8771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= swizzle_bit[0] << swizzle_shift[i];
8871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        }
8971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    }
9071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    return result;
9171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák}
9271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák
935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák/* Translate a pipe_format into a useful texture format for sampling.
945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák *
955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Some special formats are translated directly using R300_EASY_TX_FORMAT,
965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * but the majority of them is translated in a generic way, automatically
975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * supporting all the formats hw can support.
985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák *
995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT swizzles the texture.
1005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Note the signature of R300_EASY_TX_FORMAT:
1015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák *   R300_EASY_TX_FORMAT(B, G, R, A, FORMAT);
1025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák *
1035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * The FORMAT specifies how the texture sampler will treat the texture, and
1045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * makes available X, Y, Z, W, ZERO, and ONE for swizzling. */
1051c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r300_translate_texformat(enum pipe_format format,
1066f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                                  const unsigned char *swizzle_view,
1076478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                                  boolean is_r500,
1086478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                                  boolean dxtc_swizzle)
1095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{
1105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    uint32_t result = 0;
1115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    const struct util_format_description *desc;
11239e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák    unsigned i;
1135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    boolean uniform = TRUE;
1145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    const uint32_t sign_bit[4] = {
1155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        R300_TX_FORMAT_SIGNED_W,
1162e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        R300_TX_FORMAT_SIGNED_Z,
1172e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        R300_TX_FORMAT_SIGNED_Y,
1182e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        R300_TX_FORMAT_SIGNED_X,
1195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    };
1205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    desc = util_format_description(format);
1225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1235c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* Colorspace (return non-RGB formats directly). */
1245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    switch (desc->colorspace) {
12571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        /* Depth stencil formats.
12671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák         * Swizzles are added in r300_merge_textures_and_samplers. */
1275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_COLORSPACE_ZS:
1285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            switch (format) {
1295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case PIPE_FORMAT_Z16_UNORM:
13071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                    return R300_TX_FORMAT_X16;
131b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca                case PIPE_FORMAT_X8Z24_UNORM:
132866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie                case PIPE_FORMAT_S8_UINT_Z24_UNORM:
1336f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                    if (is_r500)
1346f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                        return R500_TX_FORMAT_Y8X24;
1356f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                    else
1366f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                        return R300_TX_FORMAT_Y16X16;
1375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                default:
1385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0; /* Unsupported. */
1395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
1405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1415c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        /* YUV formats. */
1425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_COLORSPACE_YUV:
1435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            result |= R300_TX_FORMAT_YUV_TO_RGB;
1445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            switch (format) {
146b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca                case PIPE_FORMAT_UYVY:
1475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result;
148b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca                case PIPE_FORMAT_YUYV:
1495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result;
1505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                default:
1515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0; /* Unsupported/unknown. */
1525c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
1535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        /* Add gamma correction. */
1555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_COLORSPACE_SRGB:
1565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            result |= R300_TX_FORMAT_GAMMA;
1575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            break;
1585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
159e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák        default:
160e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák            switch (format) {
161e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                /* Same as YUV but without the YUR->RGB conversion. */
162e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                case PIPE_FORMAT_R8G8_B8G8_UNORM:
163e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                    return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result;
164e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                case PIPE_FORMAT_G8R8_G8B8_UNORM:
165e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                    return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result;
166e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                default:;
167e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák            }
1685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
1695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
170b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák    /* Add swizzling. */
171b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák    /* The RGTC1_SNORM and LATC1_SNORM swizzle is done in the shader. */
17274a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák    if (util_format_is_compressed(format) &&
17374a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        dxtc_swizzle &&
17474a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_RGTC2_UNORM &&
17574a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_RGTC2_SNORM &&
17674a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_LATC2_UNORM &&
17774a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_LATC2_SNORM &&
17874a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_RGTC1_UNORM &&
17974a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_RGTC1_SNORM &&
18074a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        format != PIPE_FORMAT_LATC1_UNORM &&
181b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák        format != PIPE_FORMAT_LATC1_SNORM) {
18274a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view,
18374a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák                                            TRUE);
18474a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák    } else {
18574a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák        result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view,
18674a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák                                            FALSE);
1877a61957424a457f416d20c2b366232fb4bbc7761Marek Olšák    }
1885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1893252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    /* S3TC formats. */
19028cf5e1191077e063fe2a81d9d35934b71d001e2José Fonseca    if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
19188512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák        if (!util_format_s3tc_enabled) {
19288512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák            return ~0; /* Unsupported. */
19388512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák        }
19488512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák
1955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        switch (format) {
1965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_RGB:
1975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_RGBA:
1985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_SRGB:
1995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_SRGBA:
2005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return R300_TX_FORMAT_DXT1 | result;
2015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT3_RGBA:
2025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT3_SRGBA:
2035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return R300_TX_FORMAT_DXT3 | result;
2045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT5_RGBA:
2055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT5_SRGBA:
2065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return R300_TX_FORMAT_DXT5 | result;
2075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            default:
2085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return ~0; /* Unsupported/unknown. */
2095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        }
2105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
2115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2123252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    /* RGTC formats. */
2133252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) {
2143252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        switch (format) {
2153252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            case PIPE_FORMAT_RGTC1_SNORM:
2165ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák            case PIPE_FORMAT_LATC1_SNORM:
21774a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák                result |= sign_bit[0];
2185ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák            case PIPE_FORMAT_LATC1_UNORM:
21979ad6f5375253faff89bbc7eb6dc5949ba63e0efDave Airlie            case PIPE_FORMAT_RGTC1_UNORM:
2203252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák                return R500_TX_FORMAT_ATI1N | result;
2215ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák
2223252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            case PIPE_FORMAT_RGTC2_SNORM:
2235ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák            case PIPE_FORMAT_LATC2_SNORM:
2242e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák                result |= sign_bit[1] | sign_bit[0];
22579ad6f5375253faff89bbc7eb6dc5949ba63e0efDave Airlie            case PIPE_FORMAT_RGTC2_UNORM:
2265ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák            case PIPE_FORMAT_LATC2_UNORM:
2273252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák                return R400_TX_FORMAT_ATI2N | result;
2285ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák
2293252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            default:
2303252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák                return ~0; /* Unsupported/unknown. */
2313252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        }
2323252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    }
2333252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák
23466d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    /* This is truly a special format.
23566d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák     * It stores R8G8 and B is computed using sqrt(1 - R^2 - G^2)
23666d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák     * in the sampler unit. Also known as D3DFMT_CxV8U8. */
23766d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    if (format == PIPE_FORMAT_R8G8Bx_SNORM) {
23866d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák        return R300_TX_FORMAT_CxV8U8 | result;
23966d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    }
24066d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák
2414298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák    /* Integer and fixed-point 16.16 textures are not supported. */
2424298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák    for (i = 0; i < 4; i++) {
2434298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák        if (desc->channel[i].type == UTIL_FORMAT_TYPE_FIXED ||
2444298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák            ((desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED ||
2454298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák              desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) &&
2464298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák             (!desc->channel[i].normalized ||
2474298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák              desc->channel[i].pure_integer))) {
2484298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák            return ~0; /* Unsupported/unknown. */
2494298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák        }
2504298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák    }
2514298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák
25266d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    /* Add sign. */
25366d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    for (i = 0; i < desc->nr_channels; i++) {
25466d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák        if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
25566d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák            result |= sign_bit[i];
25666d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák        }
25766d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    }
25866d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák
2595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* See whether the components are of the same size. */
26039e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák    for (i = 1; i < desc->nr_channels; i++) {
2615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        uniform = uniform && desc->channel[0].size == desc->channel[i].size;
2625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
2635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* Non-uniform formats. */
2655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    if (!uniform) {
26639e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák        switch (desc->nr_channels) {
2675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case 3:
2685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 5 &&
2695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 6 &&
2705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 5) {
2715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_Z5Y6X5 | result;
2725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
2735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 5 &&
2745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 5 &&
2755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 6) {
2765c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_Z6Y5X5 | result;
2775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
278c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                if (desc->channel[0].size == 2 &&
279c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                    desc->channel[1].size == 3 &&
280c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                    desc->channel[2].size == 3) {
281c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                    return R300_TX_FORMAT_Z3Y3X2 | result;
282c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                }
2835c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return ~0; /* Unsupported/unknown. */
2845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case 4:
2865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 5 &&
2875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 5 &&
2885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 5 &&
2895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[3].size == 1) {
2905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_W1Z5Y5X5 | result;
2915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
2925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 10 &&
2935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 10 &&
2945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 10 &&
2955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[3].size == 2) {
2965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_W2Z10Y10X10 | result;
2975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
2985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        }
2995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        return ~0; /* Unsupported/unknown. */
3005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
3015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
30294e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    /* Find the first non-VOID channel. */
30394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    for (i = 0; i < 4; i++) {
30494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
30594e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            break;
30694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        }
30794e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    }
30894e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
30994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    if (i == 4)
31094e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        return ~0; /* Unsupported/unknown. */
31194e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
3125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* And finally, uniform formats. */
31394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    switch (desc->channel[i].type) {
3145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_TYPE_UNSIGNED:
3155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_TYPE_SIGNED:
31694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            if (!desc->channel[i].normalized &&
3175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) {
3185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return ~0;
3195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
3205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
32194e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            switch (desc->channel[i].size) {
3225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 4:
32339e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_Y4X4 | result;
3265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_W4Z4Y4X4 | result;
3285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0;
3305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 8:
33239e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_X8 | result;
3355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_Y8X8 | result;
3375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_W8Z8Y8X8 | result;
3395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0;
3415c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 16:
34339e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_X16 | result;
3465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_Y16X16 | result;
3485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_W16Z16Y16X16 | result;
3505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
3525c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            return ~0;
3535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_TYPE_FLOAT:
35594e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            switch (desc->channel[i].size) {
3565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 16:
35739e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_16F | result;
3605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_16F_16F | result;
3625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_16F_16F_16F_16F | result;
3645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0;
3665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 32:
36839e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_32F | result;
3715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_32F_32F | result;
3735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_32F_32F_32F_32F | result;
3755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3765c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
3775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
3785c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3795c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    return ~0; /* Unsupported/unknown. */
3805c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák}
3815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3821c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r500_tx_format_msb_bit(enum pipe_format format)
3833252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák{
3843252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    switch (format) {
3853252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        case PIPE_FORMAT_RGTC1_UNORM:
3863252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        case PIPE_FORMAT_RGTC1_SNORM:
3875ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák        case PIPE_FORMAT_LATC1_UNORM:
3885ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák        case PIPE_FORMAT_LATC1_SNORM:
389b4483823d9c1205fb9ab8cf5b4c36ee610347a36Marek Olšák        case PIPE_FORMAT_X8Z24_UNORM:
390866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie        case PIPE_FORMAT_S8_UINT_Z24_UNORM:
3913252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            return R500_TXFORMAT_MSB;
3923252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        default:
3933252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            return 0;
3943252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    }
3953252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák}
3963252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák
3973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Buffer formats. */
3983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
3993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Colorbuffer formats. This is the unswizzled format of the RB3D block's
4003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * output. For the swizzling of the targets, check the shader's format. */
4013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_colorformat(enum pipe_format format)
4023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
4033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    switch (format) {
4043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 8-bit buffers. */
4053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_A8_UNORM:
4062e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_A8_SNORM:
4073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_I8_UNORM:
4082e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_I8_SNORM:
4093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_L8_UNORM:
4102e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_L8_SNORM:
4113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_UNORM:
4123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_SNORM:
4133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_I8;
4143c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4153c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 16-bit buffers. */
4168f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák        case PIPE_FORMAT_L8A8_UNORM:
4172e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_L8A8_SNORM:
418e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_UNORM:
419e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_SNORM:
420ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R8A8_UNORM:
421ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R8A8_SNORM:
4220420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* These formats work fine with UV88 if US_OUT_FMT is set correctly. */
4230420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A16_UNORM:
4240420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A16_SNORM:
425faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_A16_FLOAT:
4260420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16_UNORM:
4270420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16_SNORM:
428faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L16_FLOAT:
4290420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_I16_UNORM:
4300420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_I16_SNORM:
431faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_I16_FLOAT:
4320420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_UNORM:
4330420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_SNORM:
4340420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_FLOAT:
435e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák            return R300_COLOR_FORMAT_UV88;
436e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák
437b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G6R5_UNORM:
4383c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_RGB565;
43926a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák
440b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G5R5A1_UNORM:
441f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        case PIPE_FORMAT_B5G5R5X1_UNORM:
4423c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB1555;
44326a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák
444b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B4G4R4A4_UNORM:
44526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B4G4R4X4_UNORM:
4463c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB4444;
4473c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4483c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 32-bit buffers. */
4493c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_B8G8R8A8_UNORM:
45091eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
4513c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_B8G8R8X8_UNORM:
45291eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
45391eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        case PIPE_FORMAT_R8G8B8A8_UNORM:
4543c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8G8B8A8_SNORM:
45526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R8G8B8X8_UNORM:
45627e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R8G8B8X8_SNORM:
4570420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* These formats work fine with ARGB8888 if US_OUT_FMT is set
4580420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * correctly. */
4590420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_UNORM:
4600420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_SNORM:
4610420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_FLOAT:
4620420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16A16_UNORM:
4630420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16A16_SNORM:
464faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L16A16_FLOAT:
465ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R16A16_UNORM:
466ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R16A16_SNORM:
467ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R16A16_FLOAT:
4680420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A32_FLOAT:
4690420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L32_FLOAT:
470faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_I32_FLOAT:
4710420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R32_FLOAT:
4723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB8888;
47326a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák
474b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_R10G10B10A2_UNORM:
47526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R10G10B10X2_SNORM:
47626a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B10G10R10A2_UNORM:
47727e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_B10G10R10X2_UNORM:
4783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R500_COLOR_FORMAT_ARGB2101010;  /* R5xx-only? */
4793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4803c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 64-bit buffers. */
4813c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_UNORM:
4823c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_SNORM:
4832ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák        case PIPE_FORMAT_R16G16B16A16_FLOAT:
48427e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R16G16B16X16_UNORM:
48527e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R16G16B16X16_SNORM:
48627e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R16G16B16X16_FLOAT:
4870420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* These formats work fine with ARGB16161616 if US_OUT_FMT is set
4880420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * correctly. */
4890420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R32G32_FLOAT:
490faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L32A32_FLOAT:
491ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R32A32_FLOAT:
4923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB16161616;
4933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 128-bit buffers. */
4953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R32G32B32A32_FLOAT:
49627e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R32G32B32X32_FLOAT:
4973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB32323232;
4983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* YUV buffers. */
500b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_UYVY:
5013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_YVYU;
502b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_YUYV:
5033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_VYUY;
5043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        default:
5053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return ~0; /* Unsupported. */
5063c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
5073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
5083c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Depthbuffer and stencilbuffer. Thankfully, we only support two flavors. */
5103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_zsformat(enum pipe_format format)
5113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
5123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    switch (format) {
5133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 16-bit depth, no stencil */
5143c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_Z16_UNORM:
5153c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_DEPTHFORMAT_16BIT_INT_Z;
5163c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 24-bit depth, ignored stencil */
517b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_X8Z24_UNORM:
5183c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 24-bit depth, 8-bit stencil */
519866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie        case PIPE_FORMAT_S8_UINT_Z24_UNORM:
5203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
5213c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        default:
5223c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return ~0; /* Unsupported. */
5233c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
5243c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
5253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5263c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Shader output formats. This is essentially the swizzle from the shader
5273c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * to the RB3D block.
5283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák *
5293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * Note that formats are stored from C3 to C0. */
5303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_out_fmt(enum pipe_format format)
5313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
5323c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    uint32_t modifier = 0;
5333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    unsigned i;
5343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    const struct util_format_description *desc;
5350420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    boolean uniform_sign;
5363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5373c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    desc = util_format_description(format);
5383c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
53994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    /* Find the first non-VOID channel. */
54094e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    for (i = 0; i < 4; i++) {
54194e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
54294e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            break;
54394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        }
54494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    }
54594e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
54694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    if (i == 4)
54794e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        return ~0; /* Unsupported/unknown. */
54894e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
5493c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Specifies how the shader output is written to the fog unit. */
5500420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    switch (desc->channel[i].type) {
5510420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    case UTIL_FORMAT_TYPE_FLOAT:
5520420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        switch (desc->channel[i].size) {
5530420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case 32:
5540420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            switch (desc->nr_channels) {
5550420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 1:
5560420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C_32_FP;
5570420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5580420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 2:
5590420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C2_32_FP;
5600420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5610420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 4:
5620420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C4_32_FP;
5630420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5640420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            }
5650420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
5660420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
5670420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case 16:
5680420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            switch (desc->nr_channels) {
5690420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 1:
5700420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C_16_FP;
5710420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5720420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 2:
5730420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C2_16_FP;
5740420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5750420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 4:
5760420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C4_16_FP;
5770420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5780420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            }
5790420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
5803c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        }
5810420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        break;
5820420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
5830420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    default:
5840420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        switch (desc->channel[i].size) {
5850420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case 16:
5860420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            switch (desc->nr_channels) {
5870420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 1:
5880420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C_16;
5890420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5900420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 2:
5910420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C2_16;
5920420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5930420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 4:
5940420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C4_16;
5950420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5960420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            }
5970420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
5980420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
5990420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case 10:
600cb4f367b268b6fbedc6673b2c6e51d107e929370Marek Olšák            modifier |= R300_US_OUT_FMT_C4_10;
6010420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
6020420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6030420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        default:
6043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            /* C4_8 seems to be used for the formats whose pixel size
6053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák             * is <= 32 bits. */
6063c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            modifier |= R300_US_OUT_FMT_C4_8;
6070420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
6083c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        }
6093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
6103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
6113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Add sign. */
6120420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    uniform_sign = TRUE;
6130420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    for (i = 0; i < desc->nr_channels; i++)
6140420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        if (desc->channel[i].type != UTIL_FORMAT_TYPE_SIGNED)
6150420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            uniform_sign = FALSE;
6160420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6170420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    if (uniform_sign)
6180420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        modifier |= R300_OUT_SIGN(0xf);
6193c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
6203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Add swizzles and return. */
6213c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    switch (format) {
6220420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /*** Special cases (non-standard channel mapping) ***/
6230420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6240420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* X8
6250420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * COLORFORMAT_I8 stores the Z component (C2). */
6263c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_A8_UNORM:
6272e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_A8_SNORM:
6283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier | R300_C2_SEL_A;
6293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_I8_UNORM:
6302e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_I8_SNORM:
6313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_L8_UNORM:
6322e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_L8_SNORM:
6333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_UNORM:
6343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_SNORM:
6353c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier | R300_C2_SEL_R;
6363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
6370420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* X8Y8
6380420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * COLORFORMAT_UV88 stores ZX (C2 and C0). */
6392e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_L8A8_SNORM:
6408f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák        case PIPE_FORMAT_L8A8_UNORM:
641ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R8A8_SNORM:
642ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R8A8_UNORM:
6438f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák            return modifier | R300_C0_SEL_A | R300_C2_SEL_R;
644e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_SNORM:
6452e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_R8G8_UNORM:
646e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák            return modifier | R300_C0_SEL_G | R300_C2_SEL_R;
647e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák
6480420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* X32Y32
6490420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * ARGB16161616 stores XZ for RG32F */
6500420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R32G32_FLOAT:
6510420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            return modifier | R300_C0_SEL_R | R300_C2_SEL_G;
6520420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6530420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /*** Generic cases (standard channel mapping) ***/
6540420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
655f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* BGRA outputs. */
656b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G6R5_UNORM:
657b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G5R5A1_UNORM:
658f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        case PIPE_FORMAT_B5G5R5X1_UNORM:
659b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B4G4R4A4_UNORM:
66026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B4G4R4X4_UNORM:
661b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B8G8R8A8_UNORM:
66291eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
663b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B8G8R8X8_UNORM:
66491eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
66526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B10G10R10A2_UNORM:
66627e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_B10G10R10X2_UNORM:
6673c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
6683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_B | R300_C1_SEL_G |
6693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_R | R300_C3_SEL_A;
6703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
671f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* ARGB outputs. */
6720420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A16_UNORM:
6730420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A16_SNORM:
674faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_A16_FLOAT:
675faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_A32_FLOAT:
6763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
6773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_A | R300_C1_SEL_R |
6783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_G | R300_C3_SEL_B;
6793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
680f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* RGBA outputs. */
68126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R8G8B8X8_UNORM:
68227e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R8G8B8X8_SNORM:
68391eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        case PIPE_FORMAT_R8G8B8A8_UNORM:
684f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        case PIPE_FORMAT_R8G8B8A8_SNORM:
685b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_R10G10B10A2_UNORM:
68626a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R10G10B10X2_SNORM:
6870420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_UNORM:
6880420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_UNORM:
6893c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_UNORM:
6900420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_SNORM:
6910420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_SNORM:
6923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_SNORM:
6930420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_FLOAT:
6940420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_FLOAT:
6952ba0c64c26d3ec9b2806f577020d4fde826a858dMarek Olšák        case PIPE_FORMAT_R16G16B16A16_FLOAT:
6960420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R32_FLOAT:
6973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R32G32B32A32_FLOAT:
69827e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R32G32B32X32_FLOAT:
6990420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16_UNORM:
7000420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16_SNORM:
701faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L16_FLOAT:
702faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L32_FLOAT:
7030420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_I16_UNORM:
7040420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_I16_SNORM:
705faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_I16_FLOAT:
706faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_I32_FLOAT:
70727e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R16G16B16X16_UNORM:
70827e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R16G16B16X16_SNORM:
70927e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák        case PIPE_FORMAT_R16G16B16X16_FLOAT:
7103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
7113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_R | R300_C1_SEL_G |
7123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_B | R300_C3_SEL_A;
7133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
7140420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* LA outputs. */
7150420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16A16_UNORM:
7160420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16A16_SNORM:
717faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L16A16_FLOAT:
718ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R16A16_UNORM:
719ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R16A16_SNORM:
720ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R16A16_FLOAT:
721faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L32A32_FLOAT:
722ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák        case PIPE_FORMAT_R32A32_FLOAT:
7230420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            return modifier |
7240420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                R300_C0_SEL_R | R300_C1_SEL_A;
7250420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
7263c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        default:
7273c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return ~0; /* Unsupported. */
7283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
7293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
7303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
7311e51d368eb5360378218217ff35731896f48512fMarek Olšákstatic uint32_t r300_translate_colormask_swizzle(enum pipe_format format)
7321e51d368eb5360378218217ff35731896f48512fMarek Olšák{
7331e51d368eb5360378218217ff35731896f48512fMarek Olšák    switch (format) {
7341e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_A8_UNORM:
7351e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_A8_SNORM:
7361e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_A16_UNORM:
7371e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_A16_SNORM:
7381e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_A16_FLOAT:
7391e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_A32_FLOAT:
7401e51d368eb5360378218217ff35731896f48512fMarek Olšák        return COLORMASK_AAAA;
7411e51d368eb5360378218217ff35731896f48512fMarek Olšák
7421e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_I8_UNORM:
7431e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_I8_SNORM:
7441e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L8_UNORM:
7451e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L8_SNORM:
7461e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8_UNORM:
7471e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8_SNORM:
7481e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R32_FLOAT:
7491e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L32_FLOAT:
7501e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_I32_FLOAT:
7511e51d368eb5360378218217ff35731896f48512fMarek Olšák        return COLORMASK_RRRR;
7521e51d368eb5360378218217ff35731896f48512fMarek Olšák
7531e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L8A8_SNORM:
7541e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L8A8_UNORM:
755ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák    case PIPE_FORMAT_R8A8_UNORM:
756ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák    case PIPE_FORMAT_R8A8_SNORM:
7571e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L16A16_UNORM:
7581e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L16A16_SNORM:
7591e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L16A16_FLOAT:
760ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák    case PIPE_FORMAT_R16A16_UNORM:
761ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák    case PIPE_FORMAT_R16A16_SNORM:
762ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák    case PIPE_FORMAT_R16A16_FLOAT:
7631e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L32A32_FLOAT:
764ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák    case PIPE_FORMAT_R32A32_FLOAT:
7651e51d368eb5360378218217ff35731896f48512fMarek Olšák        return COLORMASK_ARRA;
7661e51d368eb5360378218217ff35731896f48512fMarek Olšák
7671e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8G8_SNORM:
7681e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8G8_UNORM:
7691e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16G16_UNORM:
7701e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16G16_SNORM:
7711e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16G16_FLOAT:
7721e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R32G32_FLOAT:
7731e51d368eb5360378218217ff35731896f48512fMarek Olšák        return COLORMASK_GRRG;
7741e51d368eb5360378218217ff35731896f48512fMarek Olšák
775499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák    case PIPE_FORMAT_B5G5R5X1_UNORM:
776499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák    case PIPE_FORMAT_B4G4R4X4_UNORM:
777499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák    case PIPE_FORMAT_B8G8R8X8_UNORM:
778499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák    /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
77927e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    case PIPE_FORMAT_B10G10R10X2_UNORM:
780499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák        return COLORMASK_BGRX;
781499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák
7821e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_B5G6R5_UNORM:
7831e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_B5G5R5A1_UNORM:
7841e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_B4G4R4A4_UNORM:
7851e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_B8G8R8A8_UNORM:
7861e51d368eb5360378218217ff35731896f48512fMarek Olšák    /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
7871e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_B10G10R10A2_UNORM:
7881e51d368eb5360378218217ff35731896f48512fMarek Olšák        return COLORMASK_BGRA;
7891e51d368eb5360378218217ff35731896f48512fMarek Olšák
7901e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8G8B8X8_UNORM:
79127e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    /* RGBX_SNORM formats are broken for an unknown reason */
7921e51d368eb5360378218217ff35731896f48512fMarek Olšák    /*case PIPE_FORMAT_R8G8B8X8_SNORM:*/
79327e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    /*case PIPE_FORMAT_R10G10B10X2_SNORM:*/
79427e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    case PIPE_FORMAT_R16G16B16X16_UNORM:
79527e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    /*case PIPE_FORMAT_R16G16B16X16_SNORM:*/
79627e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    case PIPE_FORMAT_R16G16B16X16_FLOAT:
79727e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák    case PIPE_FORMAT_R32G32B32X32_FLOAT:
798499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák        return COLORMASK_RGBX;
799499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák
8001e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8G8B8A8_UNORM:
8011e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R8G8B8A8_SNORM:
8021e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R10G10B10A2_UNORM:
8031e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16_UNORM:
8041e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16G16B16A16_UNORM:
8051e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16_SNORM:
8061e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16G16B16A16_SNORM:
8071e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16_FLOAT:
8081e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R16G16B16A16_FLOAT:
8091e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_R32G32B32A32_FLOAT:
8101e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L16_UNORM:
8111e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L16_SNORM:
8121e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_L16_FLOAT:
8131e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_I16_UNORM:
8141e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_I16_SNORM:
8151e51d368eb5360378218217ff35731896f48512fMarek Olšák    case PIPE_FORMAT_I16_FLOAT:
8161e51d368eb5360378218217ff35731896f48512fMarek Olšák        return COLORMASK_RGBA;
8171e51d368eb5360378218217ff35731896f48512fMarek Olšák
8181e51d368eb5360378218217ff35731896f48512fMarek Olšák    default:
8191e51d368eb5360378218217ff35731896f48512fMarek Olšák        return ~0; /* Unsupported. */
8201e51d368eb5360378218217ff35731896f48512fMarek Olšák    }
8211e51d368eb5360378218217ff35731896f48512fMarek Olšák}
8221e51d368eb5360378218217ff35731896f48512fMarek Olšák
8233c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_colorbuffer_format_supported(enum pipe_format format)
8243c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
8253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    return r300_translate_colorformat(format) != ~0 &&
8261e51d368eb5360378218217ff35731896f48512fMarek Olšák           r300_translate_out_fmt(format) != ~0 &&
8271e51d368eb5360378218217ff35731896f48512fMarek Olšák           r300_translate_colormask_swizzle(format) != ~0;
8283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
8293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
8303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_zs_format_supported(enum pipe_format format)
8313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
8323c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    return r300_translate_zsformat(format) != ~0;
8333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
8343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
8355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšákboolean r300_is_sampler_format_supported(enum pipe_format format)
8365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{
8376478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák    return r300_translate_texformat(format, 0, TRUE, FALSE) != ~0;
8385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák}
8395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
840c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšákvoid r300_texture_setup_format_state(struct r300_screen *screen,
84156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                     struct r300_resource *tex,
842ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                     enum pipe_format format,
843c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák                                     unsigned level,
844ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                     unsigned width0_override,
845ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                     unsigned height0_override,
846c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák                                     struct r300_texture_format_state *out)
8479d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson{
848a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    struct pipe_resource *pt = &tex->b.b;
84956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_texture_desc *desc = &tex->tex;
850b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák    boolean is_r500 = screen->caps.is_r500;
85110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    unsigned width, height, depth;
85210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    unsigned txwidth, txheight, txdepth;
85310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
854ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák    width = u_minify(width0_override, level);
855ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák    height = u_minify(height0_override, level);
85610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    depth = u_minify(desc->depth0, level);
85710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
85810ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    txwidth = (width - 1) & 0x7ff;
85910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    txheight = (height - 1) & 0x7ff;
86010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    txdepth = util_logbase2(depth) & 0xf;
8619d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
862c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    /* Mask out all the fields we change. */
863c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->format0 = 0;
864c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->format1 &= ~R300_TX_FORMAT_TEX_COORD_TYPE_MASK;
865c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->format2 &= R500_TXFORMAT_MSB;
866c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->tile_config = 0;
867c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák
8683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Set sampler state. */
86913359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák    out->format0 =
87010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        R300_TX_WIDTH(txwidth) |
87110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        R300_TX_HEIGHT(txheight) |
87210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        R300_TX_DEPTH(txdepth);
873827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák
874c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    if (desc->uses_stride_addressing) {
875ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        unsigned stride =
876ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák            r300_stride_to_width(format, desc->stride_in_bytes[level]);
877827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák        /* rectangles love this */
878c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format0 |= R300_TX_PITCH_EN;
879ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        out->format2 = (stride - 1) & 0x1fff;
880827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    }
8819d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
882eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    if (pt->target == PIPE_TEXTURE_CUBE) {
883c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format1 |= R300_TX_FORMAT_CUBIC_MAP;
884eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    }
885eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    if (pt->target == PIPE_TEXTURE_3D) {
886c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format1 |= R300_TX_FORMAT_3D;
887eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    }
8889d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
889827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    /* large textures on r500 */
890827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    if (is_r500)
891827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    {
89210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        unsigned us_width = txwidth;
89310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        unsigned us_height = txheight;
89410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        unsigned us_depth = txdepth;
89510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
89610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        if (width > 2048) {
897c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák            out->format2 |= R500_TXWIDTH_BIT11;
898827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák        }
89910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        if (height > 2048) {
900c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák            out->format2 |= R500_TXHEIGHT_BIT11;
901827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák        }
90210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
90310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        /* The US_FORMAT register fixes an R500 TX addressing bug.
90410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák         * Don't ask why it must be set like this. I don't know it either. */
90510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        if (width > 2048) {
90610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            us_width = (0x000007FF + us_width) >> 1;
90710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            us_depth |= 0x0000000D;
90810ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        }
90910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        if (height > 2048) {
91010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            us_height = (0x000007FF + us_height) >> 1;
91110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            us_depth |= 0x0000000E;
91210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        }
91310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
91410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        out->us_format0 =
91510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            R300_TX_WIDTH(us_width) |
91610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            R300_TX_HEIGHT(us_height) |
91710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            R300_TX_DEPTH(us_depth);
9181aa38b2c2d80b67fe2eefe468f90aeb44bc20259Corbin Simpson    }
9192cbd5ecfb666a757c4abef85dbe40fb53d647ec9Corbin Simpson
920c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->tile_config = R300_TXO_MACRO_TILE(desc->macrotile[level]) |
921c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák                       R300_TXO_MICRO_TILE(desc->microtile);
9221c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák}
9231c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák
924fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšákstatic void r300_texture_setup_fb_state(struct r300_surface *surf)
9251c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák{
92656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource *tex = r300_resource(surf->base.texture);
927fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák    unsigned level = surf->base.u.tex.level;
928ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák    unsigned stride =
929ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák      r300_stride_to_width(surf->base.format, tex->tex.stride_in_bytes[level]);
9303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
9313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Set framebuffer state. */
932fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák    if (util_format_is_depth_or_stencil(surf->base.format)) {
933fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->pitch =
934ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                stride |
93556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                R300_DEPTHMACROTILE(tex->tex.macrotile[level]) |
93656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                R300_DEPTHMICROTILE(tex->tex.microtile);
937fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->format = r300_translate_zsformat(surf->base.format);
938d99ec708afbb785ce05031661222b38c9447059fMarek Olšák        surf->pitch_zmask = tex->tex.zmask_stride_in_pixels[level];
939d99ec708afbb785ce05031661222b38c9447059fMarek Olšák        surf->pitch_hiz = tex->tex.hiz_stride_in_pixels[level];
9403c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    } else {
9419953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák        enum pipe_format format = util_format_linear(surf->base.format);
9429953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák
943fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->pitch =
944ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                stride |
9459953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák                r300_translate_colorformat(format) |
94656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                R300_COLOR_TILE(tex->tex.macrotile[level]) |
94756ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                R300_COLOR_MICROTILE(tex->tex.microtile);
9489953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák        surf->format = r300_translate_out_fmt(format);
9491e51d368eb5360378218217ff35731896f48512fMarek Olšák        surf->colormask_swizzle =
9509953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák            r300_translate_colormask_swizzle(format);
951ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák        surf->pitch_cmask = tex->tex.cmask_stride_in_pixels;
9523c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
9533cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle}
9543cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle
955287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic void r300_texture_destroy(struct pipe_screen *screen,
9564c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                 struct pipe_resource* texture)
957287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
958ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák    struct r300_screen *rscreen = r300_screen(screen);
95956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource* tex = (struct r300_resource*)texture;
960287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
961ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák    if (tex->tex.cmask_dwords) {
962ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák        pipe_mutex_lock(rscreen->cmask_mutex);
963ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák        if (texture == rscreen->cmask_resource) {
964ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák            rscreen->cmask_resource = NULL;
965ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák        }
966ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák        pipe_mutex_unlock(rscreen->cmask_mutex);
967ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák    }
968d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    pb_reference(&tex->buf, NULL);
969287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    FREE(tex);
970287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}
971287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
97256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšákboolean r300_resource_get_handle(struct pipe_screen* screen,
97356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                 struct pipe_resource *texture,
97482db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                                 struct winsys_handle *whandle,
97582db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                                 unsigned usage)
976287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
977e05bc52b9ccbbf0ca7fa25196c5137b35d2c5c2eMarek Olšák    struct radeon_winsys *rws = r300_screen(screen)->rws;
97856ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource* tex = (struct r300_resource*)texture;
979287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
980287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    if (!tex) {
981287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell        return FALSE;
982287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    }
983287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
9846ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák    return rws->buffer_get_handle(tex->buf,
98556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                  tex->tex.stride_in_bytes[0], whandle);
986287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}
987287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
988d17d03a8dccb4bad25211693320459420409d997Henri Verbeetstatic const struct u_resource_vtbl r300_texture_vtbl =
989287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
99056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    NULL,                           /* get_handle */
99156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    r300_texture_destroy,           /* resource_destroy */
99256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    r300_texture_transfer_map,      /* transfer_map */
99356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    NULL,                           /* transfer_flush_region */
99456ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    r300_texture_transfer_unmap,    /* transfer_unmap */
995a784d86508a4b609d12ca07986d43005ff2686aeMarek Olšák    NULL /* transfer_inline_write */
996287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell};
997287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
998d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák/* The common texture constructor. */
99956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšákstatic struct r300_resource*
1000d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákr300_texture_create_object(struct r300_screen *rscreen,
1001d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                           const struct pipe_resource *base,
1002d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák                           enum radeon_bo_layout microtile,
1003d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák                           enum radeon_bo_layout macrotile,
1004d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                           unsigned stride_in_bytes_override,
1005d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák                           struct pb_buffer *buffer)
10064ce26210842176c4b280b7db85639ced40d4083dMarek Olšák{
1007d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    struct radeon_winsys *rws = rscreen->rws;
1008e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    struct r300_resource *tex = NULL;
1009260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák    struct radeon_bo_metadata tiling = {};
1010e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák
1011e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    tex = CALLOC_STRUCT(r300_resource);
1012e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    if (!tex) {
1013e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák        goto fail;
1014e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    }
10156cd9159cea628c542d2233b54f6babb74e45f83cMarek Olšák
1016a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    pipe_reference_init(&tex->b.b.reference, 1);
1017a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.b.screen = &rscreen->screen;
1018a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.b.usage = base->usage;
1019a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.b.bind = base->bind;
1020a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.b.flags = base->flags;
1021a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.vtbl = &r300_texture_vtbl;
10227c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák    tex->tex.microtile = microtile;
10237c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák    tex->tex.macrotile[0] = macrotile;
10247c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák    tex->tex.stride_in_bytes_override = stride_in_bytes_override;
102574a17a764dc2ad20d9d6f56afee963b23b597132Marek Olšák    tex->domain = (base->flags & R300_RESOURCE_FLAG_TRANSFER ||
102674a17a764dc2ad20d9d6f56afee963b23b597132Marek Olšák                   base->usage == PIPE_USAGE_STAGING) ? RADEON_DOMAIN_GTT :
1027a06f03d795153ce060d99aafb61d10c27a47efc1Marek Olšák                  base->nr_samples > 1 ? RADEON_DOMAIN_VRAM :
1028a06f03d795153ce060d99aafb61d10c27a47efc1Marek Olšák                                         RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT;
10297b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák    tex->buf = buffer;
10307c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák
10312cd7e5b737e1384bb6d27f3cc2c8524b07230d56Marek Olšák    r300_texture_desc_init(rscreen, tex, base);
1032d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
10338ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    /* Figure out the ideal placement for the texture.. */
10348ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    if (tex->domain & RADEON_DOMAIN_VRAM &&
10358ad9d42b338c6684930b7898734f9070b6368172Marek Olšák        tex->tex.size_in_bytes >= rscreen->info.vram_size) {
10368ad9d42b338c6684930b7898734f9070b6368172Marek Olšák        tex->domain &= ~RADEON_DOMAIN_VRAM;
10378ad9d42b338c6684930b7898734f9070b6368172Marek Olšák        tex->domain |= RADEON_DOMAIN_GTT;
10388ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    }
10398ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    if (tex->domain & RADEON_DOMAIN_GTT &&
10408ad9d42b338c6684930b7898734f9070b6368172Marek Olšák        tex->tex.size_in_bytes >= rscreen->info.gart_size) {
10418ad9d42b338c6684930b7898734f9070b6368172Marek Olšák        tex->domain &= ~RADEON_DOMAIN_GTT;
10428ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    }
10438ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    /* Just fail if the texture is too large. */
10448ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    if (!tex->domain) {
10458ad9d42b338c6684930b7898734f9070b6368172Marek Olšák        goto fail;
10468ad9d42b338c6684930b7898734f9070b6368172Marek Olšák    }
10478ad9d42b338c6684930b7898734f9070b6368172Marek Olšák
1048d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Create the backing buffer if needed. */
10497b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák    if (!tex->buf) {
1050448cd5ea60403576c3eec86ffb2b892e78b9dfe0Marek Olšák        tex->buf = rws->buffer_create(rws, tex->tex.size_in_bytes, 2048, TRUE,
105107c65b85eada8dd34019763b6e82ed4257a9b4a6Michel Dänzer                                      tex->domain, 0);
1052d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1053ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        if (!tex->buf) {
1054e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák            goto fail;
1055d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        }
1056d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    }
1057d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1058f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák    if (SCREEN_DBG_ON(rscreen, DBG_MSAA) && base->nr_samples > 1) {
10592f89949b666889a61196657511b1dee4418ae865Marek Olšák        fprintf(stderr, "r300: %ix MSAA %s buffer created\n",
1060f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák                base->nr_samples,
1061f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák                util_format_is_depth_or_stencil(base->format) ? "depth" : "color");
1062f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák    }
1063f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák
1064260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák    tiling.microtile = tex->tex.microtile;
1065260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák    tiling.macrotile = tex->tex.macrotile[0];
1066260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák    tiling.stride = tex->tex.stride_in_bytes[0];
1067260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák    rws->buffer_set_tiling(tex->buf, NULL, &tiling);
1068d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1069d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    return tex;
1070e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák
1071e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšákfail:
1072e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    FREE(tex);
1073e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    if (buffer)
1074e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák        pb_reference(&buffer, NULL);
1075e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák    return NULL;
10764ce26210842176c4b280b7db85639ced40d4083dMarek Olšák}
10774ce26210842176c4b280b7db85639ced40d4083dMarek Olšák
10780648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson/* Create a new texture. */
1079d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákstruct pipe_resource *r300_texture_create(struct pipe_screen *screen,
1080d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                          const struct pipe_resource *base)
10810648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson{
1082d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    struct r300_screen *rscreen = r300_screen(screen);
1083d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    enum radeon_bo_layout microtile, macrotile;
10845cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák
1085d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if ((base->flags & R300_RESOURCE_FLAG_TRANSFER) ||
1086e8f9195e5fb34a45783d6491d2e0305a0b137439Axel Davy        (base->bind & (PIPE_BIND_SCANOUT | PIPE_BIND_LINEAR))) {
1087d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        microtile = RADEON_LAYOUT_LINEAR;
1088d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        macrotile = RADEON_LAYOUT_LINEAR;
1089d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    } else {
1090d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        /* This will make the texture_create_function select the layout. */
1091d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        microtile = RADEON_LAYOUT_UNKNOWN;
1092d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        macrotile = RADEON_LAYOUT_UNKNOWN;
1093b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák    }
10949d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
1095d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    return (struct pipe_resource*)
1096d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák           r300_texture_create_object(rscreen, base, microtile, macrotile,
10977b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák                                      0, NULL);
1098d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák}
1099d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1100d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákstruct pipe_resource *r300_texture_from_handle(struct pipe_screen *screen,
1101d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                               const struct pipe_resource *base,
110282db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                                               struct winsys_handle *whandle,
110382db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                                               unsigned usage)
1104d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák{
1105d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    struct r300_screen *rscreen = r300_screen(screen);
1106e05bc52b9ccbbf0ca7fa25196c5137b35d2c5c2eMarek Olšák    struct radeon_winsys *rws = rscreen->rws;
1107d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    struct pb_buffer *buffer;
11087b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák    unsigned stride;
1109260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák    struct radeon_bo_metadata tiling = {};
1110d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1111d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Support only 2D textures without mipmaps */
1112ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri    if ((base->target != PIPE_TEXTURE_2D &&
1113ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri          base->target != PIPE_TEXTURE_RECT) ||
1114d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        base->depth0 != 1 ||
1115d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        base->last_level != 0) {
1116d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        return NULL;
11174ce26210842176c4b280b7db85639ced40d4083dMarek Olšák    }
11180bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák
1119af8eb5c851a9d566059ae9e37745614cd96b9a13Marek Olšák    buffer = rws->buffer_from_handle(rws, whandle, &stride);
1120d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if (!buffer)
1121d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        return NULL;
112219498be935328e284c7f0e456fc04cca8d465d4cMarek Olšák
1123260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák    rws->buffer_get_tiling(buffer, &tiling);
112437f3454eb3afa1297126a8d77a563d734c292a37Marek Olšák
1125d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Enforce a microtiled zbuffer. */
1126d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if (util_format_is_depth_or_stencil(base->format) &&
1127260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák        tiling.microtile == RADEON_LAYOUT_LINEAR) {
1128d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        switch (util_format_get_blocksize(base->format)) {
1129d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            case 4:
1130260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák                tiling.microtile = RADEON_LAYOUT_TILED;
1131d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                break;
1132950be3fa3c22d67f3b80e7ed5d274d957f0bff93Marek Olšák
1133d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            case 2:
1134260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák                tiling.microtile = RADEON_LAYOUT_SQUARETILED;
1135d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                break;
1136d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        }
1137d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    }
11388e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson
1139d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    return (struct pipe_resource*)
1140260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák           r300_texture_create_object(rscreen, base, tiling.microtile, tiling.macrotile,
11417b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák                                      stride, buffer);
11428e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson}
11438e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson
1144287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file:
1145287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */
1146ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšákstruct pipe_surface* r300_create_surface_custom(struct pipe_context * ctx,
11474c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                         struct pipe_resource* texture,
1148ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                         const struct pipe_surface *surf_tmpl,
1149ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                         unsigned width0_override,
1150ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák					 unsigned height0_override)
1151471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{
115256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource* tex = r300_resource(texture);
11538874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák    struct r300_surface* surface = CALLOC_STRUCT(r300_surface);
11544c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    unsigned level = surf_tmpl->u.tex.level;
11554c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
11564c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer);
1157471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson
1158471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson    if (surface) {
1159d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        uint32_t offset, tile_height;
11608c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
11618874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        pipe_reference_init(&surface->base.reference, 1);
11628874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        pipe_resource_reference(&surface->base.texture, texture);
11634c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.context = ctx;
11644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.format = surf_tmpl->format;
1165ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        surface->base.width = u_minify(width0_override, level);
1166ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        surface->base.height = u_minify(height0_override, level);
11674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.u.tex.level = level;
11684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.u.tex.first_layer = surf_tmpl->u.tex.first_layer;
11694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.u.tex.last_layer = surf_tmpl->u.tex.last_layer;
11708874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák
1171ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        surface->buf = tex->buf;
1172cf811faeff1eaa1aef817ae45314cc3419c44222Marek Olšák        surface->buf = tex->buf;
1173347c00c46e9ecf858a8c21abf58a706b658b5b37Marek Olšák
117493f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák        /* Prefer VRAM if there are multiple domains to choose from. */
117593f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák        surface->domain = tex->domain;
117693f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák        if (surface->domain & RADEON_DOMAIN_VRAM)
117793f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák            surface->domain &= ~RADEON_DOMAIN_GTT;
117893f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák
117956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák        surface->offset = r300_texture_get_offset(tex, level,
11804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                                  surf_tmpl->u.tex.first_layer);
1181fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        r300_texture_setup_fb_state(surface);
11828c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
11838c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        /* Parameters for the CBZB clear. */
118456ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák        surface->cbzb_allowed = tex->tex.cbzb_allowed[level];
11858c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_width = align(surface->base.width, 64);
11868c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
11878c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        /* Height must be aligned to the size of a tile. */
1188ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        tile_height = r300_get_pixel_alignment(surface->base.format,
1189a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák                                               tex->b.b.nr_samples,
119056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                               tex->tex.microtile,
119156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                               tex->tex.macrotile[level],
1192d19b5cbd317620f3977e68fffb7a74793436b7e2Dave Airlie                                               DIM_HEIGHT, 0);
1193d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
11948c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_height = align((surface->base.height + 1) / 2,
11958c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák                                     tile_height);
11968c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
11978c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        /* Offset must be aligned to 2K and must point at the beginning
11988c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák         * of a scanline. */
1199d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        offset = surface->offset +
120056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                 tex->tex.stride_in_bytes[level] * surface->cbzb_height;
12018c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_midpoint_offset = offset & ~2047;
12028c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
12038c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_pitch = surface->pitch & 0x1ffffc;
12048c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
12058c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        if (util_format_get_blocksizebits(surface->base.format) == 32)
12068c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák            surface->cbzb_format = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
12078c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        else
12088c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák            surface->cbzb_format = R300_DEPTHFORMAT_16BIT_INT_Z;
12098c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
12104c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        DBG(r300_context(ctx), DBG_CBZB,
12114c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            "CBZB Allowed: %s, Dim: %ix%i, Misalignment: %i, Micro: %s, Macro: %s\n",
12124c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            surface->cbzb_allowed ? "YES" : " NO",
12134c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            surface->cbzb_width, surface->cbzb_height,
12144c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            offset & 2047,
121556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex->tex.microtile ? "YES" : " NO",
121656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex->tex.macrotile[level] ? "YES" : " NO");
1217471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson    }
1218471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson
12198874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák    return &surface->base;
1220471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson}
1221471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson
1222ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšákstruct pipe_surface* r300_create_surface(struct pipe_context * ctx,
1223ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                         struct pipe_resource* texture,
1224ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                         const struct pipe_surface *surf_tmpl)
1225ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák{
1226ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák    return r300_create_surface_custom(ctx, texture, surf_tmpl,
1227ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                      texture->width0,
1228ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                      texture->height0);
1229ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák}
1230ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák
1231287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file:
1232287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */
12334c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheideggervoid r300_surface_destroy(struct pipe_context *ctx, struct pipe_surface* s)
1234471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{
1235287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    pipe_resource_reference(&s->texture, NULL);
12365e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer    FREE(s);
1237471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson}
1238