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
289871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu#include "core/ilo_state_vf.h"
299871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu#include "core/ilo_state_sol.h"
309871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu#include "core/ilo_state_surface.h"
319871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu
3263b572010554d62c3463c8db4e016ecbed117178Chia-I Wu#include "ilo_screen.h"
33cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu#include "ilo_format.h"
3463b572010554d62c3463c8db4e016ecbed117178Chia-I Wu#include "ilo_resource.h"
3563b572010554d62c3463c8db4e016ecbed117178Chia-I Wu
3681d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu/*
37c25fe88ebf0939ac1972cc0994819c27408ca59eChia-I Wu * From the Ivy Bridge PRM, volume 1 part 1, page 105:
38c25fe88ebf0939ac1972cc0994819c27408ca59eChia-I Wu *
39c25fe88ebf0939ac1972cc0994819c27408ca59eChia-I Wu *     "In addition to restrictions on maximum height, width, and depth,
40c25fe88ebf0939ac1972cc0994819c27408ca59eChia-I Wu *      surfaces are also restricted to a maximum size in bytes. This
41c25fe88ebf0939ac1972cc0994819c27408ca59eChia-I Wu *      maximum is 2 GB for all products and all surface types."
4281d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu */
43fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wustatic const size_t ilo_max_resource_size = 1u << 31;
4481d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
45cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wustatic const char *
46cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wuresource_get_bo_name(const struct pipe_resource *templ)
47cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu{
48cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   static const char *target_names[PIPE_MAX_TEXTURE_TYPES] = {
49cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_BUFFER] = "buf",
50cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_1D] = "tex-1d",
51cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_2D] = "tex-2d",
52cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_3D] = "tex-3d",
53cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_CUBE] = "tex-cube",
54cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_RECT] = "tex-rect",
55cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_1D_ARRAY] = "tex-1d-array",
56cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_2D_ARRAY] = "tex-2d-array",
57cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_CUBE_ARRAY] = "tex-cube-array",
58cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   };
59cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   const char *name = target_names[templ->target];
60cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu
61cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   if (templ->target == PIPE_BUFFER) {
62cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      switch (templ->bind) {
63cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      case PIPE_BIND_VERTEX_BUFFER:
64cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         name = "buf-vb";
65cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         break;
66cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      case PIPE_BIND_INDEX_BUFFER:
67cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         name = "buf-ib";
68cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         break;
69cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      case PIPE_BIND_CONSTANT_BUFFER:
70cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         name = "buf-cb";
71cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         break;
72cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      case PIPE_BIND_STREAM_OUTPUT:
73cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         name = "buf-so";
74cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         break;
75cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      default:
76cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         break;
77cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      }
78cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   }
79cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu
80cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   return name;
81cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu}
82cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu
83fbb869c1aaf6aa5400028556e23bbbb1ba41ce42Chia-I Wustatic bool
84fbb869c1aaf6aa5400028556e23bbbb1ba41ce42Chia-I Wuresource_get_cpu_init(const struct pipe_resource *templ)
85cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu{
86cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   return (templ->bind & (PIPE_BIND_DEPTH_STENCIL |
87cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu                          PIPE_BIND_RENDER_TARGET |
88fbb869c1aaf6aa5400028556e23bbbb1ba41ce42Chia-I Wu                          PIPE_BIND_STREAM_OUTPUT)) ? false : true;
89cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu}
90cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu
91dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wustatic enum gen_surface_type
92dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wuget_surface_type(enum pipe_texture_target target)
93dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu{
94dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu   switch (target) {
95dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu   case PIPE_TEXTURE_1D:
96dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu   case PIPE_TEXTURE_1D_ARRAY:
97dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu      return GEN6_SURFTYPE_1D;
98dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu   case PIPE_TEXTURE_2D:
99dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu   case PIPE_TEXTURE_RECT:
100dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu   case PIPE_TEXTURE_2D_ARRAY:
101dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu      return GEN6_SURFTYPE_2D;
102dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu   case PIPE_TEXTURE_3D:
103dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu      return GEN6_SURFTYPE_3D;
104dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu   case PIPE_TEXTURE_CUBE:
105dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu   case PIPE_TEXTURE_CUBE_ARRAY:
106dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu      return GEN6_SURFTYPE_CUBE;
107dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu   default:
108dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu      assert(!"unknown texture target");
109dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu      return GEN6_SURFTYPE_NULL;
110dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu   }
111dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu}
112dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu
1132ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wustatic enum pipe_format
1142ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wuresource_get_image_format(const struct pipe_resource *templ,
1152ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu                          const struct ilo_dev *dev,
1162ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu                          bool *separate_stencil_ret)
1172ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu{
1182ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   enum pipe_format format = templ->format;
1192ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   bool separate_stencil;
1202ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu
1212ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   /* silently promote ETC1 */
1222ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   if (templ->format == PIPE_FORMAT_ETC1_RGB8)
1232ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      format = PIPE_FORMAT_R8G8B8X8_UNORM;
1242ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu
1252ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   /* separate stencil buffers */
1262ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   separate_stencil = false;
1272ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   if ((templ->bind & PIPE_BIND_DEPTH_STENCIL) &&
1282ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu       util_format_is_depth_and_stencil(templ->format)) {
1292ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      switch (templ->format) {
1302ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
1312ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu         /* Gen6 requires HiZ to be available for all levels */
1322ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu         if (ilo_dev_gen(dev) >= ILO_GEN(7) || templ->last_level == 0) {
1332ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu            format = PIPE_FORMAT_Z32_FLOAT;
1342ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu            separate_stencil = true;
1352ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu         }
1362ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu         break;
1372ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      case PIPE_FORMAT_Z24_UNORM_S8_UINT:
1382ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu         format = PIPE_FORMAT_Z24X8_UNORM;
1392ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu         separate_stencil = true;
1402ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu         break;
1412ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      default:
1422ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu         break;
1432ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      }
1442ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   }
1452ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu
1462ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   if (separate_stencil_ret)
1472ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      *separate_stencil_ret = separate_stencil;
1482ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu
1492ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   return format;
1502ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu}
1512ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu
152cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wustatic inline enum gen_surface_format
153cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wupipe_to_surface_format(const struct ilo_dev *dev, enum pipe_format format)
154cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu{
155cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   switch (format) {
156cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
157cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu      return GEN6_FORMAT_R32_FLOAT_X8X24_TYPELESS;
158cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   case PIPE_FORMAT_Z32_FLOAT:
159cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu      return GEN6_FORMAT_R32_FLOAT;
160cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   case PIPE_FORMAT_Z24_UNORM_S8_UINT:
161cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   case PIPE_FORMAT_Z24X8_UNORM:
162cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu      return GEN6_FORMAT_R24_UNORM_X8_TYPELESS;
163cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   case PIPE_FORMAT_Z16_UNORM:
164cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu      return GEN6_FORMAT_R16_UNORM;
165cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   case PIPE_FORMAT_S8_UINT:
166cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu      return GEN6_FORMAT_R8_UINT;
167cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   default:
168cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu      return ilo_format_translate_color(dev, format);
169cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   }
170cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu}
171cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu
172934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wustatic void
173934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wuresource_get_image_info(const struct pipe_resource *templ,
174934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu                        const struct ilo_dev *dev,
175934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu                        enum pipe_format image_format,
176934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu                        struct ilo_image_info *info)
177934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu{
178934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   memset(info, 0, sizeof(*info));
179934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu
180dc2e92b2d3d216fc9657f2ef594d7c5d0b03370eChia-I Wu   info->type = get_surface_type(templ->target);
181cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu
182cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   info->format = pipe_to_surface_format(dev, image_format);
183cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   info->interleaved_stencil = util_format_is_depth_and_stencil(image_format);
184cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   info->is_integer = util_format_is_pure_integer(image_format);
185cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   info->compressed = util_format_is_compressed(image_format);
186cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   info->block_width = util_format_get_blockwidth(image_format);
187cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   info->block_height = util_format_get_blockheight(image_format);
188cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   info->block_size = util_format_get_blocksize(image_format);
189934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu
190934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->width = templ->width0;
191934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->height = templ->height0;
192934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->depth = templ->depth0;
193934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->array_size = templ->array_size;
194934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->level_count = templ->last_level + 1;
195934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->sample_count = (templ->nr_samples) ? templ->nr_samples : 1;
196934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu
197934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->aux_disable = (templ->usage == PIPE_USAGE_STAGING);
198934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu
199934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   if (templ->bind & PIPE_BIND_LINEAR)
200934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      info->valid_tilings = 1 << GEN6_TILING_NONE;
201934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu
2023c6af396f9526bdc8351ff61bcc6c42a3892e6b8Chia-I Wu   /*
2033c6af396f9526bdc8351ff61bcc6c42a3892e6b8Chia-I Wu    * Tiled images must be mapped via GTT to get a linear view.  Prefer linear
2043c6af396f9526bdc8351ff61bcc6c42a3892e6b8Chia-I Wu    * images when the image size is greater than one-fourth of the mappable
2053c6af396f9526bdc8351ff61bcc6c42a3892e6b8Chia-I Wu    * aperture.
2063c6af396f9526bdc8351ff61bcc6c42a3892e6b8Chia-I Wu    */
2075981ab544562c667c882526c31a6f8c2ce6eba12Marek Olšák   if (templ->usage == PIPE_USAGE_STAGING)
2083c6af396f9526bdc8351ff61bcc6c42a3892e6b8Chia-I Wu      info->prefer_linear_threshold = dev->aperture_mappable / 4;
2093c6af396f9526bdc8351ff61bcc6c42a3892e6b8Chia-I Wu
210934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->bind_surface_sampler = (templ->bind & PIPE_BIND_SAMPLER_VIEW);
211934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->bind_surface_dp_render = (templ->bind & PIPE_BIND_RENDER_TARGET);
212934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->bind_surface_dp_typed = (templ->bind &
213f9f79d29ce75c681c46bdbac5aa3f19ee1adb93bMarek Olšák         (PIPE_BIND_SHADER_IMAGE | PIPE_BIND_COMPUTE_RESOURCE));
214934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->bind_zs = (templ->bind & PIPE_BIND_DEPTH_STENCIL);
215934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->bind_scanout = (templ->bind & PIPE_BIND_SCANOUT);
216934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   info->bind_cursor = (templ->bind & PIPE_BIND_CURSOR);
217934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu}
218934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu
2190ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wustatic enum gen_surface_tiling
2200ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wuwinsys_to_surface_tiling(enum intel_tiling_mode tiling)
2210ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu{
2220ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   switch (tiling) {
2230ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   case INTEL_TILING_NONE:
2240ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return GEN6_TILING_NONE;
2250ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   case INTEL_TILING_X:
2260ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return GEN6_TILING_X;
2270ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   case INTEL_TILING_Y:
2280ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return GEN6_TILING_Y;
2290ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   default:
2300ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      assert(!"unknown tiling");
2310ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return GEN6_TILING_NONE;
2320ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   }
2330ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu}
2340ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu
2350ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wustatic inline enum intel_tiling_mode
2360ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wusurface_to_winsys_tiling(enum gen_surface_tiling tiling)
2370ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu{
2380ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   switch (tiling) {
2390ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   case GEN6_TILING_NONE:
2400ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return INTEL_TILING_NONE;
2410ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   case GEN6_TILING_X:
2420ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return INTEL_TILING_X;
2430ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   case GEN6_TILING_Y:
2440ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return INTEL_TILING_Y;
2450ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   default:
2460ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      assert(!"unknown tiling");
2470ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return GEN6_TILING_NONE;
2480ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   }
2490ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu}
2500ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu
251176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wustatic void
252176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wutex_free_slices(struct ilo_texture *tex)
253176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
254846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu   FREE(tex->slices[0]);
255176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu}
2563a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
257176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wustatic bool
258176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wutex_alloc_slices(struct ilo_texture *tex)
259176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
260176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   const struct pipe_resource *templ = &tex->base;
261176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   struct ilo_texture_slice *slices;
262176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   int depth, lv;
263176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
264176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   /* sum the depths of all levels */
265176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   depth = 0;
266176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   for (lv = 0; lv <= templ->last_level; lv++)
267176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      depth += u_minify(templ->depth0, lv);
268dd62e7bc02f705c367af37a38f572758a8d1bc37Chia-I Wu
269dd62e7bc02f705c367af37a38f572758a8d1bc37Chia-I Wu   /*
270176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu    * There are (depth * tex->base.array_size) slices in total.  Either depth
271176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu    * is one (non-3D) or templ->array_size is one (non-array), but it does
272176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu    * not matter.
2733a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu    */
274176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   slices = CALLOC(depth * templ->array_size, sizeof(*slices));
275176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (!slices)
276176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return false;
2773a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
278846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu   tex->slices[0] = slices;
2793a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
280176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   /* point to the respective positions in the buffer */
281176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   for (lv = 1; lv <= templ->last_level; lv++) {
282846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu      tex->slices[lv] = tex->slices[lv - 1] +
283176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu         u_minify(templ->depth0, lv - 1) * templ->array_size;
2843a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   }
2853a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
286176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   return true;
2873a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
2883a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
2893f79188854fd7f63ad1eb0d4ab1fc24117fd0d78Chia-I Wustatic bool
290cbc943c43ec5ce5ba625b2833bf7f911e798254eChia-I Wutex_create_bo(struct ilo_texture *tex)
291cbc943c43ec5ce5ba625b2833bf7f911e798254eChia-I Wu{
292cbc943c43ec5ce5ba625b2833bf7f911e798254eChia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
293cbc943c43ec5ce5ba625b2833bf7f911e798254eChia-I Wu   const char *name = resource_get_bo_name(&tex->base);
294fbb869c1aaf6aa5400028556e23bbbb1ba41ce42Chia-I Wu   const bool cpu_init = resource_get_cpu_init(&tex->base);
29570ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu   struct intel_bo *bo;
296176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
29719351af53dfffb8543d21a58be9c9f9a52b3ba62Chia-I Wu   bo = intel_winsys_alloc_bo(is->dev.winsys, name,
298ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu         tex->image.bo_stride * tex->image.bo_height, cpu_init);
29970ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu
30070ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu   /* set the tiling for transfer and export */
301ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   if (bo && (tex->image.tiling == GEN6_TILING_X ||
302ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu              tex->image.tiling == GEN6_TILING_Y)) {
30370ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu      const enum intel_tiling_mode tiling =
304ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu         surface_to_winsys_tiling(tex->image.tiling);
30570ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu
306ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu      if (intel_bo_set_tiling(bo, tiling, tex->image.bo_stride)) {
3074ddd981e407f9e97fcbb862c241f1ce165616fd4Chia-I Wu         intel_bo_unref(bo);
30870ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu         bo = NULL;
30970ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu      }
31070ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu   }
3113afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   if (!bo)
3123afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu      return false;
3130ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu
31436d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   intel_bo_unref(tex->vma.bo);
31536d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   ilo_vma_set_bo(&tex->vma, &is->dev, bo, 0);
3163f79188854fd7f63ad1eb0d4ab1fc24117fd0d78Chia-I Wu
3173afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   return true;
3183a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
3193a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
320e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wustatic bool
321e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wutex_create_separate_stencil(struct ilo_texture *tex)
322e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu{
323e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   struct pipe_resource templ = tex->base;
324e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   struct pipe_resource *s8;
325e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu
326e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   /*
327e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu    * Unless PIPE_BIND_DEPTH_STENCIL is set, the resource may have other
328e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu    * tilings.  But that should be fine since it will never be bound as the
329e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu    * stencil buffer, and our transfer code can handle all tilings.
330e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu    */
331e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   templ.format = PIPE_FORMAT_S8_UINT;
332e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu
333bca6c8572f68a21e43982ffec057b30f35465965Chia-I Wu   /* no stencil texturing */
334bca6c8572f68a21e43982ffec057b30f35465965Chia-I Wu   templ.bind &= ~PIPE_BIND_SAMPLER_VIEW;
335bca6c8572f68a21e43982ffec057b30f35465965Chia-I Wu
336e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   s8 = tex->base.screen->resource_create(tex->base.screen, &templ);
337e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   if (!s8)
338e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu      return false;
339e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu
340e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   tex->separate_s8 = ilo_texture(s8);
341e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu
342cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   assert(tex->separate_s8->image_format == PIPE_FORMAT_S8_UINT);
343e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu
344e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   return true;
345e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu}
346e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu
347546416d49597c4879d045707d5587317e77e160cChia-I Wustatic bool
348fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wutex_create_hiz(struct ilo_texture *tex)
349546416d49597c4879d045707d5587317e77e160cChia-I Wu{
350fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   const struct pipe_resource *templ = &tex->base;
35136d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   const uint32_t size = tex->image.aux.bo_stride * tex->image.aux.bo_height;
352546416d49597c4879d045707d5587317e77e160cChia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
3533afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   struct intel_bo *bo;
354546416d49597c4879d045707d5587317e77e160cChia-I Wu
35536d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   bo = intel_winsys_alloc_bo(is->dev.winsys, "hiz texture", size, false);
3563afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   if (!bo)
357546416d49597c4879d045707d5587317e77e160cChia-I Wu      return false;
358546416d49597c4879d045707d5587317e77e160cChia-I Wu
35936d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   ilo_vma_init(&tex->aux_vma, &is->dev, size, 4096);
36036d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   ilo_vma_set_bo(&tex->aux_vma, &is->dev, bo, 0);
3613afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu
3629b705ec32d8cd527ab8d6ebc89f6550d52908c62Chia-I Wu   if (tex->imported) {
3639b705ec32d8cd527ab8d6ebc89f6550d52908c62Chia-I Wu      unsigned lv;
364f8d19a58dcb4fbdc453549cfd3884145ae28f073Chia-I Wu
3659b705ec32d8cd527ab8d6ebc89f6550d52908c62Chia-I Wu      for (lv = 0; lv <= templ->last_level; lv++) {
3669b705ec32d8cd527ab8d6ebc89f6550d52908c62Chia-I Wu         if (tex->image.aux.enables & (1 << lv)) {
3679b705ec32d8cd527ab8d6ebc89f6550d52908c62Chia-I Wu            const unsigned num_slices = (templ->target == PIPE_TEXTURE_3D) ?
3689b705ec32d8cd527ab8d6ebc89f6550d52908c62Chia-I Wu               u_minify(templ->depth0, lv) : templ->array_size;
3699b705ec32d8cd527ab8d6ebc89f6550d52908c62Chia-I Wu            /* this will trigger HiZ resolves */
3709b705ec32d8cd527ab8d6ebc89f6550d52908c62Chia-I Wu            const unsigned flags = ILO_TEXTURE_CPU_WRITE;
371f8d19a58dcb4fbdc453549cfd3884145ae28f073Chia-I Wu
3729b705ec32d8cd527ab8d6ebc89f6550d52908c62Chia-I Wu            ilo_texture_set_slice_flags(tex, lv, 0, num_slices, flags, flags);
3739b705ec32d8cd527ab8d6ebc89f6550d52908c62Chia-I Wu         }
3747fdab3b201bd2a011e8e0b0b15aca7b7fb5a7aa5Chia-I Wu      }
3757fdab3b201bd2a011e8e0b0b15aca7b7fb5a7aa5Chia-I Wu   }
3767fdab3b201bd2a011e8e0b0b15aca7b7fb5a7aa5Chia-I Wu
377546416d49597c4879d045707d5587317e77e160cChia-I Wu   return true;
378546416d49597c4879d045707d5587317e77e160cChia-I Wu}
379546416d49597c4879d045707d5587317e77e160cChia-I Wu
38081d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wustatic bool
381fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wutex_create_mcs(struct ilo_texture *tex)
38281d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu{
38336d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   const uint32_t size = tex->image.aux.bo_stride * tex->image.aux.bo_height;
384fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
3853afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   struct intel_bo *bo;
38681d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
387c209aa7a8f08acb89f7294328589f47a88b44703Chia-I Wu   assert(tex->image.aux.enables == (1 << (tex->base.last_level + 1)) - 1);
38881d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
38936d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   bo = intel_winsys_alloc_bo(is->dev.winsys, "mcs texture", size, false);
3903afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   if (!bo)
391fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      return false;
392fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu
39336d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   ilo_vma_init(&tex->aux_vma, &is->dev, size, 4096);
39436d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   ilo_vma_set_bo(&tex->aux_vma, &is->dev, bo, 0);
3953afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu
396fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   return true;
397fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu}
398fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu
399fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wustatic void
400fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wutex_destroy(struct ilo_texture *tex)
401fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu{
402fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   if (tex->separate_s8)
403fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      tex_destroy(tex->separate_s8);
404fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu
40536d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   intel_bo_unref(tex->vma.bo);
40636d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   intel_bo_unref(tex->aux_vma.bo);
407fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu
408fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   tex_free_slices(tex);
409fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   FREE(tex);
410fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu}
411fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu
412fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wustatic bool
413f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wutex_alloc_bos(struct ilo_texture *tex)
414fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu{
415f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   if (!tex->imported && !tex_create_bo(tex))
416f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu      return false;
41781d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
418c209aa7a8f08acb89f7294328589f47a88b44703Chia-I Wu   switch (tex->image.aux.type) {
419ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   case ILO_IMAGE_AUX_HIZ:
420f825fe8e13adfec4cd488bac3663b7e9c90a8c06Chia-I Wu      if (!tex_create_hiz(tex))
4219cb0df4b50593e69f65b65704f5b64f3a12be9b5Chia-I Wu         return false;
422fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      break;
423ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   case ILO_IMAGE_AUX_MCS:
424f825fe8e13adfec4cd488bac3663b7e9c90a8c06Chia-I Wu      if (!tex_create_mcs(tex))
42581d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu         return false;
426fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      break;
427fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   default:
428fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      break;
42981d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu   }
43081d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
43181d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu   return true;
43281d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu}
43381d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
434934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wustatic struct intel_bo *
435f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wutex_import_handle(struct ilo_texture *tex,
436934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu                  const struct winsys_handle *handle,
437934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu                  struct ilo_image_info *info)
438f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu{
439f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
440f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   const struct pipe_resource *templ = &tex->base;
441f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   const char *name = resource_get_bo_name(&tex->base);
442f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   enum intel_tiling_mode tiling;
443f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   unsigned long pitch;
444f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   struct intel_bo *bo;
445f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu
446f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   bo = intel_winsys_import_handle(is->dev.winsys, name, handle,
447f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu         tex->image.bo_height, &tiling, &pitch);
448934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   /* modify image info */
449934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   if (bo) {
450934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      const uint8_t valid_tilings = 1 << winsys_to_surface_tiling(tiling);
451f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu
452934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      if (info->valid_tilings && !(info->valid_tilings & valid_tilings)) {
453934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu         intel_bo_unref(bo);
454934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu         return NULL;
455934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      }
456f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu
457934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      info->valid_tilings = valid_tilings;
458934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      info->force_bo_stride = pitch;
459f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu
460934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      /* assume imported RTs are also scanouts */
461934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      if (!info->bind_scanout)
462934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu         info->bind_scanout = (templ->usage & PIPE_BIND_RENDER_TARGET);
463934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   }
464f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu
465934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   return bo;
466f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu}
467f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu
468f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wustatic bool
469f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wutex_init_image(struct ilo_texture *tex,
4702ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu               const struct winsys_handle *handle,
4712ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu               bool *separate_stencil)
4727395432f2e792f8719b03bb39b0cf5cba8ba583bChia-I Wu{
473fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
4747395432f2e792f8719b03bb39b0cf5cba8ba583bChia-I Wu   const struct pipe_resource *templ = &tex->base;
475ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   struct ilo_image *img = &tex->image;
476ea327dc451c1c8e46ff49a368c0d9c1485889fd3Jakob Sinclair   struct intel_bo *imported_bo = NULL;
477934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   struct ilo_image_info info;
478934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu
479cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   tex->image_format = resource_get_image_format(templ,
4802ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu         &is->dev, separate_stencil);
481cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu   resource_get_image_info(templ, &is->dev, tex->image_format, &info);
4827395432f2e792f8719b03bb39b0cf5cba8ba583bChia-I Wu
483f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   if (handle) {
484934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      imported_bo = tex_import_handle(tex, handle, &info);
485934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      if (!imported_bo)
486f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu         return false;
487f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   }
4887395432f2e792f8719b03bb39b0cf5cba8ba583bChia-I Wu
489934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   if (!ilo_image_init(img, &is->dev, &info)) {
490934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      intel_bo_unref(imported_bo);
491fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      return false;
492934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   }
493934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu
4942ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   /*
4952ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu    * HiZ requires 8x4 alignment and some levels might need HiZ disabled.  It
4962ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu    * is generally fine except on Gen6, where HiZ and separate stencil must be
4972ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu    * enabled together.  For PIPE_FORMAT_Z24X8_UNORM with separate stencil, we
4982ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu    * can live with stencil values being interleaved for levels where HiZ is
4992ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu    * disabled.  But it is not the case for PIPE_FORMAT_Z32_FLOAT with
5002ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu    * separate stencil.  If HiZ was disabled for a level, we had to change the
5012ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu    * format to PIPE_FORMAT_Z32_FLOAT_S8X24_UINT for the level and that format
5022ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu    * had a different bpp.  In other words, HiZ has to be available for all
5032ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu    * levels.
5042ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu    */
5052ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   if (ilo_dev_gen(&is->dev) == ILO_GEN(6) &&
5062ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu       templ->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT &&
507cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu       tex->image_format == PIPE_FORMAT_Z32_FLOAT &&
5082ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu       img->aux.enables != (1 << templ->last_level)) {
509cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu      tex->image_format = templ->format;
510cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu      info.format = pipe_to_surface_format(&is->dev, tex->image_format);
511cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu      info.interleaved_stencil = true;
5122ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu
5132ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      memset(img, 0, sizeof(*img));
5142ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      if (!ilo_image_init(img, &is->dev, &info)) {
5152ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu         intel_bo_unref(imported_bo);
5162ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu         return false;
5172ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      }
5182ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   }
5192ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu
520934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   if (img->bo_height > ilo_max_resource_size / img->bo_stride ||
521934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu       !ilo_vma_init(&tex->vma, &is->dev, img->bo_stride * img->bo_height,
522934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu          4096)) {
523934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      intel_bo_unref(imported_bo);
524934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      return false;
525934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   }
526934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu
527934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   if (imported_bo) {
528934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      ilo_vma_set_bo(&tex->vma, &is->dev, imported_bo, 0);
529934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu      tex->imported = true;
530934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   }
5315b1c516080989c950796a1e9087a07284887602bChia-I Wu
532fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   if (templ->flags & PIPE_RESOURCE_FLAG_MAP_PERSISTENT) {
533fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      /* require on-the-fly tiling/untiling or format conversion */
5342ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      if (img->tiling == GEN8_TILING_W || *separate_stencil ||
535cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu          tex->image_format != templ->format)
536fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu         return false;
537fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   }
5386b894e6900c2705c31d1af920a85389262e90bb3Chia-I Wu
539fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   if (!tex_alloc_slices(tex))
540fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      return false;
54181d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
542fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   return true;
5433a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
5443a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
5453a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wustatic struct pipe_resource *
546176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wutex_create(struct pipe_screen *screen,
547176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu           const struct pipe_resource *templ,
548176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu           const struct winsys_handle *handle)
5493a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{
550768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   struct ilo_texture *tex;
5512ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   bool separate_stencil;
5523a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
553768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   tex = CALLOC_STRUCT(ilo_texture);
554768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   if (!tex)
5553a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu      return NULL;
5563a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
557768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   tex->base = *templ;
558768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   tex->base.screen = screen;
559768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   pipe_reference_init(&tex->base.reference, 1);
5603a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
5612ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   if (!tex_init_image(tex, handle, &separate_stencil)) {
562fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      FREE(tex);
5633a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu      return NULL;
5643a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   }
5653a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
5662ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   if (!tex_alloc_bos(tex) ||
5672ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu       (separate_stencil && !tex_create_separate_stencil(tex))) {
568e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu      tex_destroy(tex);
569e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu      return NULL;
5706b894e6900c2705c31d1af920a85389262e90bb3Chia-I Wu   }
5716b894e6900c2705c31d1af920a85389262e90bb3Chia-I Wu
572768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   return &tex->base;
5733a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
5743a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
575176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wustatic bool
576176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wutex_get_handle(struct ilo_texture *tex, struct winsys_handle *handle)
577176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
57839226705b7ee79504b5b09669e5420cd7c374713Chia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
5790ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   enum intel_tiling_mode tiling;
580176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   int err;
581176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
58270ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu   /* must match what tex_create_bo() sets */
583ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   if (tex->image.tiling == GEN8_TILING_W)
5840ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      tiling = INTEL_TILING_NONE;
5850ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   else
586ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu      tiling = surface_to_winsys_tiling(tex->image.tiling);
5870ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu
58836d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   err = intel_winsys_export_handle(is->dev.winsys, tex->vma.bo, tiling,
589ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu         tex->image.bo_stride, tex->image.bo_height, handle);
590176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
591176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   return !err;
592176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu}
593176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
5943f79188854fd7f63ad1eb0d4ab1fc24117fd0d78Chia-I Wustatic bool
5958ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wubuf_create_bo(struct ilo_buffer_resource *buf)
596176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
597176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   struct ilo_screen *is = ilo_screen(buf->base.screen);
598cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   const char *name = resource_get_bo_name(&buf->base);
599fbb869c1aaf6aa5400028556e23bbbb1ba41ce42Chia-I Wu   const bool cpu_init = resource_get_cpu_init(&buf->base);
6008ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   struct intel_bo *bo;
6018ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu
6029871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu   bo = intel_winsys_alloc_bo(is->dev.winsys, name, buf->bo_size, cpu_init);
6038ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   if (!bo)
6048ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      return false;
605176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
60636d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   intel_bo_unref(buf->vma.bo);
60736d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   ilo_vma_set_bo(&buf->vma, &is->dev, bo, 0);
608176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
6098ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   return true;
610176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu}
611176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
612176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wustatic void
6138ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wubuf_destroy(struct ilo_buffer_resource *buf)
614176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
61536d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu   intel_bo_unref(buf->vma.bo);
616176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   FREE(buf);
617176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu}
618176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
619176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wustatic struct pipe_resource *
620176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wubuf_create(struct pipe_screen *screen, const struct pipe_resource *templ)
621176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
622c1a1a627c47f7d6eca1c36afc81ca4584e965963Chia-I Wu   const struct ilo_screen *is = ilo_screen(screen);
6238ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   struct ilo_buffer_resource *buf;
6249871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu   uint32_t alignment;
62558f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu   unsigned size;
626176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
6278ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   buf = CALLOC_STRUCT(ilo_buffer_resource);
628176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (!buf)
629176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return NULL;
630176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
631176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   buf->base = *templ;
632176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   buf->base.screen = screen;
633176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   pipe_reference_init(&buf->base.reference, 1);
634176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
63558f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu   size = templ->width0;
63658f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu
63758f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu   /*
63858f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu    * As noted in ilo_format_translate(), we treat some 3-component formats as
63958f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu    * 4-component formats to work around hardware limitations.  Imagine the
64058f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu    * case where the vertex buffer holds a single PIPE_FORMAT_R16G16B16_FLOAT
64158f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu    * vertex, and buf->bo_size is 6.  The hardware would fail to fetch it at
64258f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu    * boundary check because the vertex buffer is expected to hold a
64358f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu    * PIPE_FORMAT_R16G16B16A16_FLOAT vertex and that takes at least 8 bytes.
64458f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu    *
64558f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu    * For the workaround to work, we should add 2 to the bo size.  But that
64658f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu    * would waste a page when the bo size is already page aligned.  Let's
64758f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu    * round it to page size for now and revisit this when needed.
64858f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu    */
64958f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu   if ((templ->bind & PIPE_BIND_VERTEX_BUFFER) &&
65058f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu       ilo_dev_gen(&is->dev) < ILO_GEN(7.5))
65158f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu      size = align(size, 4096);
65258f95b332d0cbad226f5bb2e96cd0cad8864fe79Chia-I Wu
6539871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu   if (templ->bind & PIPE_BIND_VERTEX_BUFFER)
6549871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu      size = ilo_state_vertex_buffer_size(&is->dev, size, &alignment);
6559871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu   if (templ->bind & PIPE_BIND_INDEX_BUFFER)
6569871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu      size = ilo_state_index_buffer_size(&is->dev, size, &alignment);
6579871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu   if (templ->bind & PIPE_BIND_STREAM_OUTPUT)
6589871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu      size = ilo_state_sol_buffer_size(&is->dev, size, &alignment);
6599871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu
6609871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu   buf->bo_size = size;
6619871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu   ilo_vma_init(&buf->vma, &is->dev, buf->bo_size, 4096);
66276713ed5d64028a434c15f4eb6572b01e5acaccaChia-I Wu
6639871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu   if (buf->bo_size < templ->width0 || buf->bo_size > ilo_max_resource_size ||
66481d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu       !buf_create_bo(buf)) {
665176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      FREE(buf);
666176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return NULL;
667176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   }
668176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
669176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   return &buf->base;
670176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu}
671176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
6723a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wustatic boolean
6733a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wuilo_can_create_resource(struct pipe_screen *screen,
6743a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu                        const struct pipe_resource *templ)
6753a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{
676934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   struct ilo_screen *is = ilo_screen(screen);
6772ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   enum pipe_format image_format;
678934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   struct ilo_image_info info;
679ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   struct ilo_image img;
680176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
681176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (templ->target == PIPE_BUFFER)
682fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      return (templ->width0 <= ilo_max_resource_size);
68381d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
6842ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   image_format = resource_get_image_format(templ, &is->dev, NULL);
6852ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   resource_get_image_info(templ, &is->dev, image_format, &info);
686934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu
687ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   memset(&img, 0, sizeof(img));
688934e4a469fd37dac03b8280cce41df4d9f4ed123Chia-I Wu   ilo_image_init(&img, &ilo_screen(screen)->dev, &info);
6893a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
6902ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   /* as in tex_init_image() */
6912ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   if (ilo_dev_gen(&is->dev) == ILO_GEN(6) &&
6922ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu       templ->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT &&
6932ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu       image_format == PIPE_FORMAT_Z32_FLOAT &&
6942ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu       img.aux.enables != (1 << templ->last_level)) {
695cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu      info.format = pipe_to_surface_format(&is->dev, templ->format);
696cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu      info.interleaved_stencil = true;
6972ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      memset(&img, 0, sizeof(img));
6982ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu      ilo_image_init(&img, &ilo_screen(screen)->dev, &info);
6992ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu   }
7002ee95f6d64aca9e9490c1ac293dd711b5f60a16bChia-I Wu
701ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   return (img.bo_height <= ilo_max_resource_size / img.bo_stride);
7023a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
7033a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
7043a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wustatic struct pipe_resource *
7053a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wuilo_resource_create(struct pipe_screen *screen,
7063a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu                    const struct pipe_resource *templ)
7073a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{
708176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (templ->target == PIPE_BUFFER)
709176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return buf_create(screen, templ);
710176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   else
711176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return tex_create(screen, templ, NULL);
7123a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
7133a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
7143a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wustatic struct pipe_resource *
7153a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wuilo_resource_from_handle(struct pipe_screen *screen,
7163a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu                         const struct pipe_resource *templ,
71782db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                         struct winsys_handle *handle,
71882db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                         unsigned usage)
7193a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{
720176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (templ->target == PIPE_BUFFER)
721176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return NULL;
722176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   else
723176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return tex_create(screen, templ, handle);
7243a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
7253a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
7263a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wustatic boolean
7273a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wuilo_resource_get_handle(struct pipe_screen *screen,
7289daaa6f5a66ab6cc99c6f0af37fc1007ab3d09afMarek Olšák                        struct pipe_context *ctx,
729768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu                        struct pipe_resource *res,
73082db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                        struct winsys_handle *handle,
73182db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                        unsigned usage)
7323a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{
733176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (res->target == PIPE_BUFFER)
734176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return false;
735176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   else
736176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return tex_get_handle(ilo_texture(res), handle);
7373a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
7383a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
7393a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
7403a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wustatic void
7413a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wuilo_resource_destroy(struct pipe_screen *screen,
742768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu                     struct pipe_resource *res)
7433a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{
744176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (res->target == PIPE_BUFFER)
7458ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      buf_destroy((struct ilo_buffer_resource *) res);
746176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   else
747176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      tex_destroy(ilo_texture(res));
7483a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
7493a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
75063b572010554d62c3463c8db4e016ecbed117178Chia-I Wu/**
75163b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Initialize resource-related functions.
75263b572010554d62c3463c8db4e016ecbed117178Chia-I Wu */
75363b572010554d62c3463c8db4e016ecbed117178Chia-I Wuvoid
75463b572010554d62c3463c8db4e016ecbed117178Chia-I Wuilo_init_resource_functions(struct ilo_screen *is)
75563b572010554d62c3463c8db4e016ecbed117178Chia-I Wu{
7563a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   is->base.can_create_resource = ilo_can_create_resource;
7573a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   is->base.resource_create = ilo_resource_create;
7583a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   is->base.resource_from_handle = ilo_resource_from_handle;
7593a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   is->base.resource_get_handle = ilo_resource_get_handle;
7603a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   is->base.resource_destroy = ilo_resource_destroy;
76163b572010554d62c3463c8db4e016ecbed117178Chia-I Wu}
76263b572010554d62c3463c8db4e016ecbed117178Chia-I Wu
763176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wubool
7648ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wuilo_resource_rename_bo(struct pipe_resource *res)
765176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
7668ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   if (res->target == PIPE_BUFFER) {
7678ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      return buf_create_bo((struct ilo_buffer_resource *) res);
7688ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   } else {
7698ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      struct ilo_texture *tex = ilo_texture(res);
770176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
7718ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      /* an imported texture cannot be renamed */
7728ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      if (tex->imported)
7738ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu         return false;
774176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
7758ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      return tex_create_bo(tex);
7768ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   }
777176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu}
778