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. */
172b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák    if (format != PIPE_FORMAT_RGTC1_SNORM &&
173b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák        format != PIPE_FORMAT_LATC1_SNORM) {
174b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák        if (util_format_is_compressed(format) &&
175b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák            dxtc_swizzle &&
176b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák            format != PIPE_FORMAT_RGTC2_UNORM &&
177b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák            format != PIPE_FORMAT_RGTC2_SNORM &&
178b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák            format != PIPE_FORMAT_LATC2_UNORM &&
179b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák            format != PIPE_FORMAT_LATC2_SNORM) {
180b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák            result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view,
181b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák                                                TRUE);
182b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák        } else {
183b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák            result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view,
184b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák                                                FALSE);
185b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák        }
1867a61957424a457f416d20c2b366232fb4bbc7761Marek Olšák    }
1875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1883252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    /* S3TC formats. */
18928cf5e1191077e063fe2a81d9d35934b71d001e2José Fonseca    if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
19088512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák        if (!util_format_s3tc_enabled) {
19188512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák            return ~0; /* Unsupported. */
19288512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák        }
19388512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák
1945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        switch (format) {
1955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_RGB:
1965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_RGBA:
1975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_SRGB:
1985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_SRGBA:
1995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return R300_TX_FORMAT_DXT1 | result;
2005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT3_RGBA:
2015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT3_SRGBA:
2025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return R300_TX_FORMAT_DXT3 | result;
2035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT5_RGBA:
2045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT5_SRGBA:
2055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return R300_TX_FORMAT_DXT5 | result;
2065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            default:
2075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return ~0; /* Unsupported/unknown. */
2085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        }
2095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
2105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2113252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    /* RGTC formats. */
2123252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) {
2133252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        switch (format) {
2143252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            case PIPE_FORMAT_RGTC1_SNORM:
2155ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák            case PIPE_FORMAT_LATC1_SNORM:
2165ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák            case PIPE_FORMAT_LATC1_UNORM:
21779ad6f5375253faff89bbc7eb6dc5949ba63e0efDave Airlie            case PIPE_FORMAT_RGTC1_UNORM:
2183252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák                return R500_TX_FORMAT_ATI1N | result;
2195ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák
2203252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            case PIPE_FORMAT_RGTC2_SNORM:
2215ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák            case PIPE_FORMAT_LATC2_SNORM:
2222e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák                result |= sign_bit[1] | sign_bit[0];
22379ad6f5375253faff89bbc7eb6dc5949ba63e0efDave Airlie            case PIPE_FORMAT_RGTC2_UNORM:
2245ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák            case PIPE_FORMAT_LATC2_UNORM:
2253252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák                return R400_TX_FORMAT_ATI2N | result;
2265ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák
2273252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            default:
2283252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák                return ~0; /* Unsupported/unknown. */
2293252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        }
2303252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    }
2313252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák
23266d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    /* This is truly a special format.
23366d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák     * It stores R8G8 and B is computed using sqrt(1 - R^2 - G^2)
23466d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák     * in the sampler unit. Also known as D3DFMT_CxV8U8. */
23566d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    if (format == PIPE_FORMAT_R8G8Bx_SNORM) {
23666d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák        return R300_TX_FORMAT_CxV8U8 | result;
23766d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    }
23866d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák
2394298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák    /* Integer and fixed-point 16.16 textures are not supported. */
2404298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák    for (i = 0; i < 4; i++) {
2414298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák        if (desc->channel[i].type == UTIL_FORMAT_TYPE_FIXED ||
2424298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák            ((desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED ||
2434298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák              desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) &&
2444298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák             (!desc->channel[i].normalized ||
2454298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák              desc->channel[i].pure_integer))) {
2464298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák            return ~0; /* Unsupported/unknown. */
2474298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák        }
2484298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák    }
2494298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák
25066d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    /* Add sign. */
25166d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    for (i = 0; i < desc->nr_channels; i++) {
25266d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák        if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
25366d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák            result |= sign_bit[i];
25466d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák        }
25566d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák    }
25666d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák
2575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* See whether the components are of the same size. */
25839e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák    for (i = 1; i < desc->nr_channels; i++) {
2595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        uniform = uniform && desc->channel[0].size == desc->channel[i].size;
2605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
2615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* Non-uniform formats. */
2635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    if (!uniform) {
26439e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák        switch (desc->nr_channels) {
2655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case 3:
2665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 5 &&
2675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 6 &&
2685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 5) {
2695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_Z5Y6X5 | result;
2705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
2715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 5 &&
2725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 5 &&
2735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 6) {
2745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_Z6Y5X5 | result;
2755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
276c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                if (desc->channel[0].size == 2 &&
277c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                    desc->channel[1].size == 3 &&
278c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                    desc->channel[2].size == 3) {
279c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                    return R300_TX_FORMAT_Z3Y3X2 | result;
280c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                }
2815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return ~0; /* Unsupported/unknown. */
2825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2835c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case 4:
2845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 5 &&
2855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 5 &&
2865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 5 &&
2875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[3].size == 1) {
2885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_W1Z5Y5X5 | result;
2895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
2905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 10 &&
2915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 10 &&
2925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 10 &&
2935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[3].size == 2) {
2945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_W2Z10Y10X10 | result;
2955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
2965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        }
2975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        return ~0; /* Unsupported/unknown. */
2985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
2995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
30094e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    /* Find the first non-VOID channel. */
30194e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    for (i = 0; i < 4; i++) {
30294e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
30394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            break;
30494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        }
30594e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    }
30694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
30794e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    if (i == 4)
30894e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        return ~0; /* Unsupported/unknown. */
30994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
3105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* And finally, uniform formats. */
31194e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    switch (desc->channel[i].type) {
3125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_TYPE_UNSIGNED:
3135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_TYPE_SIGNED:
31494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            if (!desc->channel[i].normalized &&
3155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) {
3165c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return ~0;
3175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
3185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
31994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            switch (desc->channel[i].size) {
3205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 4:
32139e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3235c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_Y4X4 | result;
3245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_W4Z4Y4X4 | result;
3265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0;
3285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 8:
33039e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_X8 | result;
3335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_Y8X8 | result;
3355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_W8Z8Y8X8 | result;
3375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0;
3395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 16:
34139e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_X16 | result;
3445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_Y16X16 | result;
3465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_W16Z16Y16X16 | result;
3485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
3505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            return ~0;
3515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3525c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_TYPE_FLOAT:
35394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            switch (desc->channel[i].size) {
3545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 16:
35539e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_16F | result;
3585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_16F_16F | result;
3605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_16F_16F_16F_16F | result;
3625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0;
3645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 32:
36639e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_32F | result;
3695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_32F_32F | result;
3715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_32F_32F_32F_32F | result;
3735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
3755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
3765c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    return ~0; /* Unsupported/unknown. */
3785c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák}
3795c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3801c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r500_tx_format_msb_bit(enum pipe_format format)
3813252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák{
3823252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    switch (format) {
3833252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        case PIPE_FORMAT_RGTC1_UNORM:
3843252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        case PIPE_FORMAT_RGTC1_SNORM:
3855ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák        case PIPE_FORMAT_LATC1_UNORM:
3865ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák        case PIPE_FORMAT_LATC1_SNORM:
387b4483823d9c1205fb9ab8cf5b4c36ee610347a36Marek Olšák        case PIPE_FORMAT_X8Z24_UNORM:
388866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie        case PIPE_FORMAT_S8_UINT_Z24_UNORM:
3893252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            return R500_TXFORMAT_MSB;
3903252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        default:
3913252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            return 0;
3923252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    }
3933252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák}
3943252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák
3953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Buffer formats. */
3963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
3973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Colorbuffer formats. This is the unswizzled format of the RB3D block's
3983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * output. For the swizzling of the targets, check the shader's format. */
3993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_colorformat(enum pipe_format format)
4003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
4013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    switch (format) {
4023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 8-bit buffers. */
4033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_A8_UNORM:
4042e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_A8_SNORM:
4053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_I8_UNORM:
4062e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_I8_SNORM:
4073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_L8_UNORM:
4082e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_L8_SNORM:
4093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_UNORM:
4103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_SNORM:
4113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_I8;
4123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 16-bit buffers. */
4148f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák        case PIPE_FORMAT_L8A8_UNORM:
4152e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_L8A8_SNORM:
416e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_UNORM:
417e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_SNORM:
4180420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* These formats work fine with UV88 if US_OUT_FMT is set correctly. */
4190420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A16_UNORM:
4200420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A16_SNORM:
421faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_A16_FLOAT:
4220420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16_UNORM:
4230420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16_SNORM:
424faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L16_FLOAT:
4250420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_I16_UNORM:
4260420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_I16_SNORM:
427faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_I16_FLOAT:
4280420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_UNORM:
4290420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_SNORM:
4300420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_FLOAT:
431e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák            return R300_COLOR_FORMAT_UV88;
432e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák
433b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G6R5_UNORM:
4343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_RGB565;
43526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák
436b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G5R5A1_UNORM:
437f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        case PIPE_FORMAT_B5G5R5X1_UNORM:
4383c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB1555;
43926a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák
440b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B4G4R4A4_UNORM:
44126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B4G4R4X4_UNORM:
4423c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB4444;
4433c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4443c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 32-bit buffers. */
4453c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_B8G8R8A8_UNORM:
44691eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
4473c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_B8G8R8X8_UNORM:
44891eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
44991eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        case PIPE_FORMAT_R8G8B8A8_UNORM:
4503c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8G8B8A8_SNORM:
45126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R8G8B8X8_UNORM:
45291eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_R8G8B8X8_SNORM:*/
4530420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* These formats work fine with ARGB8888 if US_OUT_FMT is set
4540420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * correctly. */
4550420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_UNORM:
4560420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_SNORM:
4570420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_FLOAT:
4580420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16A16_UNORM:
4590420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16A16_SNORM:
460faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L16A16_FLOAT:
4610420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A32_FLOAT:
4620420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L32_FLOAT:
463faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_I32_FLOAT:
4640420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R32_FLOAT:
4653c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB8888;
46626a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák
467b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_R10G10B10A2_UNORM:
46826a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R10G10B10X2_SNORM:
46926a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B10G10R10A2_UNORM:
4703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R500_COLOR_FORMAT_ARGB2101010;  /* R5xx-only? */
4713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 64-bit buffers. */
4733c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_UNORM:
4743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_SNORM:
4752ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák        case PIPE_FORMAT_R16G16B16A16_FLOAT:
4760420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* These formats work fine with ARGB16161616 if US_OUT_FMT is set
4770420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * correctly. */
4780420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R32G32_FLOAT:
479faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L32A32_FLOAT:
4803c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB16161616;
4813c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4823c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 128-bit buffers. */
4833c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R32G32B32A32_FLOAT:
4843c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB32323232;
4853c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4863c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* YUV buffers. */
487b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_UYVY:
4883c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_YVYU;
489b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_YUYV:
4903c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_VYUY;
4913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        default:
4923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return ~0; /* Unsupported. */
4933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
4943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
4953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Depthbuffer and stencilbuffer. Thankfully, we only support two flavors. */
4973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_zsformat(enum pipe_format format)
4983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
4993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    switch (format) {
5003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 16-bit depth, no stencil */
5013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_Z16_UNORM:
5023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_DEPTHFORMAT_16BIT_INT_Z;
5033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 24-bit depth, ignored stencil */
504b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_X8Z24_UNORM:
5053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 24-bit depth, 8-bit stencil */
506866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie        case PIPE_FORMAT_S8_UINT_Z24_UNORM:
5073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
5083c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        default:
5093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return ~0; /* Unsupported. */
5103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
5113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
5123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Shader output formats. This is essentially the swizzle from the shader
5143c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * to the RB3D block.
5153c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák *
5163c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * Note that formats are stored from C3 to C0. */
5173c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_out_fmt(enum pipe_format format)
5183c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
5193c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    uint32_t modifier = 0;
5203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    unsigned i;
5213c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    const struct util_format_description *desc;
5220420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    boolean uniform_sign;
5233c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5243c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    desc = util_format_description(format);
5253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
52694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    /* Find the first non-VOID channel. */
52794e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    for (i = 0; i < 4; i++) {
52894e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
52994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            break;
53094e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        }
53194e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    }
53294e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
53394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    if (i == 4)
53494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        return ~0; /* Unsupported/unknown. */
53594e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
5363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Specifies how the shader output is written to the fog unit. */
5370420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    switch (desc->channel[i].type) {
5380420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    case UTIL_FORMAT_TYPE_FLOAT:
5390420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        switch (desc->channel[i].size) {
5400420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case 32:
5410420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            switch (desc->nr_channels) {
5420420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 1:
5430420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C_32_FP;
5440420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5450420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 2:
5460420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C2_32_FP;
5470420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5480420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 4:
5490420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C4_32_FP;
5500420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5510420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            }
5520420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
5530420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
5540420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case 16:
5550420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            switch (desc->nr_channels) {
5560420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 1:
5570420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C_16_FP;
5580420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5590420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 2:
5600420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C2_16_FP;
5610420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5620420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 4:
5630420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C4_16_FP;
5640420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5650420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            }
5660420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
5673c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        }
5680420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        break;
5690420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
5700420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    default:
5710420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        switch (desc->channel[i].size) {
5720420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case 16:
5730420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            switch (desc->nr_channels) {
5740420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 1:
5750420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C_16;
5760420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5770420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 2:
5780420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C2_16;
5790420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5800420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            case 4:
5810420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                modifier |= R300_US_OUT_FMT_C4_16;
5820420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                break;
5830420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            }
5840420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
5850420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
5860420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case 10:
587cb4f367b268b6fbedc6673b2c6e51d107e929370Marek Olšák            modifier |= R300_US_OUT_FMT_C4_10;
5880420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
5890420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
5900420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        default:
5913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            /* C4_8 seems to be used for the formats whose pixel size
5923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák             * is <= 32 bits. */
5933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            modifier |= R300_US_OUT_FMT_C4_8;
5940420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            break;
5953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        }
5963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
5973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Add sign. */
5990420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    uniform_sign = TRUE;
6000420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    for (i = 0; i < desc->nr_channels; i++)
6010420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        if (desc->channel[i].type != UTIL_FORMAT_TYPE_SIGNED)
6020420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            uniform_sign = FALSE;
6030420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6040420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák    if (uniform_sign)
6050420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        modifier |= R300_OUT_SIGN(0xf);
6063c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
6073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Add swizzles and return. */
6083c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    switch (format) {
6090420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /*** Special cases (non-standard channel mapping) ***/
6100420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6110420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* X8
6120420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * COLORFORMAT_I8 stores the Z component (C2). */
6133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_A8_UNORM:
6142e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_A8_SNORM:
6153c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier | R300_C2_SEL_A;
6163c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_I8_UNORM:
6172e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_I8_SNORM:
6183c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_L8_UNORM:
6192e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_L8_SNORM:
6203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_UNORM:
6213c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_SNORM:
6223c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier | R300_C2_SEL_R;
6233c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
6240420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* X8Y8
6250420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * COLORFORMAT_UV88 stores ZX (C2 and C0). */
6262e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_L8A8_SNORM:
6278f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák        case PIPE_FORMAT_L8A8_UNORM:
6288f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák            return modifier | R300_C0_SEL_A | R300_C2_SEL_R;
629e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_SNORM:
6302e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák        case PIPE_FORMAT_R8G8_UNORM:
631e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák            return modifier | R300_C0_SEL_G | R300_C2_SEL_R;
632e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák
6330420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* X32Y32
6340420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák         * ARGB16161616 stores XZ for RG32F */
6350420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R32G32_FLOAT:
6360420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            return modifier | R300_C0_SEL_R | R300_C2_SEL_G;
6370420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
6380420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /*** Generic cases (standard channel mapping) ***/
6390420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
640f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* BGRA outputs. */
641b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G6R5_UNORM:
642b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G5R5A1_UNORM:
643f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        case PIPE_FORMAT_B5G5R5X1_UNORM:
644b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B4G4R4A4_UNORM:
64526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B4G4R4X4_UNORM:
646b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B8G8R8A8_UNORM:
64791eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
648b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B8G8R8X8_UNORM:
64991eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
65026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B10G10R10A2_UNORM:
6513c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
6523c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_B | R300_C1_SEL_G |
6533c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_R | R300_C3_SEL_A;
6543c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
655f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* ARGB outputs. */
6560420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A16_UNORM:
6570420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_A16_SNORM:
658faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_A16_FLOAT:
659faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_A32_FLOAT:
6603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
6613c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_A | R300_C1_SEL_R |
6623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_G | R300_C3_SEL_B;
6633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
664f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* RGBA outputs. */
66526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R8G8B8X8_UNORM:
66691eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_R8G8B8X8_SNORM:*/
66791eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        case PIPE_FORMAT_R8G8B8A8_UNORM:
668f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        case PIPE_FORMAT_R8G8B8A8_SNORM:
669b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_R10G10B10A2_UNORM:
67026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R10G10B10X2_SNORM:
6710420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_UNORM:
6720420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_UNORM:
6733c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_UNORM:
6740420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_SNORM:
6750420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_SNORM:
6763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_SNORM:
6770420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16_FLOAT:
6780420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R16G16_FLOAT:
6792ba0c64c26d3ec9b2806f577020d4fde826a858dMarek Olšák        case PIPE_FORMAT_R16G16B16A16_FLOAT:
6800420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_R32_FLOAT:
6813c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R32G32B32A32_FLOAT:
6820420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16_UNORM:
6830420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16_SNORM:
684faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L16_FLOAT:
685faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L32_FLOAT:
6860420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_I16_UNORM:
6870420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_I16_SNORM:
688faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_I16_FLOAT:
689faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_I32_FLOAT:
6903c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
6913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_R | R300_C1_SEL_G |
6923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_B | R300_C3_SEL_A;
6933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
6940420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        /* LA outputs. */
6950420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16A16_UNORM:
6960420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák        case PIPE_FORMAT_L16A16_SNORM:
697faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L16A16_FLOAT:
698faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák        case PIPE_FORMAT_L32A32_FLOAT:
6990420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák            return modifier |
7000420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák                R300_C0_SEL_R | R300_C1_SEL_A;
7010420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák
7023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        default:
7033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return ~0; /* Unsupported. */
7043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
7053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
7063c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
707e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšákstatic uint32_t r300_translate_colormask_swizzle(enum pipe_format format)
708e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák{
709e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    switch (format) {
710e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_A8_UNORM:
711e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_A8_SNORM:
712e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_A16_UNORM:
713e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_A16_SNORM:
714e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_A16_FLOAT:
715e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_A32_FLOAT:
716e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák        return COLORMASK_AAAA;
717e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák
718e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_I8_UNORM:
719e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_I8_SNORM:
720e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_L8_UNORM:
721e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_L8_SNORM:
722e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R8_UNORM:
723e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R8_SNORM:
724e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R32_FLOAT:
725e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_L32_FLOAT:
726e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_I32_FLOAT:
727e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák        return COLORMASK_RRRR;
728e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák
729e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_L8A8_SNORM:
730e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_L8A8_UNORM:
731e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_L16A16_UNORM:
732e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_L16A16_SNORM:
733e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_L16A16_FLOAT:
734e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_L32A32_FLOAT:
735e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák        return COLORMASK_ARRA;
736e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák
737e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R8G8_SNORM:
738e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R8G8_UNORM:
739e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R16G16_UNORM:
740e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R16G16_SNORM:
741e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R16G16_FLOAT:
742e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R32G32_FLOAT:
743e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák        return COLORMASK_GRRG;
744e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák
745e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_B5G6R5_UNORM:
746e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_B5G5R5A1_UNORM:
747e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_B5G5R5X1_UNORM:
748e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_B4G4R4A4_UNORM:
749e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_B4G4R4X4_UNORM:
750e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_B8G8R8A8_UNORM:
751e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
752e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_B8G8R8X8_UNORM:
753e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
754e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_B10G10R10A2_UNORM:
755e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák        return COLORMASK_BGRA;
756e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák
757e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R8G8B8X8_UNORM:
758e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    /*case PIPE_FORMAT_R8G8B8X8_SNORM:*/
759e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R8G8B8A8_UNORM:
760e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R8G8B8A8_SNORM:
761e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R10G10B10A2_UNORM:
762e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R10G10B10X2_SNORM:
763e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R16_UNORM:
764e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R16G16B16A16_UNORM:
765e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R16_SNORM:
766e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R16G16B16A16_SNORM:
767e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R16_FLOAT:
768e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R16G16B16A16_FLOAT:
769e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_R32G32B32A32_FLOAT:
770e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_L16_UNORM:
771e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_L16_SNORM:
772e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_L16_FLOAT:
773e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_I16_UNORM:
774e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_I16_SNORM:
775e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    case PIPE_FORMAT_I16_FLOAT:
776e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák        return COLORMASK_RGBA;
777e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák
778e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    default:
779e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák        return ~0; /* Unsupported. */
780e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák    }
781e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák}
782e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák
7833c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_colorbuffer_format_supported(enum pipe_format format)
7843c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
7853c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    return r300_translate_colorformat(format) != ~0 &&
786e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák           r300_translate_out_fmt(format) != ~0 &&
787e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák           r300_translate_colormask_swizzle(format) != ~0;
7883c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
7893c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
7903c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_zs_format_supported(enum pipe_format format)
7913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
7923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    return r300_translate_zsformat(format) != ~0;
7933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
7943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
7955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšákboolean r300_is_sampler_format_supported(enum pipe_format format)
7965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{
7976478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák    return r300_translate_texformat(format, 0, TRUE, FALSE) != ~0;
7985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák}
7995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
800c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšákvoid r300_texture_setup_format_state(struct r300_screen *screen,
80156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                     struct r300_resource *tex,
802ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                     enum pipe_format format,
803c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák                                     unsigned level,
804ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                     unsigned width0_override,
805ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                     unsigned height0_override,
806c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák                                     struct r300_texture_format_state *out)
8079d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson{
808a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    struct pipe_resource *pt = &tex->b.b;
80956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_texture_desc *desc = &tex->tex;
810b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák    boolean is_r500 = screen->caps.is_r500;
81110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    unsigned width, height, depth;
81210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    unsigned txwidth, txheight, txdepth;
81310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
814ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák    width = u_minify(width0_override, level);
815ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák    height = u_minify(height0_override, level);
81610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    depth = u_minify(desc->depth0, level);
81710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
81810ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    txwidth = (width - 1) & 0x7ff;
81910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    txheight = (height - 1) & 0x7ff;
82010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    txdepth = util_logbase2(depth) & 0xf;
8219d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
822c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    /* Mask out all the fields we change. */
823c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->format0 = 0;
824c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->format1 &= ~R300_TX_FORMAT_TEX_COORD_TYPE_MASK;
825c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->format2 &= R500_TXFORMAT_MSB;
826c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->tile_config = 0;
827c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák
8283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Set sampler state. */
82913359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák    out->format0 =
83010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        R300_TX_WIDTH(txwidth) |
83110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        R300_TX_HEIGHT(txheight) |
83210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        R300_TX_DEPTH(txdepth);
833827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák
834c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    if (desc->uses_stride_addressing) {
835ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        unsigned stride =
836ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák            r300_stride_to_width(format, desc->stride_in_bytes[level]);
837827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák        /* rectangles love this */
838c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format0 |= R300_TX_PITCH_EN;
839ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        out->format2 = (stride - 1) & 0x1fff;
840827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    }
8419d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
842eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    if (pt->target == PIPE_TEXTURE_CUBE) {
843c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format1 |= R300_TX_FORMAT_CUBIC_MAP;
844eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    }
845eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    if (pt->target == PIPE_TEXTURE_3D) {
846c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format1 |= R300_TX_FORMAT_3D;
847eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    }
8489d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
849827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    /* large textures on r500 */
850827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    if (is_r500)
851827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    {
85210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        unsigned us_width = txwidth;
85310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        unsigned us_height = txheight;
85410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        unsigned us_depth = txdepth;
85510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
85610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        if (width > 2048) {
857c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák            out->format2 |= R500_TXWIDTH_BIT11;
858827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák        }
85910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        if (height > 2048) {
860c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák            out->format2 |= R500_TXHEIGHT_BIT11;
861827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák        }
86210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
86310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        /* The US_FORMAT register fixes an R500 TX addressing bug.
86410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák         * Don't ask why it must be set like this. I don't know it either. */
86510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        if (width > 2048) {
86610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            us_width = (0x000007FF + us_width) >> 1;
86710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            us_depth |= 0x0000000D;
86810ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        }
86910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        if (height > 2048) {
87010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            us_height = (0x000007FF + us_height) >> 1;
87110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            us_depth |= 0x0000000E;
87210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        }
87310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
87410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák        out->us_format0 =
87510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            R300_TX_WIDTH(us_width) |
87610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            R300_TX_HEIGHT(us_height) |
87710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            R300_TX_DEPTH(us_depth);
8781aa38b2c2d80b67fe2eefe468f90aeb44bc20259Corbin Simpson    }
8792cbd5ecfb666a757c4abef85dbe40fb53d647ec9Corbin Simpson
880c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->tile_config = R300_TXO_MACRO_TILE(desc->macrotile[level]) |
881c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák                       R300_TXO_MICRO_TILE(desc->microtile);
8821c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák}
8831c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák
884fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšákstatic void r300_texture_setup_fb_state(struct r300_surface *surf)
8851c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák{
88656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource *tex = r300_resource(surf->base.texture);
887fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák    unsigned level = surf->base.u.tex.level;
888ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák    unsigned stride =
889ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák      r300_stride_to_width(surf->base.format, tex->tex.stride_in_bytes[level]);
8903c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
8913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Set framebuffer state. */
892fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák    if (util_format_is_depth_or_stencil(surf->base.format)) {
893fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->pitch =
894ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                stride |
89556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                R300_DEPTHMACROTILE(tex->tex.macrotile[level]) |
89656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                R300_DEPTHMICROTILE(tex->tex.microtile);
897fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->format = r300_translate_zsformat(surf->base.format);
898d99ec708afbb785ce05031661222b38c9447059fMarek Olšák        surf->pitch_zmask = tex->tex.zmask_stride_in_pixels[level];
899d99ec708afbb785ce05031661222b38c9447059fMarek Olšák        surf->pitch_hiz = tex->tex.hiz_stride_in_pixels[level];
9003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    } else {
901fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->pitch =
902ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                stride |
903fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák                r300_translate_colorformat(surf->base.format) |
90456ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                R300_COLOR_TILE(tex->tex.macrotile[level]) |
90556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                R300_COLOR_MICROTILE(tex->tex.microtile);
906fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->format = r300_translate_out_fmt(surf->base.format);
907e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák        surf->colormask_swizzle =
908e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák            r300_translate_colormask_swizzle(surf->base.format);
9093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
9103cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle}
9113cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle
912287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic void r300_texture_destroy(struct pipe_screen *screen,
9134c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                 struct pipe_resource* texture)
914287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
91556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource* tex = (struct r300_resource*)texture;
916287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
917d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    pb_reference(&tex->buf, NULL);
918287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    FREE(tex);
919287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}
920287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
92156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšákboolean r300_resource_get_handle(struct pipe_screen* screen,
92256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                 struct pipe_resource *texture,
92356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                 struct winsys_handle *whandle)
924287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
925e05bc52b9ccbbf0ca7fa25196c5137b35d2c5c2eMarek Olšák    struct radeon_winsys *rws = r300_screen(screen)->rws;
92656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource* tex = (struct r300_resource*)texture;
927287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
928287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    if (!tex) {
929287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell        return FALSE;
930287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    }
931287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
9326ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák    return rws->buffer_get_handle(tex->buf,
93356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                  tex->tex.stride_in_bytes[0], whandle);
934287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}
935287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
936d17d03a8dccb4bad25211693320459420409d997Henri Verbeetstatic const struct u_resource_vtbl r300_texture_vtbl =
937287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
93856ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    NULL,                           /* get_handle */
93956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    r300_texture_destroy,           /* resource_destroy */
94056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    r300_texture_get_transfer,      /* get_transfer */
94156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    r300_texture_transfer_destroy,  /* transfer_destroy */
94256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    r300_texture_transfer_map,      /* transfer_map */
94356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    NULL,                           /* transfer_flush_region */
94456ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    r300_texture_transfer_unmap,    /* transfer_unmap */
945a784d86508a4b609d12ca07986d43005ff2686aeMarek Olšák    NULL /* transfer_inline_write */
946287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell};
947287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
948d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák/* The common texture constructor. */
94956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšákstatic struct r300_resource*
950d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákr300_texture_create_object(struct r300_screen *rscreen,
951d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                           const struct pipe_resource *base,
952d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák                           enum radeon_bo_layout microtile,
953d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák                           enum radeon_bo_layout macrotile,
954d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                           unsigned stride_in_bytes_override,
955d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák                           struct pb_buffer *buffer)
9564ce26210842176c4b280b7db85639ced40d4083dMarek Olšák{
957d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    struct radeon_winsys *rws = rscreen->rws;
95856ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource *tex = CALLOC_STRUCT(r300_resource);
959d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if (!tex) {
960d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        if (buffer)
961d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák            pb_reference(&buffer, NULL);
962d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        return NULL;
963d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    }
964d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
9656cd9159cea628c542d2233b54f6babb74e45f83cMarek Olšák    if (base->nr_samples > 1)
9666cd9159cea628c542d2233b54f6babb74e45f83cMarek Olšák        return NULL;
9676cd9159cea628c542d2233b54f6babb74e45f83cMarek Olšák
968a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    pipe_reference_init(&tex->b.b.reference, 1);
969a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.b.screen = &rscreen->screen;
970a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.b.usage = base->usage;
971a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.b.bind = base->bind;
972a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.b.flags = base->flags;
973a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák    tex->b.vtbl = &r300_texture_vtbl;
9747c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák    tex->tex.microtile = microtile;
9757c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák    tex->tex.macrotile[0] = macrotile;
9767c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák    tex->tex.stride_in_bytes_override = stride_in_bytes_override;
97793f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák    tex->domain = base->flags & R300_RESOURCE_FLAG_TRANSFER ?
97893f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                  RADEON_DOMAIN_GTT :
97993f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                  RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT;
9807b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák    tex->buf = buffer;
9817c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák
9822cd7e5b737e1384bb6d27f3cc2c8524b07230d56Marek Olšák    r300_texture_desc_init(rscreen, tex, base);
983d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
984d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Create the backing buffer if needed. */
9857b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák    if (!tex->buf) {
98656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák        tex->buf = rws->buffer_create(rws, tex->tex.size_in_bytes, 2048,
98793f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                      base->bind, tex->domain);
988d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
989ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        if (!tex->buf) {
990d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            FREE(tex);
991d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            return NULL;
992d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        }
993d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    }
994d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
9956ccab620a0e7364ab6c0d902b3ddf58ee988f7faMarek Olšák    tex->cs_buf = rws->buffer_get_cs_handle(tex->buf);
9963ba8843307a909f35f2a04e6be6dcadd760ad82bMarek Olšák
997fa3f1348e49feeac511dbe5b22bbddc47f56ba81Marek Olšák    rws->buffer_set_tiling(tex->buf, NULL,
99856ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex->tex.microtile, tex->tex.macrotile[0],
9997446a0407d4e61a826385c11ed6c401837baf095Michel Dänzer            0, 0, 0, 0, 0,
100056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex->tex.stride_in_bytes[0]);
1001d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1002d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    return tex;
10034ce26210842176c4b280b7db85639ced40d4083dMarek Olšák}
10044ce26210842176c4b280b7db85639ced40d4083dMarek Olšák
10050648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson/* Create a new texture. */
1006d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákstruct pipe_resource *r300_texture_create(struct pipe_screen *screen,
1007d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                          const struct pipe_resource *base)
10080648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson{
1009d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    struct r300_screen *rscreen = r300_screen(screen);
1010d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    enum radeon_bo_layout microtile, macrotile;
10115cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák
1012d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if ((base->flags & R300_RESOURCE_FLAG_TRANSFER) ||
1013d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        (base->bind & PIPE_BIND_SCANOUT)) {
1014d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        microtile = RADEON_LAYOUT_LINEAR;
1015d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        macrotile = RADEON_LAYOUT_LINEAR;
1016d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    } else {
1017d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        /* This will make the texture_create_function select the layout. */
1018d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        microtile = RADEON_LAYOUT_UNKNOWN;
1019d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        macrotile = RADEON_LAYOUT_UNKNOWN;
1020b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák    }
10219d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
1022d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    return (struct pipe_resource*)
1023d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák           r300_texture_create_object(rscreen, base, microtile, macrotile,
10247b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák                                      0, NULL);
1025d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák}
1026d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1027d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákstruct pipe_resource *r300_texture_from_handle(struct pipe_screen *screen,
1028d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                               const struct pipe_resource *base,
1029d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                               struct winsys_handle *whandle)
1030d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák{
1031d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    struct r300_screen *rscreen = r300_screen(screen);
1032e05bc52b9ccbbf0ca7fa25196c5137b35d2c5c2eMarek Olšák    struct radeon_winsys *rws = rscreen->rws;
1033d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    struct pb_buffer *buffer;
1034d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák    enum radeon_bo_layout microtile, macrotile;
10357b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák    unsigned stride;
1036d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
1037d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Support only 2D textures without mipmaps */
1038ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri    if ((base->target != PIPE_TEXTURE_2D &&
1039ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri          base->target != PIPE_TEXTURE_RECT) ||
1040d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        base->depth0 != 1 ||
1041d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        base->last_level != 0) {
1042d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        return NULL;
10434ce26210842176c4b280b7db85639ced40d4083dMarek Olšák    }
10440bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák
1045af8eb5c851a9d566059ae9e37745614cd96b9a13Marek Olšák    buffer = rws->buffer_from_handle(rws, whandle, &stride);
1046d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if (!buffer)
1047d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        return NULL;
104819498be935328e284c7f0e456fc04cca8d465d4cMarek Olšák
1049c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    rws->buffer_get_tiling(buffer, &microtile, &macrotile, NULL, NULL, NULL, NULL, NULL);
105037f3454eb3afa1297126a8d77a563d734c292a37Marek Olšák
1051d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Enforce a microtiled zbuffer. */
1052d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if (util_format_is_depth_or_stencil(base->format) &&
1053d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák        microtile == RADEON_LAYOUT_LINEAR) {
1054d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        switch (util_format_get_blocksize(base->format)) {
1055d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            case 4:
1056d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák                microtile = RADEON_LAYOUT_TILED;
1057d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                break;
1058950be3fa3c22d67f3b80e7ed5d274d957f0bff93Marek Olšák
1059d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            case 2:
1060d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák                microtile = RADEON_LAYOUT_SQUARETILED;
1061d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                break;
1062d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        }
1063d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    }
10648e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson
1065d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    return (struct pipe_resource*)
1066d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák           r300_texture_create_object(rscreen, base, microtile, macrotile,
10677b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák                                      stride, buffer);
10688e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson}
10698e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson
1070287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file:
1071287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */
1072ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšákstruct pipe_surface* r300_create_surface_custom(struct pipe_context * ctx,
10734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                         struct pipe_resource* texture,
1074ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                         const struct pipe_surface *surf_tmpl,
1075ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                         unsigned width0_override,
1076ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák					 unsigned height0_override)
1077471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{
107856ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource* tex = r300_resource(texture);
10798874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák    struct r300_surface* surface = CALLOC_STRUCT(r300_surface);
10804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    unsigned level = surf_tmpl->u.tex.level;
10814c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
10824c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer);
1083471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson
1084471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson    if (surface) {
1085d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        uint32_t offset, tile_height;
10868c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
10878874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        pipe_reference_init(&surface->base.reference, 1);
10888874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        pipe_resource_reference(&surface->base.texture, texture);
10894c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.context = ctx;
10904c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.format = surf_tmpl->format;
1091ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        surface->base.width = u_minify(width0_override, level);
1092ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        surface->base.height = u_minify(height0_override, level);
10934c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.usage = surf_tmpl->usage;
10944c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.u.tex.level = level;
10954c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.u.tex.first_layer = surf_tmpl->u.tex.first_layer;
10964c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.u.tex.last_layer = surf_tmpl->u.tex.last_layer;
10978874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák
1098ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        surface->buf = tex->buf;
1099ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        surface->cs_buf = tex->cs_buf;
1100347c00c46e9ecf858a8c21abf58a706b658b5b37Marek Olšák
110193f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák        /* Prefer VRAM if there are multiple domains to choose from. */
110293f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák        surface->domain = tex->domain;
110393f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák        if (surface->domain & RADEON_DOMAIN_VRAM)
110493f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák            surface->domain &= ~RADEON_DOMAIN_GTT;
110593f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák
110656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák        surface->offset = r300_texture_get_offset(tex, level,
11074c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                                  surf_tmpl->u.tex.first_layer);
1108fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        r300_texture_setup_fb_state(surface);
11098c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
11108c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        /* Parameters for the CBZB clear. */
111156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák        surface->cbzb_allowed = tex->tex.cbzb_allowed[level];
11128c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_width = align(surface->base.width, 64);
11138c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
11148c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        /* Height must be aligned to the size of a tile. */
1115ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák        tile_height = r300_get_pixel_alignment(surface->base.format,
1116a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák                                               tex->b.b.nr_samples,
111756ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                               tex->tex.microtile,
111856ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                                               tex->tex.macrotile[level],
1119d19b5cbd317620f3977e68fffb7a74793436b7e2Dave Airlie                                               DIM_HEIGHT, 0);
1120d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
11218c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_height = align((surface->base.height + 1) / 2,
11228c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák                                     tile_height);
11238c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
11248c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        /* Offset must be aligned to 2K and must point at the beginning
11258c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák         * of a scanline. */
1126d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        offset = surface->offset +
112756ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák                 tex->tex.stride_in_bytes[level] * surface->cbzb_height;
11288c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_midpoint_offset = offset & ~2047;
11298c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
11308c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_pitch = surface->pitch & 0x1ffffc;
11318c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
11328c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        if (util_format_get_blocksizebits(surface->base.format) == 32)
11338c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák            surface->cbzb_format = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
11348c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        else
11358c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák            surface->cbzb_format = R300_DEPTHFORMAT_16BIT_INT_Z;
11368c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
11374c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        DBG(r300_context(ctx), DBG_CBZB,
11384c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            "CBZB Allowed: %s, Dim: %ix%i, Misalignment: %i, Micro: %s, Macro: %s\n",
11394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            surface->cbzb_allowed ? "YES" : " NO",
11404c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            surface->cbzb_width, surface->cbzb_height,
11414c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            offset & 2047,
114256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex->tex.microtile ? "YES" : " NO",
114356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex->tex.macrotile[level] ? "YES" : " NO");
1144471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson    }
1145471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson
11468874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák    return &surface->base;
1147471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson}
1148471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson
1149ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšákstruct pipe_surface* r300_create_surface(struct pipe_context * ctx,
1150ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                         struct pipe_resource* texture,
1151ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                         const struct pipe_surface *surf_tmpl)
1152ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák{
1153ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák    return r300_create_surface_custom(ctx, texture, surf_tmpl,
1154ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                      texture->width0,
1155ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák                                      texture->height0);
1156ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák}
1157ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák
1158287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file:
1159287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */
11604c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheideggervoid r300_surface_destroy(struct pipe_context *ctx, struct pipe_surface* s)
1161471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{
1162287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    pipe_resource_reference(&s->texture, NULL);
11635e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer    FREE(s);
1164471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson}
1165