r300_texture.c revision 3234066be221832f660f4e61fc6b0a92c5304780
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 505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák/* Translate a pipe_format into a useful texture format for sampling. 515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 525c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Some special formats are translated directly using R300_EASY_TX_FORMAT, 535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * but the majority of them is translated in a generic way, automatically 545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * supporting all the formats hw can support. 555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT swizzles the texture. 575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Note the signature of R300_EASY_TX_FORMAT: 585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT(B, G, R, A, FORMAT); 595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * The FORMAT specifies how the texture sampler will treat the texture, and 615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * makes available X, Y, Z, W, ZERO, and ONE for swizzling. */ 621c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r300_translate_texformat(enum pipe_format format, 633b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák const unsigned char *swizzle_view) 645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{ 655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák uint32_t result = 0; 665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák const struct util_format_description *desc; 6739e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák unsigned i; 685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák boolean uniform = TRUE; 695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák const uint32_t swizzle_shift[4] = { 705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_R_SHIFT, 715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_G_SHIFT, 725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_B_SHIFT, 735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_A_SHIFT 745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák }; 751c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák const uint32_t swizzle_bit[4] = { 76232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák R300_TX_FORMAT_X, 77232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák R300_TX_FORMAT_Y, 78232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák R300_TX_FORMAT_Z, 79232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák R300_TX_FORMAT_W 80232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák }; 815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák const uint32_t sign_bit[4] = { 825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_X, 835c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_Y, 845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_Z, 855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_W, 865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák }; 873b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák unsigned char swizzle[4]; 885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc = util_format_description(format); 905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Colorspace (return non-RGB formats directly). */ 925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->colorspace) { 935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Depth stencil formats. */ 945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_ZS: 955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_Z16_UNORM: 975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, X, X, X, X16); 98b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8Z24_UNORM: 996fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger case PIPE_FORMAT_S8_USCALED_Z24_UNORM: 1005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, X, X, X, W24_FP); 1015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported. */ 1035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* YUV formats. */ 1065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_YUV: 1075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_YUV_TO_RGB; 1085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 110b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_UYVY: 1115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result; 112b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_YUYV: 1135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result; 1145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 1165c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Add gamma correction. */ 1195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_SRGB: 1205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_GAMMA; 1215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 123e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák default: 124e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák switch (format) { 125e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák /* Same as YUV but without the YUR->RGB conversion. */ 126e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák case PIPE_FORMAT_R8G8_B8G8_UNORM: 127e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result; 128e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák case PIPE_FORMAT_G8R8_G8B8_UNORM: 129e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result; 130e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák default:; 131e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák } 1325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1343b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák /* Get swizzle. */ 1353b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák if (swizzle_view) { 1363b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák /* Compose two sets of swizzles. */ 1373b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák for (i = 0; i < 4; i++) { 1383b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák swizzle[i] = swizzle_view[i] <= UTIL_FORMAT_SWIZZLE_W ? 1393b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák desc->swizzle[swizzle_view[i]] : swizzle_view[i]; 1401c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák } 1413b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák } else { 1423b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák memcpy(swizzle, desc->swizzle, sizeof(swizzle)); 1433b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák } 1441c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák 1453b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák /* Add swizzle. */ 1465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák for (i = 0; i < 4; i++) { 1471c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák switch (swizzle[i]) { 1485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_X: 1495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_NONE: 1501c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák result |= swizzle_bit[0] << swizzle_shift[i]; 1515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1525c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_Y: 1531c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák result |= swizzle_bit[1] << swizzle_shift[i]; 1545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_Z: 1561c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák result |= swizzle_bit[2] << swizzle_shift[i]; 1575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_W: 1591c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák result |= swizzle_bit[3] << swizzle_shift[i]; 1605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_0: 1625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_ZERO << swizzle_shift[i]; 1635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_1: 1655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_ONE << swizzle_shift[i]; 1665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported. */ 1695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1723252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák /* S3TC formats. */ 17328cf5e1191077e063fe2a81d9d35934b71d001e2José Fonseca if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) { 17488512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák if (!util_format_s3tc_enabled) { 17588512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák return ~0; /* Unsupported. */ 17688512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák } 17788512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák 1785c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 1795c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_RGB: 1805c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_RGBA: 1815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_SRGB: 1825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_SRGBA: 1835c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT1 | result; 1845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT3_RGBA: 1855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT3_SRGBA: 1865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT3 | result; 1875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT5_RGBA: 1885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT5_SRGBA: 1895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT5 | result; 1905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 1925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Add sign. */ 19639e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák for (i = 0; i < desc->nr_channels; i++) { 1975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 1985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= sign_bit[i]; 1995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 202e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák /* This is truly a special format. 203e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák * It stores R8G8 and B is computed using sqrt(1 - R^2 - G^2) 204e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák * in the sampler unit. Also known as D3DFMT_CxV8U8. */ 205e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák if (format == PIPE_FORMAT_R8G8Bx_SNORM) { 206e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák return R300_TX_FORMAT_CxV8U8 | result; 207e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák } 208e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák 2093252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák /* RGTC formats. */ 2103252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) { 2113252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák switch (format) { 2123252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_UNORM: 2133252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_SNORM: 2143252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R500_TX_FORMAT_ATI1N | result; 2153252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC2_UNORM: 2163252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC2_SNORM: 2173252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R400_TX_FORMAT_ATI2N | result; 2183252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák default: 2193252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return ~0; /* Unsupported/unknown. */ 2203252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 2213252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 2223252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák 2235c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* See whether the components are of the same size. */ 22439e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák for (i = 1; i < desc->nr_channels; i++) { 2255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák uniform = uniform && desc->channel[0].size == desc->channel[i].size; 2265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Non-uniform formats. */ 2295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (!uniform) { 23039e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 3: 2325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 2335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 6 && 2345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 5) { 2355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Z5Y6X5 | result; 2365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 2385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 5 && 2395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 6) { 2405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Z6Y5X5 | result; 2415c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 2435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 2465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 5 && 2475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 5 && 2485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[3].size == 1) { 2495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W1Z5Y5X5 | result; 2505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 10 && 2525c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 10 && 2535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 10 && 2545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[3].size == 2) { 2555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W2Z10Y10X10 | result; 2565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 2595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* And finally, uniform formats. */ 2625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->channel[0].type) { 2635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_UNSIGNED: 2645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_SIGNED: 2655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (!desc->channel[0].normalized && 2665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) { 2675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->channel[0].size) { 2715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 27239e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 2745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y4X4 | result; 2755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2765c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W4Z4Y4X4 | result; 2775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2785c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2795c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2805c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 8: 28139e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 2835c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_X8 | result; 2845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 2855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y8X8 | result; 2865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W8Z8Y8X8 | result; 2885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 16: 29239e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 2945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_X16 | result; 2955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 2965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y16X16 | result; 2975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W16Z16Y16X16 | result; 2995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 3025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_FLOAT: 3045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->channel[0].size) { 3055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 16: 30639e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 3075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 3085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F | result; 3095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 3105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F_16F | result; 3115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 3125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F_16F_16F_16F | result; 3135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 3155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3165c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 32: 31739e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 3185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 3195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F | result; 3205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 3215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F_32F | result; 3225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 3235c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F_32F_32F_32F | result; 3245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 3295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák} 3305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3311c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r500_tx_format_msb_bit(enum pipe_format format) 3323252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák{ 3333252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák switch (format) { 3343252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_UNORM: 3353252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_SNORM: 3363252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R500_TXFORMAT_MSB; 3373252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák default: 3383252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return 0; 3393252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 3403252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák} 3413252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák 3423c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Buffer formats. */ 3433c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3443c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Colorbuffer formats. This is the unswizzled format of the RB3D block's 3453c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * output. For the swizzling of the targets, check the shader's format. */ 3463c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_colorformat(enum pipe_format format) 3473c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 3483c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 3493c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 8-bit buffers. */ 3503c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_A8_UNORM: 3513c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_I8_UNORM: 3523c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_L8_UNORM: 3533c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_UNORM: 3543c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_SNORM: 3553c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_I8; 3563c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3573c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 16-bit buffers. */ 358b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G6R5_UNORM: 3593c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_RGB565; 36026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák 361b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G5R5A1_UNORM: 362f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_B5G5R5X1_UNORM: 3633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB1555; 36426a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák 365b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B4G4R4A4_UNORM: 36626a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B4G4R4X4_UNORM: 3673c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB4444; 3683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 32-bit buffers. */ 3703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_B8G8R8A8_UNORM: 3713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_B8G8R8X8_UNORM: 372b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8R8G8B8_UNORM: 373b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8R8G8B8_UNORM: 374b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8B8G8R8_UNORM: 3753c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8G8B8A8_SNORM: 376b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8B8G8R8_UNORM: 37726a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R8G8B8X8_UNORM: 378b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 3793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB8888; 38026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák 381b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R10G10B10A2_UNORM: 38226a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10G10B10X2_SNORM: 38326a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B10G10R10A2_UNORM: 38426a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 3853c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R500_COLOR_FORMAT_ARGB2101010; /* R5xx-only? */ 3863c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3873c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 64-bit buffers. */ 3883c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_UNORM: 3893c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_SNORM: 3902ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák case PIPE_FORMAT_R16G16B16A16_FLOAT: 3913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB16161616; 3923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 128-bit buffers. */ 3943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R32G32B32A32_FLOAT: 3953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB32323232; 3963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* YUV buffers. */ 398b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_UYVY: 3993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_YVYU; 400b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_YUYV: 4013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_VYUY; 4023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 4033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 4043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 4063c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Depthbuffer and stencilbuffer. Thankfully, we only support two flavors. */ 4083c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_zsformat(enum pipe_format format) 4093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 4103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 4113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 16-bit depth, no stencil */ 4123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_Z16_UNORM: 4133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_DEPTHFORMAT_16BIT_INT_Z; 4143c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 24-bit depth, ignored stencil */ 415b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8Z24_UNORM: 4163c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 24-bit depth, 8-bit stencil */ 4176fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger case PIPE_FORMAT_S8_USCALED_Z24_UNORM: 4183c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL; 4193c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 4203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 4213c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4223c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 4233c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4243c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Shader output formats. This is essentially the swizzle from the shader 4253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * to the RB3D block. 4263c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * 4273c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * Note that formats are stored from C3 to C0. */ 4283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_out_fmt(enum pipe_format format) 4293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 4303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák uint32_t modifier = 0; 4313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák unsigned i; 4323c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák const struct util_format_description *desc; 4333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák static const uint32_t sign_bit[4] = { 4343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x1), 4353c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x2), 4363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x4), 4373c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x8), 4383c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák }; 4393c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4403c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák desc = util_format_description(format); 4413c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4423c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Specifies how the shader output is written to the fog unit. */ 4430c81739528fd8f240176bb120c90c712f9606718Marek Olšák if (desc->channel[0].type == UTIL_FORMAT_TYPE_FLOAT) { 4443c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (desc->channel[0].size == 32) { 4453c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_32_FP; 4463c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 4473c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_16_FP; 4483c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4493c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 4503c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (desc->channel[0].size == 16) { 4513c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_16; 4523c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 4533c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* C4_8 seems to be used for the formats whose pixel size 4543c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * is <= 32 bits. */ 4553c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_8; 4563c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4573c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4583c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4593c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Add sign. */ 4603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák for (i = 0; i < 4; i++) 4613c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 4623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= sign_bit[i]; 4633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4653c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Add swizzles and return. */ 4663c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 4673c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 8-bit outputs. 4683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * COLORFORMAT_I8 stores the C2 component. */ 4693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_A8_UNORM: 4703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | R300_C2_SEL_A; 4713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_I8_UNORM: 4723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_L8_UNORM: 4733c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_UNORM: 4743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_SNORM: 4753c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | R300_C2_SEL_R; 4763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 477f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* BGRA outputs. */ 478b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G6R5_UNORM: 479b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G5R5A1_UNORM: 480f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_B5G5R5X1_UNORM: 481b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B4G4R4A4_UNORM: 48226a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B4G4R4X4_UNORM: 483b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B8G8R8A8_UNORM: 484b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B8G8R8X8_UNORM: 48526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B10G10R10A2_UNORM: 4863c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 4873c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_B | R300_C1_SEL_G | 4883c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_R | R300_C3_SEL_A; 4893c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 490f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* ARGB outputs. */ 491b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8R8G8B8_UNORM: 492b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8R8G8B8_UNORM: 4933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 4943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_A | R300_C1_SEL_R | 4953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_G | R300_C3_SEL_B; 4963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 497f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* ABGR outputs. */ 498b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8B8G8R8_UNORM: 499b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8B8G8R8_UNORM: 5003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 5013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_A | R300_C1_SEL_B | 5023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_G | R300_C3_SEL_R; 5033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 504f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* RGBA outputs. */ 50526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R8G8B8X8_UNORM: 506f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_R8G8B8A8_SNORM: 507b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 508b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R10G10B10A2_UNORM: 50926a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10G10B10X2_SNORM: 51026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 5113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_UNORM: 5123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_SNORM: 5132ba0c64c26d3ec9b2806f577020d4fde826a858dMarek Olšák case PIPE_FORMAT_R16G16B16A16_FLOAT: 5143c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R32G32B32A32_FLOAT: 5153c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 5163c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_R | R300_C1_SEL_G | 5173c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_B | R300_C3_SEL_A; 5183c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5193c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 5203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 5213c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 5223c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5233c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5243c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_colorbuffer_format_supported(enum pipe_format format) 5253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 5263c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return r300_translate_colorformat(format) != ~0 && 5273c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák r300_translate_out_fmt(format) != ~0; 5283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_zs_format_supported(enum pipe_format format) 5313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 5323c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return r300_translate_zsformat(format) != ~0; 5333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšákboolean r300_is_sampler_format_supported(enum pipe_format format) 5365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{ 5371c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák return r300_translate_texformat(format, 0) != ~0; 5385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák} 5395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 5401c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákstatic void r300_texture_setup_immutable_state(struct r300_screen* screen, 5411c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák struct r300_texture* tex) 5429d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson{ 5431c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák struct r300_texture_format_state* f = &tex->tx_format; 544287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *pt = &tex->b.b; 545b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák boolean is_r500 = screen->caps.is_r500; 5469d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 5473c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Set sampler state. */ 5481c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format0 = R300_TX_WIDTH((pt->width0 - 1) & 0x7ff) | 5491c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák R300_TX_HEIGHT((pt->height0 - 1) & 0x7ff); 550827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák 5514e949271c25ccc5a06fbbbe912b0b43b75d1d169Marek Olšák if (tex->uses_pitch) { 552827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* rectangles love this */ 5531c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format0 |= R300_TX_PITCH_EN; 5549dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák f->format2 = (tex->hwpitch[0] - 1) & 0x1fff; 55563c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák } else { 556827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* power of two textures (3D, mipmaps, and no pitch) */ 5571c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format0 |= R300_TX_DEPTH(util_logbase2(pt->depth0) & 0xf); 558827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 5599d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 5601c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format1 = 0; 561eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie if (pt->target == PIPE_TEXTURE_CUBE) { 5621c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format1 |= R300_TX_FORMAT_CUBIC_MAP; 563eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie } 564eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie if (pt->target == PIPE_TEXTURE_3D) { 5651c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format1 |= R300_TX_FORMAT_3D; 566eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie } 5679d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 568827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* large textures on r500 */ 569827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák if (is_r500) 570827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák { 571d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger if (pt->width0 > 2048) { 5721c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format2 |= R500_TXWIDTH_BIT11; 573827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 574d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger if (pt->height0 > 2048) { 5751c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format2 |= R500_TXHEIGHT_BIT11; 576827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 5771aa38b2c2d80b67fe2eefe468f90aeb44bc20259Corbin Simpson } 5782cbd5ecfb666a757c4abef85dbe40fb53d647ec9Corbin Simpson 5791c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->tile_config = R300_TXO_MACRO_TILE(tex->macrotile) | 5801c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák R300_TXO_MICRO_TILE(tex->microtile); 5811c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák} 5821c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák 5831c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákstatic void r300_texture_setup_fb_state(struct r300_screen* screen, 5841c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák struct r300_texture* tex) 5851c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák{ 5861c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák unsigned i; 5873c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5883c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Set framebuffer state. */ 589287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (util_format_is_depth_or_stencil(tex->b.b.format)) { 590287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell for (i = 0; i <= tex->b.b.last_level; i++) { 5913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák tex->fb_state.depthpitch[i] = 5929dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák tex->hwpitch[i] | 5933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_DEPTHMACROTILE(tex->mip_macrotile[i]) | 5943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_DEPTHMICROTILE(tex->microtile); 5953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 596287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->fb_state.zb_format = r300_translate_zsformat(tex->b.b.format); 5973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 598287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell for (i = 0; i <= tex->b.b.last_level; i++) { 5993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák tex->fb_state.colorpitch[i] = 6009dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák tex->hwpitch[i] | 601287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_translate_colorformat(tex->b.b.format) | 6023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_COLOR_TILE(tex->mip_macrotile[i]) | 6033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_COLOR_MICROTILE(tex->microtile); 6043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 605287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->fb_state.us_out_fmt = r300_translate_out_fmt(tex->b.b.format); 6063c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 6073cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle} 6083cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 609f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšákvoid r300_texture_reinterpret_format(struct pipe_screen *screen, 610287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex, 611f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák enum pipe_format new_format) 612f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák{ 613f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák struct r300_screen *r300screen = r300_screen(screen); 614f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 6150bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(r300screen, DBG_TEX, "r300: texture_reinterpret_format: %s -> %s\n", 616ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák util_format_short_name(tex->format), util_format_short_name(new_format)); 617f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 618f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák tex->format = new_format; 619f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 6201c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_fb_state(r300_screen(screen), r300_texture(tex)); 621f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák} 622f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 623118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšákunsigned r300_texture_get_offset(struct r300_texture* tex, unsigned level, 624118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák unsigned zslice, unsigned face) 625118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák{ 626118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák unsigned offset = tex->offset[level]; 627118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 628287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell switch (tex->b.b.target) { 629118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák case PIPE_TEXTURE_3D: 630118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák assert(face == 0); 631118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák return offset + zslice * tex->layer_size[level]; 632118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 633118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák case PIPE_TEXTURE_CUBE: 634118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák assert(zslice == 0); 635118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák return offset + face * tex->layer_size[level]; 636118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 637118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák default: 638118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák assert(zslice == 0 && face == 0); 639118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák return offset; 640118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák } 641118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák} 642118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 6433cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle/** 64446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák * Return the width (dim==TILE_WIDTH) or height (dim==TILE_HEIGHT) of one tile 64546992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák * of the given texture. 64646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák */ 647c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšákstatic unsigned r300_texture_get_tile_size(struct r300_texture* tex, 648c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák int dim, boolean macrotile) 64946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák{ 65046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned pixsize, tile_size; 65146992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 652287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pixsize = util_format_get_blocksize(tex->b.b.format); 653c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_size = microblock_table[util_logbase2(pixsize)][tex->microtile][dim]; 654c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 655c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák if (macrotile) { 656c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_size *= 8; 657c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák } 65846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 65946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák assert(tile_size); 66046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák return tile_size; 66146992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák} 66246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 663c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák/* Return true if macrotiling should be enabled on the miplevel. */ 664c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšákstatic boolean r300_texture_macro_switch(struct r300_texture *tex, 665c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák unsigned level, 66657a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák boolean rv350_mode, 66757a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák int dim) 668c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák{ 66957a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák unsigned tile, texdim; 670c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 67157a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák tile = r300_texture_get_tile_size(tex, dim, TRUE); 67257a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák if (dim == TILE_WIDTH) { 673287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell texdim = u_minify(tex->b.b.width0, level); 67457a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák } else { 675287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell texdim = u_minify(tex->b.b.height0, level); 67657a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák } 677c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 678c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák /* See TX_FILTER1_n.MACRO_SWITCH. */ 679c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák if (rv350_mode) { 68057a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák return texdim >= tile; 681c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák } else { 68257a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák return texdim > tile; 683c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák } 684c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák} 685c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 68646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák/** 6873cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * Return the stride, in bytes, of the texture images of the given texture 6883cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * at the given level. 6893cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle */ 6908959608051ef8e4a97214323009d09c5e9e633fbMarek Olšákunsigned r300_texture_get_stride(struct r300_screen* screen, 6918959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák struct r300_texture* tex, unsigned level) 6923cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle{ 69346992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned tile_width, width; 69446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 6953cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle if (tex->stride_override) 6963cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle return tex->stride_override; 6973cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 69846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák /* Check the level. */ 699287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (level > tex->b.b.last_level) { 7008959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák SCREEN_DBG(screen, DBG_TEX, "%s: level (%u) > last_level (%u)\n", 701287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell __FUNCTION__, level, tex->b.b.last_level); 7023cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle return 0; 7033cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle } 7043cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 705287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell width = u_minify(tex->b.b.width0, level); 70646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 707ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák if (util_format_is_plain(tex->b.b.format)) { 708c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_width = r300_texture_get_tile_size(tex, TILE_WIDTH, 709c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->mip_macrotile[level]); 710cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák width = align(width, tile_width); 711c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 712287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return util_format_get_stride(tex->b.b.format, width); 713cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák } else { 714287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return align(util_format_get_stride(tex->b.b.format, width), 32); 715cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák } 71646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák} 71746992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 71846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšákstatic unsigned r300_texture_get_nblocksy(struct r300_texture* tex, 71946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned level) 72046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák{ 72146992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned height, tile_height; 72246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 723287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell height = u_minify(tex->b.b.height0, level); 724cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák 725ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák if (util_format_is_plain(tex->b.b.format)) { 726c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_height = r300_texture_get_tile_size(tex, TILE_HEIGHT, 727c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->mip_macrotile[level]); 728cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák height = align(height, tile_height); 729e7f1e5ca648d6c96d056d3ae8eab65e98f47f311Marek Olšák 730e7f1e5ca648d6c96d056d3ae8eab65e98f47f311Marek Olšák /* This is needed for the kernel checker, unfortunately. */ 731e7f1e5ca648d6c96d056d3ae8eab65e98f47f311Marek Olšák height = util_next_power_of_two(height); 732cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák } 73346992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 734287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return util_format_get_nblocksy(tex->b.b.format, height); 7359d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson} 7369d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 7372e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšákstatic void r300_texture_3d_fix_mipmapping(struct r300_screen *screen, 7382e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák struct r300_texture *tex) 7392e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák{ 7402579fe4044012a552c8be222ffae76b48de13592Marek Olšák /* The kernels <= 2.6.34-rc4 compute the size of mipmapped 3D textures 7412e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák * incorrectly. This is a workaround to prevent CS from being rejected. */ 7422e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 7432e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák unsigned i, size; 7442e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 745b7fa7e8da6239333bd9327eac1a3015c668d215bMarek Olšák if (!screen->rws->get_value(screen->rws, R300_VID_DRM_2_3_0) && 7462e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák tex->b.b.target == PIPE_TEXTURE_3D && 7472e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák tex->b.b.last_level > 0) { 7482e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák size = 0; 7492e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 7502e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák for (i = 0; i <= tex->b.b.last_level; i++) { 7512e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák size += r300_texture_get_stride(screen, tex, i) * 7522e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák r300_texture_get_nblocksy(tex, i); 7532e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák } 7542e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 7552e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák size *= tex->b.b.depth0; 7562e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák tex->size = size; 7572e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák } 7582e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák} 7592e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 7608959608051ef8e4a97214323009d09c5e9e633fbMarek Olšákstatic void r300_setup_miptree(struct r300_screen* screen, 7618959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák struct r300_texture* tex) 7628e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson{ 763287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource* base = &tex->b.b; 76446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned stride, size, layer_size, nblocksy, i; 765f189caeed046e05bfeec8adf2ebeaae01d1bf2f6Marek Olšák boolean rv350_mode = screen->caps.is_rv350; 7668e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 7670bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(screen, DBG_TEXALLOC, "r300: Making miptree for texture, format %s\n", 768ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák util_format_short_name(base->format)); 769ce1c493ff8fad4b62e2b66f06636ac6560a6e0adCorbin Simpson 7702b5770e652f0e6620b52971755bd7eb31c16ad7dCorbin Simpson for (i = 0; i <= base->last_level; i++) { 771c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák /* Let's see if this miplevel can be macrotiled. */ 77257a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák tex->mip_macrotile[i] = 77357a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák (tex->macrotile == R300_BUFFER_TILED && 774a43618fdc4e046f946d5f0de6dd8a421b66e9498Mathias Fröhlich r300_texture_macro_switch(tex, i, rv350_mode, TILE_WIDTH) && 775a43618fdc4e046f946d5f0de6dd8a421b66e9498Mathias Fröhlich r300_texture_macro_switch(tex, i, rv350_mode, TILE_HEIGHT)) ? 77657a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák R300_BUFFER_TILED : R300_BUFFER_LINEAR; 777c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 7788959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák stride = r300_texture_get_stride(screen, tex, i); 77946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák nblocksy = r300_texture_get_nblocksy(tex, i); 780c78748a5274e58bcbb122923edf81065be9bbe16Roland Scheidegger layer_size = stride * nblocksy; 781827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák 782827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák if (base->target == PIPE_TEXTURE_CUBE) 783827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák size = layer_size * 6; 784827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák else 785d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger size = layer_size * u_minify(base->depth0, i); 7868e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 787c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->offset[i] = tex->size; 788048f988aeb06fa360c6c41eaa50cb96b4b86e34eMichel Dänzer tex->size = tex->offset[i] + size; 789118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák tex->layer_size[i] = layer_size; 790b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol tex->pitch[i] = stride / util_format_get_blocksize(base->format); 7919dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák tex->hwpitch[i] = 7929dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák tex->pitch[i] * util_format_get_blockwidth(base->format); 79363c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák 7940bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(screen, DBG_TEXALLOC, "r300: Texture miptree: Level %d " 795c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák "(%dx%dx%d px, pitch %d bytes) %d bytes total, macrotiled %s\n", 796d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger i, u_minify(base->width0, i), u_minify(base->height0, i), 797c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák u_minify(base->depth0, i), stride, tex->size, 798c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->mip_macrotile[i] ? "TRUE" : "FALSE"); 7998e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson } 8008e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson} 8018e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 80263c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšákstatic void r300_setup_flags(struct r300_texture* tex) 80363c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák{ 804287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->uses_pitch = !util_is_power_of_two(tex->b.b.width0) || 805287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell !util_is_power_of_two(tex->b.b.height0) || 8064e949271c25ccc5a06fbbbe912b0b43b75d1d169Marek Olšák tex->stride_override; 80763c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák} 80863c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák 809b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšákstatic void r300_setup_tiling(struct pipe_screen *screen, 810b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák struct r300_texture *tex) 811b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák{ 81212dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 813287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell enum pipe_format format = tex->b.b.format; 814f189caeed046e05bfeec8adf2ebeaae01d1bf2f6Marek Olšák boolean rv350_mode = r300_screen(screen)->caps.is_rv350; 815c383defdaacab0fe7f35e7a4ae5b57228cf5310cMarek Olšák boolean is_zb = util_format_is_depth_or_stencil(format); 8165b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák boolean dbg_no_tiling = SCREEN_DBG_ON(r300_screen(screen), DBG_NO_TILING); 817b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 818ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák if (!util_format_is_plain(format)) { 819b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák return; 820b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 821b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 822c383defdaacab0fe7f35e7a4ae5b57228cf5310cMarek Olšák /* If height == 1, disable microtiling except for zbuffer. */ 8235b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák if (!is_zb && (tex->b.b.height0 == 1 || dbg_no_tiling)) { 824b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák return; 825b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 826b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 827b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák /* Set microtiling. */ 828b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák switch (util_format_get_blocksize(format)) { 829b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák case 1: 830b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák case 4: 831b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák tex->microtile = R300_BUFFER_TILED; 832b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák break; 833b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 83412dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák case 2: 835b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák case 8: 83612dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák if (rws->get_value(rws, R300_VID_SQUARE_TILING_SUPPORT)) { 83712dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák tex->microtile = R300_BUFFER_SQUARETILED; 83812dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák } 83912dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák break; 840b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 841b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 8425b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák if (dbg_no_tiling) { 8435b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák return; 8445b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák } 8455b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák 846b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák /* Set macrotiling. */ 84757a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák if (r300_texture_macro_switch(tex, 0, rv350_mode, TILE_WIDTH) && 84857a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák r300_texture_macro_switch(tex, 0, rv350_mode, TILE_HEIGHT)) { 849b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák tex->macrotile = R300_BUFFER_TILED; 850b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 851b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák} 852b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 853287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic unsigned r300_texture_is_referenced(struct pipe_context *context, 854287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *texture, 855287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned face, unsigned level) 856287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 857287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_context *r300 = r300_context(context); 858287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_texture *rtex = (struct r300_texture *)texture; 859287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 8607a1b5c937fa32968a04a11649e456a1ef8c5b442Marek Olšák if (r300->rws->is_buffer_referenced(r300->rws, rtex->buffer, R300_REF_CS)) 861287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 862287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 863287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return PIPE_UNREFERENCED; 864287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 865287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 866287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic void r300_texture_destroy(struct pipe_screen *screen, 867287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource* texture) 868287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 869287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_texture* tex = (struct r300_texture*)texture; 870287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_winsys_screen *rws = (struct r300_winsys_screen *)texture->screen->winsys; 871287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 872287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell rws->buffer_reference(rws, &tex->buffer, NULL); 873287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell FREE(tex); 874287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 875287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 8760b4df63609e9fb25319debd56142a90b11d75671Marek Olšákstatic boolean r300_texture_get_handle(struct pipe_screen* screen, 8770b4df63609e9fb25319debd56142a90b11d75671Marek Olšák struct pipe_resource *texture, 8780b4df63609e9fb25319debd56142a90b11d75671Marek Olšák struct winsys_handle *whandle) 879287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 880287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 881287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_texture* tex = (struct r300_texture*)texture; 882287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned stride; 883287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 884287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (!tex) { 885287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return FALSE; 886287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell } 887287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 888287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell stride = r300_texture_get_stride(r300_screen(screen), tex, 0); 889287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 890287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell rws->buffer_get_handle(rws, tex->buffer, stride, whandle); 891287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 892287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return TRUE; 893287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 894287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 895287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct u_resource_vtbl r300_texture_vtbl = 896287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 897287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_get_handle, /* get_handle */ 898287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_destroy, /* resource_destroy */ 899287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_is_referenced, /* is_resource_referenced */ 900287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_get_transfer, /* get_transfer */ 901287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_transfer_destroy, /* transfer_destroy */ 902287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_transfer_map, /* transfer_map */ 903287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell u_default_transfer_flush_region, /* transfer_flush_region */ 904287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_transfer_unmap, /* transfer_unmap */ 905287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell u_default_transfer_inline_write /* transfer_inline_write */ 906287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}; 907287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 9080648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson/* Create a new texture. */ 909287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource* r300_texture_create(struct pipe_screen* screen, 910287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource* base) 9110648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson{ 9128e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson struct r300_texture* tex = CALLOC_STRUCT(r300_texture); 9138959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák struct r300_screen* rscreen = r300_screen(screen); 91468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 9158e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 9168e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson if (!tex) { 9178e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson return NULL; 9185cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák } 9195cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák 9205cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák /* Refuse to create a texture with size 0. */ 9215cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák if (!base->width0 || 9225cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák (!base->height0 && (base->target == PIPE_TEXTURE_2D || 9235cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák base->target == PIPE_TEXTURE_CUBE)) || 9245cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák (!base->depth0 && base->target == PIPE_TEXTURE_3D)) { 9255cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák fprintf(stderr, "r300: texture_create: " 9265cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák "Got invalid texture dimensions: %ix%ix%i\n", 9275cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák base->width0, base->height0, base->depth0); 9283234066be221832f660f4e61fc6b0a92c5304780Vinson Lee FREE(tex); 9295cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák return NULL; 9308e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson } 9318e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 932287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.b = *base; 933287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.vtbl = &r300_texture_vtbl; 934287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_reference_init(&tex->b.b.reference, 1); 935287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.b.screen = screen; 9368e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 93763c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák r300_setup_flags(tex); 938287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (!(base->flags & R300_RESOURCE_FLAG_TRANSFER) && 939287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell !(base->bind & PIPE_BIND_SCANOUT)) { 940b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák r300_setup_tiling(screen, tex); 941b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 9428959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák r300_setup_miptree(rscreen, tex); 9432e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák r300_texture_3d_fix_mipmapping(rscreen, tex); 9441c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_immutable_state(rscreen, tex); 9451c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_fb_state(rscreen, tex); 9469d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 9470bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(rscreen, DBG_TEX, 9480bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák "r300: texture_create: Macro: %s, Micro: %s, Pitch: %i, " 9490bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák "Dim: %ix%ix%i, LastLevel: %i, Format: %s\n", 9500bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->macrotile ? "YES" : " NO", 9510bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->microtile ? "YES" : " NO", 9520bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->hwpitch[0], 9530bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák base->width0, base->height0, base->depth0, base->last_level, 954ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák util_format_short_name(base->format)); 9550bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák 95668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie tex->buffer = rws->buffer_create(rws, 2048, 957287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_SAMPLER_VIEW, /* XXX */ 95868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie tex->size); 95968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie rws->buffer_set_tiling(rws, tex->buffer, 96068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie tex->pitch[0], 96133d2349119ada410dbfbaa667fc7aef8b60d1a6fMarek Olšák tex->microtile, 96233d2349119ada410dbfbaa667fc7aef8b60d1a6fMarek Olšák tex->macrotile); 9638e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 9648e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson if (!tex->buffer) { 9658e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson FREE(tex); 9668e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson return NULL; 9678e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson } 9688e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 969287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return (struct pipe_resource*)tex; 9708e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson} 9718e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 972287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file: 973287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */ 974287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_surface* r300_get_tex_surface(struct pipe_screen* screen, 975287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource* texture, 976287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned face, 977287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned level, 978287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned zslice, 979287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned flags) 980471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{ 981a1f85cf689b6f9ccf6b7310485460f84c8d78cadMarek Olšák struct r300_texture* tex = r300_texture(texture); 982471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson struct pipe_surface* surface = CALLOC_STRUCT(pipe_surface); 983471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson unsigned offset; 984471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 985118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák offset = r300_texture_get_offset(tex, level, zslice, face); 986471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 987471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson if (surface) { 9885e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer pipe_reference_init(&surface->reference, 1); 989287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&surface->texture, texture); 990471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson surface->format = texture->format; 991d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger surface->width = u_minify(texture->width0, level); 992d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger surface->height = u_minify(texture->height0, level); 993471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson surface->offset = offset; 994471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson surface->usage = flags; 995c2df759cd73e281c4698c717e0ab89757a7affd5Marek Olšák surface->zslice = zslice; 996c2df759cd73e281c4698c717e0ab89757a7affd5Marek Olšák surface->texture = texture; 997c2df759cd73e281c4698c717e0ab89757a7affd5Marek Olšák surface->face = face; 998c2df759cd73e281c4698c717e0ab89757a7affd5Marek Olšák surface->level = level; 999471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson } 1000471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 1001471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson return surface; 1002471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson} 1003471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 1004287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file: 1005287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */ 1006287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid r300_tex_surface_destroy(struct pipe_surface* s) 1007471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{ 1008287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&s->texture, NULL); 10095e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer FREE(s); 1010471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson} 1011471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 1012287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource* 1013287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellr300_texture_from_handle(struct pipe_screen* screen, 1014287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource* base, 1015287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct winsys_handle *whandle) 1016d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz{ 101768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = (struct r300_winsys_screen*)screen->winsys; 1018d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz struct r300_screen* rscreen = r300_screen(screen); 101968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_buffer *buffer; 1020d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz struct r300_texture* tex; 1021d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz unsigned stride; 1022b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák boolean override_zb_flags; 1023d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1024d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz /* Support only 2D textures without mipmaps */ 1025d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (base->target != PIPE_TEXTURE_2D || 1026d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz base->depth0 != 1 || 1027d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz base->last_level != 0) { 1028d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return NULL; 1029d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 1030d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 103168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie buffer = rws->buffer_from_handle(rws, screen, whandle, &stride); 1032d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (!buffer) { 1033d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return NULL; 1034d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 1035d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1036d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex = CALLOC_STRUCT(r300_texture); 1037d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (!tex) { 1038d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return NULL; 1039d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 1040d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1041287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.b = *base; 1042287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.vtbl = &r300_texture_vtbl; 1043287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_reference_init(&tex->b.b.reference, 1); 1044287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.b.screen = screen; 1045d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1046d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex->stride_override = stride; 1047d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1048d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz /* one ref already taken */ 1049d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex->buffer = buffer; 1050d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 10514c26cdbe01619abad413b09317f2842dcf1a4d57Dave Airlie rws->buffer_get_tiling(rws, buffer, &tex->microtile, &tex->macrotile); 1052e0848bd90378ba633cfa57013c650e892d931f74Marek Olšák r300_setup_flags(tex); 10530bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(rscreen, DBG_TEX, 10540bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák "r300: texture_from_handle: Macro: %s, Micro: %s, " 10550bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák "Pitch: % 4i, Dim: %ix%i, Format: %s\n", 10560bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->macrotile ? "YES" : " NO", 10570bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->microtile ? "YES" : " NO", 10580bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák stride / util_format_get_blocksize(base->format), 10590bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák base->width0, base->height0, 1060ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák util_format_short_name(base->format)); 1061b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1062b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák /* Enforce microtiled zbuffer. */ 1063b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák override_zb_flags = util_format_is_depth_or_stencil(base->format) && 1064b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák tex->microtile == R300_BUFFER_LINEAR; 1065b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1066b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák if (override_zb_flags) { 1067b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák switch (util_format_get_blocksize(base->format)) { 1068b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák case 4: 1069b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák tex->microtile = R300_BUFFER_TILED; 1070b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák break; 1071b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1072b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák case 2: 1073b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák if (rws->get_value(rws, R300_VID_SQUARE_TILING_SUPPORT)) { 1074b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák tex->microtile = R300_BUFFER_SQUARETILED; 1075b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák break; 1076b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák } 1077b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák /* Pass through. */ 1078b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1079b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák default: 1080b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák override_zb_flags = FALSE; 1081b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák } 1082b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák } 1083b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1084e0848bd90378ba633cfa57013c650e892d931f74Marek Olšák r300_setup_miptree(rscreen, tex); 10851c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_immutable_state(rscreen, tex); 10861c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_fb_state(rscreen, tex); 1087b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1088b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák if (override_zb_flags) { 1089b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák rws->buffer_set_tiling(rws, tex->buffer, 1090b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák tex->pitch[0], 1091b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák tex->microtile, 1092b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák tex->macrotile); 1093b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák } 1094287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return (struct pipe_resource*)tex; 1095d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz} 1096