r300_texture.c revision 3784b0fa69491aa14bdf6f7a61c4d5de2589d234
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 246a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "pipe/p_screen.h" 256a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson 266df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol#include "util/u_format.h" 2788512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák#include "util/u_format_s3tc.h" 286a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "util/u_math.h" 296a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "util/u_memory.h" 306a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson 316a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "r300_context.h" 321c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák#include "r300_reg.h" 330648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson#include "r300_texture.h" 34287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "r300_transfer.h" 35827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák#include "r300_screen.h" 368bf9842fac00369b5cd3a82fb4d87db0e31848b8Marek Olšák#include "r300_winsys.h" 37b7a002df1e06504ff1ed0dc005c9b10aa4be54f7Marek Olšák 3846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák#define TILE_WIDTH 0 3946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák#define TILE_HEIGHT 1 4046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 4146992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšákstatic const unsigned microblock_table[5][3][2] = { 4246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák /*linear tiled square-tiled */ 4346992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák {{32, 1}, {8, 4}, {0, 0}}, /* 8 bits per pixel */ 4446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák {{16, 1}, {8, 2}, {4, 4}}, /* 16 bits per pixel */ 4546992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák {{ 8, 1}, {4, 2}, {0, 0}}, /* 32 bits per pixel */ 4646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák {{ 4, 1}, {0, 0}, {2, 2}}, /* 64 bits per pixel */ 4746992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák {{ 2, 1}, {0, 0}, {0, 0}} /* 128 bits per pixel */ 4846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák}; 4946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 5071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšákunsigned r300_get_swizzle_combined(const unsigned char *swizzle_format, 5171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák const unsigned char *swizzle_view) 5271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák{ 5371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák unsigned i; 5471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák unsigned char swizzle[4]; 5571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák unsigned result = 0; 5671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák const uint32_t swizzle_shift[4] = { 5771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_R_SHIFT, 5871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_G_SHIFT, 5971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_B_SHIFT, 6071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_A_SHIFT 6171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák }; 6271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák const uint32_t swizzle_bit[4] = { 6371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_X, 6471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_Y, 6571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_Z, 6671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_W 6771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák }; 6871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák 6971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák if (swizzle_view) { 7071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák /* Combine two sets of swizzles. */ 7171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák for (i = 0; i < 4; i++) { 7271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák swizzle[i] = swizzle_view[i] <= UTIL_FORMAT_SWIZZLE_W ? 7371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák swizzle_format[swizzle_view[i]] : swizzle_view[i]; 7471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } 7571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } else { 7671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák memcpy(swizzle, swizzle_format, 4); 7771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } 7871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák 7971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák /* Get swizzle. */ 8071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák for (i = 0; i < 4; i++) { 8171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák switch (swizzle[i]) { 8271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák case UTIL_FORMAT_SWIZZLE_Y: 8371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= swizzle_bit[1] << swizzle_shift[i]; 8471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 8571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák case UTIL_FORMAT_SWIZZLE_Z: 8671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= swizzle_bit[2] << swizzle_shift[i]; 8771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 8871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák case UTIL_FORMAT_SWIZZLE_W: 8971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= swizzle_bit[3] << swizzle_shift[i]; 9071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 9171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák case UTIL_FORMAT_SWIZZLE_0: 9271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= R300_TX_FORMAT_ZERO << swizzle_shift[i]; 9371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 9471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák case UTIL_FORMAT_SWIZZLE_1: 9571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= R300_TX_FORMAT_ONE << swizzle_shift[i]; 9671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 9771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák default: /* UTIL_FORMAT_SWIZZLE_X */ 9871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= swizzle_bit[0] << swizzle_shift[i]; 9971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } 10071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } 10171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák return result; 10271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák} 10371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák 1045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák/* Translate a pipe_format into a useful texture format for sampling. 1055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 1065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Some special formats are translated directly using R300_EASY_TX_FORMAT, 1075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * but the majority of them is translated in a generic way, automatically 1085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * supporting all the formats hw can support. 1095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 1105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT swizzles the texture. 1115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Note the signature of R300_EASY_TX_FORMAT: 1125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT(B, G, R, A, FORMAT); 1135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 1145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * The FORMAT specifies how the texture sampler will treat the texture, and 1155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * makes available X, Y, Z, W, ZERO, and ONE for swizzling. */ 1161c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r300_translate_texformat(enum pipe_format format, 1173b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák const unsigned char *swizzle_view) 1185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{ 1195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák uint32_t result = 0; 1205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák const struct util_format_description *desc; 12139e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák unsigned i; 1225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák boolean uniform = TRUE; 1235c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák const uint32_t sign_bit[4] = { 1245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_X, 1255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_Y, 1265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_Z, 1275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_W, 1285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák }; 1295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc = util_format_description(format); 1315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Colorspace (return non-RGB formats directly). */ 1335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->colorspace) { 13471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák /* Depth stencil formats. 13571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák * Swizzles are added in r300_merge_textures_and_samplers. */ 1365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_ZS: 1375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 1385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_Z16_UNORM: 13971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák return R300_TX_FORMAT_X16; 140b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8Z24_UNORM: 1416fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger case PIPE_FORMAT_S8_USCALED_Z24_UNORM: 142b4483823d9c1205fb9ab8cf5b4c36ee610347a36Marek Olšák return R500_TX_FORMAT_Y8X24; 1435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported. */ 1455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* YUV formats. */ 1485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_YUV: 1495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_YUV_TO_RGB; 1505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 152b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_UYVY: 1535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result; 154b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_YUYV: 1555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result; 1565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 1585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Add gamma correction. */ 1615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_SRGB: 1625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_GAMMA; 1635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 165e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák default: 166e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák switch (format) { 167e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák /* Same as YUV but without the YUR->RGB conversion. */ 168e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák case PIPE_FORMAT_R8G8_B8G8_UNORM: 169e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result; 170e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák case PIPE_FORMAT_G8R8_G8B8_UNORM: 171e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result; 172e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák default:; 173e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák } 1745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 17671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view); 1775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1783252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák /* S3TC formats. */ 17928cf5e1191077e063fe2a81d9d35934b71d001e2José Fonseca if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) { 18088512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák if (!util_format_s3tc_enabled) { 18188512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák return ~0; /* Unsupported. */ 18288512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák } 18388512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák 1845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 1855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_RGB: 1865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_RGBA: 1875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_SRGB: 1885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_SRGBA: 1895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT1 | result; 1905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT3_RGBA: 1915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT3_SRGBA: 1925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT3 | result; 1935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT5_RGBA: 1945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT5_SRGBA: 1955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT5 | result; 1965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 1985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Add sign. */ 20239e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák for (i = 0; i < desc->nr_channels; i++) { 2035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 2045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= sign_bit[i]; 2055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 208e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák /* This is truly a special format. 209e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák * It stores R8G8 and B is computed using sqrt(1 - R^2 - G^2) 210e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák * in the sampler unit. Also known as D3DFMT_CxV8U8. */ 211e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák if (format == PIPE_FORMAT_R8G8Bx_SNORM) { 212e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák return R300_TX_FORMAT_CxV8U8 | result; 213e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák } 214e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák 2153252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák /* RGTC formats. */ 2163252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) { 2173252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák switch (format) { 2183252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_UNORM: 2193252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_SNORM: 2203252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R500_TX_FORMAT_ATI1N | result; 2213252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC2_UNORM: 2223252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC2_SNORM: 2233252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R400_TX_FORMAT_ATI2N | result; 2243252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák default: 2253252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return ~0; /* Unsupported/unknown. */ 2263252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 2273252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 2283252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák 2295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* See whether the components are of the same size. */ 23039e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák for (i = 1; i < desc->nr_channels; i++) { 2315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák uniform = uniform && desc->channel[0].size == desc->channel[i].size; 2325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Non-uniform formats. */ 2355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (!uniform) { 23639e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 3: 2385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 2395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 6 && 2405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 5) { 2415c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Z5Y6X5 | result; 2425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 2445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 5 && 2455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 6) { 2465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Z6Y5X5 | result; 2475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 2495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 2525c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 5 && 2535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 5 && 2545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[3].size == 1) { 2555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W1Z5Y5X5 | result; 2565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 10 && 2585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 10 && 2595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 10 && 2605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[3].size == 2) { 2615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W2Z10Y10X10 | result; 2625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 2655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* And finally, uniform formats. */ 2685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->channel[0].type) { 2695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_UNSIGNED: 2705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_SIGNED: 2715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (!desc->channel[0].normalized && 2725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) { 2735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2765c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->channel[0].size) { 2775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 27839e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2795c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 2805c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y4X4 | result; 2815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W4Z4Y4X4 | result; 2835c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 8: 28739e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 2895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_X8 | result; 2905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 2915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y8X8 | result; 2925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W8Z8Y8X8 | result; 2945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 16: 29839e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 3005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_X16 | result; 3015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 3025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y16X16 | result; 3035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 3045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W16Z16Y16X16 | result; 3055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 3085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_FLOAT: 3105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->channel[0].size) { 3115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 16: 31239e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 3135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 3145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F | result; 3155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 3165c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F_16F | result; 3175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 3185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F_16F_16F_16F | result; 3195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 3215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 32: 32339e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 3245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 3255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F | result; 3265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 3275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F_32F | result; 3285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 3295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F_32F_32F_32F | result; 3305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 3355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák} 3365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3371c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r500_tx_format_msb_bit(enum pipe_format format) 3383252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák{ 3393252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák switch (format) { 3403252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_UNORM: 3413252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_SNORM: 342b4483823d9c1205fb9ab8cf5b4c36ee610347a36Marek Olšák case PIPE_FORMAT_X8Z24_UNORM: 343b4483823d9c1205fb9ab8cf5b4c36ee610347a36Marek Olšák case PIPE_FORMAT_S8_USCALED_Z24_UNORM: 3443252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R500_TXFORMAT_MSB; 3453252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák default: 3463252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return 0; 3473252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 3483252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák} 3493252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák 3503c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Buffer formats. */ 3513c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3523c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Colorbuffer formats. This is the unswizzled format of the RB3D block's 3533c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * output. For the swizzling of the targets, check the shader's format. */ 3543c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_colorformat(enum pipe_format format) 3553c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 3563c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 3573c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 8-bit buffers. */ 3583c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_A8_UNORM: 3593c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_I8_UNORM: 3603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_L8_UNORM: 3613c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_UNORM: 3623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_SNORM: 3633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_I8; 3643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3653c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 16-bit buffers. */ 366b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G6R5_UNORM: 3673c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_RGB565; 36826a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák 369b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G5R5A1_UNORM: 370f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_B5G5R5X1_UNORM: 3713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB1555; 37226a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák 373b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B4G4R4A4_UNORM: 37426a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B4G4R4X4_UNORM: 3753c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB4444; 3763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 32-bit buffers. */ 3783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_B8G8R8A8_UNORM: 3793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_B8G8R8X8_UNORM: 380b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8R8G8B8_UNORM: 381b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8R8G8B8_UNORM: 382b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8B8G8R8_UNORM: 3833c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8G8B8A8_SNORM: 384b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8B8G8R8_UNORM: 38526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R8G8B8X8_UNORM: 386b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 3873c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB8888; 38826a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák 389b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R10G10B10A2_UNORM: 39026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10G10B10X2_SNORM: 39126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B10G10R10A2_UNORM: 39226a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 3933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R500_COLOR_FORMAT_ARGB2101010; /* R5xx-only? */ 3943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 64-bit buffers. */ 3963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_UNORM: 3973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_SNORM: 3982ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák case PIPE_FORMAT_R16G16B16A16_FLOAT: 3993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB16161616; 4003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 128-bit buffers. */ 4023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R32G32B32A32_FLOAT: 4033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB32323232; 4043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* YUV buffers. */ 406b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_UYVY: 4073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_YVYU; 408b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_YUYV: 4093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_VYUY; 4103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 4113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 4123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 4143c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4153c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Depthbuffer and stencilbuffer. Thankfully, we only support two flavors. */ 4163c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_zsformat(enum pipe_format format) 4173c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 4183c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 4193c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 16-bit depth, no stencil */ 4203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_Z16_UNORM: 4213c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_DEPTHFORMAT_16BIT_INT_Z; 4223c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 24-bit depth, ignored stencil */ 423b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8Z24_UNORM: 4243c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 24-bit depth, 8-bit stencil */ 4256fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger case PIPE_FORMAT_S8_USCALED_Z24_UNORM: 4263c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL; 4273c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 4283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 4293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 4313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4323c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Shader output formats. This is essentially the swizzle from the shader 4333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * to the RB3D block. 4343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * 4353c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * Note that formats are stored from C3 to C0. */ 4363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_out_fmt(enum pipe_format format) 4373c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 4383c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák uint32_t modifier = 0; 4393c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák unsigned i; 4403c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák const struct util_format_description *desc; 4413c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák static const uint32_t sign_bit[4] = { 4423c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x1), 4433c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x2), 4443c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x4), 4453c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x8), 4463c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák }; 4473c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4483c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák desc = util_format_description(format); 4493c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4503c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Specifies how the shader output is written to the fog unit. */ 4510c81739528fd8f240176bb120c90c712f9606718Marek Olšák if (desc->channel[0].type == UTIL_FORMAT_TYPE_FLOAT) { 4523c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (desc->channel[0].size == 32) { 4533c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_32_FP; 4543c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 4553c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_16_FP; 4563c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4573c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 4583c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (desc->channel[0].size == 16) { 4593c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_16; 4603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 4613c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* C4_8 seems to be used for the formats whose pixel size 4623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * is <= 32 bits. */ 4633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_8; 4643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4653c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4663c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4673c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Add sign. */ 4683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák for (i = 0; i < 4; i++) 4693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 4703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= sign_bit[i]; 4713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4733c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Add swizzles and return. */ 4743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 4753c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 8-bit outputs. 4763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * COLORFORMAT_I8 stores the C2 component. */ 4773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_A8_UNORM: 4783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | R300_C2_SEL_A; 4793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_I8_UNORM: 4803c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_L8_UNORM: 4813c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_UNORM: 4823c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_SNORM: 4833c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | R300_C2_SEL_R; 4843c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 485f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* BGRA outputs. */ 486b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G6R5_UNORM: 487b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G5R5A1_UNORM: 488f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_B5G5R5X1_UNORM: 489b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B4G4R4A4_UNORM: 49026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B4G4R4X4_UNORM: 491b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B8G8R8A8_UNORM: 492b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B8G8R8X8_UNORM: 49326a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B10G10R10A2_UNORM: 4943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 4953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_B | R300_C1_SEL_G | 4963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_R | R300_C3_SEL_A; 4973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 498f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* ARGB outputs. */ 499b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8R8G8B8_UNORM: 500b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8R8G8B8_UNORM: 5013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 5023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_A | R300_C1_SEL_R | 5033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_G | R300_C3_SEL_B; 5043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 505f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* ABGR outputs. */ 506b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8B8G8R8_UNORM: 507b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8B8G8R8_UNORM: 5083c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 5093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_A | R300_C1_SEL_B | 5103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_G | R300_C3_SEL_R; 5113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 512f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* RGBA outputs. */ 51326a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R8G8B8X8_UNORM: 514f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_R8G8B8A8_SNORM: 515b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 516b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R10G10B10A2_UNORM: 51726a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10G10B10X2_SNORM: 51826a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 5193c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_UNORM: 5203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_SNORM: 5212ba0c64c26d3ec9b2806f577020d4fde826a858dMarek Olšák case PIPE_FORMAT_R16G16B16A16_FLOAT: 5223c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R32G32B32A32_FLOAT: 5233c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 5243c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_R | R300_C1_SEL_G | 5253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_B | R300_C3_SEL_A; 5263c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5273c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 5283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 5293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 5303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5323c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_colorbuffer_format_supported(enum pipe_format format) 5333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 5343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return r300_translate_colorformat(format) != ~0 && 5353c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák r300_translate_out_fmt(format) != ~0; 5363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5373c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5383c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_zs_format_supported(enum pipe_format format) 5393c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 5403c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return r300_translate_zsformat(format) != ~0; 5413c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5423c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšákboolean r300_is_sampler_format_supported(enum pipe_format format) 5445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{ 5451c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák return r300_translate_texformat(format, 0) != ~0; 5465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák} 5475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 5481c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákstatic void r300_texture_setup_immutable_state(struct r300_screen* screen, 5491c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák struct r300_texture* tex) 5509d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson{ 5511c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák struct r300_texture_format_state* f = &tex->tx_format; 552287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *pt = &tex->b.b; 553b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák boolean is_r500 = screen->caps.is_r500; 5549d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 5553c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Set sampler state. */ 5561c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format0 = R300_TX_WIDTH((pt->width0 - 1) & 0x7ff) | 5571c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák R300_TX_HEIGHT((pt->height0 - 1) & 0x7ff); 558827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák 5594e949271c25ccc5a06fbbbe912b0b43b75d1d169Marek Olšák if (tex->uses_pitch) { 560827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* rectangles love this */ 5611c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format0 |= R300_TX_PITCH_EN; 5629dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák f->format2 = (tex->hwpitch[0] - 1) & 0x1fff; 56363c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák } else { 564827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* power of two textures (3D, mipmaps, and no pitch) */ 5651c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format0 |= R300_TX_DEPTH(util_logbase2(pt->depth0) & 0xf); 566827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 5679d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 5681c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format1 = 0; 569eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie if (pt->target == PIPE_TEXTURE_CUBE) { 5701c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format1 |= R300_TX_FORMAT_CUBIC_MAP; 571eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie } 572eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie if (pt->target == PIPE_TEXTURE_3D) { 5731c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format1 |= R300_TX_FORMAT_3D; 574eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie } 5759d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 576827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* large textures on r500 */ 577827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák if (is_r500) 578827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák { 579d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger if (pt->width0 > 2048) { 5801c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format2 |= R500_TXWIDTH_BIT11; 581827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 582d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger if (pt->height0 > 2048) { 5831c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format2 |= R500_TXHEIGHT_BIT11; 584827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 5851aa38b2c2d80b67fe2eefe468f90aeb44bc20259Corbin Simpson } 5862cbd5ecfb666a757c4abef85dbe40fb53d647ec9Corbin Simpson 5871c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->tile_config = R300_TXO_MACRO_TILE(tex->macrotile) | 5881c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák R300_TXO_MICRO_TILE(tex->microtile); 5891c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák} 5901c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák 5911c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákstatic void r300_texture_setup_fb_state(struct r300_screen* screen, 5921c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák struct r300_texture* tex) 5931c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák{ 5941c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák unsigned i; 5953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Set framebuffer state. */ 597287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (util_format_is_depth_or_stencil(tex->b.b.format)) { 598287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell for (i = 0; i <= tex->b.b.last_level; i++) { 5998874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák tex->fb_state.pitch[i] = 6009dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák tex->hwpitch[i] | 6013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_DEPTHMACROTILE(tex->mip_macrotile[i]) | 6023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_DEPTHMICROTILE(tex->microtile); 6033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 6048874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák tex->fb_state.format = r300_translate_zsformat(tex->b.b.format); 6053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 606287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell for (i = 0; i <= tex->b.b.last_level; i++) { 6078874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák tex->fb_state.pitch[i] = 6089dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák tex->hwpitch[i] | 609287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_translate_colorformat(tex->b.b.format) | 6103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_COLOR_TILE(tex->mip_macrotile[i]) | 6113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_COLOR_MICROTILE(tex->microtile); 6123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 6138874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák tex->fb_state.format = r300_translate_out_fmt(tex->b.b.format); 6143c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 6153cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle} 6163cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 617f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšákvoid r300_texture_reinterpret_format(struct pipe_screen *screen, 618287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex, 619f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák enum pipe_format new_format) 620f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák{ 621f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák struct r300_screen *r300screen = r300_screen(screen); 622f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 6233784b0fa69491aa14bdf6f7a61c4d5de2589d234Corbin Simpson SCREEN_DBG(r300screen, DBG_TEX, 6243784b0fa69491aa14bdf6f7a61c4d5de2589d234Corbin Simpson "r300: texture_reinterpret_format: %s -> %s\n", 6253784b0fa69491aa14bdf6f7a61c4d5de2589d234Corbin Simpson util_format_short_name(tex->format), 6263784b0fa69491aa14bdf6f7a61c4d5de2589d234Corbin Simpson util_format_short_name(new_format)); 627f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 628f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák tex->format = new_format; 629f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 6301c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_fb_state(r300_screen(screen), r300_texture(tex)); 631f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák} 632f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 633118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšákunsigned r300_texture_get_offset(struct r300_texture* tex, unsigned level, 634118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák unsigned zslice, unsigned face) 635118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák{ 636118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák unsigned offset = tex->offset[level]; 637118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 638287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell switch (tex->b.b.target) { 639118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák case PIPE_TEXTURE_3D: 640118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák assert(face == 0); 641118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák return offset + zslice * tex->layer_size[level]; 642118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 643118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák case PIPE_TEXTURE_CUBE: 644118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák assert(zslice == 0); 645118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák return offset + face * tex->layer_size[level]; 646118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 647118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák default: 648118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák assert(zslice == 0 && face == 0); 649118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák return offset; 650118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák } 651118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák} 652118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 6533cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle/** 65446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák * Return the width (dim==TILE_WIDTH) or height (dim==TILE_HEIGHT) of one tile 65546992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák * of the given texture. 65646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák */ 657c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšákstatic unsigned r300_texture_get_tile_size(struct r300_texture* tex, 658c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák int dim, boolean macrotile) 65946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák{ 66046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned pixsize, tile_size; 66146992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 662287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pixsize = util_format_get_blocksize(tex->b.b.format); 663c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_size = microblock_table[util_logbase2(pixsize)][tex->microtile][dim]; 664c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 665c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák if (macrotile) { 666c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_size *= 8; 667c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák } 66846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 66946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák assert(tile_size); 67046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák return tile_size; 67146992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák} 67246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 673c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák/* Return true if macrotiling should be enabled on the miplevel. */ 674c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšákstatic boolean r300_texture_macro_switch(struct r300_texture *tex, 675c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák unsigned level, 67657a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák boolean rv350_mode, 67757a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák int dim) 678c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák{ 67957a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák unsigned tile, texdim; 680c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 68157a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák tile = r300_texture_get_tile_size(tex, dim, TRUE); 68257a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák if (dim == TILE_WIDTH) { 683287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell texdim = u_minify(tex->b.b.width0, level); 68457a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák } else { 685287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell texdim = u_minify(tex->b.b.height0, level); 68657a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák } 687c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 688c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák /* See TX_FILTER1_n.MACRO_SWITCH. */ 689c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák if (rv350_mode) { 69057a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák return texdim >= tile; 691c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák } else { 69257a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák return texdim > tile; 693c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák } 694c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák} 695c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 69646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák/** 6973cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * Return the stride, in bytes, of the texture images of the given texture 6983cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * at the given level. 6993cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle */ 7008959608051ef8e4a97214323009d09c5e9e633fbMarek Olšákunsigned r300_texture_get_stride(struct r300_screen* screen, 7018959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák struct r300_texture* tex, unsigned level) 7023cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle{ 703e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák unsigned tile_width, width, stride; 70446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 7053cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle if (tex->stride_override) 7063cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle return tex->stride_override; 7073cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 70846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák /* Check the level. */ 709287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (level > tex->b.b.last_level) { 7108959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák SCREEN_DBG(screen, DBG_TEX, "%s: level (%u) > last_level (%u)\n", 711287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell __FUNCTION__, level, tex->b.b.last_level); 7123cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle return 0; 7133cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle } 7143cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 715287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell width = u_minify(tex->b.b.width0, level); 71646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 717ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák if (util_format_is_plain(tex->b.b.format)) { 718c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_width = r300_texture_get_tile_size(tex, TILE_WIDTH, 719c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->mip_macrotile[level]); 720cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák width = align(width, tile_width); 721c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 722e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák stride = util_format_get_stride(tex->b.b.format, width); 723e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák 724e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák /* Some IGPs need a minimum stride of 64 bytes, hmm... 725e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák * This doesn't seem to apply to tiled textures, according to r300c. */ 726e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák if (!tex->microtile && !tex->mip_macrotile[level] && 727e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák (screen->caps.family == CHIP_FAMILY_RS600 || 728e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák screen->caps.family == CHIP_FAMILY_RS690 || 729e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák screen->caps.family == CHIP_FAMILY_RS740)) { 730e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák return stride < 64 ? 64 : stride; 731e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák } 732e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák 733e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák /* The alignment to 32 bytes is sort of implied by the layout... */ 734e0d72814be13fbe8fec6a96978e92b1ec662c69cMarek Olšák return stride; 735cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák } else { 736287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return align(util_format_get_stride(tex->b.b.format, width), 32); 737cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák } 73846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák} 73946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 74046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšákstatic unsigned r300_texture_get_nblocksy(struct r300_texture* tex, 74146992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned level) 74246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák{ 74346992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned height, tile_height; 74446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 745287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell height = u_minify(tex->b.b.height0, level); 746cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák 747ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák if (util_format_is_plain(tex->b.b.format)) { 748c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_height = r300_texture_get_tile_size(tex, TILE_HEIGHT, 749c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->mip_macrotile[level]); 750cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák height = align(height, tile_height); 751e7f1e5ca648d6c96d056d3ae8eab65e98f47f311Marek Olšák 752e7f1e5ca648d6c96d056d3ae8eab65e98f47f311Marek Olšák /* This is needed for the kernel checker, unfortunately. */ 753e7f1e5ca648d6c96d056d3ae8eab65e98f47f311Marek Olšák height = util_next_power_of_two(height); 754cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák } 75546992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 756287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return util_format_get_nblocksy(tex->b.b.format, height); 7579d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson} 7589d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 7592e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšákstatic void r300_texture_3d_fix_mipmapping(struct r300_screen *screen, 7602e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák struct r300_texture *tex) 7612e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák{ 7622579fe4044012a552c8be222ffae76b48de13592Marek Olšák /* The kernels <= 2.6.34-rc4 compute the size of mipmapped 3D textures 7632e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák * incorrectly. This is a workaround to prevent CS from being rejected. */ 7642e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 7652e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák unsigned i, size; 7662e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 767b7fa7e8da6239333bd9327eac1a3015c668d215bMarek Olšák if (!screen->rws->get_value(screen->rws, R300_VID_DRM_2_3_0) && 7682e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák tex->b.b.target == PIPE_TEXTURE_3D && 7692e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák tex->b.b.last_level > 0) { 7702e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák size = 0; 7712e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 7722e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák for (i = 0; i <= tex->b.b.last_level; i++) { 7732e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák size += r300_texture_get_stride(screen, tex, i) * 7742e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák r300_texture_get_nblocksy(tex, i); 7752e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák } 7762e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 7772e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák size *= tex->b.b.depth0; 7782e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák tex->size = size; 7792e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák } 7802e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák} 7812e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 7828959608051ef8e4a97214323009d09c5e9e633fbMarek Olšákstatic void r300_setup_miptree(struct r300_screen* screen, 7838959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák struct r300_texture* tex) 7848e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson{ 785287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource* base = &tex->b.b; 78646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned stride, size, layer_size, nblocksy, i; 787f189caeed046e05bfeec8adf2ebeaae01d1bf2f6Marek Olšák boolean rv350_mode = screen->caps.is_rv350; 7888e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 7893784b0fa69491aa14bdf6f7a61c4d5de2589d234Corbin Simpson SCREEN_DBG(screen, DBG_TEXALLOC, 7903784b0fa69491aa14bdf6f7a61c4d5de2589d234Corbin Simpson "r300: Making miptree for texture, format %s\n", 7913784b0fa69491aa14bdf6f7a61c4d5de2589d234Corbin Simpson util_format_short_name(base->format)); 792ce1c493ff8fad4b62e2b66f06636ac6560a6e0adCorbin Simpson 7932b5770e652f0e6620b52971755bd7eb31c16ad7dCorbin Simpson for (i = 0; i <= base->last_level; i++) { 794c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák /* Let's see if this miplevel can be macrotiled. */ 79557a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák tex->mip_macrotile[i] = 79657a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák (tex->macrotile == R300_BUFFER_TILED && 797a43618fdc4e046f946d5f0de6dd8a421b66e9498Mathias Fröhlich r300_texture_macro_switch(tex, i, rv350_mode, TILE_WIDTH) && 798a43618fdc4e046f946d5f0de6dd8a421b66e9498Mathias Fröhlich r300_texture_macro_switch(tex, i, rv350_mode, TILE_HEIGHT)) ? 79957a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák R300_BUFFER_TILED : R300_BUFFER_LINEAR; 800c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 8018959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák stride = r300_texture_get_stride(screen, tex, i); 80246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák nblocksy = r300_texture_get_nblocksy(tex, i); 803c78748a5274e58bcbb122923edf81065be9bbe16Roland Scheidegger layer_size = stride * nblocksy; 804827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák 805827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák if (base->target == PIPE_TEXTURE_CUBE) 806827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák size = layer_size * 6; 807827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák else 808d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger size = layer_size * u_minify(base->depth0, i); 8098e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 810c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->offset[i] = tex->size; 811048f988aeb06fa360c6c41eaa50cb96b4b86e34eMichel Dänzer tex->size = tex->offset[i] + size; 812118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák tex->layer_size[i] = layer_size; 813b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol tex->pitch[i] = stride / util_format_get_blocksize(base->format); 8149dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák tex->hwpitch[i] = 8159dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák tex->pitch[i] * util_format_get_blockwidth(base->format); 81663c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák 8170bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(screen, DBG_TEXALLOC, "r300: Texture miptree: Level %d " 818c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák "(%dx%dx%d px, pitch %d bytes) %d bytes total, macrotiled %s\n", 819d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger i, u_minify(base->width0, i), u_minify(base->height0, i), 820c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák u_minify(base->depth0, i), stride, tex->size, 821c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->mip_macrotile[i] ? "TRUE" : "FALSE"); 8228e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson } 8238e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson} 8248e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 82563c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšákstatic void r300_setup_flags(struct r300_texture* tex) 82663c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák{ 827287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->uses_pitch = !util_is_power_of_two(tex->b.b.width0) || 828287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell !util_is_power_of_two(tex->b.b.height0) || 8294e949271c25ccc5a06fbbbe912b0b43b75d1d169Marek Olšák tex->stride_override; 83063c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák} 83163c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák 832b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšákstatic void r300_setup_tiling(struct pipe_screen *screen, 833b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák struct r300_texture *tex) 834b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák{ 83512dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 836287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell enum pipe_format format = tex->b.b.format; 837f189caeed046e05bfeec8adf2ebeaae01d1bf2f6Marek Olšák boolean rv350_mode = r300_screen(screen)->caps.is_rv350; 838c383defdaacab0fe7f35e7a4ae5b57228cf5310cMarek Olšák boolean is_zb = util_format_is_depth_or_stencil(format); 8395b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák boolean dbg_no_tiling = SCREEN_DBG_ON(r300_screen(screen), DBG_NO_TILING); 840b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 841ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák if (!util_format_is_plain(format)) { 842b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák return; 843b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 844b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 845c383defdaacab0fe7f35e7a4ae5b57228cf5310cMarek Olšák /* If height == 1, disable microtiling except for zbuffer. */ 8465b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák if (!is_zb && (tex->b.b.height0 == 1 || dbg_no_tiling)) { 847b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák return; 848b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 849b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 850b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák /* Set microtiling. */ 851b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák switch (util_format_get_blocksize(format)) { 852b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák case 1: 853b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák case 4: 854b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák tex->microtile = R300_BUFFER_TILED; 855b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák break; 856b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 85712dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák case 2: 858b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák case 8: 85912dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák if (rws->get_value(rws, R300_VID_SQUARE_TILING_SUPPORT)) { 86012dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák tex->microtile = R300_BUFFER_SQUARETILED; 86112dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák } 86212dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák break; 863b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 864b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 8655b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák if (dbg_no_tiling) { 8665b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák return; 8675b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák } 8685b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák 869b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák /* Set macrotiling. */ 87057a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák if (r300_texture_macro_switch(tex, 0, rv350_mode, TILE_WIDTH) && 87157a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák r300_texture_macro_switch(tex, 0, rv350_mode, TILE_HEIGHT)) { 872b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák tex->macrotile = R300_BUFFER_TILED; 873b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 874b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák} 875b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 876287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic unsigned r300_texture_is_referenced(struct pipe_context *context, 877287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *texture, 878287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned face, unsigned level) 879287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 880287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_context *r300 = r300_context(context); 881287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_texture *rtex = (struct r300_texture *)texture; 882287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 8837a1b5c937fa32968a04a11649e456a1ef8c5b442Marek Olšák if (r300->rws->is_buffer_referenced(r300->rws, rtex->buffer, R300_REF_CS)) 884287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 885287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 886287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return PIPE_UNREFERENCED; 887287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 888287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 889287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic void r300_texture_destroy(struct pipe_screen *screen, 890287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource* texture) 891287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 892287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_texture* tex = (struct r300_texture*)texture; 893287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_winsys_screen *rws = (struct r300_winsys_screen *)texture->screen->winsys; 894287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 895287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell rws->buffer_reference(rws, &tex->buffer, NULL); 896287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell FREE(tex); 897287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 898287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 8990b4df63609e9fb25319debd56142a90b11d75671Marek Olšákstatic boolean r300_texture_get_handle(struct pipe_screen* screen, 9000b4df63609e9fb25319debd56142a90b11d75671Marek Olšák struct pipe_resource *texture, 9010b4df63609e9fb25319debd56142a90b11d75671Marek Olšák struct winsys_handle *whandle) 902287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 903287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 904287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_texture* tex = (struct r300_texture*)texture; 905287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned stride; 906287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 907287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (!tex) { 908287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return FALSE; 909287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell } 910287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 911287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell stride = r300_texture_get_stride(r300_screen(screen), tex, 0); 912287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 913287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell rws->buffer_get_handle(rws, tex->buffer, stride, whandle); 914287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 915287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return TRUE; 916287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 917287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 918287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct u_resource_vtbl r300_texture_vtbl = 919287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 920287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_get_handle, /* get_handle */ 921287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_destroy, /* resource_destroy */ 922287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_is_referenced, /* is_resource_referenced */ 923287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_get_transfer, /* get_transfer */ 924287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_transfer_destroy, /* transfer_destroy */ 925287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_transfer_map, /* transfer_map */ 926287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell u_default_transfer_flush_region, /* transfer_flush_region */ 927287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_transfer_unmap, /* transfer_unmap */ 928287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell u_default_transfer_inline_write /* transfer_inline_write */ 929287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}; 930287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 9310648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson/* Create a new texture. */ 932287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource* r300_texture_create(struct pipe_screen* screen, 933287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource* base) 9340648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson{ 9358e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson struct r300_texture* tex = CALLOC_STRUCT(r300_texture); 9368959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák struct r300_screen* rscreen = r300_screen(screen); 93768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 9388e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 9398e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson if (!tex) { 9408e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson return NULL; 9415cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák } 9425cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák 9435cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák /* Refuse to create a texture with size 0. */ 9445cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák if (!base->width0 || 9455cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák (!base->height0 && (base->target == PIPE_TEXTURE_2D || 9465cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák base->target == PIPE_TEXTURE_CUBE)) || 9475cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák (!base->depth0 && base->target == PIPE_TEXTURE_3D)) { 9485cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák fprintf(stderr, "r300: texture_create: " 9495cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák "Got invalid texture dimensions: %ix%ix%i\n", 9505cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák base->width0, base->height0, base->depth0); 9513234066be221832f660f4e61fc6b0a92c5304780Vinson Lee FREE(tex); 9525cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák return NULL; 9538e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson } 9548e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 955287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.b = *base; 956287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.vtbl = &r300_texture_vtbl; 957287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_reference_init(&tex->b.b.reference, 1); 958287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.b.screen = screen; 9598e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 96063c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák r300_setup_flags(tex); 961287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (!(base->flags & R300_RESOURCE_FLAG_TRANSFER) && 962287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell !(base->bind & PIPE_BIND_SCANOUT)) { 963b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák r300_setup_tiling(screen, tex); 964b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 9658959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák r300_setup_miptree(rscreen, tex); 9662e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák r300_texture_3d_fix_mipmapping(rscreen, tex); 9671c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_immutable_state(rscreen, tex); 9681c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_fb_state(rscreen, tex); 9699d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 9700bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(rscreen, DBG_TEX, 9710bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák "r300: texture_create: Macro: %s, Micro: %s, Pitch: %i, " 972f571a569a03edc66ecd76d67f10db0a4bb600a40Marek Olšák "Dim: %ix%ix%i, LastLevel: %i, Size: %i, Format: %s\n", 9730bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->macrotile ? "YES" : " NO", 9740bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->microtile ? "YES" : " NO", 9750bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->hwpitch[0], 9760bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák base->width0, base->height0, base->depth0, base->last_level, 977f571a569a03edc66ecd76d67f10db0a4bb600a40Marek Olšák tex->size, 978ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák util_format_short_name(base->format)); 9790bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák 980b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák tex->domain = base->flags & R300_RESOURCE_FLAG_TRANSFER ? R300_DOMAIN_GTT : 981b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák R300_DOMAIN_VRAM; 98219498be935328e284c7f0e456fc04cca8d465d4cMarek Olšák 983b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák tex->buffer = rws->buffer_create(rws, 2048, base->bind, tex->domain, 984b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák tex->size); 98537f3454eb3afa1297126a8d77a563d734c292a37Marek Olšák 986950be3fa3c22d67f3b80e7ed5d274d957f0bff93Marek Olšák if (!tex->buffer) { 987950be3fa3c22d67f3b80e7ed5d274d957f0bff93Marek Olšák FREE(tex); 988950be3fa3c22d67f3b80e7ed5d274d957f0bff93Marek Olšák return NULL; 989950be3fa3c22d67f3b80e7ed5d274d957f0bff93Marek Olšák } 990950be3fa3c22d67f3b80e7ed5d274d957f0bff93Marek Olšák 99168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie rws->buffer_set_tiling(rws, tex->buffer, 99221dfcde3ff54e0d01ddd2c79b14db82b57541433Marek Olšák tex->pitch[0] * util_format_get_blocksize(tex->b.b.format), 99321dfcde3ff54e0d01ddd2c79b14db82b57541433Marek Olšák tex->microtile, 99421dfcde3ff54e0d01ddd2c79b14db82b57541433Marek Olšák tex->macrotile); 9958e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 996287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return (struct pipe_resource*)tex; 9978e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson} 9988e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 999287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file: 1000287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */ 1001287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_surface* r300_get_tex_surface(struct pipe_screen* screen, 1002287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource* texture, 1003287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned face, 1004287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned level, 1005287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned zslice, 1006287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned flags) 1007471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{ 1008a1f85cf689b6f9ccf6b7310485460f84c8d78cadMarek Olšák struct r300_texture* tex = r300_texture(texture); 10098874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák struct r300_surface* surface = CALLOC_STRUCT(r300_surface); 1010471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 1011471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson if (surface) { 10128874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák pipe_reference_init(&surface->base.reference, 1); 10138874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák pipe_resource_reference(&surface->base.texture, texture); 10148874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák surface->base.format = texture->format; 10158874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák surface->base.width = u_minify(texture->width0, level); 10168874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák surface->base.height = u_minify(texture->height0, level); 10178874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák surface->base.usage = flags; 10188874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák surface->base.zslice = zslice; 10198874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák surface->base.face = face; 10208874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák surface->base.level = level; 10218874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák 10228874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák surface->buffer = tex->buffer; 10238874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák surface->domain = tex->domain; 10248874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák surface->offset = r300_texture_get_offset(tex, level, zslice, face); 10258874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák surface->pitch = tex->fb_state.pitch[level]; 10268874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák surface->format = tex->fb_state.format; 1027471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson } 1028471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 10298874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák return &surface->base; 1030471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson} 1031471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 1032287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file: 1033287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */ 1034287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid r300_tex_surface_destroy(struct pipe_surface* s) 1035471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{ 1036287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&s->texture, NULL); 10375e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer FREE(s); 1038471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson} 1039471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 1040287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource* 1041287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellr300_texture_from_handle(struct pipe_screen* screen, 1042287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource* base, 1043287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct winsys_handle *whandle) 1044d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz{ 104568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = (struct r300_winsys_screen*)screen->winsys; 1046d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz struct r300_screen* rscreen = r300_screen(screen); 104768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_buffer *buffer; 1048d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz struct r300_texture* tex; 1049d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz unsigned stride; 1050b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák boolean override_zb_flags; 1051d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1052d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz /* Support only 2D textures without mipmaps */ 1053d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (base->target != PIPE_TEXTURE_2D || 1054d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz base->depth0 != 1 || 1055d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz base->last_level != 0) { 1056d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return NULL; 1057d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 1058d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 105968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie buffer = rws->buffer_from_handle(rws, screen, whandle, &stride); 1060d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (!buffer) { 1061d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return NULL; 1062d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 1063d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1064d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex = CALLOC_STRUCT(r300_texture); 1065d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (!tex) { 1066d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return NULL; 1067d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 1068d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1069287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.b = *base; 1070287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.vtbl = &r300_texture_vtbl; 1071287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_reference_init(&tex->b.b.reference, 1); 1072287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.b.screen = screen; 1073b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák tex->domain = R300_DOMAIN_VRAM; 1074d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1075d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex->stride_override = stride; 1076d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1077d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz /* one ref already taken */ 1078d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex->buffer = buffer; 1079d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 10804c26cdbe01619abad413b09317f2842dcf1a4d57Dave Airlie rws->buffer_get_tiling(rws, buffer, &tex->microtile, &tex->macrotile); 1081e0848bd90378ba633cfa57013c650e892d931f74Marek Olšák r300_setup_flags(tex); 10820bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(rscreen, DBG_TEX, 10830bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák "r300: texture_from_handle: Macro: %s, Micro: %s, " 10840bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák "Pitch: % 4i, Dim: %ix%i, Format: %s\n", 10850bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->macrotile ? "YES" : " NO", 10860bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->microtile ? "YES" : " NO", 10870bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák stride / util_format_get_blocksize(base->format), 10880bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák base->width0, base->height0, 1089ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák util_format_short_name(base->format)); 1090b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1091b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák /* Enforce microtiled zbuffer. */ 1092b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák override_zb_flags = util_format_is_depth_or_stencil(base->format) && 1093b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák tex->microtile == R300_BUFFER_LINEAR; 1094b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1095b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák if (override_zb_flags) { 1096b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák switch (util_format_get_blocksize(base->format)) { 1097b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák case 4: 1098b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák tex->microtile = R300_BUFFER_TILED; 1099b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák break; 1100b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1101b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák case 2: 1102b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák if (rws->get_value(rws, R300_VID_SQUARE_TILING_SUPPORT)) { 1103b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák tex->microtile = R300_BUFFER_SQUARETILED; 1104b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák break; 1105b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák } 1106b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák /* Pass through. */ 1107b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1108b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák default: 1109b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák override_zb_flags = FALSE; 1110b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák } 1111b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák } 1112b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1113e0848bd90378ba633cfa57013c650e892d931f74Marek Olšák r300_setup_miptree(rscreen, tex); 11141c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_immutable_state(rscreen, tex); 11151c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_fb_state(rscreen, tex); 1116b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1117b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák if (override_zb_flags) { 1118b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák rws->buffer_set_tiling(rws, tex->buffer, 111921dfcde3ff54e0d01ddd2c79b14db82b57541433Marek Olšák tex->pitch[0] * util_format_get_blocksize(tex->b.b.format), 112021dfcde3ff54e0d01ddd2c79b14db82b57541433Marek Olšák tex->microtile, 112121dfcde3ff54e0d01ddd2c79b14db82b57541433Marek Olšák tex->macrotile); 1122b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák } 1123287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return (struct pipe_resource*)tex; 1124d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz} 1125