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, µtile, ¯otile, 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