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