r300_texture.c revision ce9c0d280104c8001a3ee360b07218ad3d260e46
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"
328bf9842fac00369b5cd3a82fb4d87db0e31848b8Marek Olšák#include "r300_winsys.h"
33b7a002df1e06504ff1ed0dc005c9b10aa4be54f7Marek Olšák
346e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "util/u_format.h"
356e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "util/u_format_s3tc.h"
366e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "util/u_math.h"
376e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "util/u_memory.h"
386eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie#include "util/u_mm.h"
396e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák
406e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "pipe/p_screen.h"
4146992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák
4271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšákunsigned r300_get_swizzle_combined(const unsigned char *swizzle_format,
436478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                                   const unsigned char *swizzle_view,
446478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                                   boolean dxtc_swizzle)
4571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák{
4671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    unsigned i;
4771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    unsigned char swizzle[4];
4871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    unsigned result = 0;
4971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    const uint32_t swizzle_shift[4] = {
5071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_R_SHIFT,
5171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_G_SHIFT,
5271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_B_SHIFT,
5371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_A_SHIFT
5471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    };
556478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák    uint32_t swizzle_bit[4] = {
566478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák        dxtc_swizzle ? R300_TX_FORMAT_Z : R300_TX_FORMAT_X,
5771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_Y,
586478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák        dxtc_swizzle ? R300_TX_FORMAT_X : R300_TX_FORMAT_Z,
5971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        R300_TX_FORMAT_W
6071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    };
6171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák
6271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    if (swizzle_view) {
6371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        /* Combine two sets of swizzles. */
6471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        for (i = 0; i < 4; i++) {
6571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            swizzle[i] = swizzle_view[i] <= UTIL_FORMAT_SWIZZLE_W ?
6671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                         swizzle_format[swizzle_view[i]] : swizzle_view[i];
6771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        }
6871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    } else {
6971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        memcpy(swizzle, swizzle_format, 4);
7071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    }
7171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák
7271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    /* Get swizzle. */
7371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    for (i = 0; i < 4; i++) {
7471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        switch (swizzle[i]) {
7571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            case UTIL_FORMAT_SWIZZLE_Y:
7671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= swizzle_bit[1] << swizzle_shift[i];
7771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
7871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            case UTIL_FORMAT_SWIZZLE_Z:
7971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= swizzle_bit[2] << swizzle_shift[i];
8071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
8171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            case UTIL_FORMAT_SWIZZLE_W:
8271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= swizzle_bit[3] << swizzle_shift[i];
8371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
8471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            case UTIL_FORMAT_SWIZZLE_0:
8571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= R300_TX_FORMAT_ZERO << swizzle_shift[i];
8671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
8771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            case UTIL_FORMAT_SWIZZLE_1:
8871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= R300_TX_FORMAT_ONE << swizzle_shift[i];
8971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                break;
9071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák            default: /* UTIL_FORMAT_SWIZZLE_X */
9171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                result |= swizzle_bit[0] << swizzle_shift[i];
9271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        }
9371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    }
9471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák    return result;
9571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák}
9671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák
975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák/* Translate a pipe_format into a useful texture format for sampling.
985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák *
995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Some special formats are translated directly using R300_EASY_TX_FORMAT,
1005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * but the majority of them is translated in a generic way, automatically
1015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * supporting all the formats hw can support.
1025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák *
1035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT swizzles the texture.
1045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Note the signature of R300_EASY_TX_FORMAT:
1055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák *   R300_EASY_TX_FORMAT(B, G, R, A, FORMAT);
1065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák *
1075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * The FORMAT specifies how the texture sampler will treat the texture, and
1085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * makes available X, Y, Z, W, ZERO, and ONE for swizzling. */
1091c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r300_translate_texformat(enum pipe_format format,
1106f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                                  const unsigned char *swizzle_view,
1116478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                                  boolean is_r500,
1126478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                                  boolean dxtc_swizzle)
1135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{
1145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    uint32_t result = 0;
1155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    const struct util_format_description *desc;
11639e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák    unsigned i;
1175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    boolean uniform = TRUE;
1185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    const uint32_t sign_bit[4] = {
1195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        R300_TX_FORMAT_SIGNED_X,
1205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        R300_TX_FORMAT_SIGNED_Y,
1215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        R300_TX_FORMAT_SIGNED_Z,
1225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        R300_TX_FORMAT_SIGNED_W,
1235c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    };
1245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    desc = util_format_description(format);
1265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* Colorspace (return non-RGB formats directly). */
1285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    switch (desc->colorspace) {
12971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák        /* Depth stencil formats.
13071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák         * Swizzles are added in r300_merge_textures_and_samplers. */
1315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_COLORSPACE_ZS:
1325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            switch (format) {
1335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case PIPE_FORMAT_Z16_UNORM:
13471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák                    return R300_TX_FORMAT_X16;
135b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca                case PIPE_FORMAT_X8Z24_UNORM:
1366fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger                case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
1376f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                    if (is_r500)
1386f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                        return R500_TX_FORMAT_Y8X24;
1396f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                    else
1406f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák                        return R300_TX_FORMAT_Y16X16;
1415c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                default:
1425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0; /* Unsupported. */
1435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
1445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        /* YUV formats. */
1465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_COLORSPACE_YUV:
1475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            result |= R300_TX_FORMAT_YUV_TO_RGB;
1485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            switch (format) {
150b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca                case PIPE_FORMAT_UYVY:
1515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result;
152b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca                case PIPE_FORMAT_YUYV:
1535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result;
1545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                default:
1555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0; /* Unsupported/unknown. */
1565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
1575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        /* Add gamma correction. */
1595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_COLORSPACE_SRGB:
1605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            result |= R300_TX_FORMAT_GAMMA;
1615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            break;
1625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
163e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák        default:
164e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák            switch (format) {
165e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                /* Same as YUV but without the YUR->RGB conversion. */
166e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                case PIPE_FORMAT_R8G8_B8G8_UNORM:
167e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                    return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result;
168e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                case PIPE_FORMAT_G8R8_G8B8_UNORM:
169e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                    return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result;
170e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák                default:;
171e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák            }
1725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
1735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1746478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák    result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view,
1756478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák                    util_format_is_compressed(format) && dxtc_swizzle);
1765c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
1773252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    /* S3TC formats. */
17828cf5e1191077e063fe2a81d9d35934b71d001e2José Fonseca    if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
17988512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák        if (!util_format_s3tc_enabled) {
18088512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák            return ~0; /* Unsupported. */
18188512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák        }
18288512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák
1835c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        switch (format) {
1845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_RGB:
1855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_RGBA:
1865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_SRGB:
1875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT1_SRGBA:
1885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return R300_TX_FORMAT_DXT1 | result;
1895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT3_RGBA:
1905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT3_SRGBA:
1915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return R300_TX_FORMAT_DXT3 | result;
1925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT5_RGBA:
1935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case PIPE_FORMAT_DXT5_SRGBA:
1945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return R300_TX_FORMAT_DXT5 | result;
1955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            default:
1965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return ~0; /* Unsupported/unknown. */
1975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        }
1985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
1995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* Add sign. */
20139e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák    for (i = 0; i < desc->nr_channels; i++) {
2025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
2035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            result |= sign_bit[i];
2045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        }
2055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
2065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
207e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák    /* This is truly a special format.
208e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák     * It stores R8G8 and B is computed using sqrt(1 - R^2 - G^2)
209e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák     * in the sampler unit. Also known as D3DFMT_CxV8U8. */
210e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák    if (format == PIPE_FORMAT_R8G8Bx_SNORM) {
211e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák        return R300_TX_FORMAT_CxV8U8 | result;
212e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák    }
213e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák
2143252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    /* RGTC formats. */
2153252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) {
2163252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        switch (format) {
2173252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            case PIPE_FORMAT_RGTC1_UNORM:
2183252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            case PIPE_FORMAT_RGTC1_SNORM:
2193252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák                return R500_TX_FORMAT_ATI1N | result;
2203252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            case PIPE_FORMAT_RGTC2_UNORM:
2213252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            case PIPE_FORMAT_RGTC2_SNORM:
2223252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák                return R400_TX_FORMAT_ATI2N | result;
2233252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            default:
2243252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák                return ~0; /* Unsupported/unknown. */
2253252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        }
2263252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    }
2273252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák
2285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* See whether the components are of the same size. */
22939e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák    for (i = 1; i < desc->nr_channels; i++) {
2305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        uniform = uniform && desc->channel[0].size == desc->channel[i].size;
2315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
2325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* Non-uniform formats. */
2345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    if (!uniform) {
23539e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák        switch (desc->nr_channels) {
2365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case 3:
2375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 5 &&
2385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 6 &&
2395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 5) {
2405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_Z5Y6X5 | result;
2415c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
2425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 5 &&
2435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 5 &&
2445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 6) {
2455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_Z6Y5X5 | result;
2465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
247c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                if (desc->channel[0].size == 2 &&
248c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                    desc->channel[1].size == 3 &&
249c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                    desc->channel[2].size == 3) {
250c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                    return R300_TX_FORMAT_Z3Y3X2 | result;
251c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák                }
2525c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return ~0; /* Unsupported/unknown. */
2535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
2545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            case 4:
2555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 5 &&
2565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 5 &&
2575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 5 &&
2585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[3].size == 1) {
2595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_W1Z5Y5X5 | result;
2605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
2615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                if (desc->channel[0].size == 10 &&
2625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[1].size == 10 &&
2635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[2].size == 10 &&
2645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    desc->channel[3].size == 2) {
2655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return R300_TX_FORMAT_W2Z10Y10X10 | result;
2665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                }
2675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        }
2685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        return ~0; /* Unsupported/unknown. */
2695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
2705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
27194e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    /* Find the first non-VOID channel. */
27294e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    for (i = 0; i < 4; i++) {
27394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
27494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            break;
27594e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        }
27694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    }
27794e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
27894e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    if (i == 4)
27994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        return ~0; /* Unsupported/unknown. */
28094e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
2815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    /* And finally, uniform formats. */
28294e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    switch (desc->channel[i].type) {
2835c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_TYPE_UNSIGNED:
2845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_TYPE_SIGNED:
28594e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            if (!desc->channel[i].normalized &&
2865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) {
2875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                return ~0;
2885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
2895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
29094e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            switch (desc->channel[i].size) {
2915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 4:
29239e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
2935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
2945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_Y4X4 | result;
2955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
2965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_W4Z4Y4X4 | result;
2975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
2985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0;
2995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 8:
30139e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_X8 | result;
3045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_Y8X8 | result;
3065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_W8Z8Y8X8 | result;
3085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0;
3105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 16:
31239e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_X16 | result;
3155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3165c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_Y16X16 | result;
3175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_W16Z16Y16X16 | result;
3195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
3215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            return ~0;
3225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3235c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák        case UTIL_FORMAT_TYPE_FLOAT:
32494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            switch (desc->channel[i].size) {
3255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 16:
32639e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_16F | result;
3295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_16F_16F | result;
3315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_16F_16F_16F_16F | result;
3335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    return ~0;
3355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                case 32:
33739e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák                    switch (desc->nr_channels) {
3385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 1:
3395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_32F | result;
3405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 2:
3415c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_32F_32F | result;
3425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                        case 4:
3435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                            return R300_TX_FORMAT_32F_32F_32F_32F | result;
3445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák                    }
3455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák            }
3465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    }
3475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák    return ~0; /* Unsupported/unknown. */
3495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák}
3505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
3511c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r500_tx_format_msb_bit(enum pipe_format format)
3523252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák{
3533252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    switch (format) {
3543252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        case PIPE_FORMAT_RGTC1_UNORM:
3553252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        case PIPE_FORMAT_RGTC1_SNORM:
356b4483823d9c1205fb9ab8cf5b4c36ee610347a36Marek Olšák        case PIPE_FORMAT_X8Z24_UNORM:
357b4483823d9c1205fb9ab8cf5b4c36ee610347a36Marek Olšák        case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
3583252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            return R500_TXFORMAT_MSB;
3593252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák        default:
3603252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák            return 0;
3613252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák    }
3623252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák}
3633252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák
3643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Buffer formats. */
3653c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
3663c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Colorbuffer formats. This is the unswizzled format of the RB3D block's
3673c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * output. For the swizzling of the targets, check the shader's format. */
3683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_colorformat(enum pipe_format format)
3693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
3703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    switch (format) {
3713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 8-bit buffers. */
3723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_A8_UNORM:
37391eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_A8_SNORM:*/
3743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_I8_UNORM:
37591eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_I8_SNORM:*/
3763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_L8_UNORM:
37791eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_L8_SNORM:*/
3783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_UNORM:
3793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_SNORM:
3803c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_I8;
3813c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
3823c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 16-bit buffers. */
3838f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák        case PIPE_FORMAT_L8A8_UNORM:
38491eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_L8A8_SNORM:*/
385e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_UNORM:
386e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_SNORM:
387e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák            return R300_COLOR_FORMAT_UV88;
388e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák
389b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G6R5_UNORM:
3903c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_RGB565;
39126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák
392b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G5R5A1_UNORM:
393f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        case PIPE_FORMAT_B5G5R5X1_UNORM:
3943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB1555;
39526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák
396b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B4G4R4A4_UNORM:
39726a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B4G4R4X4_UNORM:
3983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB4444;
3993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 32-bit buffers. */
4013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_B8G8R8A8_UNORM:
40291eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
4033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_B8G8R8X8_UNORM:
40491eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
405b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_A8R8G8B8_UNORM:
40691eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_A8R8G8B8_SNORM:*/
407b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_X8R8G8B8_UNORM:
40891eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_X8R8G8B8_SNORM:*/
409b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_A8B8G8R8_UNORM:
41091eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_A8B8G8R8_SNORM:*/
41191eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        case PIPE_FORMAT_R8G8B8A8_UNORM:
4123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8G8B8A8_SNORM:
413b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_X8B8G8R8_UNORM:
41491eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_X8B8G8R8_SNORM:*/
41526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R8G8B8X8_UNORM:
41691eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_R8G8B8X8_SNORM:*/
417b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
4183c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB8888;
41926a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák
420b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_R10G10B10A2_UNORM:
42126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R10G10B10X2_SNORM:
42226a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B10G10R10A2_UNORM:
42326a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
4243c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R500_COLOR_FORMAT_ARGB2101010;  /* R5xx-only? */
4253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4263c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 64-bit buffers. */
4273c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_UNORM:
4283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_SNORM:
4292ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák        case PIPE_FORMAT_R16G16B16A16_FLOAT:
4303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB16161616;
4313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4323c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 128-bit buffers. */
4333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R32G32B32A32_FLOAT:
4343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_ARGB32323232;
4353c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* YUV buffers. */
437b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_UYVY:
4383c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_YVYU;
439b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_YUYV:
4403c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_COLOR_FORMAT_VYUY;
4413c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        default:
4423c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return ~0; /* Unsupported. */
4433c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
4443c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
4453c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4463c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Depthbuffer and stencilbuffer. Thankfully, we only support two flavors. */
4473c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_zsformat(enum pipe_format format)
4483c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
4493c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    switch (format) {
4503c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 16-bit depth, no stencil */
4513c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_Z16_UNORM:
4523c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_DEPTHFORMAT_16BIT_INT_Z;
4533c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 24-bit depth, ignored stencil */
454b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_X8Z24_UNORM:
4553c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        /* 24-bit depth, 8-bit stencil */
4566fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger        case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
4573c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
4583c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        default:
4593c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return ~0; /* Unsupported. */
4603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
4613c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
4623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Shader output formats. This is essentially the swizzle from the shader
4643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * to the RB3D block.
4653c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák *
4663c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * Note that formats are stored from C3 to C0. */
4673c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_out_fmt(enum pipe_format format)
4683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
4693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    uint32_t modifier = 0;
4703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    unsigned i;
4713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    const struct util_format_description *desc;
4723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    static const uint32_t sign_bit[4] = {
4733c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        R300_OUT_SIGN(0x1),
4743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        R300_OUT_SIGN(0x2),
4753c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        R300_OUT_SIGN(0x4),
4763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        R300_OUT_SIGN(0x8),
4773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    };
4783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
4793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    desc = util_format_description(format);
4803c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
48194e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    /* Find the first non-VOID channel. */
48294e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    for (i = 0; i < 4; i++) {
48394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
48494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák            break;
48594e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        }
48694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    }
48794e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
48894e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    if (i == 4)
48994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        return ~0; /* Unsupported/unknown. */
49094e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák
4913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Specifies how the shader output is written to the fog unit. */
49294e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák    if (desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) {
49394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        if (desc->channel[i].size == 32) {
4943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            modifier |= R300_US_OUT_FMT_C4_32_FP;
4953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        } else {
4963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            modifier |= R300_US_OUT_FMT_C4_16_FP;
4973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        }
4983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    } else {
49994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák        if (desc->channel[i].size == 16) {
5003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            modifier |= R300_US_OUT_FMT_C4_16;
501cb4f367b268b6fbedc6673b2c6e51d107e929370Marek Olšák        } else if (desc->channel[i].size == 10) {
502cb4f367b268b6fbedc6673b2c6e51d107e929370Marek Olšák            modifier |= R300_US_OUT_FMT_C4_10;
5033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        } else {
5043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            /* C4_8 seems to be used for the formats whose pixel size
5053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák             * is <= 32 bits. */
5063c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            modifier |= R300_US_OUT_FMT_C4_8;
5073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        }
5083c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
5093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Add sign. */
5113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    for (i = 0; i < 4; i++)
5123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
5133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            modifier |= sign_bit[i];
5143c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        }
5153c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5163c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Add swizzles and return. */
5173c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    switch (format) {
518e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        /* 8-bit outputs, one channel.
5193c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák         * COLORFORMAT_I8 stores the C2 component. */
5203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_A8_UNORM:
52191eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_A8_SNORM:*/
5223c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier | R300_C2_SEL_A;
5233c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_I8_UNORM:
52491eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_I8_SNORM:*/
5253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_L8_UNORM:
52691eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_L8_SNORM:*/
5273c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_UNORM:
5283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R8_SNORM:
5293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier | R300_C2_SEL_R;
5303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
531e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        /* 16-bit outputs, two channels.
532e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák         * COLORFORMAT_UV88 stores C2 and C0. */
5338f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák        case PIPE_FORMAT_L8A8_UNORM:
53491eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_L8A8_SNORM:*/
5358f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák            return modifier | R300_C0_SEL_A | R300_C2_SEL_R;
536e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_UNORM:
537e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák        case PIPE_FORMAT_R8G8_SNORM:
538e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák            return modifier | R300_C0_SEL_G | R300_C2_SEL_R;
539e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák
540f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* BGRA outputs. */
541b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G6R5_UNORM:
542b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B5G5R5A1_UNORM:
543f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        case PIPE_FORMAT_B5G5R5X1_UNORM:
544b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B4G4R4A4_UNORM:
54526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B4G4R4X4_UNORM:
546b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B8G8R8A8_UNORM:
54791eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
548b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_B8G8R8X8_UNORM:
54991eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
55026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_B10G10R10A2_UNORM:
5513c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
5523c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_B | R300_C1_SEL_G |
5533c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_R | R300_C3_SEL_A;
5543c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
555f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* ARGB outputs. */
556b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_A8R8G8B8_UNORM:
55791eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_A8R8G8B8_SNORM:*/
558b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_X8R8G8B8_UNORM:
55991eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_X8R8G8B8_SNORM:*/
5603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
5613c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_A | R300_C1_SEL_R |
5623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_G | R300_C3_SEL_B;
5633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
564f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* ABGR outputs. */
565b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_A8B8G8R8_UNORM:
56691eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_A8B8G8R8_SNORM:*/
567b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_X8B8G8R8_UNORM:
56891eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_X8B8G8R8_SNORM:*/
5693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
5703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_A | R300_C1_SEL_B |
5713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_G | R300_C3_SEL_R;
5723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
573f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        /* RGBA outputs. */
57426a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R8G8B8X8_UNORM:
57591eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        /*case PIPE_FORMAT_R8G8B8X8_SNORM:*/
57691eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák        case PIPE_FORMAT_R8G8B8A8_UNORM:
577f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák        case PIPE_FORMAT_R8G8B8A8_SNORM:
578b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
579b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca        case PIPE_FORMAT_R10G10B10A2_UNORM:
58026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R10G10B10X2_SNORM:
58126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák        case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
5823c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_UNORM:
5833c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R16G16B16A16_SNORM:
5842ba0c64c26d3ec9b2806f577020d4fde826a858dMarek Olšák        case PIPE_FORMAT_R16G16B16A16_FLOAT:
5853c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        case PIPE_FORMAT_R32G32B32A32_FLOAT:
5863c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return modifier |
5873c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C0_SEL_R | R300_C1_SEL_G |
5883c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák                R300_C2_SEL_B | R300_C3_SEL_A;
5893c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5903c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák        default:
5913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák            return ~0; /* Unsupported. */
5923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
5933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
5943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
5953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_colorbuffer_format_supported(enum pipe_format format)
5963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
5973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    return r300_translate_colorformat(format) != ~0 &&
5983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák           r300_translate_out_fmt(format) != ~0;
5993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
6003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
6013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_zs_format_supported(enum pipe_format format)
6023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{
6033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    return r300_translate_zsformat(format) != ~0;
6043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák}
6053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
6065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšákboolean r300_is_sampler_format_supported(enum pipe_format format)
6075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{
6086478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák    return r300_translate_texformat(format, 0, TRUE, FALSE) != ~0;
6095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák}
6105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák
611c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšákvoid r300_texture_setup_format_state(struct r300_screen *screen,
612c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák                                     struct r300_texture_desc *desc,
613c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák                                     unsigned level,
614c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák                                     struct r300_texture_format_state *out)
6159d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson{
616c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    struct pipe_resource *pt = &desc->b.b;
617b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák    boolean is_r500 = screen->caps.is_r500;
6189d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
619c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    /* Mask out all the fields we change. */
620c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->format0 = 0;
621c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->format1 &= ~R300_TX_FORMAT_TEX_COORD_TYPE_MASK;
622c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->format2 &= R500_TXFORMAT_MSB;
623c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->tile_config = 0;
624c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák
6253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Set sampler state. */
62613359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák    out->format0 =
62713359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák        R300_TX_WIDTH((u_minify(desc->width0, level) - 1) & 0x7ff) |
62813359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák        R300_TX_HEIGHT((u_minify(desc->height0, level) - 1) & 0x7ff) |
62913359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák        R300_TX_DEPTH(util_logbase2(u_minify(desc->depth0, level)) & 0xf);
630827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák
631c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    if (desc->uses_stride_addressing) {
632827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák        /* rectangles love this */
633c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format0 |= R300_TX_PITCH_EN;
634c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format2 = (desc->stride_in_pixels[level] - 1) & 0x1fff;
635827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    }
6369d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
637eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    if (pt->target == PIPE_TEXTURE_CUBE) {
638c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format1 |= R300_TX_FORMAT_CUBIC_MAP;
639eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    }
640eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    if (pt->target == PIPE_TEXTURE_3D) {
641c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák        out->format1 |= R300_TX_FORMAT_3D;
642eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie    }
6439d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
644827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    /* large textures on r500 */
645827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    if (is_r500)
646827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák    {
64713359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák        if (desc->width0 > 2048) {
648c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák            out->format2 |= R500_TXWIDTH_BIT11;
649827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák        }
65013359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák        if (desc->height0 > 2048) {
651c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák            out->format2 |= R500_TXHEIGHT_BIT11;
652827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák        }
6531aa38b2c2d80b67fe2eefe468f90aeb44bc20259Corbin Simpson    }
6542cbd5ecfb666a757c4abef85dbe40fb53d647ec9Corbin Simpson
655c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    out->tile_config = R300_TXO_MACRO_TILE(desc->macrotile[level]) |
656c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák                       R300_TXO_MICRO_TILE(desc->microtile);
6571c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák}
6581c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák
659fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšákstatic void r300_texture_setup_fb_state(struct r300_surface *surf)
6601c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák{
661fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák    struct r300_texture *tex = r300_texture(surf->base.texture);
662fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák    unsigned level = surf->base.u.tex.level;
6633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák
6643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    /* Set framebuffer state. */
665fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák    if (util_format_is_depth_or_stencil(surf->base.format)) {
666fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->pitch =
667fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák                tex->desc.stride_in_pixels[level] |
668fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák                R300_DEPTHMACROTILE(tex->desc.macrotile[level]) |
669d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                R300_DEPTHMICROTILE(tex->desc.microtile);
670fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->format = r300_translate_zsformat(surf->base.format);
6713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    } else {
672fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->pitch =
673fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák                tex->desc.stride_in_pixels[level] |
674fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák                r300_translate_colorformat(surf->base.format) |
675fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák                R300_COLOR_TILE(tex->desc.macrotile[level]) |
676d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                R300_COLOR_MICROTILE(tex->desc.microtile);
677fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        surf->format = r300_translate_out_fmt(surf->base.format);
6783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák    }
6793cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle}
6803cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle
681f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšákvoid r300_texture_reinterpret_format(struct pipe_screen *screen,
682287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                     struct pipe_resource *tex,
683f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák                                     enum pipe_format new_format)
684f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák{
685f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák    struct r300_screen *r300screen = r300_screen(screen);
686f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák
6873784b0fa69491aa14bdf6f7a61c4d5de2589d234Corbin Simpson    SCREEN_DBG(r300screen, DBG_TEX,
6883784b0fa69491aa14bdf6f7a61c4d5de2589d234Corbin Simpson        "r300: texture_reinterpret_format: %s -> %s\n",
6893784b0fa69491aa14bdf6f7a61c4d5de2589d234Corbin Simpson        util_format_short_name(tex->format),
6903784b0fa69491aa14bdf6f7a61c4d5de2589d234Corbin Simpson        util_format_short_name(new_format));
691f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák
692f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák    tex->format = new_format;
693f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák}
694f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák
695287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic unsigned r300_texture_is_referenced(struct pipe_context *context,
6964c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                           struct pipe_resource *texture,
6974c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                           unsigned level, int layer)
698287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
699287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    struct r300_context *r300 = r300_context(context);
700287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    struct r300_texture *rtex = (struct r300_texture *)texture;
701287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
702fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák    if (r300->rws->cs_is_buffer_referenced(r300->cs,
703ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák                                           rtex->cs_buf, R300_REF_CS))
704287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell        return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE;
705287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
706287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    return PIPE_UNREFERENCED;
707287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}
708287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
709287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic void r300_texture_destroy(struct pipe_screen *screen,
7104c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                 struct pipe_resource* texture)
711287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
712287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    struct r300_texture* tex = (struct r300_texture*)texture;
713287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    struct r300_winsys_screen *rws = (struct r300_winsys_screen *)texture->screen->winsys;
7146eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie    int i;
715287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
716ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    rws->buffer_reference(rws, &tex->buf, NULL);
7176eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie    for (i = 0; i < R300_MAX_TEXTURE_LEVELS; i++) {
7186eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie        if (tex->hiz_mem[i])
7196eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie            u_mmFreeMem(tex->hiz_mem[i]);
7206eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie    }
7216eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie
722287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    FREE(tex);
723287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}
724287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
7250b4df63609e9fb25319debd56142a90b11d75671Marek Olšákstatic boolean r300_texture_get_handle(struct pipe_screen* screen,
7260b4df63609e9fb25319debd56142a90b11d75671Marek Olšák                                       struct pipe_resource *texture,
7270b4df63609e9fb25319debd56142a90b11d75671Marek Olšák                                       struct winsys_handle *whandle)
728287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
729287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys;
730287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    struct r300_texture* tex = (struct r300_texture*)texture;
731287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
732287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    if (!tex) {
733287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell        return FALSE;
734287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    }
735287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
736ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    return rws->buffer_get_handle(rws, tex->buf,
737d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                  tex->desc.stride_in_bytes[0], whandle);
738287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}
739287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
740d17d03a8dccb4bad25211693320459420409d997Henri Verbeetstatic const struct u_resource_vtbl r300_texture_vtbl =
741287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
742287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   r300_texture_get_handle,	      /* get_handle */
743287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   r300_texture_destroy,	      /* resource_destroy */
744287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   r300_texture_is_referenced,	      /* is_resource_referenced */
745287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   r300_texture_get_transfer,	      /* get_transfer */
746287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   r300_texture_transfer_destroy,     /* transfer_destroy */
747287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   r300_texture_transfer_map,	      /* transfer_map */
748287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   u_default_transfer_flush_region,   /* transfer_flush_region */
749287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   r300_texture_transfer_unmap,	      /* transfer_unmap */
750287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   u_default_transfer_inline_write    /* transfer_inline_write */
751287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell};
752287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
753d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák/* The common texture constructor. */
754d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákstatic struct r300_texture*
755d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákr300_texture_create_object(struct r300_screen *rscreen,
756d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                           const struct pipe_resource *base,
757d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                           enum r300_buffer_tiling microtile,
758d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                           enum r300_buffer_tiling macrotile,
759d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                           unsigned stride_in_bytes_override,
760d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                           unsigned max_buffer_size,
761d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                           struct r300_winsys_buffer *buffer)
7624ce26210842176c4b280b7db85639ced40d4083dMarek Olšák{
763d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    struct r300_winsys_screen *rws = rscreen->rws;
764d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    struct r300_texture *tex = CALLOC_STRUCT(r300_texture);
765d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if (!tex) {
766d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        if (buffer)
767d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            rws->buffer_reference(rws, &buffer, NULL);
768d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        return NULL;
769d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    }
770d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
771d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Initialize the descriptor. */
772d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if (!r300_texture_desc_init(rscreen, &tex->desc, base,
773d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                microtile, macrotile,
774d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                stride_in_bytes_override,
775d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                max_buffer_size)) {
776d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        if (buffer)
777d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            rws->buffer_reference(rws, &buffer, NULL);
778d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        FREE(tex);
779d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        return NULL;
780d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    }
781d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Initialize the hardware state. */
782c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák    r300_texture_setup_format_state(rscreen, &tex->desc, 0, &tex->tx_format);
783d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
784d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    tex->desc.b.vtbl = &r300_texture_vtbl;
785d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    pipe_reference_init(&tex->desc.b.b.reference, 1);
786d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    tex->domain = base->flags & R300_RESOURCE_FLAG_TRANSFER ?
787d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                  R300_DOMAIN_GTT :
788d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                  R300_DOMAIN_VRAM | R300_DOMAIN_GTT;
789ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    tex->buf = buffer;
790d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
791d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Create the backing buffer if needed. */
792ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    if (!tex->buf) {
793ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        tex->buf = rws->buffer_create(rws, tex->desc.size_in_bytes, 2048,
794d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                         base->bind, base->usage, tex->domain);
795d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
796ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        if (!tex->buf) {
797d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            FREE(tex);
798d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            return NULL;
799d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        }
800d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    }
801d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
802ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    tex->cs_buf = rws->buffer_get_cs_handle(rws, tex->buf);
8033ba8843307a909f35f2a04e6be6dcadd760ad82bMarek Olšák
804ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    rws->buffer_set_tiling(rws, tex->buf,
805d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            tex->desc.microtile, tex->desc.macrotile[0],
806d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            tex->desc.stride_in_bytes[0]);
807d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
808d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    return tex;
8094ce26210842176c4b280b7db85639ced40d4083dMarek Olšák}
8104ce26210842176c4b280b7db85639ced40d4083dMarek Olšák
8110648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson/* Create a new texture. */
812d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákstruct pipe_resource *r300_texture_create(struct pipe_screen *screen,
813d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                          const struct pipe_resource *base)
8140648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson{
815d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    struct r300_screen *rscreen = r300_screen(screen);
816d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    enum r300_buffer_tiling microtile, macrotile;
8175cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák
818d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if ((base->flags & R300_RESOURCE_FLAG_TRANSFER) ||
819d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        (base->bind & PIPE_BIND_SCANOUT)) {
820d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        microtile = R300_BUFFER_LINEAR;
821d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        macrotile = R300_BUFFER_LINEAR;
822d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    } else {
823d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        microtile = R300_BUFFER_SELECT_LAYOUT;
824d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        macrotile = R300_BUFFER_SELECT_LAYOUT;
825b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák    }
8269d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
827d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    return (struct pipe_resource*)
828d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák           r300_texture_create_object(rscreen, base, microtile, macrotile,
829d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                      0, 0, NULL);
830d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák}
831d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
832d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákstruct pipe_resource *r300_texture_from_handle(struct pipe_screen *screen,
833d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                               const struct pipe_resource *base,
834d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                               struct winsys_handle *whandle)
835d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák{
836d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    struct r300_winsys_screen *rws = (struct r300_winsys_screen*)screen->winsys;
837d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    struct r300_screen *rscreen = r300_screen(screen);
838d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    struct r300_winsys_buffer *buffer;
839d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    enum r300_buffer_tiling microtile, macrotile;
840d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    unsigned stride, size;
841d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
842d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Support only 2D textures without mipmaps */
843ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri    if ((base->target != PIPE_TEXTURE_2D &&
844ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri          base->target != PIPE_TEXTURE_RECT) ||
845d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        base->depth0 != 1 ||
846d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        base->last_level != 0) {
847d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        return NULL;
8484ce26210842176c4b280b7db85639ced40d4083dMarek Olšák    }
8490bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák
850d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    buffer = rws->buffer_from_handle(rws, whandle, &stride, &size);
851d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if (!buffer)
852d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        return NULL;
85319498be935328e284c7f0e456fc04cca8d465d4cMarek Olšák
854d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    rws->buffer_get_tiling(rws, buffer, &microtile, &macrotile);
85537f3454eb3afa1297126a8d77a563d734c292a37Marek Olšák
856d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    /* Enforce a microtiled zbuffer. */
857d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    if (util_format_is_depth_or_stencil(base->format) &&
858d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        microtile == R300_BUFFER_LINEAR) {
859d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        switch (util_format_get_blocksize(base->format)) {
860d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            case 4:
861d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                microtile = R300_BUFFER_TILED;
862d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                break;
863950be3fa3c22d67f3b80e7ed5d274d957f0bff93Marek Olšák
864d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák            case 2:
8652e3ccada076fe275d04d37dc60142230445d1007Marek Olšák                if (rws->get_value(rws, R300_VID_DRM_2_1_0))
866d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                    microtile = R300_BUFFER_SQUARETILED;
867d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                break;
868d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        }
869d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    }
8708e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson
871d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák    return (struct pipe_resource*)
872d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák           r300_texture_create_object(rscreen, base, microtile, macrotile,
873d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                      stride, size, buffer);
8748e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson}
8758e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson
876287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file:
877287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */
8784c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheideggerstruct pipe_surface* r300_create_surface(struct pipe_context * ctx,
8794c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                         struct pipe_resource* texture,
8804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                         const struct pipe_surface *surf_tmpl)
881471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{
882a1f85cf689b6f9ccf6b7310485460f84c8d78cadMarek Olšák    struct r300_texture* tex = r300_texture(texture);
8838874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák    struct r300_surface* surface = CALLOC_STRUCT(r300_surface);
8844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    unsigned level = surf_tmpl->u.tex.level;
8854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
8864c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer);
887471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson
888471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson    if (surface) {
889d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        uint32_t offset, tile_height;
8908c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
8918874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        pipe_reference_init(&surface->base.reference, 1);
8928874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        pipe_resource_reference(&surface->base.texture, texture);
8934c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.context = ctx;
8944c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.format = surf_tmpl->format;
8958874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        surface->base.width = u_minify(texture->width0, level);
8968874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        surface->base.height = u_minify(texture->height0, level);
8974c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.usage = surf_tmpl->usage;
8984c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.u.tex.level = level;
8994c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.u.tex.first_layer = surf_tmpl->u.tex.first_layer;
9004c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->base.u.tex.last_layer = surf_tmpl->u.tex.last_layer;
9018874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák
902ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        surface->buf = tex->buf;
903ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        surface->cs_buf = tex->cs_buf;
904347c00c46e9ecf858a8c21abf58a706b658b5b37Marek Olšák
905347c00c46e9ecf858a8c21abf58a706b658b5b37Marek Olšák        /* Prefer VRAM if there are multiple domains to choose from. */
9068874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        surface->domain = tex->domain;
907347c00c46e9ecf858a8c21abf58a706b658b5b37Marek Olšák        if (surface->domain & R300_DOMAIN_VRAM)
908347c00c46e9ecf858a8c21abf58a706b658b5b37Marek Olšák            surface->domain &= ~R300_DOMAIN_GTT;
909347c00c46e9ecf858a8c21abf58a706b658b5b37Marek Olšák
9104c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        surface->offset = r300_texture_get_offset(&tex->desc, level,
9114c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                                  surf_tmpl->u.tex.first_layer);
912fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák        r300_texture_setup_fb_state(surface);
9138c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
9148c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        /* Parameters for the CBZB clear. */
915d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        surface->cbzb_allowed = tex->desc.cbzb_allowed[level];
9168c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_width = align(surface->base.width, 64);
9178c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
9188c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        /* Height must be aligned to the size of a tile. */
919d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        tile_height = r300_get_pixel_alignment(tex->desc.b.b.format,
920d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                               tex->desc.b.b.nr_samples,
921d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                               tex->desc.microtile,
922d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                                               tex->desc.macrotile[level],
923d19b5cbd317620f3977e68fffb7a74793436b7e2Dave Airlie                                               DIM_HEIGHT, 0);
924d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák
9258c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_height = align((surface->base.height + 1) / 2,
9268c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák                                     tile_height);
9278c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
9288c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        /* Offset must be aligned to 2K and must point at the beginning
9298c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák         * of a scanline. */
930d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák        offset = surface->offset +
931d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák                 tex->desc.stride_in_bytes[level] * surface->cbzb_height;
9328c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_midpoint_offset = offset & ~2047;
9338c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
9348c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surface->cbzb_pitch = surface->pitch & 0x1ffffc;
9358c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
9368c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        if (util_format_get_blocksizebits(surface->base.format) == 32)
9378c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák            surface->cbzb_format = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
9388c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        else
9398c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák            surface->cbzb_format = R300_DEPTHFORMAT_16BIT_INT_Z;
9408c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
9414c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger        DBG(r300_context(ctx), DBG_CBZB,
9424c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            "CBZB Allowed: %s, Dim: %ix%i, Misalignment: %i, Micro: %s, Macro: %s\n",
9434c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            surface->cbzb_allowed ? "YES" : " NO",
9444c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            surface->cbzb_width, surface->cbzb_height,
9454c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            offset & 2047,
9464c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            tex->desc.microtile ? "YES" : " NO",
9474c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            tex->desc.macrotile[level] ? "YES" : " NO");
948471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson    }
949471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson
9508874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák    return &surface->base;
951471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson}
952471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson
953287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file:
954287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */
9554c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheideggervoid r300_surface_destroy(struct pipe_context *ctx, struct pipe_surface* s)
956471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{
957287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    pipe_resource_reference(&s->texture, NULL);
9585e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer    FREE(s);
959471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson}
960