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