r300_texture.c revision 6eb892cc12047af36f4eb42050f1d2e57b0f3a3c
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" 276a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "util/u_math.h" 286a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "util/u_memory.h" 296a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson 306a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "r300_context.h" 310648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson#include "r300_texture.h" 32827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák#include "r300_screen.h" 338bf9842fac00369b5cd3a82fb4d87db0e31848b8Marek Olšák#include "r300_winsys.h" 34b7a002df1e06504ff1ed0dc005c9b10aa4be54f7Marek Olšák 352ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák/* XXX Enable float textures here. */ 362ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák/*#define ENABLE_FLOAT_TEXTURES*/ 372ab737557258148d52d9b9e983e4b18560b7a460Marek 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 509fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák/* Return true for non-compressed and non-YUV formats. */ 519fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšákstatic boolean r300_format_is_plain(enum pipe_format format) 529fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák{ 539fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák const struct util_format_description *desc = util_format_description(format); 549fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák 559fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák if (!format) { 569fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák return FALSE; 579fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák } 589fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák 599fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák return desc->layout == UTIL_FORMAT_LAYOUT_PLAIN; 609fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák} 619fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák 625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák/* Translate a pipe_format into a useful texture format for sampling. 635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Some special formats are translated directly using R300_EASY_TX_FORMAT, 655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * but the majority of them is translated in a generic way, automatically 665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * supporting all the formats hw can support. 675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT swizzles the texture. 695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Note the signature of R300_EASY_TX_FORMAT: 705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT(B, G, R, A, FORMAT); 715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * The FORMAT specifies how the texture sampler will treat the texture, and 735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * makes available X, Y, Z, W, ZERO, and ONE for swizzling. */ 745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšákstatic uint32_t r300_translate_texformat(enum pipe_format format) 755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{ 765c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák uint32_t result = 0; 775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák const struct util_format_description *desc; 7839e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák unsigned i; 795c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák boolean uniform = TRUE; 805c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák const uint32_t swizzle_shift[4] = { 815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_R_SHIFT, 825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_G_SHIFT, 835c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_B_SHIFT, 845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_A_SHIFT 855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák }; 86f9f4f3df422334aee31f9041c374c72d0f97ba39José Fonseca const uint32_t swizzle[4] = { 87232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák R300_TX_FORMAT_X, 88232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák R300_TX_FORMAT_Y, 89232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák R300_TX_FORMAT_Z, 90232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák R300_TX_FORMAT_W 91232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák }; 925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák const uint32_t sign_bit[4] = { 935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_X, 945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_Y, 955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_Z, 965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_W, 975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák }; 985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc = util_format_description(format); 1005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Colorspace (return non-RGB formats directly). */ 1025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->colorspace) { 1035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Depth stencil formats. */ 1045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_ZS: 1055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 1065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_Z16_UNORM: 1075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, X, X, X, X16); 108b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8Z24_UNORM: 1096fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger case PIPE_FORMAT_S8_USCALED_Z24_UNORM: 1105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, X, X, X, W24_FP); 1115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported. */ 1135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* YUV formats. */ 1165c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_YUV: 1175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_YUV_TO_RGB; 1185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 120b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_UYVY: 1215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result; 122b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_YUYV: 1235c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result; 1245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 1265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Add gamma correction. */ 1295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_SRGB: 1305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_GAMMA; 1315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default:; 1345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Add swizzle. */ 1375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák for (i = 0; i < 4; i++) { 1385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->swizzle[i]) { 1395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_X: 1405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_NONE: 141232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák result |= swizzle[0] << swizzle_shift[i]; 1425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_Y: 144232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák result |= swizzle[1] << swizzle_shift[i]; 1455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_Z: 147232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák result |= swizzle[2] << swizzle_shift[i]; 1485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_W: 150232f6e176192d112fbdf9bd7de2d0f36ee16a246Marek Olšák result |= swizzle[3] << swizzle_shift[i]; 1515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1525c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_0: 1535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_ZERO << swizzle_shift[i]; 1545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_SWIZZLE_1: 1565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_ONE << swizzle_shift[i]; 1575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported. */ 1605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1633252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák /* S3TC formats. */ 16428cf5e1191077e063fe2a81d9d35934b71d001e2José Fonseca if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) { 1655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 1665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_RGB: 1675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_RGBA: 1685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_SRGB: 1695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_SRGBA: 1705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT1 | result; 1715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT3_RGBA: 1725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT3_SRGBA: 1735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT3 | result; 1745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT5_RGBA: 1755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT5_SRGBA: 1765c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT5 | result; 1775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1785c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 1795c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1805c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Add sign. */ 18339e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák for (i = 0; i < desc->nr_channels; i++) { 1845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 1855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= sign_bit[i]; 1865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1893252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák /* RGTC formats. */ 1903252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) { 1913252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák switch (format) { 1923252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_UNORM: 1933252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_SNORM: 1943252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R500_TX_FORMAT_ATI1N | result; 1953252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC2_UNORM: 1963252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC2_SNORM: 1973252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R400_TX_FORMAT_ATI2N | result; 1983252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák default: 1993252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return ~0; /* Unsupported/unknown. */ 2003252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 2013252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 2023252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák 2035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* See whether the components are of the same size. */ 20439e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák for (i = 1; i < desc->nr_channels; i++) { 2055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák uniform = uniform && desc->channel[0].size == desc->channel[i].size; 2065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Non-uniform formats. */ 2095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (!uniform) { 21039e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 3: 2125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 2135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 6 && 2145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 5) { 2155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Z5Y6X5 | result; 2165c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 2185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 5 && 2195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 6) { 2205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Z6Y5X5 | result; 2215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 2235c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 2265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 5 && 2275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 5 && 2285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[3].size == 1) { 2295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W1Z5Y5X5 | result; 2305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 10 && 2325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 10 && 2335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 10 && 2345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[3].size == 2) { 2355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W2Z10Y10X10 | result; 2365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 2395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2415c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* And finally, uniform formats. */ 2425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->channel[0].type) { 2435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_UNSIGNED: 2445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_SIGNED: 2455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (!desc->channel[0].normalized && 2465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) { 2475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->channel[0].size) { 2515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 25239e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 2545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y4X4 | result; 2555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W4Z4Y4X4 | result; 2575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 8: 26139e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 2635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_X8 | result; 2645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 2655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y8X8 | result; 2665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W8Z8Y8X8 | result; 2685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 16: 27239e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 2745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_X16 | result; 2755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 2765c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y16X16 | result; 2775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2785c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W16Z16Y16X16 | result; 2795c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2805c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2832ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák#if defined(ENABLE_FLOAT_TEXTURES) 2845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_FLOAT: 2855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->channel[0].size) { 2865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 16: 28739e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 2895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F | result; 2905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 2915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F_16F | result; 2925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F_16F_16F_16F | result; 2945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 32: 29839e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 3005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F | result; 3015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 3025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F_32F | result; 3035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 3045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F_32F_32F_32F | result; 3055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák#endif 3085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 3115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák} 3125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3133252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšákstatic uint32_t r500_tx_format_msb_bit(enum pipe_format format) 3143252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák{ 3153252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák switch (format) { 3163252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_UNORM: 3173252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_SNORM: 3183252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R500_TXFORMAT_MSB; 3193252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák default: 3203252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return 0; 3213252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 3223252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák} 3233252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák 3243c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Buffer formats. */ 3253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3263c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Colorbuffer formats. This is the unswizzled format of the RB3D block's 3273c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * output. For the swizzling of the targets, check the shader's format. */ 3283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_colorformat(enum pipe_format format) 3293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 3303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 3313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 8-bit buffers. */ 3323c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_A8_UNORM: 3333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_I8_UNORM: 3343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_L8_UNORM: 3353c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_UNORM: 3363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_SNORM: 3373c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_I8; 3383c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3393c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 16-bit buffers. */ 340b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G6R5_UNORM: 3413c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_RGB565; 342b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G5R5A1_UNORM: 343f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_B5G5R5X1_UNORM: 3443c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB1555; 345b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B4G4R4A4_UNORM: 3463c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB4444; 3473c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3483c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 32-bit buffers. */ 3493c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_B8G8R8A8_UNORM: 3503c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_B8G8R8X8_UNORM: 351b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8R8G8B8_UNORM: 352b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8R8G8B8_UNORM: 353b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8B8G8R8_UNORM: 3543c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8G8B8A8_SNORM: 355b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8B8G8R8_UNORM: 356b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 3573c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB8888; 358b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R10G10B10A2_UNORM: 3593c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R500_COLOR_FORMAT_ARGB2101010; /* R5xx-only? */ 3603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3613c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 64-bit buffers. */ 3623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_UNORM: 3633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_SNORM: 3642ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák#if defined(ENABLE_FLOAT_TEXTURES) 3652ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák case PIPE_FORMAT_R16G16B16A16_FLOAT: 3662ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák#endif 3673c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB16161616; 3683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 128-bit buffers. */ 3702ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák#if defined(ENABLE_FLOAT_TEXTURES) 3713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R32G32B32A32_FLOAT: 3723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB32323232; 3733c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák#endif 3743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3753c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* YUV buffers. */ 376b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_UYVY: 3773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_YVYU; 378b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_YUYV: 3793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_VYUY; 3803c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 3813c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 3823c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 3833c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 3843c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3853c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Depthbuffer and stencilbuffer. Thankfully, we only support two flavors. */ 3863c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_zsformat(enum pipe_format format) 3873c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 3883c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 3893c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 16-bit depth, no stencil */ 3903c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_Z16_UNORM: 3913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_DEPTHFORMAT_16BIT_INT_Z; 3923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 24-bit depth, ignored stencil */ 393b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8Z24_UNORM: 3943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 24-bit depth, 8-bit stencil */ 3956fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger case PIPE_FORMAT_S8_USCALED_Z24_UNORM: 3963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL; 3973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 3983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 3993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 4013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Shader output formats. This is essentially the swizzle from the shader 4033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * to the RB3D block. 4043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * 4053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * Note that formats are stored from C3 to C0. */ 4063c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_out_fmt(enum pipe_format format) 4073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 4083c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák uint32_t modifier = 0; 4093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák unsigned i; 4103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák const struct util_format_description *desc; 4113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák static const uint32_t sign_bit[4] = { 4123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x1), 4133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x2), 4143c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x4), 4153c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x8), 4163c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák }; 4173c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4183c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák desc = util_format_description(format); 4193c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Specifies how the shader output is written to the fog unit. */ 4210c81739528fd8f240176bb120c90c712f9606718Marek Olšák if (desc->channel[0].type == UTIL_FORMAT_TYPE_FLOAT) { 4223c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (desc->channel[0].size == 32) { 4233c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_32_FP; 4243c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 4253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_16_FP; 4263c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4273c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 4283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (desc->channel[0].size == 16) { 4293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_16; 4303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 4313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* C4_8 seems to be used for the formats whose pixel size 4323c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * is <= 32 bits. */ 4333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_8; 4343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4353c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4373c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Add sign. */ 4383c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák for (i = 0; i < 4; i++) 4393c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 4403c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= sign_bit[i]; 4413c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4423c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4433c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Add swizzles and return. */ 4443c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 4453c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 8-bit outputs. 4463c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * COLORFORMAT_I8 stores the C2 component. */ 4473c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_A8_UNORM: 4483c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | R300_C2_SEL_A; 4493c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_I8_UNORM: 4503c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_L8_UNORM: 4513c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_UNORM: 4523c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_SNORM: 4533c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | R300_C2_SEL_R; 4543c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 455f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* BGRA outputs. */ 456b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G6R5_UNORM: 457b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G5R5A1_UNORM: 458f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_B5G5R5X1_UNORM: 459b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B4G4R4A4_UNORM: 460b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B8G8R8A8_UNORM: 461b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B8G8R8X8_UNORM: 4623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 4633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_B | R300_C1_SEL_G | 4643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_R | R300_C3_SEL_A; 4653c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 466f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* ARGB outputs. */ 467b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8R8G8B8_UNORM: 468b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8R8G8B8_UNORM: 4693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 4703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_A | R300_C1_SEL_R | 4713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_G | R300_C3_SEL_B; 4723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 473f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* ABGR outputs. */ 474b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8B8G8R8_UNORM: 475b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8B8G8R8_UNORM: 4763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 4773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_A | R300_C1_SEL_B | 4783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_G | R300_C3_SEL_R; 4793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 480f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* RGBA outputs. */ 481f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_R8G8B8A8_SNORM: 482b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 483b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R10G10B10A2_UNORM: 4843c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_UNORM: 4853c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_SNORM: 4863c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák //case PIPE_FORMAT_R16G16B16A16_FLOAT: /* not in pipe_format */ 4873c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R32G32B32A32_FLOAT: 4883c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 4893c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_R | R300_C1_SEL_G | 4903c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_B | R300_C3_SEL_A; 4913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 4933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 4943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 4963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_colorbuffer_format_supported(enum pipe_format format) 4983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 4993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return r300_translate_colorformat(format) != ~0 && 5003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák r300_translate_out_fmt(format) != ~0; 5013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_zs_format_supported(enum pipe_format format) 5043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 5053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return r300_translate_zsformat(format) != ~0; 5063c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšákboolean r300_is_sampler_format_supported(enum pipe_format format) 5095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{ 5105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return r300_translate_texformat(format) != ~0; 5115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák} 5125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 5138959608051ef8e4a97214323009d09c5e9e633fbMarek Olšákstatic void r300_setup_texture_state(struct r300_screen* screen, struct r300_texture* tex) 5149d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson{ 515d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák struct r300_texture_format_state* state = &tex->state; 5169bf85f6b95cb684d16b6035381b1f8a9c44f473fDave Airlie struct pipe_texture *pt = &tex->tex; 5173c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák unsigned i; 5188959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák boolean is_r500 = screen->caps->is_r500; 5199d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 5203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Set sampler state. */ 521d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger state->format0 = R300_TX_WIDTH((pt->width0 - 1) & 0x7ff) | 522d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger R300_TX_HEIGHT((pt->height0 - 1) & 0x7ff); 523827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák 52463c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák if (tex->is_npot) { 525827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* rectangles love this */ 526827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák state->format0 |= R300_TX_PITCH_EN; 52763c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák state->format2 = (tex->pitch[0] - 1) & 0x1fff; 52863c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák } else { 529827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* power of two textures (3D, mipmaps, and no pitch) */ 530c95cbd45c657ac47e908a4d99d118737034bde43Roland Scheidegger state->format0 |= R300_TX_DEPTH(util_logbase2(pt->depth0) & 0xf); 531827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 5329d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 5339bf85f6b95cb684d16b6035381b1f8a9c44f473fDave Airlie state->format1 = r300_translate_texformat(pt->format); 534eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie if (pt->target == PIPE_TEXTURE_CUBE) { 535034db65f08b943ee9940947db69e4e190f751061Corbin Simpson state->format1 |= R300_TX_FORMAT_CUBIC_MAP; 536eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie } 537eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie if (pt->target == PIPE_TEXTURE_3D) { 538034db65f08b943ee9940947db69e4e190f751061Corbin Simpson state->format1 |= R300_TX_FORMAT_3D; 539eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie } 5409d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 541827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* large textures on r500 */ 542827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák if (is_r500) 543827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák { 544d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger if (pt->width0 > 2048) { 545827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák state->format2 |= R500_TXWIDTH_BIT11; 546827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 547d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger if (pt->height0 > 2048) { 548827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák state->format2 |= R500_TXHEIGHT_BIT11; 549827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 5503252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák state->format2 |= r500_tx_format_msb_bit(pt->format); 5511aa38b2c2d80b67fe2eefe468f90aeb44bc20259Corbin Simpson } 5522cbd5ecfb666a757c4abef85dbe40fb53d647ec9Corbin Simpson 5538959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák SCREEN_DBG(screen, DBG_TEX, "r300: Set texture state (%dx%d, %d levels)\n", 5548959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák pt->width0, pt->height0, pt->last_level); 5553c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5563c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Set framebuffer state. */ 5573c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (util_format_is_depth_or_stencil(tex->tex.format)) { 5583c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák for (i = 0; i <= tex->tex.last_level; i++) { 5593c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák tex->fb_state.depthpitch[i] = 5603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák tex->pitch[i] | 5613c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_DEPTHMACROTILE(tex->mip_macrotile[i]) | 5623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_DEPTHMICROTILE(tex->microtile); 5633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 5643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák tex->fb_state.zb_format = r300_translate_zsformat(tex->tex.format); 5653c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 5663c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák for (i = 0; i <= tex->tex.last_level; i++) { 5673c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák tex->fb_state.colorpitch[i] = 5683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák tex->pitch[i] | 5693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák r300_translate_colorformat(tex->tex.format) | 5703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_COLOR_TILE(tex->mip_macrotile[i]) | 5713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_COLOR_MICROTILE(tex->microtile); 5723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 5733c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák tex->fb_state.us_out_fmt = r300_translate_out_fmt(tex->tex.format); 5743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 5753cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle} 5763cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 577f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšákvoid r300_texture_reinterpret_format(struct pipe_screen *screen, 578f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák struct pipe_texture *tex, 579f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák enum pipe_format new_format) 580f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák{ 581f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák struct r300_screen *r300screen = r300_screen(screen); 582f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 583f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák SCREEN_DBG(r300screen, DBG_TEX, "r300: Reinterpreting format: %s -> %s\n", 584f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák util_format_name(tex->format), util_format_name(new_format)); 585f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 586f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák tex->format = new_format; 587f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 588f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák r300_setup_texture_state(r300_screen(screen), (struct r300_texture*)tex); 589f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák} 590f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 591118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšákunsigned r300_texture_get_offset(struct r300_texture* tex, unsigned level, 592118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák unsigned zslice, unsigned face) 593118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák{ 594118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák unsigned offset = tex->offset[level]; 595118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 596118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák switch (tex->tex.target) { 597118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák case PIPE_TEXTURE_3D: 598118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák assert(face == 0); 599118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák return offset + zslice * tex->layer_size[level]; 600118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 601118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák case PIPE_TEXTURE_CUBE: 602118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák assert(zslice == 0); 603118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák return offset + face * tex->layer_size[level]; 604118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 605118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák default: 606118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák assert(zslice == 0 && face == 0); 607118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák return offset; 608118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák } 609118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák} 610118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 6113cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle/** 61246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák * Return the width (dim==TILE_WIDTH) or height (dim==TILE_HEIGHT) of one tile 61346992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák * of the given texture. 61446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák */ 615c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšákstatic unsigned r300_texture_get_tile_size(struct r300_texture* tex, 616c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák int dim, boolean macrotile) 61746992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák{ 61846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned pixsize, tile_size; 61946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 62046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák pixsize = util_format_get_blocksize(tex->tex.format); 621c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_size = microblock_table[util_logbase2(pixsize)][tex->microtile][dim]; 622c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 623c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák if (macrotile) { 624c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_size *= 8; 625c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák } 62646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 62746992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák assert(tile_size); 62846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák return tile_size; 62946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák} 63046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 631c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák/* Return true if macrotiling should be enabled on the miplevel. */ 632c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšákstatic boolean r300_texture_macro_switch(struct r300_texture *tex, 633c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák unsigned level, 63457a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák boolean rv350_mode, 63557a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák int dim) 636c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák{ 63757a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák unsigned tile, texdim; 638c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 63957a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák tile = r300_texture_get_tile_size(tex, dim, TRUE); 64057a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák if (dim == TILE_WIDTH) { 64157a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák texdim = u_minify(tex->tex.width0, level); 64257a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák } else { 64357a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák texdim = u_minify(tex->tex.height0, level); 64457a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák } 645c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 646c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák /* See TX_FILTER1_n.MACRO_SWITCH. */ 647c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák if (rv350_mode) { 64857a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák return texdim >= tile; 649c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák } else { 65057a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák return texdim > tile; 651c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák } 652c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák} 653c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 65446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák/** 6553cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * Return the stride, in bytes, of the texture images of the given texture 6563cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * at the given level. 6573cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle */ 6588959608051ef8e4a97214323009d09c5e9e633fbMarek Olšákunsigned r300_texture_get_stride(struct r300_screen* screen, 6598959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák struct r300_texture* tex, unsigned level) 6603cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle{ 66146992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned tile_width, width; 66246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 6633cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle if (tex->stride_override) 6643cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle return tex->stride_override; 6653cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 66646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák /* Check the level. */ 6673cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle if (level > tex->tex.last_level) { 6688959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák SCREEN_DBG(screen, DBG_TEX, "%s: level (%u) > last_level (%u)\n", 6698959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák __FUNCTION__, level, tex->tex.last_level); 6703cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle return 0; 6713cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle } 6723cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 673cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák width = u_minify(tex->tex.width0, level); 67446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 6759fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák if (r300_format_is_plain(tex->tex.format)) { 676c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_width = r300_texture_get_tile_size(tex, TILE_WIDTH, 677c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->mip_macrotile[level]); 678cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák width = align(width, tile_width); 679c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 680cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák return util_format_get_stride(tex->tex.format, width); 681cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák } else { 682cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák return align(util_format_get_stride(tex->tex.format, width), 32); 683cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák } 68446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák} 68546992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 68646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšákstatic unsigned r300_texture_get_nblocksy(struct r300_texture* tex, 68746992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned level) 68846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák{ 68946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned height, tile_height; 69046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 691cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák height = u_minify(tex->tex.height0, level); 692cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák 6939fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák if (r300_format_is_plain(tex->tex.format)) { 694c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_height = r300_texture_get_tile_size(tex, TILE_HEIGHT, 695c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->mip_macrotile[level]); 696cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák height = align(height, tile_height); 697cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák } 69846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 69946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák return util_format_get_nblocksy(tex->tex.format, height); 7009d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson} 7019d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 7028959608051ef8e4a97214323009d09c5e9e633fbMarek Olšákstatic void r300_setup_miptree(struct r300_screen* screen, 7038959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák struct r300_texture* tex) 7048e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson{ 7058e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson struct pipe_texture* base = &tex->tex; 70646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned stride, size, layer_size, nblocksy, i; 707c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák boolean rv350_mode = screen->caps->family >= CHIP_FAMILY_RV350; 7088e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 7098959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák SCREEN_DBG(screen, DBG_TEX, "r300: Making miptree for texture, format %s\n", 71006f76e4a6b8a3949918e55643f39525de1276815José Fonseca util_format_name(base->format)); 711ce1c493ff8fad4b62e2b66f06636ac6560a6e0adCorbin Simpson 7122b5770e652f0e6620b52971755bd7eb31c16ad7dCorbin Simpson for (i = 0; i <= base->last_level; i++) { 713c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák /* Let's see if this miplevel can be macrotiled. */ 71457a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák tex->mip_macrotile[i] = 71557a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák (tex->macrotile == R300_BUFFER_TILED && 716a43618fdc4e046f946d5f0de6dd8a421b66e9498Mathias Fröhlich r300_texture_macro_switch(tex, i, rv350_mode, TILE_WIDTH) && 717a43618fdc4e046f946d5f0de6dd8a421b66e9498Mathias Fröhlich r300_texture_macro_switch(tex, i, rv350_mode, TILE_HEIGHT)) ? 71857a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák R300_BUFFER_TILED : R300_BUFFER_LINEAR; 719c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 7208959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák stride = r300_texture_get_stride(screen, tex, i); 72146992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák nblocksy = r300_texture_get_nblocksy(tex, i); 722c78748a5274e58bcbb122923edf81065be9bbe16Roland Scheidegger layer_size = stride * nblocksy; 723827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák 724827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák if (base->target == PIPE_TEXTURE_CUBE) 725827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák size = layer_size * 6; 726827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák else 727d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger size = layer_size * u_minify(base->depth0, i); 7288e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 729c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->offset[i] = tex->size; 730048f988aeb06fa360c6c41eaa50cb96b4b86e34eMichel Dänzer tex->size = tex->offset[i] + size; 731118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák tex->layer_size[i] = layer_size; 732b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol tex->pitch[i] = stride / util_format_get_blocksize(base->format); 73363c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák 7348959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák SCREEN_DBG(screen, DBG_TEX, "r300: Texture miptree: Level %d " 735c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák "(%dx%dx%d px, pitch %d bytes) %d bytes total, macrotiled %s\n", 736d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger i, u_minify(base->width0, i), u_minify(base->height0, i), 737c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák u_minify(base->depth0, i), stride, tex->size, 738c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->mip_macrotile[i] ? "TRUE" : "FALSE"); 7398e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson } 7408e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson} 7418e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 74263c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšákstatic void r300_setup_flags(struct r300_texture* tex) 74363c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák{ 744d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger tex->is_npot = !util_is_power_of_two(tex->tex.width0) || 745d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger !util_is_power_of_two(tex->tex.height0); 74663c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák} 74763c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák 748b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšákstatic void r300_setup_tiling(struct pipe_screen *screen, 749b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák struct r300_texture *tex) 750b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák{ 75112dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 752b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák enum pipe_format format = tex->tex.format; 753b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák boolean rv350_mode = r300_screen(screen)->caps->family >= CHIP_FAMILY_RV350; 754b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 7559fc6c8b831e5b43ae86ece6a531fc892f6f66356Marek Olšák if (!r300_format_is_plain(format)) { 756b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák return; 757b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 758b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 759b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák if (tex->tex.width0 == 1 || 760b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák tex->tex.height0 == 1) { 761b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák return; 762b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 763b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 764b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák /* Set microtiling. */ 765b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák switch (util_format_get_blocksize(format)) { 766b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák case 1: 767b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák case 4: 768b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák tex->microtile = R300_BUFFER_TILED; 769b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák break; 770b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 77112dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák case 2: 772b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák case 8: 77312dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák if (rws->get_value(rws, R300_VID_SQUARE_TILING_SUPPORT)) { 77412dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák tex->microtile = R300_BUFFER_SQUARETILED; 77512dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák } 77612dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák break; 777b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 778b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 779b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák /* Set macrotiling. */ 78057a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák if (r300_texture_macro_switch(tex, 0, rv350_mode, TILE_WIDTH) && 78157a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák r300_texture_macro_switch(tex, 0, rv350_mode, TILE_HEIGHT)) { 782b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák tex->macrotile = R300_BUFFER_TILED; 783b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 784b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák} 785b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 7860648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson/* Create a new texture. */ 7876c7fac846ef99cde5305cf1011b4570bd1901625Marek Olšákstatic struct pipe_texture* r300_texture_create(struct pipe_screen* screen, 7886eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák const struct pipe_texture* base) 7890648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson{ 7908e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson struct r300_texture* tex = CALLOC_STRUCT(r300_texture); 7918959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák struct r300_screen* rscreen = r300_screen(screen); 79268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 7938e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 7948e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson if (!tex) { 7958e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson return NULL; 7968e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson } 7978e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 7986eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák tex->tex = *base; 7995e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer pipe_reference_init(&tex->tex.reference, 1); 8008e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson tex->tex.screen = screen; 8018e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 80263c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák r300_setup_flags(tex); 8036eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák if (!(base->tex_usage & R300_TEXTURE_USAGE_TRANSFER)) { 804b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák r300_setup_tiling(screen, tex); 805b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 8068959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák r300_setup_miptree(rscreen, tex); 8078959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák r300_setup_texture_state(rscreen, tex); 8089d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 80968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie tex->buffer = rws->buffer_create(rws, 2048, 81068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie PIPE_BUFFER_USAGE_PIXEL, 81168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie tex->size); 81268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie rws->buffer_set_tiling(rws, tex->buffer, 81368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie tex->pitch[0], 81433d2349119ada410dbfbaa667fc7aef8b60d1a6fMarek Olšák tex->microtile, 81533d2349119ada410dbfbaa667fc7aef8b60d1a6fMarek Olšák tex->macrotile); 8168e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 8178e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson if (!tex->buffer) { 8188e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson FREE(tex); 8198e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson return NULL; 8208e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson } 8218e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 8228e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson return (struct pipe_texture*)tex; 8238e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson} 8248e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 8255e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzerstatic void r300_texture_destroy(struct pipe_texture* texture) 8268e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson{ 8275e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer struct r300_texture* tex = (struct r300_texture*)texture; 82868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = (struct r300_winsys_screen *)texture->screen->winsys; 8298e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 83068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie rws->buffer_reference(rws, &tex->buffer, NULL); 8315e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer FREE(tex); 8320648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson} 8330648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson 834471129c7a14fb585ede198970e59270c4afa5310Corbin Simpsonstatic struct pipe_surface* r300_get_tex_surface(struct pipe_screen* screen, 835471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson struct pipe_texture* texture, 836471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson unsigned face, 837471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson unsigned level, 838471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson unsigned zslice, 839471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson unsigned flags) 840471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{ 841471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson struct r300_texture* tex = (struct r300_texture*)texture; 842471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson struct pipe_surface* surface = CALLOC_STRUCT(pipe_surface); 843471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson unsigned offset; 844471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 845118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák offset = r300_texture_get_offset(tex, level, zslice, face); 846471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 847471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson if (surface) { 8485e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer pipe_reference_init(&surface->reference, 1); 849471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson pipe_texture_reference(&surface->texture, texture); 850471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson surface->format = texture->format; 851d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger surface->width = u_minify(texture->width0, level); 852d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger surface->height = u_minify(texture->height0, level); 853471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson surface->offset = offset; 854471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson surface->usage = flags; 855c2df759cd73e281c4698c717e0ab89757a7affd5Marek Olšák surface->zslice = zslice; 856c2df759cd73e281c4698c717e0ab89757a7affd5Marek Olšák surface->texture = texture; 857c2df759cd73e281c4698c717e0ab89757a7affd5Marek Olšák surface->face = face; 858c2df759cd73e281c4698c717e0ab89757a7affd5Marek Olšák surface->level = level; 859471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson } 860471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 861471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson return surface; 862471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson} 863471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 8645e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzerstatic void r300_tex_surface_destroy(struct pipe_surface* s) 865471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{ 8665e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer pipe_texture_reference(&s->texture, NULL); 8675e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer FREE(s); 868471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson} 869471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 8701a5eea0c1e9ce6162ed6b07c337bffe62cb3c221Corbin Simpson 871d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantzstatic struct pipe_texture* 872d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz r300_texture_from_handle(struct pipe_screen* screen, 873d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz const struct pipe_texture* base, 874d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz struct winsys_handle *whandle) 875d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz{ 87668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = (struct r300_winsys_screen*)screen->winsys; 877d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz struct r300_screen* rscreen = r300_screen(screen); 87868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_buffer *buffer; 879d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz struct r300_texture* tex; 880d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz unsigned stride; 881d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 882d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz /* Support only 2D textures without mipmaps */ 883d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (base->target != PIPE_TEXTURE_2D || 884d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz base->depth0 != 1 || 885d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz base->last_level != 0) { 886d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return NULL; 887d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 888d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 88968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie buffer = rws->buffer_from_handle(rws, screen, whandle, &stride); 890d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (!buffer) { 891d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return NULL; 892d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 893d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 894d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex = CALLOC_STRUCT(r300_texture); 895d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (!tex) { 896d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return NULL; 897d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 898d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 899d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex->tex = *base; 900d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz pipe_reference_init(&tex->tex.reference, 1); 901d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex->tex.screen = screen; 902d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 903d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex->stride_override = stride; 904d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 905d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz /* one ref already taken */ 906d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex->buffer = buffer; 907d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 9084c26cdbe01619abad413b09317f2842dcf1a4d57Dave Airlie rws->buffer_get_tiling(rws, buffer, &tex->microtile, &tex->macrotile); 909e0848bd90378ba633cfa57013c650e892d931f74Marek Olšák r300_setup_flags(tex); 910e0848bd90378ba633cfa57013c650e892d931f74Marek Olšák r300_setup_miptree(rscreen, tex); 911e0848bd90378ba633cfa57013c650e892d931f74Marek Olšák r300_setup_texture_state(rscreen, tex); 912d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return (struct pipe_texture*)tex; 913d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz} 914d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 915d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantzstatic boolean 916d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz r300_texture_get_handle(struct pipe_screen* screen, 917d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz struct pipe_texture *texture, 918d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz struct winsys_handle *whandle) 919d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz{ 92068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 921d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz struct r300_texture* tex = (struct r300_texture*)texture; 922d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz unsigned stride; 923d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 924d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (!tex) { 925d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return FALSE; 926d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 927d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 928d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz stride = r300_texture_get_stride(r300_screen(screen), tex, 0); 929d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 93068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie rws->buffer_get_handle(rws, tex->buffer, stride, whandle); 931d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 932d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return TRUE; 933d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz} 934d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 935a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuanstatic struct pipe_video_surface * 936a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuanr300_video_surface_create(struct pipe_screen *screen, 937a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan enum pipe_video_chroma_format chroma_format, 938a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan unsigned width, unsigned height) 939a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan{ 940a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan struct r300_video_surface *r300_vsfc; 9416eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák struct pipe_texture base; 942a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan 943a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan assert(screen); 944a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan assert(width && height); 945a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan 946a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan r300_vsfc = CALLOC_STRUCT(r300_video_surface); 947a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan if (!r300_vsfc) 948a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan return NULL; 949a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan 950a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan pipe_reference_init(&r300_vsfc->base.reference, 1); 951a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan r300_vsfc->base.screen = screen; 952a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan r300_vsfc->base.chroma_format = chroma_format; 953a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan r300_vsfc->base.width = width; 954a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan r300_vsfc->base.height = height; 955a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan 9566eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák memset(&base, 0, sizeof(struct pipe_texture)); 9576eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák base.target = PIPE_TEXTURE_2D; 9586eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák base.format = PIPE_FORMAT_B8G8R8X8_UNORM; 9596eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák base.last_level = 0; 9606eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák base.width0 = util_next_power_of_two(width); 9616eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák base.height0 = util_next_power_of_two(height); 9626eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák base.depth0 = 1; 9636eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák base.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER | 9646eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák PIPE_TEXTURE_USAGE_RENDER_TARGET; 9656eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák 9666eb892cc12047af36f4eb42050f1d2e57b0f3a3cMarek Olšák r300_vsfc->tex = screen->texture_create(screen, &base); 967a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan if (!r300_vsfc->tex) 968a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan { 969a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan FREE(r300_vsfc); 970a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan return NULL; 971a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan } 972a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan 973a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan return &r300_vsfc->base; 974a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan} 975a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan 976a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuanstatic void r300_video_surface_destroy(struct pipe_video_surface *vsfc) 977a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan{ 978a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan struct r300_video_surface *r300_vsfc = r300_video_surface(vsfc); 979a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan pipe_texture_reference(&r300_vsfc->tex, NULL); 980a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan FREE(r300_vsfc); 981a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan} 982a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan 9830648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpsonvoid r300_init_screen_texture_functions(struct pipe_screen* screen) 9840648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson{ 9850648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson screen->texture_create = r300_texture_create; 986d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz screen->texture_from_handle = r300_texture_from_handle; 987d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz screen->texture_get_handle = r300_texture_get_handle; 9885e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer screen->texture_destroy = r300_texture_destroy; 989471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson screen->get_tex_surface = r300_get_tex_surface; 9905e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer screen->tex_surface_destroy = r300_tex_surface_destroy; 991a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan 992a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan screen->video_surface_create = r300_video_surface_create; 993a74e53ddba246b1f6604c6120b63a923fd9c60d5Cooper Yuan screen->video_surface_destroy= r300_video_surface_destroy; 9940648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson} 99560041203d5847de8ab71842a6ce5d33d96cc4930Corbin Simpson 99668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlieboolean r300_get_texture_buffer(struct pipe_screen* screen, 99768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct pipe_texture* texture, 99868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_buffer** buffer, 99968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie unsigned* stride) 100068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie{ 100168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_texture* tex = (struct r300_texture*)texture; 100268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 100368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_buffer *buf; 100468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 100568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie if (!tex) { 100668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie return FALSE; 100768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie } 100868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 100968e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie rws->buffer_reference(rws, &buf, tex->buffer); 101068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 101168e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie if (stride) { 101268e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie *stride = r300_texture_get_stride(r300_screen(screen), tex, 0); 101368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie } 101468e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 101568e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie *buffer = buf; 101668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie return TRUE; 101768e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie} 1018