r300_texture.c revision b6b76cbb20b3d9467011231069e23972b98afa49
10648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson/* 20648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> 33c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * Copyright 2010 Marek Olšák <maraeo@gmail.com> 40648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * 50648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * Permission is hereby granted, free of charge, to any person obtaining a 60648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * copy of this software and associated documentation files (the "Software"), 70648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * to deal in the Software without restriction, including without limitation 80648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * on the rights to use, copy, modify, merge, publish, distribute, sub 90648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * license, and/or sell copies of the Software, and to permit persons to whom 100648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * the Software is furnished to do so, subject to the following conditions: 110648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * 120648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * The above copyright notice and this permission notice (including the next 130648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * paragraph) shall be included in all copies or substantial portions of the 140648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * Software. 150648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * 160648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 170648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 180648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 190648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 200648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 210648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 220648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 230648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson 246a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "pipe/p_screen.h" 256a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson 266df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol#include "util/u_format.h" 2788512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák#include "util/u_format_s3tc.h" 286a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "util/u_math.h" 296a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "util/u_memory.h" 306a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson 316a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "r300_context.h" 321c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák#include "r300_reg.h" 330648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson#include "r300_texture.h" 34287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "r300_transfer.h" 35827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák#include "r300_screen.h" 368bf9842fac00369b5cd3a82fb4d87db0e31848b8Marek Olšák#include "r300_winsys.h" 37b7a002df1e06504ff1ed0dc005c9b10aa4be54f7Marek Olšák 3846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák#define TILE_WIDTH 0 3946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák#define TILE_HEIGHT 1 4046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 4146992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšákstatic const unsigned microblock_table[5][3][2] = { 4246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák /*linear tiled square-tiled */ 4346992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák {{32, 1}, {8, 4}, {0, 0}}, /* 8 bits per pixel */ 4446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák {{16, 1}, {8, 2}, {4, 4}}, /* 16 bits per pixel */ 4546992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák {{ 8, 1}, {4, 2}, {0, 0}}, /* 32 bits per pixel */ 4646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák {{ 4, 1}, {0, 0}, {2, 2}}, /* 64 bits per pixel */ 4746992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák {{ 2, 1}, {0, 0}, {0, 0}} /* 128 bits per pixel */ 4846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák}; 4946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 5071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšákunsigned r300_get_swizzle_combined(const unsigned char *swizzle_format, 5171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák const unsigned char *swizzle_view) 5271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák{ 5371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák unsigned i; 5471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák unsigned char swizzle[4]; 5571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák unsigned result = 0; 5671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák const uint32_t swizzle_shift[4] = { 5771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_R_SHIFT, 5871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_G_SHIFT, 5971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_B_SHIFT, 6071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_A_SHIFT 6171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák }; 6271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák const uint32_t swizzle_bit[4] = { 6371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_X, 6471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_Y, 6571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_Z, 6671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_W 6771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák }; 6871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák 6971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák if (swizzle_view) { 7071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák /* Combine two sets of swizzles. */ 7171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák for (i = 0; i < 4; i++) { 7271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák swizzle[i] = swizzle_view[i] <= UTIL_FORMAT_SWIZZLE_W ? 7371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák swizzle_format[swizzle_view[i]] : swizzle_view[i]; 7471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } 7571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } else { 7671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák memcpy(swizzle, swizzle_format, 4); 7771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } 7871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák 7971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák /* Get swizzle. */ 8071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák for (i = 0; i < 4; i++) { 8171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák switch (swizzle[i]) { 8271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák case UTIL_FORMAT_SWIZZLE_Y: 8371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= swizzle_bit[1] << swizzle_shift[i]; 8471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 8571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák case UTIL_FORMAT_SWIZZLE_Z: 8671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= swizzle_bit[2] << swizzle_shift[i]; 8771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 8871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák case UTIL_FORMAT_SWIZZLE_W: 8971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= swizzle_bit[3] << swizzle_shift[i]; 9071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 9171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák case UTIL_FORMAT_SWIZZLE_0: 9271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= R300_TX_FORMAT_ZERO << swizzle_shift[i]; 9371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 9471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák case UTIL_FORMAT_SWIZZLE_1: 9571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= R300_TX_FORMAT_ONE << swizzle_shift[i]; 9671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 9771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák default: /* UTIL_FORMAT_SWIZZLE_X */ 9871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= swizzle_bit[0] << swizzle_shift[i]; 9971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } 10071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } 10171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák return result; 10271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák} 10371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák 1045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák/* Translate a pipe_format into a useful texture format for sampling. 1055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 1065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Some special formats are translated directly using R300_EASY_TX_FORMAT, 1075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * but the majority of them is translated in a generic way, automatically 1085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * supporting all the formats hw can support. 1095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 1105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT swizzles the texture. 1115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Note the signature of R300_EASY_TX_FORMAT: 1125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT(B, G, R, A, FORMAT); 1135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 1145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * The FORMAT specifies how the texture sampler will treat the texture, and 1155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * makes available X, Y, Z, W, ZERO, and ONE for swizzling. */ 1161c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r300_translate_texformat(enum pipe_format format, 1173b667700a5d88b71e6e7a41d1521754b393c022eMarek Olšák const unsigned char *swizzle_view) 1185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{ 1195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák uint32_t result = 0; 1205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák const struct util_format_description *desc; 12139e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák unsigned i; 1225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák boolean uniform = TRUE; 1235c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák const uint32_t sign_bit[4] = { 1245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_X, 1255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_Y, 1265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_Z, 1275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_W, 1285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák }; 1295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc = util_format_description(format); 1315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Colorspace (return non-RGB formats directly). */ 1335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->colorspace) { 13471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák /* Depth stencil formats. 13571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák * Swizzles are added in r300_merge_textures_and_samplers. */ 1365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_ZS: 1375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 1385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_Z16_UNORM: 13971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák return R300_TX_FORMAT_X16; 140b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8Z24_UNORM: 1416fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger case PIPE_FORMAT_S8_USCALED_Z24_UNORM: 14271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák return R300_TX_FORMAT_W24_FP; 1435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported. */ 1455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* YUV formats. */ 1485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_YUV: 1495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_YUV_TO_RGB; 1505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 152b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_UYVY: 1535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result; 154b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_YUYV: 1555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result; 1565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 1585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Add gamma correction. */ 1615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_SRGB: 1625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_GAMMA; 1635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 1645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 165e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák default: 166e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák switch (format) { 167e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák /* Same as YUV but without the YUR->RGB conversion. */ 168e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák case PIPE_FORMAT_R8G8_B8G8_UNORM: 169e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result; 170e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák case PIPE_FORMAT_G8R8_G8B8_UNORM: 171e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result; 172e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák default:; 173e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák } 1745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 17671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view); 1775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1783252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák /* S3TC formats. */ 17928cf5e1191077e063fe2a81d9d35934b71d001e2José Fonseca if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) { 18088512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák if (!util_format_s3tc_enabled) { 18188512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák return ~0; /* Unsupported. */ 18288512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák } 18388512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák 1845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 1855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_RGB: 1865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_RGBA: 1875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_SRGB: 1885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_SRGBA: 1895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT1 | result; 1905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT3_RGBA: 1915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT3_SRGBA: 1925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT3 | result; 1935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT5_RGBA: 1945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT5_SRGBA: 1955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT5 | result; 1965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 1975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 1985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 1995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Add sign. */ 20239e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák for (i = 0; i < desc->nr_channels; i++) { 2035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 2045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= sign_bit[i]; 2055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 208e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák /* This is truly a special format. 209e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák * It stores R8G8 and B is computed using sqrt(1 - R^2 - G^2) 210e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák * in the sampler unit. Also known as D3DFMT_CxV8U8. */ 211e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák if (format == PIPE_FORMAT_R8G8Bx_SNORM) { 212e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák return R300_TX_FORMAT_CxV8U8 | result; 213e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák } 214e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák 2153252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák /* RGTC formats. */ 2163252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) { 2173252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák switch (format) { 2183252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_UNORM: 2193252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_SNORM: 2203252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R500_TX_FORMAT_ATI1N | result; 2213252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC2_UNORM: 2223252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC2_SNORM: 2233252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R400_TX_FORMAT_ATI2N | result; 2243252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák default: 2253252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return ~0; /* Unsupported/unknown. */ 2263252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 2273252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 2283252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák 2295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* See whether the components are of the same size. */ 23039e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák for (i = 1; i < desc->nr_channels; i++) { 2315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák uniform = uniform && desc->channel[0].size == desc->channel[i].size; 2325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Non-uniform formats. */ 2355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (!uniform) { 23639e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 3: 2385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 2395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 6 && 2405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 5) { 2415c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Z5Y6X5 | result; 2425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 2445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 5 && 2455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 6) { 2465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Z6Y5X5 | result; 2475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 2495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 2525c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 5 && 2535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 5 && 2545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[3].size == 1) { 2555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W1Z5Y5X5 | result; 2565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 10 && 2585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 10 && 2595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 10 && 2605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[3].size == 2) { 2615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W2Z10Y10X10 | result; 2625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 2655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* And finally, uniform formats. */ 2685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->channel[0].type) { 2695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_UNSIGNED: 2705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_SIGNED: 2715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (!desc->channel[0].normalized && 2725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) { 2735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2765c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->channel[0].size) { 2775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 27839e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2795c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 2805c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y4X4 | result; 2815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W4Z4Y4X4 | result; 2835c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 8: 28739e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 2895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_X8 | result; 2905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 2915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y8X8 | result; 2925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 2935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W8Z8Y8X8 | result; 2945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2955c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 2965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 16: 29839e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 2995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 3005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_X16 | result; 3015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 3025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y16X16 | result; 3035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 3045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W16Z16Y16X16 | result; 3055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 3085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_FLOAT: 3105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->channel[0].size) { 3115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 16: 31239e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 3135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 3145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F | result; 3155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 3165c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F_16F | result; 3175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 3185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F_16F_16F_16F | result; 3195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 3215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 32: 32339e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 3245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 3255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F | result; 3265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 3275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F_32F | result; 3285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 3295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F_32F_32F_32F | result; 3305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 3355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák} 3365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3371c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r500_tx_format_msb_bit(enum pipe_format format) 3383252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák{ 3393252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák switch (format) { 3403252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_UNORM: 3413252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_SNORM: 3423252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R500_TXFORMAT_MSB; 3433252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák default: 3443252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return 0; 3453252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 3463252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák} 3473252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák 3483c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Buffer formats. */ 3493c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3503c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Colorbuffer formats. This is the unswizzled format of the RB3D block's 3513c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * output. For the swizzling of the targets, check the shader's format. */ 3523c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_colorformat(enum pipe_format format) 3533c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 3543c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 3553c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 8-bit buffers. */ 3563c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_A8_UNORM: 3573c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_I8_UNORM: 3583c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_L8_UNORM: 3593c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_UNORM: 3603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_SNORM: 3613c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_I8; 3623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 16-bit buffers. */ 364b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G6R5_UNORM: 3653c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_RGB565; 36626a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák 367b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G5R5A1_UNORM: 368f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_B5G5R5X1_UNORM: 3693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB1555; 37026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák 371b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B4G4R4A4_UNORM: 37226a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B4G4R4X4_UNORM: 3733c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB4444; 3743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3753c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 32-bit buffers. */ 3763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_B8G8R8A8_UNORM: 3773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_B8G8R8X8_UNORM: 378b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8R8G8B8_UNORM: 379b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8R8G8B8_UNORM: 380b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8B8G8R8_UNORM: 3813c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8G8B8A8_SNORM: 382b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8B8G8R8_UNORM: 38326a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R8G8B8X8_UNORM: 384b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 3853c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB8888; 38626a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák 387b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R10G10B10A2_UNORM: 38826a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10G10B10X2_SNORM: 38926a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B10G10R10A2_UNORM: 39026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 3913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R500_COLOR_FORMAT_ARGB2101010; /* R5xx-only? */ 3923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 64-bit buffers. */ 3943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_UNORM: 3953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_SNORM: 3962ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák case PIPE_FORMAT_R16G16B16A16_FLOAT: 3973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB16161616; 3983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 3993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 128-bit buffers. */ 4003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R32G32B32A32_FLOAT: 4013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB32323232; 4023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* YUV buffers. */ 404b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_UYVY: 4053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_YVYU; 406b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_YUYV: 4073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_VYUY; 4083c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 4093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 4103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 4123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Depthbuffer and stencilbuffer. Thankfully, we only support two flavors. */ 4143c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_zsformat(enum pipe_format format) 4153c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 4163c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 4173c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 16-bit depth, no stencil */ 4183c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_Z16_UNORM: 4193c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_DEPTHFORMAT_16BIT_INT_Z; 4203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 24-bit depth, ignored stencil */ 421b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8Z24_UNORM: 4223c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 24-bit depth, 8-bit stencil */ 4236fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger case PIPE_FORMAT_S8_USCALED_Z24_UNORM: 4243c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL; 4253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 4263c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 4273c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 4293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Shader output formats. This is essentially the swizzle from the shader 4313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * to the RB3D block. 4323c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * 4333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * Note that formats are stored from C3 to C0. */ 4343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_out_fmt(enum pipe_format format) 4353c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 4363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák uint32_t modifier = 0; 4373c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák unsigned i; 4383c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák const struct util_format_description *desc; 4393c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák static const uint32_t sign_bit[4] = { 4403c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x1), 4413c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x2), 4423c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x4), 4433c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_OUT_SIGN(0x8), 4443c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák }; 4453c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4463c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák desc = util_format_description(format); 4473c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4483c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Specifies how the shader output is written to the fog unit. */ 4490c81739528fd8f240176bb120c90c712f9606718Marek Olšák if (desc->channel[0].type == UTIL_FORMAT_TYPE_FLOAT) { 4503c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (desc->channel[0].size == 32) { 4513c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_32_FP; 4523c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 4533c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_16_FP; 4543c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4553c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 4563c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (desc->channel[0].size == 16) { 4573c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_16; 4583c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 4593c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* C4_8 seems to be used for the formats whose pixel size 4603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * is <= 32 bits. */ 4613c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_8; 4623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4653c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Add sign. */ 4663c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák for (i = 0; i < 4; i++) 4673c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 4683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= sign_bit[i]; 4693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 4703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Add swizzles and return. */ 4723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 4733c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 8-bit outputs. 4743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * COLORFORMAT_I8 stores the C2 component. */ 4753c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_A8_UNORM: 4763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | R300_C2_SEL_A; 4773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_I8_UNORM: 4783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_L8_UNORM: 4793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_UNORM: 4803c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_SNORM: 4813c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | R300_C2_SEL_R; 4823c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 483f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* BGRA outputs. */ 484b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G6R5_UNORM: 485b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G5R5A1_UNORM: 486f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_B5G5R5X1_UNORM: 487b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B4G4R4A4_UNORM: 48826a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B4G4R4X4_UNORM: 489b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B8G8R8A8_UNORM: 490b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B8G8R8X8_UNORM: 49126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B10G10R10A2_UNORM: 4923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 4933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_B | R300_C1_SEL_G | 4943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_R | R300_C3_SEL_A; 4953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 496f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* ARGB outputs. */ 497b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8R8G8B8_UNORM: 498b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8R8G8B8_UNORM: 4993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 5003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_A | R300_C1_SEL_R | 5013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_G | R300_C3_SEL_B; 5023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 503f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* ABGR outputs. */ 504b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_A8B8G8R8_UNORM: 505b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8B8G8R8_UNORM: 5063c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 5073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_A | R300_C1_SEL_B | 5083c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_G | R300_C3_SEL_R; 5093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 510f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* RGBA outputs. */ 51126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R8G8B8X8_UNORM: 512f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_R8G8B8A8_SNORM: 513b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 514b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R10G10B10A2_UNORM: 51526a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10G10B10X2_SNORM: 51626a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 5173c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_UNORM: 5183c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_SNORM: 5192ba0c64c26d3ec9b2806f577020d4fde826a858dMarek Olšák case PIPE_FORMAT_R16G16B16A16_FLOAT: 5203c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R32G32B32A32_FLOAT: 5213c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 5223c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_R | R300_C1_SEL_G | 5233c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_B | R300_C3_SEL_A; 5243c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5253c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 5263c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 5273c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 5283c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5293c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5303c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_colorbuffer_format_supported(enum pipe_format format) 5313c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 5323c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return r300_translate_colorformat(format) != ~0 && 5333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák r300_translate_out_fmt(format) != ~0; 5343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5353c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_zs_format_supported(enum pipe_format format) 5373c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 5383c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return r300_translate_zsformat(format) != ~0; 5393c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5403c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5415c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšákboolean r300_is_sampler_format_supported(enum pipe_format format) 5425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{ 5431c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák return r300_translate_texformat(format, 0) != ~0; 5445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák} 5455c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 5461c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákstatic void r300_texture_setup_immutable_state(struct r300_screen* screen, 5471c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák struct r300_texture* tex) 5489d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson{ 5491c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák struct r300_texture_format_state* f = &tex->tx_format; 550287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *pt = &tex->b.b; 551b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák boolean is_r500 = screen->caps.is_r500; 5529d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 5533c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Set sampler state. */ 5541c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format0 = R300_TX_WIDTH((pt->width0 - 1) & 0x7ff) | 5551c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák R300_TX_HEIGHT((pt->height0 - 1) & 0x7ff); 556827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák 5574e949271c25ccc5a06fbbbe912b0b43b75d1d169Marek Olšák if (tex->uses_pitch) { 558827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* rectangles love this */ 5591c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format0 |= R300_TX_PITCH_EN; 5609dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák f->format2 = (tex->hwpitch[0] - 1) & 0x1fff; 56163c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák } else { 562827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* power of two textures (3D, mipmaps, and no pitch) */ 5631c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format0 |= R300_TX_DEPTH(util_logbase2(pt->depth0) & 0xf); 564827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 5659d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 5661c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format1 = 0; 567eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie if (pt->target == PIPE_TEXTURE_CUBE) { 5681c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format1 |= R300_TX_FORMAT_CUBIC_MAP; 569eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie } 570eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie if (pt->target == PIPE_TEXTURE_3D) { 5711c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format1 |= R300_TX_FORMAT_3D; 572eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie } 5739d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 574827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* large textures on r500 */ 575827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák if (is_r500) 576827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák { 577d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger if (pt->width0 > 2048) { 5781c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format2 |= R500_TXWIDTH_BIT11; 579827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 580d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger if (pt->height0 > 2048) { 5811c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->format2 |= R500_TXHEIGHT_BIT11; 582827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 5831aa38b2c2d80b67fe2eefe468f90aeb44bc20259Corbin Simpson } 5842cbd5ecfb666a757c4abef85dbe40fb53d647ec9Corbin Simpson 5851c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák f->tile_config = R300_TXO_MACRO_TILE(tex->macrotile) | 5861c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák R300_TXO_MICRO_TILE(tex->microtile); 5871c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák} 5881c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák 5891c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákstatic void r300_texture_setup_fb_state(struct r300_screen* screen, 5901c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák struct r300_texture* tex) 5911c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák{ 5921c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák unsigned i; 5933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Set framebuffer state. */ 595287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (util_format_is_depth_or_stencil(tex->b.b.format)) { 596287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell for (i = 0; i <= tex->b.b.last_level; i++) { 5973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák tex->fb_state.depthpitch[i] = 5989dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák tex->hwpitch[i] | 5993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_DEPTHMACROTILE(tex->mip_macrotile[i]) | 6003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_DEPTHMICROTILE(tex->microtile); 6013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 602287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->fb_state.zb_format = r300_translate_zsformat(tex->b.b.format); 6033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 604287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell for (i = 0; i <= tex->b.b.last_level; i++) { 6053c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák tex->fb_state.colorpitch[i] = 6069dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák tex->hwpitch[i] | 607287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_translate_colorformat(tex->b.b.format) | 6083c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_COLOR_TILE(tex->mip_macrotile[i]) | 6093c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_COLOR_MICROTILE(tex->microtile); 6103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 611287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->fb_state.us_out_fmt = r300_translate_out_fmt(tex->b.b.format); 6123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 6133cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle} 6143cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 615f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšákvoid r300_texture_reinterpret_format(struct pipe_screen *screen, 616287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex, 617f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák enum pipe_format new_format) 618f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák{ 619f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák struct r300_screen *r300screen = r300_screen(screen); 620f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 6210bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(r300screen, DBG_TEX, "r300: texture_reinterpret_format: %s -> %s\n", 622ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák util_format_short_name(tex->format), util_format_short_name(new_format)); 623f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 624f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák tex->format = new_format; 625f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 6261c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_fb_state(r300_screen(screen), r300_texture(tex)); 627f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák} 628f22ddd8e4743dbbfea2fac6c54837b30cbb1eb0eMarek Olšák 629118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšákunsigned r300_texture_get_offset(struct r300_texture* tex, unsigned level, 630118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák unsigned zslice, unsigned face) 631118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák{ 632118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák unsigned offset = tex->offset[level]; 633118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 634287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell switch (tex->b.b.target) { 635118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák case PIPE_TEXTURE_3D: 636118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák assert(face == 0); 637118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák return offset + zslice * tex->layer_size[level]; 638118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 639118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák case PIPE_TEXTURE_CUBE: 640118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák assert(zslice == 0); 641118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák return offset + face * tex->layer_size[level]; 642118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 643118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák default: 644118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák assert(zslice == 0 && face == 0); 645118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák return offset; 646118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák } 647118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák} 648118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 6493cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle/** 65046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák * Return the width (dim==TILE_WIDTH) or height (dim==TILE_HEIGHT) of one tile 65146992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák * of the given texture. 65246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák */ 653c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšákstatic unsigned r300_texture_get_tile_size(struct r300_texture* tex, 654c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák int dim, boolean macrotile) 65546992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák{ 65646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned pixsize, tile_size; 65746992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 658287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pixsize = util_format_get_blocksize(tex->b.b.format); 659c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_size = microblock_table[util_logbase2(pixsize)][tex->microtile][dim]; 660c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 661c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák if (macrotile) { 662c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_size *= 8; 663c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák } 66446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 66546992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák assert(tile_size); 66646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák return tile_size; 66746992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák} 66846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 669c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák/* Return true if macrotiling should be enabled on the miplevel. */ 670c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšákstatic boolean r300_texture_macro_switch(struct r300_texture *tex, 671c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák unsigned level, 67257a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák boolean rv350_mode, 67357a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák int dim) 674c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák{ 67557a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák unsigned tile, texdim; 676c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 67757a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák tile = r300_texture_get_tile_size(tex, dim, TRUE); 67857a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák if (dim == TILE_WIDTH) { 679287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell texdim = u_minify(tex->b.b.width0, level); 68057a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák } else { 681287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell texdim = u_minify(tex->b.b.height0, level); 68257a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák } 683c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 684c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák /* See TX_FILTER1_n.MACRO_SWITCH. */ 685c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák if (rv350_mode) { 68657a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák return texdim >= tile; 687c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák } else { 68857a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák return texdim > tile; 689c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák } 690c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák} 691c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 69246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák/** 6933cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * Return the stride, in bytes, of the texture images of the given texture 6943cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * at the given level. 6953cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle */ 6968959608051ef8e4a97214323009d09c5e9e633fbMarek Olšákunsigned r300_texture_get_stride(struct r300_screen* screen, 6978959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák struct r300_texture* tex, unsigned level) 6983cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle{ 69946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned tile_width, width; 70046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 7013cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle if (tex->stride_override) 7023cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle return tex->stride_override; 7033cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 70446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák /* Check the level. */ 705287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (level > tex->b.b.last_level) { 7068959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák SCREEN_DBG(screen, DBG_TEX, "%s: level (%u) > last_level (%u)\n", 707287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell __FUNCTION__, level, tex->b.b.last_level); 7083cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle return 0; 7093cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle } 7103cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 711287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell width = u_minify(tex->b.b.width0, level); 71246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 713ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák if (util_format_is_plain(tex->b.b.format)) { 714c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_width = r300_texture_get_tile_size(tex, TILE_WIDTH, 715c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->mip_macrotile[level]); 716cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák width = align(width, tile_width); 717c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 718287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return util_format_get_stride(tex->b.b.format, width); 719cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák } else { 720287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return align(util_format_get_stride(tex->b.b.format, width), 32); 721cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák } 72246992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák} 72346992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 72446992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšákstatic unsigned r300_texture_get_nblocksy(struct r300_texture* tex, 72546992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned level) 72646992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák{ 72746992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned height, tile_height; 72846992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 729287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell height = u_minify(tex->b.b.height0, level); 730cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák 731ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák if (util_format_is_plain(tex->b.b.format)) { 732c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tile_height = r300_texture_get_tile_size(tex, TILE_HEIGHT, 733c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->mip_macrotile[level]); 734cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák height = align(height, tile_height); 735e7f1e5ca648d6c96d056d3ae8eab65e98f47f311Marek Olšák 736e7f1e5ca648d6c96d056d3ae8eab65e98f47f311Marek Olšák /* This is needed for the kernel checker, unfortunately. */ 737e7f1e5ca648d6c96d056d3ae8eab65e98f47f311Marek Olšák height = util_next_power_of_two(height); 738cd553ec8be14eea7db2d21b9f26ea6e72474a471Marek Olšák } 73946992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 740287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return util_format_get_nblocksy(tex->b.b.format, height); 7419d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson} 7429d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 7432e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšákstatic void r300_texture_3d_fix_mipmapping(struct r300_screen *screen, 7442e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák struct r300_texture *tex) 7452e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák{ 7462579fe4044012a552c8be222ffae76b48de13592Marek Olšák /* The kernels <= 2.6.34-rc4 compute the size of mipmapped 3D textures 7472e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák * incorrectly. This is a workaround to prevent CS from being rejected. */ 7482e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 7492e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák unsigned i, size; 7502e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 751b7fa7e8da6239333bd9327eac1a3015c668d215bMarek Olšák if (!screen->rws->get_value(screen->rws, R300_VID_DRM_2_3_0) && 7522e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák tex->b.b.target == PIPE_TEXTURE_3D && 7532e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák tex->b.b.last_level > 0) { 7542e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák size = 0; 7552e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 7562e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák for (i = 0; i <= tex->b.b.last_level; i++) { 7572e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák size += r300_texture_get_stride(screen, tex, i) * 7582e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák r300_texture_get_nblocksy(tex, i); 7592e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák } 7602e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 7612e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák size *= tex->b.b.depth0; 7622e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák tex->size = size; 7632e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák } 7642e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák} 7652e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák 7668959608051ef8e4a97214323009d09c5e9e633fbMarek Olšákstatic void r300_setup_miptree(struct r300_screen* screen, 7678959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák struct r300_texture* tex) 7688e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson{ 769287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource* base = &tex->b.b; 77046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák unsigned stride, size, layer_size, nblocksy, i; 771f189caeed046e05bfeec8adf2ebeaae01d1bf2f6Marek Olšák boolean rv350_mode = screen->caps.is_rv350; 7728e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 7730bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(screen, DBG_TEXALLOC, "r300: Making miptree for texture, format %s\n", 774ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák util_format_short_name(base->format)); 775ce1c493ff8fad4b62e2b66f06636ac6560a6e0adCorbin Simpson 7762b5770e652f0e6620b52971755bd7eb31c16ad7dCorbin Simpson for (i = 0; i <= base->last_level; i++) { 777c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák /* Let's see if this miplevel can be macrotiled. */ 77857a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák tex->mip_macrotile[i] = 77957a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák (tex->macrotile == R300_BUFFER_TILED && 780a43618fdc4e046f946d5f0de6dd8a421b66e9498Mathias Fröhlich r300_texture_macro_switch(tex, i, rv350_mode, TILE_WIDTH) && 781a43618fdc4e046f946d5f0de6dd8a421b66e9498Mathias Fröhlich r300_texture_macro_switch(tex, i, rv350_mode, TILE_HEIGHT)) ? 78257a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák R300_BUFFER_TILED : R300_BUFFER_LINEAR; 783c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák 7848959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák stride = r300_texture_get_stride(screen, tex, i); 78546992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák nblocksy = r300_texture_get_nblocksy(tex, i); 786c78748a5274e58bcbb122923edf81065be9bbe16Roland Scheidegger layer_size = stride * nblocksy; 787827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák 788827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák if (base->target == PIPE_TEXTURE_CUBE) 789827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák size = layer_size * 6; 790827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák else 791d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger size = layer_size * u_minify(base->depth0, i); 7928e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 793c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->offset[i] = tex->size; 794048f988aeb06fa360c6c41eaa50cb96b4b86e34eMichel Dänzer tex->size = tex->offset[i] + size; 795118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák tex->layer_size[i] = layer_size; 796b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol tex->pitch[i] = stride / util_format_get_blocksize(base->format); 7979dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák tex->hwpitch[i] = 7989dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák tex->pitch[i] * util_format_get_blockwidth(base->format); 79963c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák 8000bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(screen, DBG_TEXALLOC, "r300: Texture miptree: Level %d " 801c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák "(%dx%dx%d px, pitch %d bytes) %d bytes total, macrotiled %s\n", 802d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger i, u_minify(base->width0, i), u_minify(base->height0, i), 803c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák u_minify(base->depth0, i), stride, tex->size, 804c608e19328758842d77dc4da3c8109fe0feb8e86Marek Olšák tex->mip_macrotile[i] ? "TRUE" : "FALSE"); 8058e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson } 8068e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson} 8078e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 80863c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšákstatic void r300_setup_flags(struct r300_texture* tex) 80963c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák{ 810287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->uses_pitch = !util_is_power_of_two(tex->b.b.width0) || 811287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell !util_is_power_of_two(tex->b.b.height0) || 8124e949271c25ccc5a06fbbbe912b0b43b75d1d169Marek Olšák tex->stride_override; 81363c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák} 81463c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák 815b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšákstatic void r300_setup_tiling(struct pipe_screen *screen, 816b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák struct r300_texture *tex) 817b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák{ 81812dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 819287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell enum pipe_format format = tex->b.b.format; 820f189caeed046e05bfeec8adf2ebeaae01d1bf2f6Marek Olšák boolean rv350_mode = r300_screen(screen)->caps.is_rv350; 821c383defdaacab0fe7f35e7a4ae5b57228cf5310cMarek Olšák boolean is_zb = util_format_is_depth_or_stencil(format); 8225b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák boolean dbg_no_tiling = SCREEN_DBG_ON(r300_screen(screen), DBG_NO_TILING); 823b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 824ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák if (!util_format_is_plain(format)) { 825b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák return; 826b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 827b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 828c383defdaacab0fe7f35e7a4ae5b57228cf5310cMarek Olšák /* If height == 1, disable microtiling except for zbuffer. */ 8295b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák if (!is_zb && (tex->b.b.height0 == 1 || dbg_no_tiling)) { 830b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák return; 831b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 832b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 833b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák /* Set microtiling. */ 834b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák switch (util_format_get_blocksize(format)) { 835b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák case 1: 836b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák case 4: 837b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák tex->microtile = R300_BUFFER_TILED; 838b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák break; 839b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 84012dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák case 2: 841b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák case 8: 84212dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák if (rws->get_value(rws, R300_VID_SQUARE_TILING_SUPPORT)) { 84312dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák tex->microtile = R300_BUFFER_SQUARETILED; 84412dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák } 84512dc4971735a8703c298d35eb21e3d1a2e053217Marek Olšák break; 846b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 847b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 8485b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák if (dbg_no_tiling) { 8495b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák return; 8505b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák } 8515b609badf7682da2377c5e67ab827b2dc3a06b9bMarek Olšák 852b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák /* Set macrotiling. */ 85357a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák if (r300_texture_macro_switch(tex, 0, rv350_mode, TILE_WIDTH) && 85457a1395ec3f8eb01af6cfea3fd6b5903dcc61720Marek Olšák r300_texture_macro_switch(tex, 0, rv350_mode, TILE_HEIGHT)) { 855b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák tex->macrotile = R300_BUFFER_TILED; 856b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 857b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák} 858b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák 859287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic unsigned r300_texture_is_referenced(struct pipe_context *context, 860287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *texture, 861287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned face, unsigned level) 862287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 863287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_context *r300 = r300_context(context); 864287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_texture *rtex = (struct r300_texture *)texture; 865287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 8667a1b5c937fa32968a04a11649e456a1ef8c5b442Marek Olšák if (r300->rws->is_buffer_referenced(r300->rws, rtex->buffer, R300_REF_CS)) 867287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 868287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 869287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return PIPE_UNREFERENCED; 870287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 871287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 872287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic void r300_texture_destroy(struct pipe_screen *screen, 873287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource* texture) 874287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 875287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_texture* tex = (struct r300_texture*)texture; 876287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_winsys_screen *rws = (struct r300_winsys_screen *)texture->screen->winsys; 877287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 878287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell rws->buffer_reference(rws, &tex->buffer, NULL); 879287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell FREE(tex); 880287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 881287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 8820b4df63609e9fb25319debd56142a90b11d75671Marek Olšákstatic boolean r300_texture_get_handle(struct pipe_screen* screen, 8830b4df63609e9fb25319debd56142a90b11d75671Marek Olšák struct pipe_resource *texture, 8840b4df63609e9fb25319debd56142a90b11d75671Marek Olšák struct winsys_handle *whandle) 885287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 886287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 887287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct r300_texture* tex = (struct r300_texture*)texture; 888287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned stride; 889287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 890287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (!tex) { 891287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return FALSE; 892287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell } 893287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 894287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell stride = r300_texture_get_stride(r300_screen(screen), tex, 0); 895287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 896287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell rws->buffer_get_handle(rws, tex->buffer, stride, whandle); 897287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 898287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return TRUE; 899287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 900287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 901287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct u_resource_vtbl r300_texture_vtbl = 902287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 903287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_get_handle, /* get_handle */ 904287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_destroy, /* resource_destroy */ 905287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_is_referenced, /* is_resource_referenced */ 906287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_get_transfer, /* get_transfer */ 907287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_transfer_destroy, /* transfer_destroy */ 908287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_transfer_map, /* transfer_map */ 909287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell u_default_transfer_flush_region, /* transfer_flush_region */ 910287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_texture_transfer_unmap, /* transfer_unmap */ 911287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell u_default_transfer_inline_write /* transfer_inline_write */ 912287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}; 913287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 9140648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson/* Create a new texture. */ 915287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource* r300_texture_create(struct pipe_screen* screen, 916287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource* base) 9170648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson{ 9188e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson struct r300_texture* tex = CALLOC_STRUCT(r300_texture); 9198959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák struct r300_screen* rscreen = r300_screen(screen); 92068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = (struct r300_winsys_screen *)screen->winsys; 9218e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 9228e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson if (!tex) { 9238e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson return NULL; 9245cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák } 9255cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák 9265cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák /* Refuse to create a texture with size 0. */ 9275cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák if (!base->width0 || 9285cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák (!base->height0 && (base->target == PIPE_TEXTURE_2D || 9295cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák base->target == PIPE_TEXTURE_CUBE)) || 9305cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák (!base->depth0 && base->target == PIPE_TEXTURE_3D)) { 9315cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák fprintf(stderr, "r300: texture_create: " 9325cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák "Got invalid texture dimensions: %ix%ix%i\n", 9335cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák base->width0, base->height0, base->depth0); 9343234066be221832f660f4e61fc6b0a92c5304780Vinson Lee FREE(tex); 9355cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák return NULL; 9368e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson } 9378e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 938287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.b = *base; 939287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.vtbl = &r300_texture_vtbl; 940287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_reference_init(&tex->b.b.reference, 1); 941287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.b.screen = screen; 9428e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 94363c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák r300_setup_flags(tex); 944287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (!(base->flags & R300_RESOURCE_FLAG_TRANSFER) && 945287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell !(base->bind & PIPE_BIND_SCANOUT)) { 946b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák r300_setup_tiling(screen, tex); 947b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 9488959608051ef8e4a97214323009d09c5e9e633fbMarek Olšák r300_setup_miptree(rscreen, tex); 9492e7785be22181d6c6a10d2fd665bc41f8912b027Marek Olšák r300_texture_3d_fix_mipmapping(rscreen, tex); 9501c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_immutable_state(rscreen, tex); 9511c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_fb_state(rscreen, tex); 9529d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 9530bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(rscreen, DBG_TEX, 9540bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák "r300: texture_create: Macro: %s, Micro: %s, Pitch: %i, " 9550bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák "Dim: %ix%ix%i, LastLevel: %i, Format: %s\n", 9560bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->macrotile ? "YES" : " NO", 9570bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->microtile ? "YES" : " NO", 9580bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->hwpitch[0], 9590bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák base->width0, base->height0, base->depth0, base->last_level, 960ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák util_format_short_name(base->format)); 9610bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák 962b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák tex->domain = base->flags & R300_RESOURCE_FLAG_TRANSFER ? R300_DOMAIN_GTT : 963b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák R300_DOMAIN_VRAM; 96419498be935328e284c7f0e456fc04cca8d465d4cMarek Olšák 965b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák tex->buffer = rws->buffer_create(rws, 2048, base->bind, tex->domain, 966b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák tex->size); 96737f3454eb3afa1297126a8d77a563d734c292a37Marek Olšák 96868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie rws->buffer_set_tiling(rws, tex->buffer, 96921dfcde3ff54e0d01ddd2c79b14db82b57541433Marek Olšák tex->pitch[0] * util_format_get_blocksize(tex->b.b.format), 97021dfcde3ff54e0d01ddd2c79b14db82b57541433Marek Olšák tex->microtile, 97121dfcde3ff54e0d01ddd2c79b14db82b57541433Marek Olšák tex->macrotile); 9728e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 9738e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson if (!tex->buffer) { 9748e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson FREE(tex); 9758e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson return NULL; 9768e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson } 9778e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 978287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return (struct pipe_resource*)tex; 9798e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson} 9808e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 981287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file: 982287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */ 983287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_surface* r300_get_tex_surface(struct pipe_screen* screen, 984287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource* texture, 985287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned face, 986287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned level, 987287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned zslice, 988287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned flags) 989471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{ 990a1f85cf689b6f9ccf6b7310485460f84c8d78cadMarek Olšák struct r300_texture* tex = r300_texture(texture); 991471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson struct pipe_surface* surface = CALLOC_STRUCT(pipe_surface); 992471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson unsigned offset; 993471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 994118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák offset = r300_texture_get_offset(tex, level, zslice, face); 995471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 996471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson if (surface) { 9975e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer pipe_reference_init(&surface->reference, 1); 998287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&surface->texture, texture); 999471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson surface->format = texture->format; 1000d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger surface->width = u_minify(texture->width0, level); 1001d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger surface->height = u_minify(texture->height0, level); 1002471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson surface->offset = offset; 1003471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson surface->usage = flags; 1004c2df759cd73e281c4698c717e0ab89757a7affd5Marek Olšák surface->zslice = zslice; 1005c2df759cd73e281c4698c717e0ab89757a7affd5Marek Olšák surface->texture = texture; 1006c2df759cd73e281c4698c717e0ab89757a7affd5Marek Olšák surface->face = face; 1007c2df759cd73e281c4698c717e0ab89757a7affd5Marek Olšák surface->level = level; 1008471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson } 1009471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 1010471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson return surface; 1011471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson} 1012471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 1013287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file: 1014287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */ 1015287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid r300_tex_surface_destroy(struct pipe_surface* s) 1016471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{ 1017287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&s->texture, NULL); 10185e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer FREE(s); 1019471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson} 1020471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 1021287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource* 1022287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellr300_texture_from_handle(struct pipe_screen* screen, 1023287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource* base, 1024287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct winsys_handle *whandle) 1025d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz{ 102668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_screen *rws = (struct r300_winsys_screen*)screen->winsys; 1027d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz struct r300_screen* rscreen = r300_screen(screen); 102868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie struct r300_winsys_buffer *buffer; 1029d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz struct r300_texture* tex; 1030d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz unsigned stride; 1031b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák boolean override_zb_flags; 1032d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1033d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz /* Support only 2D textures without mipmaps */ 1034d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (base->target != PIPE_TEXTURE_2D || 1035d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz base->depth0 != 1 || 1036d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz base->last_level != 0) { 1037d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return NULL; 1038d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 1039d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 104068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie buffer = rws->buffer_from_handle(rws, screen, whandle, &stride); 1041d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (!buffer) { 1042d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return NULL; 1043d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 1044d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1045d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex = CALLOC_STRUCT(r300_texture); 1046d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz if (!tex) { 1047d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz return NULL; 1048d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz } 1049d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1050287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.b = *base; 1051287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.vtbl = &r300_texture_vtbl; 1052287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_reference_init(&tex->b.b.reference, 1); 1053287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex->b.b.screen = screen; 1054b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák tex->domain = R300_DOMAIN_VRAM; 1055d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1056d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex->stride_override = stride; 1057d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 1058d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz /* one ref already taken */ 1059d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz tex->buffer = buffer; 1060d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz 10614c26cdbe01619abad413b09317f2842dcf1a4d57Dave Airlie rws->buffer_get_tiling(rws, buffer, &tex->microtile, &tex->macrotile); 1062e0848bd90378ba633cfa57013c650e892d931f74Marek Olšák r300_setup_flags(tex); 10630bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák SCREEN_DBG(rscreen, DBG_TEX, 10640bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák "r300: texture_from_handle: Macro: %s, Micro: %s, " 10650bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák "Pitch: % 4i, Dim: %ix%i, Format: %s\n", 10660bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->macrotile ? "YES" : " NO", 10670bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák tex->microtile ? "YES" : " NO", 10680bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák stride / util_format_get_blocksize(base->format), 10690bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák base->width0, base->height0, 1070ac6a26b429d70395cf6def04d2d9c8cf1bd2c964Marek Olšák util_format_short_name(base->format)); 1071b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1072b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák /* Enforce microtiled zbuffer. */ 1073b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák override_zb_flags = util_format_is_depth_or_stencil(base->format) && 1074b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák tex->microtile == R300_BUFFER_LINEAR; 1075b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1076b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák if (override_zb_flags) { 1077b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák switch (util_format_get_blocksize(base->format)) { 1078b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák case 4: 1079b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák tex->microtile = R300_BUFFER_TILED; 1080b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák break; 1081b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1082b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák case 2: 1083b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák if (rws->get_value(rws, R300_VID_SQUARE_TILING_SUPPORT)) { 1084b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák tex->microtile = R300_BUFFER_SQUARETILED; 1085b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák break; 1086b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák } 1087b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák /* Pass through. */ 1088b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1089b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák default: 1090b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák override_zb_flags = FALSE; 1091b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák } 1092b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák } 1093b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1094e0848bd90378ba633cfa57013c650e892d931f74Marek Olšák r300_setup_miptree(rscreen, tex); 10951c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_immutable_state(rscreen, tex); 10961c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák r300_texture_setup_fb_state(rscreen, tex); 1097b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák 1098b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák if (override_zb_flags) { 1099b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák rws->buffer_set_tiling(rws, tex->buffer, 110021dfcde3ff54e0d01ddd2c79b14db82b57541433Marek Olšák tex->pitch[0] * util_format_get_blocksize(tex->b.b.format), 110121dfcde3ff54e0d01ddd2c79b14db82b57541433Marek Olšák tex->microtile, 110221dfcde3ff54e0d01ddd2c79b14db82b57541433Marek Olšák tex->macrotile); 1103b05ada76a5473d901ac9c352af3a05a24ed21363Marek Olšák } 1104287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return (struct pipe_resource*)tex; 1105d160eed005e75d8933562f4880dfc84033011ac5Jakob Bornecrantz} 1106