10648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson/* 20648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> 33c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * Copyright 2010 Marek Olšák <maraeo@gmail.com> 40648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * 50648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * Permission is hereby granted, free of charge, to any person obtaining a 60648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * copy of this software and associated documentation files (the "Software"), 70648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * to deal in the Software without restriction, including without limitation 80648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * on the rights to use, copy, modify, merge, publish, distribute, sub 90648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * license, and/or sell copies of the Software, and to permit persons to whom 100648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * the Software is furnished to do so, subject to the following conditions: 110648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * 120648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * The above copyright notice and this permission notice (including the next 130648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * paragraph) shall be included in all copies or substantial portions of the 140648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * Software. 150648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * 160648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 170648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 180648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 190648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 200648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 210648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 220648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 230648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson 246e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák/* Always include headers in the reverse order!! ~ M. */ 256e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "r300_texture.h" 266a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson 276a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "r300_context.h" 281c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák#include "r300_reg.h" 29d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák#include "r300_texture_desc.h" 30287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "r300_transfer.h" 31827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák#include "r300_screen.h" 32b7a002df1e06504ff1ed0dc005c9b10aa4be54f7Marek Olšák 336e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "util/u_format.h" 346e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "util/u_format_s3tc.h" 356e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "util/u_math.h" 366e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "util/u_memory.h" 376eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie#include "util/u_mm.h" 386e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák 396e96cfa39a1d6705be6b3fc3bae651ba0450a336Marek Olšák#include "pipe/p_screen.h" 4046992664d18ce28ce9dbbf43ccc94443e1fdd00cMarek Olšák 41172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák/* These formats are supported by swapping their bytes. 42172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák * The swizzles must be set exactly like their non-swapped counterparts, 43172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák * because byte-swapping is what reverses the component order, not swizzling. 44172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák * 45172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák * This function returns the format that must be used to program CB and TX 46172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák * swizzles. 47172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák */ 48172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšákstatic enum pipe_format r300_unbyteswap_array_format(enum pipe_format format) 49172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák{ 50b75c0bf73a9f7944fef4f983419b0daf875456f9Grazvydas Ignotas /* FIXME: Disabled on little endian because of a reported regression: 51b75c0bf73a9f7944fef4f983419b0daf875456f9Grazvydas Ignotas * https://bugs.freedesktop.org/show_bug.cgi?id=98869 */ 52b75c0bf73a9f7944fef4f983419b0daf875456f9Grazvydas Ignotas if (PIPE_ENDIAN_NATIVE != PIPE_ENDIAN_BIG) 53b75c0bf73a9f7944fef4f983419b0daf875456f9Grazvydas Ignotas return format; 54b75c0bf73a9f7944fef4f983419b0daf875456f9Grazvydas Ignotas 55172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák /* Only BGRA 8888 array formats are supported for simplicity of 56172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák * the implementation. */ 57172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák switch (format) { 58172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák case PIPE_FORMAT_A8R8G8B8_UNORM: 59172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák return PIPE_FORMAT_B8G8R8A8_UNORM; 60172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák case PIPE_FORMAT_A8R8G8B8_SRGB: 61172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák return PIPE_FORMAT_B8G8R8A8_SRGB; 62172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák case PIPE_FORMAT_X8R8G8B8_UNORM: 63172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák return PIPE_FORMAT_B8G8R8X8_UNORM; 64172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák case PIPE_FORMAT_X8R8G8B8_SRGB: 65172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák return PIPE_FORMAT_B8G8R8X8_SRGB; 66172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák default: 67172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák return format; 68172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák } 69172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák} 70172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák 71172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšákstatic unsigned r300_get_endian_swap(enum pipe_format format) 72172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák{ 73172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák const struct util_format_description *desc; 74172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák unsigned swap_size; 75172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák 76172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák if (r300_unbyteswap_array_format(format) != format) 77172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák return R300_SURF_DWORD_SWAP; 78172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák 79172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák if (PIPE_ENDIAN_NATIVE != PIPE_ENDIAN_BIG) 80172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák return R300_SURF_NO_SWAP; 81172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák 82172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák desc = util_format_description(format); 83172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák if (!desc) 84172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák return R300_SURF_NO_SWAP; 85172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák 86172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák /* Compressed formats should be in the little endian format. */ 87172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák if (desc->block.width != 1 || desc->block.height != 1) 88172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák return R300_SURF_NO_SWAP; 89172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák 90172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák swap_size = desc->is_array ? desc->channel[0].size : desc->block.bits; 91172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák 92172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák switch (swap_size) { 93172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák default: /* shouldn't happen? */ 94172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák case 8: 95172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák return R300_SURF_NO_SWAP; 96172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák case 16: 97172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák return R300_SURF_WORD_SWAP; 98172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák case 32: 99172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák return R300_SURF_DWORD_SWAP; 100172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák } 101172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák} 102172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák 10371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšákunsigned r300_get_swizzle_combined(const unsigned char *swizzle_format, 1046478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák const unsigned char *swizzle_view, 1056478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák boolean dxtc_swizzle) 10671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák{ 10771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák unsigned i; 10871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák unsigned char swizzle[4]; 10971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák unsigned result = 0; 11071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák const uint32_t swizzle_shift[4] = { 11171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_R_SHIFT, 11271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_G_SHIFT, 11371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_B_SHIFT, 11471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_A_SHIFT 11571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák }; 1166478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák uint32_t swizzle_bit[4] = { 1176478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák dxtc_swizzle ? R300_TX_FORMAT_Z : R300_TX_FORMAT_X, 11871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_Y, 1196478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák dxtc_swizzle ? R300_TX_FORMAT_X : R300_TX_FORMAT_Z, 12071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák R300_TX_FORMAT_W 12171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák }; 12271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák 12371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák if (swizzle_view) { 12471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák /* Combine two sets of swizzles. */ 125be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák util_format_compose_swizzles(swizzle_format, swizzle_view, swizzle); 12671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } else { 12771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák memcpy(swizzle, swizzle_format, 4); 12871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } 12971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák 13071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák /* Get swizzle. */ 13171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák for (i = 0; i < 4; i++) { 13271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák switch (swizzle[i]) { 133fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák case PIPE_SWIZZLE_Y: 13471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= swizzle_bit[1] << swizzle_shift[i]; 13571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 136fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák case PIPE_SWIZZLE_Z: 13771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= swizzle_bit[2] << swizzle_shift[i]; 13871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 139fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák case PIPE_SWIZZLE_W: 14071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= swizzle_bit[3] << swizzle_shift[i]; 14171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 142fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák case PIPE_SWIZZLE_0: 14371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= R300_TX_FORMAT_ZERO << swizzle_shift[i]; 14471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 145fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák case PIPE_SWIZZLE_1: 14671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= R300_TX_FORMAT_ONE << swizzle_shift[i]; 14771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák break; 148fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák default: /* PIPE_SWIZZLE_X */ 14971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák result |= swizzle_bit[0] << swizzle_shift[i]; 15071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } 15171584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák } 15271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák return result; 15371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák} 15471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák 1555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák/* Translate a pipe_format into a useful texture format for sampling. 1565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 1575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Some special formats are translated directly using R300_EASY_TX_FORMAT, 1585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * but the majority of them is translated in a generic way, automatically 1595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * supporting all the formats hw can support. 1605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 1615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT swizzles the texture. 1625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * Note the signature of R300_EASY_TX_FORMAT: 1635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * R300_EASY_TX_FORMAT(B, G, R, A, FORMAT); 1645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * 1655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * The FORMAT specifies how the texture sampler will treat the texture, and 1665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák * makes available X, Y, Z, W, ZERO, and ONE for swizzling. */ 1671c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r300_translate_texformat(enum pipe_format format, 1686f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák const unsigned char *swizzle_view, 1696478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák boolean is_r500, 1706478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák boolean dxtc_swizzle) 1715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{ 1725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák uint32_t result = 0; 1735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák const struct util_format_description *desc; 17439e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák unsigned i; 1755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák boolean uniform = TRUE; 1765c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák const uint32_t sign_bit[4] = { 1775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák R300_TX_FORMAT_SIGNED_W, 1782e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák R300_TX_FORMAT_SIGNED_Z, 1792e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák R300_TX_FORMAT_SIGNED_Y, 1802e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák R300_TX_FORMAT_SIGNED_X, 1815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák }; 1825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 183172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák format = r300_unbyteswap_array_format(format); 1845c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc = util_format_description(format); 1855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 1865c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Colorspace (return non-RGB formats directly). */ 1875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (desc->colorspace) { 18871584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák /* Depth stencil formats. 18971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák * Swizzles are added in r300_merge_textures_and_samplers. */ 1905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_ZS: 1915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 1925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_Z16_UNORM: 19371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák return R300_TX_FORMAT_X16; 194b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8Z24_UNORM: 195866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_S8_UINT_Z24_UNORM: 1966f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák if (is_r500) 1976f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák return R500_TX_FORMAT_Y8X24; 1986f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák else 1996f2936c654c68388b9c43a189a1b8c06f3a9d241Marek Olšák return R300_TX_FORMAT_Y16X16; 2005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 2015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported. */ 2025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* YUV formats. */ 2055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_YUV: 2065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_YUV_TO_RGB; 2075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 209b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_UYVY: 2105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result; 211b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_YUYV: 2125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result; 2135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 2145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 2155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2165c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Add gamma correction. */ 2185c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_COLORSPACE_SRGB: 2195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák result |= R300_TX_FORMAT_GAMMA; 2205c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák break; 2215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 222e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák default: 223e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák switch (format) { 224e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák /* Same as YUV but without the YUR->RGB conversion. */ 225e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák case PIPE_FORMAT_R8G8_B8G8_UNORM: 226e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result; 227e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák case PIPE_FORMAT_G8R8_G8B8_UNORM: 228e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result; 229e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák default:; 230e1208bbeaeefd12a445cef84cbd12b7dc346531fMarek Olšák } 2315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 233b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák /* Add swizzling. */ 234b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák /* The RGTC1_SNORM and LATC1_SNORM swizzle is done in the shader. */ 23574a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák if (util_format_is_compressed(format) && 23674a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák dxtc_swizzle && 23774a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák format != PIPE_FORMAT_RGTC2_UNORM && 23874a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák format != PIPE_FORMAT_RGTC2_SNORM && 23974a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák format != PIPE_FORMAT_LATC2_UNORM && 24074a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák format != PIPE_FORMAT_LATC2_SNORM && 24174a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák format != PIPE_FORMAT_RGTC1_UNORM && 24274a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák format != PIPE_FORMAT_RGTC1_SNORM && 24374a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák format != PIPE_FORMAT_LATC1_UNORM && 244b3011ea60cc36a888da031ebac932d67473f4521Marek Olšák format != PIPE_FORMAT_LATC1_SNORM) { 24574a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view, 24674a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák TRUE); 24774a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák } else { 24874a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view, 24974a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák FALSE); 2507a61957424a457f416d20c2b366232fb4bbc7761Marek Olšák } 2515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2523252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák /* S3TC formats. */ 25328cf5e1191077e063fe2a81d9d35934b71d001e2José Fonseca if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) { 25488512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák if (!util_format_s3tc_enabled) { 25588512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák return ~0; /* Unsupported. */ 25688512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák } 25788512e837e45b72c33a7d28ccf02f00580a4cf10Marek Olšák 2585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák switch (format) { 2595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_RGB: 2605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_RGBA: 2615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_SRGB: 2625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT1_SRGBA: 2635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT1 | result; 2645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT3_RGBA: 2655c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT3_SRGBA: 2665c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT3 | result; 2675c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT5_RGBA: 2685c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case PIPE_FORMAT_DXT5_SRGBA: 2695c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_DXT5 | result; 2705c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák default: 2715c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 2725c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2735c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 2745c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 2753252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák /* RGTC formats. */ 2763252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) { 2773252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák switch (format) { 2783252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_SNORM: 2795ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák case PIPE_FORMAT_LATC1_SNORM: 28074a757f92f7377f59c0feb7f84c7518f9a167631Marek Olšák result |= sign_bit[0]; 2815ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák case PIPE_FORMAT_LATC1_UNORM: 28279ad6f5375253faff89bbc7eb6dc5949ba63e0efDave Airlie case PIPE_FORMAT_RGTC1_UNORM: 2833252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R500_TX_FORMAT_ATI1N | result; 2845ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák 2853252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC2_SNORM: 2865ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák case PIPE_FORMAT_LATC2_SNORM: 2872e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák result |= sign_bit[1] | sign_bit[0]; 28879ad6f5375253faff89bbc7eb6dc5949ba63e0efDave Airlie case PIPE_FORMAT_RGTC2_UNORM: 2895ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák case PIPE_FORMAT_LATC2_UNORM: 2903252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R400_TX_FORMAT_ATI2N | result; 2915ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák 2923252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák default: 2933252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return ~0; /* Unsupported/unknown. */ 2943252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 2953252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 2963252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák 29766d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák /* This is truly a special format. 29866d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák * It stores R8G8 and B is computed using sqrt(1 - R^2 - G^2) 29966d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák * in the sampler unit. Also known as D3DFMT_CxV8U8. */ 30066d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák if (format == PIPE_FORMAT_R8G8Bx_SNORM) { 30166d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák return R300_TX_FORMAT_CxV8U8 | result; 30266d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák } 30366d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák 3044298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák /* Integer and fixed-point 16.16 textures are not supported. */ 3054298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák for (i = 0; i < 4; i++) { 3064298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_FIXED || 3074298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák ((desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED || 3084298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) && 3094298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák (!desc->channel[i].normalized || 3104298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák desc->channel[i].pure_integer))) { 3114298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák return ~0; /* Unsupported/unknown. */ 3124298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák } 3134298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák } 3144298c88f656c191f3daca0c341850dd8c23f5f92Marek Olšák 31566d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák /* Add sign. */ 31666d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák for (i = 0; i < desc->nr_channels; i++) { 31766d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 31866d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák result |= sign_bit[i]; 31966d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák } 32066d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák } 32166d5de74c44b92e481a9f6792e10bf4e3f688dfcMarek Olšák 3225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* See whether the components are of the same size. */ 32339e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák for (i = 1; i < desc->nr_channels; i++) { 3245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák uniform = uniform && desc->channel[0].size == desc->channel[i].size; 3255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* Non-uniform formats. */ 3285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (!uniform) { 32939e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 3305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 3: 3315c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 3325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 6 && 3335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 5) { 3345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Z5Y6X5 | result; 3355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 3375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 5 && 3385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 6) { 3395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Z6Y5X5 | result; 3405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 341c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák if (desc->channel[0].size == 2 && 342c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák desc->channel[1].size == 3 && 343c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák desc->channel[2].size == 3) { 344c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák return R300_TX_FORMAT_Z3Y3X2 | result; 345c420c0e7d6c4b8fac90fd6a64a49652ac58535fdMarek Olšák } 3465c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 3475c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3485c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 3495c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 5 && 3505c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 5 && 3515c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 5 && 3525c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[3].size == 1) { 3535c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W1Z5Y5X5 | result; 3545c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3555c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák if (desc->channel[0].size == 10 && 3565c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[1].size == 10 && 3575c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[2].size == 10 && 3585c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->channel[3].size == 2) { 3595c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W2Z10Y10X10 | result; 3605c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3615c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3625c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 3635c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3645c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 36594e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák /* Find the first non-VOID channel. */ 36694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák for (i = 0; i < 4; i++) { 36794e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 36894e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák break; 36994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák } 37094e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák } 37194e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák 37294e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák if (i == 4) 37394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák return ~0; /* Unsupported/unknown. */ 37494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák 3755c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák /* And finally, uniform formats. */ 37694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák switch (desc->channel[i].type) { 3775c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_UNSIGNED: 3785c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_SIGNED: 37994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák if (!desc->channel[i].normalized && 3805c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) { 3815c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 3825c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3835c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 38494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák switch (desc->channel[i].size) { 3855c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 38639e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 3875c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 3885c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y4X4 | result; 3895c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 3905c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W4Z4Y4X4 | result; 3915c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 3925c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 3935c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 3945c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 8: 39539e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 3965c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 3975c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_X8 | result; 3985c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 3995c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y8X8 | result; 4005c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 4015c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W8Z8Y8X8 | result; 4025c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 4035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 4045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 4055c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 16: 40639e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 4075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 4085c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_X16 | result; 4095c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 4105c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_Y16X16 | result; 4115c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 4125c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_W16Z16Y16X16 | result; 4135c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 4145c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 4155c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 4165c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 4175c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case UTIL_FORMAT_TYPE_FLOAT: 41894e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák switch (desc->channel[i].size) { 4195c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 16: 42039e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 4215c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 4225c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F | result; 4235c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 4245c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F_16F | result; 4255c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 4265c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_16F_16F_16F_16F | result; 4275c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 4285c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; 4295c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 4305c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 32: 43139e116e3a0dce1a13dbb4395585cd3873e5ed073Marek Olšák switch (desc->nr_channels) { 4325c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 1: 4335c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F | result; 4345c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 2: 4355c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F_32F | result; 4365c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák case 4: 4375c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return R300_TX_FORMAT_32F_32F_32F_32F | result; 4385c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 4395c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 4405c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák } 4415c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 4425c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák return ~0; /* Unsupported/unknown. */ 4435c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák} 4445c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 4451c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákuint32_t r500_tx_format_msb_bit(enum pipe_format format) 4463252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák{ 4473252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák switch (format) { 4483252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_UNORM: 4493252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák case PIPE_FORMAT_RGTC1_SNORM: 4505ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák case PIPE_FORMAT_LATC1_UNORM: 4515ef807c0361ed73d598619918b1e16aab0de3044Marek Olšák case PIPE_FORMAT_LATC1_SNORM: 452b4483823d9c1205fb9ab8cf5b4c36ee610347a36Marek Olšák case PIPE_FORMAT_X8Z24_UNORM: 453866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_S8_UINT_Z24_UNORM: 4543252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return R500_TXFORMAT_MSB; 4553252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák default: 4563252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák return 0; 4573252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák } 4583252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák} 4593252651fb291d7e6e4af5fed8ab461f603574cd6Marek Olšák 4603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Buffer formats. */ 4613c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Colorbuffer formats. This is the unswizzled format of the RB3D block's 4633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * output. For the swizzling of the targets, check the shader's format. */ 4643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_colorformat(enum pipe_format format) 4653c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 466172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák format = r300_unbyteswap_array_format(format); 467172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák 4683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 4693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 8-bit buffers. */ 4703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_A8_UNORM: 4712e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák case PIPE_FORMAT_A8_SNORM: 4723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_I8_UNORM: 4732e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák case PIPE_FORMAT_I8_SNORM: 4743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_L8_UNORM: 4752e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák case PIPE_FORMAT_L8_SNORM: 4763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_UNORM: 4773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_SNORM: 4783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_I8; 4793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 4803c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 16-bit buffers. */ 4818f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák case PIPE_FORMAT_L8A8_UNORM: 4822e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák case PIPE_FORMAT_L8A8_SNORM: 483e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák case PIPE_FORMAT_R8G8_UNORM: 484e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák case PIPE_FORMAT_R8G8_SNORM: 485ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R8A8_UNORM: 486ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R8A8_SNORM: 4870420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák /* These formats work fine with UV88 if US_OUT_FMT is set correctly. */ 4880420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_A16_UNORM: 4890420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_A16_SNORM: 490faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_A16_FLOAT: 4910420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_L16_UNORM: 4920420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_L16_SNORM: 493faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_L16_FLOAT: 4940420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_I16_UNORM: 4950420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_I16_SNORM: 496faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_I16_FLOAT: 4970420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R16_UNORM: 4980420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R16_SNORM: 4990420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R16_FLOAT: 500e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák return R300_COLOR_FORMAT_UV88; 501e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák 502b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G6R5_UNORM: 5033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_RGB565; 50426a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák 505b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G5R5A1_UNORM: 506f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_B5G5R5X1_UNORM: 5073c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB1555; 50826a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák 509b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B4G4R4A4_UNORM: 51026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B4G4R4X4_UNORM: 5113c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB4444; 5123c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5133c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 32-bit buffers. */ 5143c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_B8G8R8A8_UNORM: 51591eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/ 5163c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_B8G8R8X8_UNORM: 51791eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/ 51891eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák case PIPE_FORMAT_R8G8B8A8_UNORM: 5193c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8G8B8A8_SNORM: 52026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R8G8B8X8_UNORM: 52127e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R8G8B8X8_SNORM: 5220420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák /* These formats work fine with ARGB8888 if US_OUT_FMT is set 5230420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák * correctly. */ 5240420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R16G16_UNORM: 5250420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R16G16_SNORM: 5260420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R16G16_FLOAT: 5270420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_L16A16_UNORM: 5280420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_L16A16_SNORM: 529faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_L16A16_FLOAT: 530ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R16A16_UNORM: 531ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R16A16_SNORM: 532ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R16A16_FLOAT: 5330420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_A32_FLOAT: 5340420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_L32_FLOAT: 535faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_I32_FLOAT: 5360420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R32_FLOAT: 5373c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB8888; 53826a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák 539b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R10G10B10A2_UNORM: 54026a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10G10B10X2_SNORM: 54126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B10G10R10A2_UNORM: 54227e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_B10G10R10X2_UNORM: 5433c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R500_COLOR_FORMAT_ARGB2101010; /* R5xx-only? */ 5443c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5453c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 64-bit buffers. */ 5463c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_UNORM: 5473c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_SNORM: 5482ab737557258148d52d9b9e983e4b18560b7a460Marek Olšák case PIPE_FORMAT_R16G16B16A16_FLOAT: 54927e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R16G16B16X16_UNORM: 55027e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R16G16B16X16_SNORM: 55127e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R16G16B16X16_FLOAT: 5520420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák /* These formats work fine with ARGB16161616 if US_OUT_FMT is set 5530420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák * correctly. */ 5540420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R32G32_FLOAT: 555faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_L32A32_FLOAT: 556ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R32A32_FLOAT: 5573c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB16161616; 5583c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5593c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 128-bit buffers. */ 5603c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R32G32B32A32_FLOAT: 56127e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R32G32B32X32_FLOAT: 5623c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_ARGB32323232; 5633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5643c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* YUV buffers. */ 565b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_UYVY: 5663c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_YVYU; 567b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_YUYV: 5683c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_COLOR_FORMAT_VYUY; 5693c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 5703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 5713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 5723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5733c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Depthbuffer and stencilbuffer. Thankfully, we only support two flavors. */ 5753c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_zsformat(enum pipe_format format) 5763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 5773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 5783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 16-bit depth, no stencil */ 5793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_Z16_UNORM: 5803c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_DEPTHFORMAT_16BIT_INT_Z; 5813c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 24-bit depth, ignored stencil */ 582b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_X8Z24_UNORM: 5833c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* 24-bit depth, 8-bit stencil */ 584866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_S8_UINT_Z24_UNORM: 5853c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL; 5863c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 5873c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 5883c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 5893c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 5903c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 5913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák/* Shader output formats. This is essentially the swizzle from the shader 5923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * to the RB3D block. 5933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * 5943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * Note that formats are stored from C3 to C0. */ 5953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákstatic uint32_t r300_translate_out_fmt(enum pipe_format format) 5963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 5973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák uint32_t modifier = 0; 5983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák unsigned i; 5993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák const struct util_format_description *desc; 6000420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák boolean uniform_sign; 6013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 602172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák format = r300_unbyteswap_array_format(format); 6033c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák desc = util_format_description(format); 6043c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 60594e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák /* Find the first non-VOID channel. */ 60694e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák for (i = 0; i < 4; i++) { 60794e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 60894e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák break; 60994e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák } 61094e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák } 61194e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák 61294e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák if (i == 4) 61394e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák return ~0; /* Unsupported/unknown. */ 61494e9ab975cb4187a63eeb4cd03694ebd3cb27bd8Marek Olšák 6153c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Specifies how the shader output is written to the fog unit. */ 6160420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák switch (desc->channel[i].type) { 6170420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case UTIL_FORMAT_TYPE_FLOAT: 6180420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák switch (desc->channel[i].size) { 6190420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 32: 6200420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák switch (desc->nr_channels) { 6210420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 1: 6220420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák modifier |= R300_US_OUT_FMT_C_32_FP; 6230420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6240420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 2: 6250420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák modifier |= R300_US_OUT_FMT_C2_32_FP; 6260420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6270420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 4: 6280420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák modifier |= R300_US_OUT_FMT_C4_32_FP; 6290420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6300420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák } 6310420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6320420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák 6330420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 16: 6340420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák switch (desc->nr_channels) { 6350420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 1: 6360420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák modifier |= R300_US_OUT_FMT_C_16_FP; 6370420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6380420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 2: 6390420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák modifier |= R300_US_OUT_FMT_C2_16_FP; 6400420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6410420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 4: 6420420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák modifier |= R300_US_OUT_FMT_C4_16_FP; 6430420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6440420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák } 6450420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6463c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 6470420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6480420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák 6490420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák default: 6500420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák switch (desc->channel[i].size) { 6510420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 16: 6520420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák switch (desc->nr_channels) { 6530420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 1: 6540420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák modifier |= R300_US_OUT_FMT_C_16; 6550420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6560420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 2: 6570420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák modifier |= R300_US_OUT_FMT_C2_16; 6580420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6590420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 4: 6600420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák modifier |= R300_US_OUT_FMT_C4_16; 6610420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6620420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák } 6630420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6640420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák 6650420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case 10: 666cb4f367b268b6fbedc6673b2c6e51d107e929370Marek Olšák modifier |= R300_US_OUT_FMT_C4_10; 6670420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6680420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák 6690420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák default: 6703c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* C4_8 seems to be used for the formats whose pixel size 6713c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák * is <= 32 bits. */ 6723c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák modifier |= R300_US_OUT_FMT_C4_8; 6730420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák break; 6743c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 6753c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 6763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 6773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Add sign. */ 6780420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák uniform_sign = TRUE; 6790420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák for (i = 0; i < desc->nr_channels; i++) 6800420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák if (desc->channel[i].type != UTIL_FORMAT_TYPE_SIGNED) 6810420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák uniform_sign = FALSE; 6820420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák 6830420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák if (uniform_sign) 6840420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák modifier |= R300_OUT_SIGN(0xf); 6853c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 6863c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Add swizzles and return. */ 6873c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák switch (format) { 6880420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák /*** Special cases (non-standard channel mapping) ***/ 6890420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák 6900420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák /* X8 6910420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák * COLORFORMAT_I8 stores the Z component (C2). */ 6923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_A8_UNORM: 6932e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák case PIPE_FORMAT_A8_SNORM: 6943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | R300_C2_SEL_A; 6953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_I8_UNORM: 6962e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák case PIPE_FORMAT_I8_SNORM: 6973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_L8_UNORM: 6982e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák case PIPE_FORMAT_L8_SNORM: 6993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_UNORM: 7003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R8_SNORM: 7013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | R300_C2_SEL_R; 7023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 7030420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák /* X8Y8 7040420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák * COLORFORMAT_UV88 stores ZX (C2 and C0). */ 7052e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák case PIPE_FORMAT_L8A8_SNORM: 7068f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák case PIPE_FORMAT_L8A8_UNORM: 707ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R8A8_SNORM: 708ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R8A8_UNORM: 7098f7177e0de06877ae717250ccaa3ac292340b7beMarek Olšák return modifier | R300_C0_SEL_A | R300_C2_SEL_R; 710e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák case PIPE_FORMAT_R8G8_SNORM: 7112e6a69939c26ab8cc27bcab29ed64cec5e9428eeMarek Olšák case PIPE_FORMAT_R8G8_UNORM: 712e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák return modifier | R300_C0_SEL_G | R300_C2_SEL_R; 713e75bce026c33ba670fd3146076fc2a2cf00f4371Marek Olšák 7140420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák /* X32Y32 7150420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák * ARGB16161616 stores XZ for RG32F */ 7160420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R32G32_FLOAT: 7170420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák return modifier | R300_C0_SEL_R | R300_C2_SEL_G; 7180420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák 7190420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák /*** Generic cases (standard channel mapping) ***/ 7200420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák 721f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* BGRA outputs. */ 722b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G6R5_UNORM: 723b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B5G5R5A1_UNORM: 724f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_B5G5R5X1_UNORM: 725b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B4G4R4A4_UNORM: 72626a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B4G4R4X4_UNORM: 727b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B8G8R8A8_UNORM: 72891eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/ 729b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_B8G8R8X8_UNORM: 73091eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/ 73126a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_B10G10R10A2_UNORM: 73227e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_B10G10R10X2_UNORM: 7333c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 7343c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_B | R300_C1_SEL_G | 7353c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_R | R300_C3_SEL_A; 7363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 737f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* ARGB outputs. */ 7380420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_A16_UNORM: 7390420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_A16_SNORM: 740faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_A16_FLOAT: 741faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_A32_FLOAT: 7423c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 7433c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_A | R300_C1_SEL_R | 7443c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_G | R300_C3_SEL_B; 7453c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 746f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák /* RGBA outputs. */ 74726a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R8G8B8X8_UNORM: 74827e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R8G8B8X8_SNORM: 74991eba2567eab9409d94efc3c1f07a4a3731d0047Marek Olšák case PIPE_FORMAT_R8G8B8A8_UNORM: 750f6e987ce7839d66edb88403d2c9ac1b28db2832bMarek Olšák case PIPE_FORMAT_R8G8B8A8_SNORM: 751b5cfa6f1966557106a7033b2c80769d64c72ce4cJosé Fonseca case PIPE_FORMAT_R10G10B10A2_UNORM: 75226a54ed6fddd42d8dba3d0c18d9d23ea63c62807Marek Olšák case PIPE_FORMAT_R10G10B10X2_SNORM: 7530420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R16_UNORM: 7540420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R16G16_UNORM: 7553c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_UNORM: 7560420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R16_SNORM: 7570420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R16G16_SNORM: 7583c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R16G16B16A16_SNORM: 7590420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R16_FLOAT: 7600420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R16G16_FLOAT: 7612ba0c64c26d3ec9b2806f577020d4fde826a858dMarek Olšák case PIPE_FORMAT_R16G16B16A16_FLOAT: 7620420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_R32_FLOAT: 7633c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák case PIPE_FORMAT_R32G32B32A32_FLOAT: 76427e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R32G32B32X32_FLOAT: 7650420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_L16_UNORM: 7660420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_L16_SNORM: 767faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_L16_FLOAT: 768faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_L32_FLOAT: 7690420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_I16_UNORM: 7700420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_I16_SNORM: 771faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_I16_FLOAT: 772faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_I32_FLOAT: 77327e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R16G16B16X16_UNORM: 77427e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R16G16B16X16_SNORM: 77527e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R16G16B16X16_FLOAT: 7763c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return modifier | 7773c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C0_SEL_R | R300_C1_SEL_G | 7783c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák R300_C2_SEL_B | R300_C3_SEL_A; 7793c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 7800420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák /* LA outputs. */ 7810420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_L16A16_UNORM: 7820420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák case PIPE_FORMAT_L16A16_SNORM: 783faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_L16A16_FLOAT: 784ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R16A16_UNORM: 785ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R16A16_SNORM: 786ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R16A16_FLOAT: 787faba01d171a85399332e2ece8f66ba40495eda90Marek Olšák case PIPE_FORMAT_L32A32_FLOAT: 788ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R32A32_FLOAT: 7890420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák return modifier | 7900420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák R300_C0_SEL_R | R300_C1_SEL_A; 7910420ae3d9069ff5cbe067bdd5c6075d9292dbe66Marek Olšák 7923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák default: 7933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return ~0; /* Unsupported. */ 7943c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 7953c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 7963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 7971e51d368eb5360378218217ff35731896f48512fMarek Olšákstatic uint32_t r300_translate_colormask_swizzle(enum pipe_format format) 7981e51d368eb5360378218217ff35731896f48512fMarek Olšák{ 799172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák format = r300_unbyteswap_array_format(format); 800172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák 8011e51d368eb5360378218217ff35731896f48512fMarek Olšák switch (format) { 8021e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_A8_UNORM: 8031e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_A8_SNORM: 8041e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_A16_UNORM: 8051e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_A16_SNORM: 8061e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_A16_FLOAT: 8071e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_A32_FLOAT: 8081e51d368eb5360378218217ff35731896f48512fMarek Olšák return COLORMASK_AAAA; 8091e51d368eb5360378218217ff35731896f48512fMarek Olšák 8101e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_I8_UNORM: 8111e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_I8_SNORM: 8121e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_L8_UNORM: 8131e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_L8_SNORM: 8141e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R8_UNORM: 8151e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R8_SNORM: 8161e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R32_FLOAT: 8171e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_L32_FLOAT: 8181e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_I32_FLOAT: 8191e51d368eb5360378218217ff35731896f48512fMarek Olšák return COLORMASK_RRRR; 8201e51d368eb5360378218217ff35731896f48512fMarek Olšák 8211e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_L8A8_SNORM: 8221e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_L8A8_UNORM: 823ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R8A8_UNORM: 824ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R8A8_SNORM: 8251e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_L16A16_UNORM: 8261e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_L16A16_SNORM: 8271e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_L16A16_FLOAT: 828ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R16A16_UNORM: 829ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R16A16_SNORM: 830ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R16A16_FLOAT: 8311e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_L32A32_FLOAT: 832ec5376f5d8b588bc3c147189059178f47aed3503Marek Olšák case PIPE_FORMAT_R32A32_FLOAT: 8331e51d368eb5360378218217ff35731896f48512fMarek Olšák return COLORMASK_ARRA; 8341e51d368eb5360378218217ff35731896f48512fMarek Olšák 8351e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R8G8_SNORM: 8361e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R8G8_UNORM: 8371e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R16G16_UNORM: 8381e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R16G16_SNORM: 8391e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R16G16_FLOAT: 8401e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R32G32_FLOAT: 8411e51d368eb5360378218217ff35731896f48512fMarek Olšák return COLORMASK_GRRG; 8421e51d368eb5360378218217ff35731896f48512fMarek Olšák 843499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák case PIPE_FORMAT_B5G5R5X1_UNORM: 844499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák case PIPE_FORMAT_B4G4R4X4_UNORM: 845499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák case PIPE_FORMAT_B8G8R8X8_UNORM: 846499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/ 84727e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_B10G10R10X2_UNORM: 848499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák return COLORMASK_BGRX; 849499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák 8501e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_B5G6R5_UNORM: 8511e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_B5G5R5A1_UNORM: 8521e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_B4G4R4A4_UNORM: 8531e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_B8G8R8A8_UNORM: 8541e51d368eb5360378218217ff35731896f48512fMarek Olšák /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/ 8551e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_B10G10R10A2_UNORM: 8561e51d368eb5360378218217ff35731896f48512fMarek Olšák return COLORMASK_BGRA; 8571e51d368eb5360378218217ff35731896f48512fMarek Olšák 8581e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R8G8B8X8_UNORM: 85927e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák /* RGBX_SNORM formats are broken for an unknown reason */ 8601e51d368eb5360378218217ff35731896f48512fMarek Olšák /*case PIPE_FORMAT_R8G8B8X8_SNORM:*/ 86127e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák /*case PIPE_FORMAT_R10G10B10X2_SNORM:*/ 86227e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R16G16B16X16_UNORM: 86327e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák /*case PIPE_FORMAT_R16G16B16X16_SNORM:*/ 86427e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R16G16B16X16_FLOAT: 86527e216a07501f4d2ade1e1ec8b9a1f709304013bMarek Olšák case PIPE_FORMAT_R32G32B32X32_FLOAT: 866499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák return COLORMASK_RGBX; 867499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák 8681e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R8G8B8A8_UNORM: 8691e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R8G8B8A8_SNORM: 8701e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R10G10B10A2_UNORM: 8711e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R16_UNORM: 8721e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R16G16B16A16_UNORM: 8731e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R16_SNORM: 8741e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R16G16B16A16_SNORM: 8751e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R16_FLOAT: 8761e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R16G16B16A16_FLOAT: 8771e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_R32G32B32A32_FLOAT: 8781e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_L16_UNORM: 8791e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_L16_SNORM: 8801e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_L16_FLOAT: 8811e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_I16_UNORM: 8821e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_I16_SNORM: 8831e51d368eb5360378218217ff35731896f48512fMarek Olšák case PIPE_FORMAT_I16_FLOAT: 8841e51d368eb5360378218217ff35731896f48512fMarek Olšák return COLORMASK_RGBA; 8851e51d368eb5360378218217ff35731896f48512fMarek Olšák 8861e51d368eb5360378218217ff35731896f48512fMarek Olšák default: 8871e51d368eb5360378218217ff35731896f48512fMarek Olšák return ~0; /* Unsupported. */ 8881e51d368eb5360378218217ff35731896f48512fMarek Olšák } 8891e51d368eb5360378218217ff35731896f48512fMarek Olšák} 8901e51d368eb5360378218217ff35731896f48512fMarek Olšák 8913c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_colorbuffer_format_supported(enum pipe_format format) 8923c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 8933c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return r300_translate_colorformat(format) != ~0 && 8941e51d368eb5360378218217ff35731896f48512fMarek Olšák r300_translate_out_fmt(format) != ~0 && 8951e51d368eb5360378218217ff35731896f48512fMarek Olšák r300_translate_colormask_swizzle(format) != ~0; 8963c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 8973c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 8983c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšákboolean r300_is_zs_format_supported(enum pipe_format format) 8993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák{ 9003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák return r300_translate_zsformat(format) != ~0; 9013c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák} 9023c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 9035c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšákboolean r300_is_sampler_format_supported(enum pipe_format format) 9045c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák{ 9056478a4de14d368bf85ba3477d73fd1bd91067e86Marek Olšák return r300_translate_texformat(format, 0, TRUE, FALSE) != ~0; 9065c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák} 9075c14fd1743701776d128c2c1d25244f4de371ebeMarek Olšák 908c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšákvoid r300_texture_setup_format_state(struct r300_screen *screen, 90956ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *tex, 910ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák enum pipe_format format, 911c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák unsigned level, 912ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák unsigned width0_override, 913ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák unsigned height0_override, 914c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák struct r300_texture_format_state *out) 9159d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson{ 916a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák struct pipe_resource *pt = &tex->b.b; 91756ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_texture_desc *desc = &tex->tex; 918b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák boolean is_r500 = screen->caps.is_r500; 91910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák unsigned width, height, depth; 92010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák unsigned txwidth, txheight, txdepth; 92110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák 922ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák width = u_minify(width0_override, level); 923ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák height = u_minify(height0_override, level); 92410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák depth = u_minify(desc->depth0, level); 92510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák 92610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák txwidth = (width - 1) & 0x7ff; 92710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák txheight = (height - 1) & 0x7ff; 92810ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák txdepth = util_logbase2(depth) & 0xf; 9299d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 930c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák /* Mask out all the fields we change. */ 931c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák out->format0 = 0; 932c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák out->format1 &= ~R300_TX_FORMAT_TEX_COORD_TYPE_MASK; 933c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák out->format2 &= R500_TXFORMAT_MSB; 934c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák out->tile_config = 0; 935c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák 9363c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Set sampler state. */ 93713359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák out->format0 = 93810ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák R300_TX_WIDTH(txwidth) | 93910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák R300_TX_HEIGHT(txheight) | 94010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák R300_TX_DEPTH(txdepth); 941827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák 942c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák if (desc->uses_stride_addressing) { 943ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák unsigned stride = 944ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák r300_stride_to_width(format, desc->stride_in_bytes[level]); 945827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* rectangles love this */ 946c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák out->format0 |= R300_TX_PITCH_EN; 947ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák out->format2 = (stride - 1) & 0x1fff; 948827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 9499d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 950eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie if (pt->target == PIPE_TEXTURE_CUBE) { 951c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák out->format1 |= R300_TX_FORMAT_CUBIC_MAP; 952eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie } 953eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie if (pt->target == PIPE_TEXTURE_3D) { 954c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák out->format1 |= R300_TX_FORMAT_3D; 955eb5dd947fbed35478784e777fe2e59564fee051bDave Airlie } 9569d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 957827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák /* large textures on r500 */ 958827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák if (is_r500) 959827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák { 96010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák unsigned us_width = txwidth; 96110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák unsigned us_height = txheight; 96210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák unsigned us_depth = txdepth; 96310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák 96410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák if (width > 2048) { 965c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák out->format2 |= R500_TXWIDTH_BIT11; 966827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 96710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák if (height > 2048) { 968c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák out->format2 |= R500_TXHEIGHT_BIT11; 969827002f5ff990f8676385583275d6b8090abfb7aMarek Olšák } 97010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák 97110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák /* The US_FORMAT register fixes an R500 TX addressing bug. 97210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák * Don't ask why it must be set like this. I don't know it either. */ 97310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák if (width > 2048) { 97410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák us_width = (0x000007FF + us_width) >> 1; 97510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák us_depth |= 0x0000000D; 97610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák } 97710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák if (height > 2048) { 97810ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák us_height = (0x000007FF + us_height) >> 1; 97910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák us_depth |= 0x0000000E; 98010ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák } 98110ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák 98210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák out->us_format0 = 98310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák R300_TX_WIDTH(us_width) | 98410ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák R300_TX_HEIGHT(us_height) | 98510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák R300_TX_DEPTH(us_depth); 9861aa38b2c2d80b67fe2eefe468f90aeb44bc20259Corbin Simpson } 9872cbd5ecfb666a757c4abef85dbe40fb53d647ec9Corbin Simpson 988c5b8ba9368fe935af9f350874f3c03f5a230d4b5Marek Olšák out->tile_config = R300_TXO_MACRO_TILE(desc->macrotile[level]) | 989172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák R300_TXO_MICRO_TILE(desc->microtile) | 990172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák R300_TXO_ENDIAN(r300_get_endian_swap(format)); 9911c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák} 9921c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák 993fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšákstatic void r300_texture_setup_fb_state(struct r300_surface *surf) 9941c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák{ 99556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource *tex = r300_resource(surf->base.texture); 996fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák unsigned level = surf->base.u.tex.level; 997ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák unsigned stride = 998ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák r300_stride_to_width(surf->base.format, tex->tex.stride_in_bytes[level]); 9993c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák 10003c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák /* Set framebuffer state. */ 1001fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák if (util_format_is_depth_or_stencil(surf->base.format)) { 1002fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák surf->pitch = 1003ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák stride | 100456ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák R300_DEPTHMACROTILE(tex->tex.macrotile[level]) | 1005172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák R300_DEPTHMICROTILE(tex->tex.microtile) | 1006172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák R300_DEPTHENDIAN(r300_get_endian_swap(surf->base.format)); 1007fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák surf->format = r300_translate_zsformat(surf->base.format); 1008d99ec708afbb785ce05031661222b38c9447059fMarek Olšák surf->pitch_zmask = tex->tex.zmask_stride_in_pixels[level]; 1009d99ec708afbb785ce05031661222b38c9447059fMarek Olšák surf->pitch_hiz = tex->tex.hiz_stride_in_pixels[level]; 10103c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } else { 10119953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák enum pipe_format format = util_format_linear(surf->base.format); 10129953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák 1013fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák surf->pitch = 1014ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák stride | 10159953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák r300_translate_colorformat(format) | 101656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák R300_COLOR_TILE(tex->tex.macrotile[level]) | 1017172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák R300_COLOR_MICROTILE(tex->tex.microtile) | 1018172bfdaa9e80342ade3f023f72d455d76713b866Marek Olšák R300_COLOR_ENDIAN(r300_get_endian_swap(format)); 10199953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák surf->format = r300_translate_out_fmt(format); 10201e51d368eb5360378218217ff35731896f48512fMarek Olšák surf->colormask_swizzle = 10219953586af2254f83a610d4cd284f52f37fa18b98Marek Olšák r300_translate_colormask_swizzle(format); 1022ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák surf->pitch_cmask = tex->tex.cmask_stride_in_pixels; 10233c244dac47195cce3fdcb05176e38d33b2cad8edMarek Olšák } 10243cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle} 10253cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle 1026287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic void r300_texture_destroy(struct pipe_screen *screen, 10274c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_resource* texture) 1028287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 1029ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák struct r300_screen *rscreen = r300_screen(screen); 103056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource* tex = (struct r300_resource*)texture; 1031287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 1032ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák if (tex->tex.cmask_dwords) { 1033ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák pipe_mutex_lock(rscreen->cmask_mutex); 1034ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák if (texture == rscreen->cmask_resource) { 1035ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák rscreen->cmask_resource = NULL; 1036ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák } 1037ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák pipe_mutex_unlock(rscreen->cmask_mutex); 1038ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák } 1039d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák pb_reference(&tex->buf, NULL); 1040287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell FREE(tex); 1041287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 1042287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 104356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšákboolean r300_resource_get_handle(struct pipe_screen* screen, 10449daaa6f5a66ab6cc99c6f0af37fc1007ab3d09afMarek Olšák struct pipe_context *ctx, 104556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct pipe_resource *texture, 104682db518f1519cec9e3842f23455a105e2006afbdMarek Olšák struct winsys_handle *whandle, 104782db518f1519cec9e3842f23455a105e2006afbdMarek Olšák unsigned usage) 1048287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 1049e05bc52b9ccbbf0ca7fa25196c5137b35d2c5c2eMarek Olšák struct radeon_winsys *rws = r300_screen(screen)->rws; 105056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource* tex = (struct r300_resource*)texture; 1051287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 1052287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (!tex) { 1053287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return FALSE; 1054287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell } 1055287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 105604bc082f6a8bfc3b3774bb102d3200317609432eChristian König return rws->buffer_get_handle(tex->buf, tex->tex.stride_in_bytes[0], 105784b961dd53a0509a6865d8417301838b34a40096Brian Paul 0, 0, whandle); 1058287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 1059287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 1060d17d03a8dccb4bad25211693320459420409d997Henri Verbeetstatic const struct u_resource_vtbl r300_texture_vtbl = 1061287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 106256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák NULL, /* get_handle */ 106356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák r300_texture_destroy, /* resource_destroy */ 106456ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák r300_texture_transfer_map, /* transfer_map */ 106556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák NULL, /* transfer_flush_region */ 106656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák r300_texture_transfer_unmap, /* transfer_unmap */ 1067287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}; 1068287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 1069d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák/* The common texture constructor. */ 107056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšákstatic struct r300_resource* 1071d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákr300_texture_create_object(struct r300_screen *rscreen, 1072d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák const struct pipe_resource *base, 1073d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák enum radeon_bo_layout microtile, 1074d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák enum radeon_bo_layout macrotile, 1075d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák unsigned stride_in_bytes_override, 1076d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák struct pb_buffer *buffer) 10774ce26210842176c4b280b7db85639ced40d4083dMarek Olšák{ 1078d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák struct radeon_winsys *rws = rscreen->rws; 1079e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák struct r300_resource *tex = NULL; 1080260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák struct radeon_bo_metadata tiling = {}; 1081e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák 1082e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák tex = CALLOC_STRUCT(r300_resource); 1083e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák if (!tex) { 1084e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák goto fail; 1085e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák } 10866cd9159cea628c542d2233b54f6babb74e45f83cMarek Olšák 1087a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák pipe_reference_init(&tex->b.b.reference, 1); 1088a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák tex->b.b.screen = &rscreen->screen; 1089a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák tex->b.b.usage = base->usage; 1090a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák tex->b.b.bind = base->bind; 1091a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák tex->b.b.flags = base->flags; 1092a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák tex->b.vtbl = &r300_texture_vtbl; 10937c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák tex->tex.microtile = microtile; 10947c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák tex->tex.macrotile[0] = macrotile; 10957c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák tex->tex.stride_in_bytes_override = stride_in_bytes_override; 109674a17a764dc2ad20d9d6f56afee963b23b597132Marek Olšák tex->domain = (base->flags & R300_RESOURCE_FLAG_TRANSFER || 109774a17a764dc2ad20d9d6f56afee963b23b597132Marek Olšák base->usage == PIPE_USAGE_STAGING) ? RADEON_DOMAIN_GTT : 1098a06f03d795153ce060d99aafb61d10c27a47efc1Marek Olšák base->nr_samples > 1 ? RADEON_DOMAIN_VRAM : 1099a06f03d795153ce060d99aafb61d10c27a47efc1Marek Olšák RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT; 11007b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák tex->buf = buffer; 11017c24a4c6a86402be1f68d23f4d52d4d071957801Marek Olšák 11022cd7e5b737e1384bb6d27f3cc2c8524b07230d56Marek Olšák r300_texture_desc_init(rscreen, tex, base); 1103d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák 11048ad9d42b338c6684930b7898734f9070b6368172Marek Olšák /* Figure out the ideal placement for the texture.. */ 11058ad9d42b338c6684930b7898734f9070b6368172Marek Olšák if (tex->domain & RADEON_DOMAIN_VRAM && 11068ad9d42b338c6684930b7898734f9070b6368172Marek Olšák tex->tex.size_in_bytes >= rscreen->info.vram_size) { 11078ad9d42b338c6684930b7898734f9070b6368172Marek Olšák tex->domain &= ~RADEON_DOMAIN_VRAM; 11088ad9d42b338c6684930b7898734f9070b6368172Marek Olšák tex->domain |= RADEON_DOMAIN_GTT; 11098ad9d42b338c6684930b7898734f9070b6368172Marek Olšák } 11108ad9d42b338c6684930b7898734f9070b6368172Marek Olšák if (tex->domain & RADEON_DOMAIN_GTT && 11118ad9d42b338c6684930b7898734f9070b6368172Marek Olšák tex->tex.size_in_bytes >= rscreen->info.gart_size) { 11128ad9d42b338c6684930b7898734f9070b6368172Marek Olšák tex->domain &= ~RADEON_DOMAIN_GTT; 11138ad9d42b338c6684930b7898734f9070b6368172Marek Olšák } 11148ad9d42b338c6684930b7898734f9070b6368172Marek Olšák /* Just fail if the texture is too large. */ 11158ad9d42b338c6684930b7898734f9070b6368172Marek Olšák if (!tex->domain) { 11168ad9d42b338c6684930b7898734f9070b6368172Marek Olšák goto fail; 11178ad9d42b338c6684930b7898734f9070b6368172Marek Olšák } 11188ad9d42b338c6684930b7898734f9070b6368172Marek Olšák 1119d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák /* Create the backing buffer if needed. */ 11207b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák if (!tex->buf) { 1121562c4a17b7e4fb56c7db679233b4a48f8b80b0f2Nicolai Hähnle tex->buf = rws->buffer_create(rws, tex->tex.size_in_bytes, 2048, 11226d89a4067627fdf568c6c4e3d9a201fd45d5352bNicolai Hähnle tex->domain, RADEON_FLAG_HANDLE); 1123d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák 1124ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák if (!tex->buf) { 1125e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák goto fail; 1126d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák } 1127d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák } 1128d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák 1129f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák if (SCREEN_DBG_ON(rscreen, DBG_MSAA) && base->nr_samples > 1) { 11302f89949b666889a61196657511b1dee4418ae865Marek Olšák fprintf(stderr, "r300: %ix MSAA %s buffer created\n", 1131f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák base->nr_samples, 1132f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák util_format_is_depth_or_stencil(base->format) ? "depth" : "color"); 1133f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák } 1134f8651dea4e4aa12a2a4aa287d45b7495f146af37Marek Olšák 1135260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák tiling.microtile = tex->tex.microtile; 1136260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák tiling.macrotile = tex->tex.macrotile[0]; 1137260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák tiling.stride = tex->tex.stride_in_bytes[0]; 1138bd1feb28273e8d7047304e5a2a02ca3d71de5533Marek Olšák rws->buffer_set_metadata(tex->buf, &tiling); 1139d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák 1140d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák return tex; 1141e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák 1142e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšákfail: 1143e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák FREE(tex); 1144e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák if (buffer) 1145e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák pb_reference(&buffer, NULL); 1146e694ea09f57cdce557a7424401e68b37e0e80fa7Marek Olšák return NULL; 11474ce26210842176c4b280b7db85639ced40d4083dMarek Olšák} 11484ce26210842176c4b280b7db85639ced40d4083dMarek Olšák 11490648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson/* Create a new texture. */ 1150d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákstruct pipe_resource *r300_texture_create(struct pipe_screen *screen, 1151d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák const struct pipe_resource *base) 11520648bc9f65f1c6700b442e57ac0e82404fb60c2dCorbin Simpson{ 1153d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák struct r300_screen *rscreen = r300_screen(screen); 1154d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák enum radeon_bo_layout microtile, macrotile; 11555cdedaaf295acae13ac10feeb3143d83bc53d314Marek Olšák 1156d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák if ((base->flags & R300_RESOURCE_FLAG_TRANSFER) || 1157e8f9195e5fb34a45783d6491d2e0305a0b137439Axel Davy (base->bind & (PIPE_BIND_SCANOUT | PIPE_BIND_LINEAR))) { 1158d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák microtile = RADEON_LAYOUT_LINEAR; 1159d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák macrotile = RADEON_LAYOUT_LINEAR; 1160d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák } else { 1161d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák /* This will make the texture_create_function select the layout. */ 1162d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák microtile = RADEON_LAYOUT_UNKNOWN; 1163d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák macrotile = RADEON_LAYOUT_UNKNOWN; 1164b37d63337596aabc543ea7ecfa82f0f9fdbade69Marek Olšák } 11659d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 1166d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák return (struct pipe_resource*) 1167d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák r300_texture_create_object(rscreen, base, microtile, macrotile, 11687b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák 0, NULL); 1169d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák} 1170d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák 1171d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákstruct pipe_resource *r300_texture_from_handle(struct pipe_screen *screen, 1172d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák const struct pipe_resource *base, 117382db518f1519cec9e3842f23455a105e2006afbdMarek Olšák struct winsys_handle *whandle, 117482db518f1519cec9e3842f23455a105e2006afbdMarek Olšák unsigned usage) 1175d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák{ 1176d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák struct r300_screen *rscreen = r300_screen(screen); 1177e05bc52b9ccbbf0ca7fa25196c5137b35d2c5c2eMarek Olšák struct radeon_winsys *rws = rscreen->rws; 1178d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák struct pb_buffer *buffer; 11797b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák unsigned stride; 1180260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák struct radeon_bo_metadata tiling = {}; 1181d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák 1182d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák /* Support only 2D textures without mipmaps */ 1183ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri if ((base->target != PIPE_TEXTURE_2D && 1184ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri base->target != PIPE_TEXTURE_RECT) || 1185d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák base->depth0 != 1 || 1186d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák base->last_level != 0) { 1187d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák return NULL; 11884ce26210842176c4b280b7db85639ced40d4083dMarek Olšák } 11890bcb4f10016fb611b2946307d880f4dc1dd05eaeMarek Olšák 119004bc082f6a8bfc3b3774bb102d3200317609432eChristian König buffer = rws->buffer_from_handle(rws, whandle, &stride, NULL); 1191d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák if (!buffer) 1192d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák return NULL; 119319498be935328e284c7f0e456fc04cca8d465d4cMarek Olšák 1194bd1feb28273e8d7047304e5a2a02ca3d71de5533Marek Olšák rws->buffer_get_metadata(buffer, &tiling); 119537f3454eb3afa1297126a8d77a563d734c292a37Marek Olšák 1196d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák /* Enforce a microtiled zbuffer. */ 1197d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák if (util_format_is_depth_or_stencil(base->format) && 1198260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák tiling.microtile == RADEON_LAYOUT_LINEAR) { 1199d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák switch (util_format_get_blocksize(base->format)) { 1200d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák case 4: 1201260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák tiling.microtile = RADEON_LAYOUT_TILED; 1202d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák break; 1203950be3fa3c22d67f3b80e7ed5d274d957f0bff93Marek Olšák 1204d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák case 2: 1205260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák tiling.microtile = RADEON_LAYOUT_SQUARETILED; 1206d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák break; 1207d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák } 1208d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák } 12098e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 1210d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák return (struct pipe_resource*) 1211260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák r300_texture_create_object(rscreen, base, tiling.microtile, tiling.macrotile, 12127b42ed6eb508e2f0b89f66f3f985ef1d76a0ef91Marek Olšák stride, buffer); 12138e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson} 12148e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 1215287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file: 1216287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */ 1217ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšákstruct pipe_surface* r300_create_surface_custom(struct pipe_context * ctx, 12184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_resource* texture, 1219ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák const struct pipe_surface *surf_tmpl, 1220ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák unsigned width0_override, 1221ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák unsigned height0_override) 1222471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{ 122356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_resource* tex = r300_resource(texture); 12248874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák struct r300_surface* surface = CALLOC_STRUCT(r300_surface); 12254c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level = surf_tmpl->u.tex.level; 12264c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 12274c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer); 1228471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 1229471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson if (surface) { 1230d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák uint32_t offset, tile_height; 12318c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák 12328874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák pipe_reference_init(&surface->base.reference, 1); 12338874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák pipe_resource_reference(&surface->base.texture, texture); 12344c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surface->base.context = ctx; 12354c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surface->base.format = surf_tmpl->format; 1236ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák surface->base.width = u_minify(width0_override, level); 1237ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák surface->base.height = u_minify(height0_override, level); 12384c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surface->base.u.tex.level = level; 12394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surface->base.u.tex.first_layer = surf_tmpl->u.tex.first_layer; 12404c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surface->base.u.tex.last_layer = surf_tmpl->u.tex.last_layer; 12418874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák 1242ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák surface->buf = tex->buf; 1243cf811faeff1eaa1aef817ae45314cc3419c44222Marek Olšák surface->buf = tex->buf; 1244347c00c46e9ecf858a8c21abf58a706b658b5b37Marek Olšák 124593f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák /* Prefer VRAM if there are multiple domains to choose from. */ 124693f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák surface->domain = tex->domain; 124793f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák if (surface->domain & RADEON_DOMAIN_VRAM) 124893f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák surface->domain &= ~RADEON_DOMAIN_GTT; 124993f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák 125056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák surface->offset = r300_texture_get_offset(tex, level, 12514c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_tmpl->u.tex.first_layer); 1252fc9170d0cf1c7a7dcd580e9da17742a6ab68bd1bMarek Olšák r300_texture_setup_fb_state(surface); 12538c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák 12548c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák /* Parameters for the CBZB clear. */ 125556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák surface->cbzb_allowed = tex->tex.cbzb_allowed[level]; 12568c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák surface->cbzb_width = align(surface->base.width, 64); 12578c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák 12588c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák /* Height must be aligned to the size of a tile. */ 1259ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák tile_height = r300_get_pixel_alignment(surface->base.format, 1260a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák tex->b.b.nr_samples, 126156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák tex->tex.microtile, 126256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák tex->tex.macrotile[level], 1263d19b5cbd317620f3977e68fffb7a74793436b7e2Dave Airlie DIM_HEIGHT, 0); 1264d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák 12658c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák surface->cbzb_height = align((surface->base.height + 1) / 2, 12668c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák tile_height); 12678c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák 12688c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák /* Offset must be aligned to 2K and must point at the beginning 12698c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák * of a scanline. */ 1270d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák offset = surface->offset + 127156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák tex->tex.stride_in_bytes[level] * surface->cbzb_height; 12728c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák surface->cbzb_midpoint_offset = offset & ~2047; 12738c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák 12748c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák surface->cbzb_pitch = surface->pitch & 0x1ffffc; 12758c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák 12768c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák if (util_format_get_blocksizebits(surface->base.format) == 32) 12778c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák surface->cbzb_format = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL; 12788c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák else 12798c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák surface->cbzb_format = R300_DEPTHFORMAT_16BIT_INT_Z; 12808c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák 12814c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger DBG(r300_context(ctx), DBG_CBZB, 12824c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger "CBZB Allowed: %s, Dim: %ix%i, Misalignment: %i, Micro: %s, Macro: %s\n", 12834c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surface->cbzb_allowed ? "YES" : " NO", 12844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surface->cbzb_width, surface->cbzb_height, 12854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger offset & 2047, 128656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák tex->tex.microtile ? "YES" : " NO", 128756ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák tex->tex.macrotile[level] ? "YES" : " NO"); 1288471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson } 1289471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 12908874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák return &surface->base; 1291471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson} 1292471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson 1293ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšákstruct pipe_surface* r300_create_surface(struct pipe_context * ctx, 1294ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák struct pipe_resource* texture, 1295ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák const struct pipe_surface *surf_tmpl) 1296ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák{ 1297ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák return r300_create_surface_custom(ctx, texture, surf_tmpl, 1298ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák texture->width0, 1299ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák texture->height0); 1300ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák} 1301ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák 1302287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Not required to implement u_resource_vtbl, consider moving to another file: 1303287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */ 13044c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheideggervoid r300_surface_destroy(struct pipe_context *ctx, struct pipe_surface* s) 1305471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson{ 1306287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&s->texture, NULL); 13075e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer FREE(s); 1308471129c7a14fb585ede198970e59270c4afa5310Corbin Simpson} 1309