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