163b572010554d62c3463c8db4e016ecbed117178Chia-I Wu/* 263b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Mesa 3-D graphics library 363b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * 463b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Copyright (C) 2012-2013 LunarG, Inc. 563b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * 663b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 763b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * copy of this software and associated documentation files (the "Software"), 863b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * to deal in the Software without restriction, including without limitation 963b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1063b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 1163b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Software is furnished to do so, subject to the following conditions: 1263b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * 1363b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * The above copyright notice and this permission notice shall be included 1463b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * in all copies or substantial portions of the Software. 1563b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * 1663b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1763b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1863b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1963b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2063b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2163b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2263b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * DEALINGS IN THE SOFTWARE. 2363b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * 2463b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Authors: 2563b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Chia-I Wu <olv@lunarg.com> 2663b572010554d62c3463c8db4e016ecbed117178Chia-I Wu */ 2763b572010554d62c3463c8db4e016ecbed117178Chia-I Wu 2863b572010554d62c3463c8db4e016ecbed117178Chia-I Wu#ifndef ILO_FORMAT_H 2963b572010554d62c3463c8db4e016ecbed117178Chia-I Wu#define ILO_FORMAT_H 3063b572010554d62c3463c8db4e016ecbed117178Chia-I Wu 3101e3e82a56310932667c60bcca9cc9fdfd8b87c4Chia-I Wu#include "genhw/genhw.h" 32513bc5d90b8e9237bd6a04da5d0dee175ff134f6Chia-I Wu 33513bc5d90b8e9237bd6a04da5d0dee175ff134f6Chia-I Wu#include "ilo_common.h" 34b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu 3582527655324b09c0d347a948e9bc66e79e48f201Chia-I Wubool 3682527655324b09c0d347a948e9bc66e79e48f201Chia-I Wuilo_format_support_vb(const struct ilo_dev *dev, 3782527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu enum pipe_format format); 3863b572010554d62c3463c8db4e016ecbed117178Chia-I Wu 3982527655324b09c0d347a948e9bc66e79e48f201Chia-I Wubool 4082527655324b09c0d347a948e9bc66e79e48f201Chia-I Wuilo_format_support_sol(const struct ilo_dev *dev, 4182527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu enum pipe_format format); 4263b572010554d62c3463c8db4e016ecbed117178Chia-I Wu 4382527655324b09c0d347a948e9bc66e79e48f201Chia-I Wubool 4482527655324b09c0d347a948e9bc66e79e48f201Chia-I Wuilo_format_support_sampler(const struct ilo_dev *dev, 4582527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu enum pipe_format format); 4682527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu 4782527655324b09c0d347a948e9bc66e79e48f201Chia-I Wubool 4882527655324b09c0d347a948e9bc66e79e48f201Chia-I Wuilo_format_support_rt(const struct ilo_dev *dev, 4982527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu enum pipe_format format); 5082527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu 5182527655324b09c0d347a948e9bc66e79e48f201Chia-I Wubool 5282527655324b09c0d347a948e9bc66e79e48f201Chia-I Wuilo_format_support_zs(const struct ilo_dev *dev, 5382527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu enum pipe_format format); 5463b572010554d62c3463c8db4e016ecbed117178Chia-I Wu 55b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wuint 5682527655324b09c0d347a948e9bc66e79e48f201Chia-I Wuilo_format_translate_color(const struct ilo_dev *dev, 572126541b0b6c15aa82c2ffb78ecc09d33a07ae53Chia-I Wu enum pipe_format format); 58b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu 59b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu/** 60b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * Translate a pipe format to a hardware surface format suitable for 61b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * the given purpose. Return -1 on errors. 62b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * 63b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * This is an inline function not only for performance reasons. There are 642126541b0b6c15aa82c2ffb78ecc09d33a07ae53Chia-I Wu * caveats that the callers should be aware of before calling this function. 65b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu */ 66b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wustatic inline int 6782527655324b09c0d347a948e9bc66e79e48f201Chia-I Wuilo_format_translate(const struct ilo_dev *dev, 682126541b0b6c15aa82c2ffb78ecc09d33a07ae53Chia-I Wu enum pipe_format format, unsigned bind) 69b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu{ 70b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu switch (bind) { 71b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_BIND_RENDER_TARGET: 72b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu /* 73b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * Some RGBX formats are not supported as render target formats. But we 74b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * can use their RGBA counterparts and force the destination alpha to be 75b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * one when blending is enabled. 76b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu */ 77b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu switch (format) { 78b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_FORMAT_B8G8R8X8_UNORM: 796c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu return GEN6_FORMAT_B8G8R8A8_UNORM; 80b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu default: 8182527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu return ilo_format_translate_color(dev, format); 82b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu } 83b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu break; 84b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_BIND_SAMPLER_VIEW: 85b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu /* 86b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * For depth formats, we want the depth values to be returned as R 87b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * values. But we assume in many places that the depth values are 88b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * returned as I values (util_make_fragment_tex_shader_writedepth() is 89b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * one such example). We have to live with that at least for now. 90a8e46140718b85fd33be97c693050f8722db1defChia-I Wu * 91a8e46140718b85fd33be97c693050f8722db1defChia-I Wu * For ETC1 format, the texture data will be decompressed before being 926b894e6900c2705c31d1af920a85389262e90bb3Chia-I Wu * written to the bo. See tex_staging_sys_convert_write(). 93b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu */ 94b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu switch (format) { 95b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_FORMAT_Z16_UNORM: 966c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu return GEN6_FORMAT_I16_UNORM; 97b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_FORMAT_Z32_FLOAT: 986c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu return GEN6_FORMAT_I32_FLOAT; 99b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_FORMAT_Z24X8_UNORM: 100b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_FORMAT_Z24_UNORM_S8_UINT: 1016c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu return GEN6_FORMAT_I24X8_UNORM; 102b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 1036c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu return GEN6_FORMAT_I32X32_FLOAT; 104a8e46140718b85fd33be97c693050f8722db1defChia-I Wu case PIPE_FORMAT_ETC1_RGB8: 1056c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu return GEN6_FORMAT_R8G8B8X8_UNORM; 106b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu default: 10782527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu return ilo_format_translate_color(dev, format); 108b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu } 109b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu break; 110b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_BIND_VERTEX_BUFFER: 11156d2ebb019f38d727a41f8f4a8ebd4f1aeee19e0Chia-I Wu if (ilo_dev_gen(dev) >= ILO_GEN(7.5)) 11282527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu return ilo_format_translate_color(dev, format); 113c1a1a627c47f7d6eca1c36afc81ca4584e965963Chia-I Wu 114b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu /* 115b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * Some 3-component formats are not supported as vertex element formats. 116b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * But since we move between vertices using vb->stride, we should be 117b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * good to use their 4-component counterparts if we force the W 118b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * component to be one. The only exception is that the vb boundary 119b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu * check for the last vertex may fail. 120b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu */ 121b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu switch (format) { 122b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_FORMAT_R16G16B16_FLOAT: 1236c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu return GEN6_FORMAT_R16G16B16A16_FLOAT; 124b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_FORMAT_R16G16B16_UINT: 1256c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu return GEN6_FORMAT_R16G16B16A16_UINT; 126b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_FORMAT_R16G16B16_SINT: 1276c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu return GEN6_FORMAT_R16G16B16A16_SINT; 128b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_FORMAT_R8G8B8_UINT: 1296c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu return GEN6_FORMAT_R8G8B8A8_UINT; 130b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu case PIPE_FORMAT_R8G8B8_SINT: 1316c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu return GEN6_FORMAT_R8G8B8A8_SINT; 132b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu default: 13382527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu return ilo_format_translate_color(dev, format); 134b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu } 135b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu break; 13682527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu case PIPE_BIND_STREAM_OUTPUT: 13782527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu return ilo_format_translate_color(dev, format); 13882527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu break; 139b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu default: 140b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu assert(!"cannot translate format"); 141b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu break; 142b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu } 143b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu 144b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu return -1; 145b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu} 146b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu 147b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wustatic inline int 14882527655324b09c0d347a948e9bc66e79e48f201Chia-I Wuilo_format_translate_render(const struct ilo_dev *dev, 1492126541b0b6c15aa82c2ffb78ecc09d33a07ae53Chia-I Wu enum pipe_format format) 150b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu{ 15182527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu return ilo_format_translate(dev, format, PIPE_BIND_RENDER_TARGET); 152b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu} 153b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu 154b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wustatic inline int 15582527655324b09c0d347a948e9bc66e79e48f201Chia-I Wuilo_format_translate_texture(const struct ilo_dev *dev, 1562126541b0b6c15aa82c2ffb78ecc09d33a07ae53Chia-I Wu enum pipe_format format) 157b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu{ 15882527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu return ilo_format_translate(dev, format, PIPE_BIND_SAMPLER_VIEW); 159b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu} 160b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu 161b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wustatic inline int 16282527655324b09c0d347a948e9bc66e79e48f201Chia-I Wuilo_format_translate_vertex(const struct ilo_dev *dev, 1632126541b0b6c15aa82c2ffb78ecc09d33a07ae53Chia-I Wu enum pipe_format format) 164b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu{ 16582527655324b09c0d347a948e9bc66e79e48f201Chia-I Wu return ilo_format_translate(dev, format, PIPE_BIND_VERTEX_BUFFER); 166b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu} 167b50e68cb67534bd9e648b5cb687949d9327ee011Chia-I Wu 168cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wustatic inline enum gen_depth_format 169cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wuilo_format_translate_depth(const struct ilo_dev *dev, 170cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu enum pipe_format format) 171cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu{ 172cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu if (ilo_dev_gen(dev) >= ILO_GEN(7)) { 173cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu switch (format) { 174cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu case PIPE_FORMAT_Z32_FLOAT: 175cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu return GEN6_ZFORMAT_D32_FLOAT; 176cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu case PIPE_FORMAT_Z24X8_UNORM: 177cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu return GEN6_ZFORMAT_D24_UNORM_X8_UINT; 178cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu case PIPE_FORMAT_Z16_UNORM: 179cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu return GEN6_ZFORMAT_D16_UNORM; 180cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu default: 181cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu assert(!"unknown depth format"); 182cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu return GEN6_ZFORMAT_D32_FLOAT; 183cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu } 184cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu } else { 185cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu switch (format) { 186cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 187cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu return GEN6_ZFORMAT_D32_FLOAT_S8X24_UINT; 188cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu case PIPE_FORMAT_Z32_FLOAT: 189cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu return GEN6_ZFORMAT_D32_FLOAT; 190cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu case PIPE_FORMAT_Z24_UNORM_S8_UINT: 191cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu return GEN6_ZFORMAT_D24_UNORM_S8_UINT; 192cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu case PIPE_FORMAT_Z24X8_UNORM: 193cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu return GEN6_ZFORMAT_D24_UNORM_X8_UINT; 194cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu case PIPE_FORMAT_Z16_UNORM: 195cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu return GEN6_ZFORMAT_D16_UNORM; 196cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu default: 197cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu assert(!"unknown depth format"); 198cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu return GEN6_ZFORMAT_D32_FLOAT; 199cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu } 200cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu } 201cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu} 202cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu 20363b572010554d62c3463c8db4e016ecbed117178Chia-I Wu#endif /* ILO_FORMAT_H */ 204