ilo_resource.c revision f6ca4084c7eca649e5444ac20218d94bd2a88057
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#include "ilo_screen.h"
2963b572010554d62c3463c8db4e016ecbed117178Chia-I Wu#include "ilo_resource.h"
3063b572010554d62c3463c8db4e016ecbed117178Chia-I Wu
3181d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu/*
32c25fe88ebf0939ac1972cc0994819c27408ca59eChia-I Wu * From the Ivy Bridge PRM, volume 1 part 1, page 105:
33c25fe88ebf0939ac1972cc0994819c27408ca59eChia-I Wu *
34c25fe88ebf0939ac1972cc0994819c27408ca59eChia-I Wu *     "In addition to restrictions on maximum height, width, and depth,
35c25fe88ebf0939ac1972cc0994819c27408ca59eChia-I Wu *      surfaces are also restricted to a maximum size in bytes. This
36c25fe88ebf0939ac1972cc0994819c27408ca59eChia-I Wu *      maximum is 2 GB for all products and all surface types."
3781d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu */
38fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wustatic const size_t ilo_max_resource_size = 1u << 31;
3981d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
40cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wustatic const char *
41cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wuresource_get_bo_name(const struct pipe_resource *templ)
42cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu{
43cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   static const char *target_names[PIPE_MAX_TEXTURE_TYPES] = {
44cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_BUFFER] = "buf",
45cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_1D] = "tex-1d",
46cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_2D] = "tex-2d",
47cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_3D] = "tex-3d",
48cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_CUBE] = "tex-cube",
49cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_RECT] = "tex-rect",
50cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_1D_ARRAY] = "tex-1d-array",
51cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_2D_ARRAY] = "tex-2d-array",
52cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      [PIPE_TEXTURE_CUBE_ARRAY] = "tex-cube-array",
53cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   };
54cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   const char *name = target_names[templ->target];
55cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu
56cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   if (templ->target == PIPE_BUFFER) {
57cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      switch (templ->bind) {
58cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      case PIPE_BIND_VERTEX_BUFFER:
59cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         name = "buf-vb";
60cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         break;
61cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      case PIPE_BIND_INDEX_BUFFER:
62cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         name = "buf-ib";
63cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         break;
64cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      case PIPE_BIND_CONSTANT_BUFFER:
65cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         name = "buf-cb";
66cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         break;
67cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      case PIPE_BIND_STREAM_OUTPUT:
68cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         name = "buf-so";
69cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         break;
70cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      default:
71cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu         break;
72cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu      }
73cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   }
74cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu
75cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   return name;
76cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu}
77cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu
78fbb869c1aaf6aa5400028556e23bbbb1ba41ce42Chia-I Wustatic bool
79fbb869c1aaf6aa5400028556e23bbbb1ba41ce42Chia-I Wuresource_get_cpu_init(const struct pipe_resource *templ)
80cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu{
81cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   return (templ->bind & (PIPE_BIND_DEPTH_STENCIL |
82cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu                          PIPE_BIND_RENDER_TARGET |
83fbb869c1aaf6aa5400028556e23bbbb1ba41ce42Chia-I Wu                          PIPE_BIND_STREAM_OUTPUT)) ? false : true;
84cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu}
85cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu
860ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wustatic enum gen_surface_tiling
870ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wuwinsys_to_surface_tiling(enum intel_tiling_mode tiling)
880ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu{
890ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   switch (tiling) {
900ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   case INTEL_TILING_NONE:
910ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return GEN6_TILING_NONE;
920ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   case INTEL_TILING_X:
930ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return GEN6_TILING_X;
940ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   case INTEL_TILING_Y:
950ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return GEN6_TILING_Y;
960ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   default:
970ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      assert(!"unknown tiling");
980ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return GEN6_TILING_NONE;
990ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   }
1000ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu}
1010ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu
1020ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wustatic inline enum intel_tiling_mode
1030ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wusurface_to_winsys_tiling(enum gen_surface_tiling tiling)
1040ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu{
1050ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   switch (tiling) {
1060ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   case GEN6_TILING_NONE:
1070ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return INTEL_TILING_NONE;
1080ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   case GEN6_TILING_X:
1090ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return INTEL_TILING_X;
1100ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   case GEN6_TILING_Y:
1110ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return INTEL_TILING_Y;
1120ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   default:
1130ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      assert(!"unknown tiling");
1140ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      return GEN6_TILING_NONE;
1150ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   }
1160ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu}
1170ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu
118176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wustatic void
119176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wutex_free_slices(struct ilo_texture *tex)
120176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
121846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu   FREE(tex->slices[0]);
122176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu}
1233a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
124176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wustatic bool
125176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wutex_alloc_slices(struct ilo_texture *tex)
126176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
127176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   const struct pipe_resource *templ = &tex->base;
128176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   struct ilo_texture_slice *slices;
129176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   int depth, lv;
130176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
131176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   /* sum the depths of all levels */
132176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   depth = 0;
133176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   for (lv = 0; lv <= templ->last_level; lv++)
134176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      depth += u_minify(templ->depth0, lv);
135dd62e7bc02f705c367af37a38f572758a8d1bc37Chia-I Wu
136dd62e7bc02f705c367af37a38f572758a8d1bc37Chia-I Wu   /*
137176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu    * There are (depth * tex->base.array_size) slices in total.  Either depth
138176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu    * is one (non-3D) or templ->array_size is one (non-array), but it does
139176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu    * not matter.
1403a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu    */
141176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   slices = CALLOC(depth * templ->array_size, sizeof(*slices));
142176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (!slices)
143176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return false;
1443a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
145846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu   tex->slices[0] = slices;
1463a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
147176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   /* point to the respective positions in the buffer */
148176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   for (lv = 1; lv <= templ->last_level; lv++) {
149846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu      tex->slices[lv] = tex->slices[lv - 1] +
150176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu         u_minify(templ->depth0, lv - 1) * templ->array_size;
1513a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   }
1523a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
153176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   return true;
1543a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
1553a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
1563f79188854fd7f63ad1eb0d4ab1fc24117fd0d78Chia-I Wustatic bool
157cbc943c43ec5ce5ba625b2833bf7f911e798254eChia-I Wutex_create_bo(struct ilo_texture *tex)
158cbc943c43ec5ce5ba625b2833bf7f911e798254eChia-I Wu{
159cbc943c43ec5ce5ba625b2833bf7f911e798254eChia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
160cbc943c43ec5ce5ba625b2833bf7f911e798254eChia-I Wu   const char *name = resource_get_bo_name(&tex->base);
161fbb869c1aaf6aa5400028556e23bbbb1ba41ce42Chia-I Wu   const bool cpu_init = resource_get_cpu_init(&tex->base);
16270ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu   struct intel_bo *bo;
163176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
16419351af53dfffb8543d21a58be9c9f9a52b3ba62Chia-I Wu   bo = intel_winsys_alloc_bo(is->dev.winsys, name,
165ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu         tex->image.bo_stride * tex->image.bo_height, cpu_init);
16670ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu
16770ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu   /* set the tiling for transfer and export */
168ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   if (bo && (tex->image.tiling == GEN6_TILING_X ||
169ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu              tex->image.tiling == GEN6_TILING_Y)) {
17070ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu      const enum intel_tiling_mode tiling =
171ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu         surface_to_winsys_tiling(tex->image.tiling);
17270ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu
173ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu      if (intel_bo_set_tiling(bo, tiling, tex->image.bo_stride)) {
1744ddd981e407f9e97fcbb862c241f1ce165616fd4Chia-I Wu         intel_bo_unref(bo);
17570ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu         bo = NULL;
17670ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu      }
17770ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu   }
1783afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   if (!bo)
1793afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu      return false;
1800ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu
1813afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   ilo_image_set_bo(&tex->image, bo);
1823afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   intel_bo_unref(bo);
1833f79188854fd7f63ad1eb0d4ab1fc24117fd0d78Chia-I Wu
1843afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   return true;
1853a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
1863a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
187e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wustatic bool
188e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wutex_create_separate_stencil(struct ilo_texture *tex)
189e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu{
190e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   struct pipe_resource templ = tex->base;
191e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   struct pipe_resource *s8;
192e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu
193e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   /*
194e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu    * Unless PIPE_BIND_DEPTH_STENCIL is set, the resource may have other
195e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu    * tilings.  But that should be fine since it will never be bound as the
196e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu    * stencil buffer, and our transfer code can handle all tilings.
197e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu    */
198e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   templ.format = PIPE_FORMAT_S8_UINT;
199e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu
200bca6c8572f68a21e43982ffec057b30f35465965Chia-I Wu   /* no stencil texturing */
201bca6c8572f68a21e43982ffec057b30f35465965Chia-I Wu   templ.bind &= ~PIPE_BIND_SAMPLER_VIEW;
202bca6c8572f68a21e43982ffec057b30f35465965Chia-I Wu
203e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   s8 = tex->base.screen->resource_create(tex->base.screen, &templ);
204e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   if (!s8)
205e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu      return false;
206e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu
207e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   tex->separate_s8 = ilo_texture(s8);
208e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu
209ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   assert(tex->separate_s8->image.format == PIPE_FORMAT_S8_UINT);
210e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu
211e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu   return true;
212e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu}
213e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu
214546416d49597c4879d045707d5587317e77e160cChia-I Wustatic bool
215fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wutex_create_hiz(struct ilo_texture *tex)
216546416d49597c4879d045707d5587317e77e160cChia-I Wu{
217fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   const struct pipe_resource *templ = &tex->base;
218546416d49597c4879d045707d5587317e77e160cChia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
2193afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   struct intel_bo *bo;
22081d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu   unsigned lv;
221546416d49597c4879d045707d5587317e77e160cChia-I Wu
2223afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   bo = intel_winsys_alloc_bo(is->dev.winsys, "hiz texture",
223c209aa7a8f08acb89f7294328589f47a88b44703Chia-I Wu         tex->image.aux.bo_stride * tex->image.aux.bo_height, false);
2243afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   if (!bo)
225546416d49597c4879d045707d5587317e77e160cChia-I Wu      return false;
226546416d49597c4879d045707d5587317e77e160cChia-I Wu
2273afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   ilo_image_set_aux_bo(&tex->image, bo);
2283afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu
2297fdab3b201bd2a011e8e0b0b15aca7b7fb5a7aa5Chia-I Wu   for (lv = 0; lv <= templ->last_level; lv++) {
230c209aa7a8f08acb89f7294328589f47a88b44703Chia-I Wu      if (tex->image.aux.enables & (1 << lv)) {
231fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu         const unsigned num_slices = (templ->target == PIPE_TEXTURE_3D) ?
232fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu            u_minify(templ->depth0, lv) : templ->array_size;
233fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu         unsigned flags = ILO_TEXTURE_HIZ;
234f8d19a58dcb4fbdc453549cfd3884145ae28f073Chia-I Wu
235f8d19a58dcb4fbdc453549cfd3884145ae28f073Chia-I Wu         /* this will trigger a HiZ resolve */
236f8d19a58dcb4fbdc453549cfd3884145ae28f073Chia-I Wu         if (tex->imported)
237f8d19a58dcb4fbdc453549cfd3884145ae28f073Chia-I Wu            flags |= ILO_TEXTURE_CPU_WRITE;
238f8d19a58dcb4fbdc453549cfd3884145ae28f073Chia-I Wu
239f8d19a58dcb4fbdc453549cfd3884145ae28f073Chia-I Wu         ilo_texture_set_slice_flags(tex, lv, 0, num_slices, flags, flags);
2407fdab3b201bd2a011e8e0b0b15aca7b7fb5a7aa5Chia-I Wu      }
2417fdab3b201bd2a011e8e0b0b15aca7b7fb5a7aa5Chia-I Wu   }
2427fdab3b201bd2a011e8e0b0b15aca7b7fb5a7aa5Chia-I Wu
243546416d49597c4879d045707d5587317e77e160cChia-I Wu   return true;
244546416d49597c4879d045707d5587317e77e160cChia-I Wu}
245546416d49597c4879d045707d5587317e77e160cChia-I Wu
24681d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wustatic bool
247fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wutex_create_mcs(struct ilo_texture *tex)
24881d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu{
249fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
2503afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   struct intel_bo *bo;
25181d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
252c209aa7a8f08acb89f7294328589f47a88b44703Chia-I Wu   assert(tex->image.aux.enables == (1 << (tex->base.last_level + 1)) - 1);
25381d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
2543afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   bo = intel_winsys_alloc_bo(is->dev.winsys, "mcs texture",
255c209aa7a8f08acb89f7294328589f47a88b44703Chia-I Wu         tex->image.aux.bo_stride * tex->image.aux.bo_height, false);
2563afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   if (!bo)
257fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      return false;
258fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu
2593afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   ilo_image_set_aux_bo(&tex->image, bo);
2603afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu
261fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   return true;
262fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu}
263fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu
264fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wustatic void
265fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wutex_destroy(struct ilo_texture *tex)
266fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu{
267fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   if (tex->separate_s8)
268fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      tex_destroy(tex->separate_s8);
269fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu
2703afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   ilo_image_cleanup(&tex->image);
271fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu
272fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   tex_free_slices(tex);
273fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   FREE(tex);
274fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu}
275fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu
276fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wustatic bool
277f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wutex_alloc_bos(struct ilo_texture *tex)
278fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu{
279fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
28081d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
281f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   if (!tex->imported && !tex_create_bo(tex))
282f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu      return false;
28381d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
28481d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu   /* allocate separate stencil resource */
285ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   if (tex->image.separate_stencil && !tex_create_separate_stencil(tex))
28681d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu      return false;
28781d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
288c209aa7a8f08acb89f7294328589f47a88b44703Chia-I Wu   switch (tex->image.aux.type) {
289ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   case ILO_IMAGE_AUX_HIZ:
290fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      if (!tex_create_hiz(tex)) {
291fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu         /* Separate Stencil Buffer requires HiZ to be enabled */
29256d2ebb019f38d727a41f8f4a8ebd4f1aeee19e0Chia-I Wu         if (ilo_dev_gen(&is->dev) == ILO_GEN(6) &&
293ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu             tex->image.separate_stencil)
294fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu            return false;
295fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      }
296fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      break;
297ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   case ILO_IMAGE_AUX_MCS:
298fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      if (!tex_create_mcs(tex))
29981d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu         return false;
300fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      break;
301fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   default:
302fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      break;
30381d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu   }
30481d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
30581d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu   return true;
30681d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu}
30781d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
3087395432f2e792f8719b03bb39b0cf5cba8ba583bChia-I Wustatic bool
309f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wutex_import_handle(struct ilo_texture *tex,
310f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu                  const struct winsys_handle *handle)
311f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu{
312f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
313f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   const struct pipe_resource *templ = &tex->base;
314f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   const char *name = resource_get_bo_name(&tex->base);
315f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   enum intel_tiling_mode tiling;
316f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   unsigned long pitch;
317f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   struct intel_bo *bo;
318f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu
319f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   bo = intel_winsys_import_handle(is->dev.winsys, name, handle,
320f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu         tex->image.bo_height, &tiling, &pitch);
321f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   if (!bo)
322f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu      return false;
323f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu
324f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   if (!ilo_image_init_for_imported(&tex->image, &is->dev, templ,
325f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu            winsys_to_surface_tiling(tiling), pitch)) {
326f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu      ilo_err("failed to import handle for texture\n");
327f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu      intel_bo_unref(bo);
328f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu      return false;
329f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   }
330f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu
331f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   ilo_image_set_bo(&tex->image, bo);
332f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   intel_bo_unref(bo);
333f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu
334f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   tex->imported = true;
335f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu
336f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   return true;
337f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu}
338f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu
339f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wustatic bool
340f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wutex_init_image(struct ilo_texture *tex,
341f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu               const struct winsys_handle *handle)
3427395432f2e792f8719b03bb39b0cf5cba8ba583bChia-I Wu{
343fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
3447395432f2e792f8719b03bb39b0cf5cba8ba583bChia-I Wu   const struct pipe_resource *templ = &tex->base;
345ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   struct ilo_image *img = &tex->image;
3467395432f2e792f8719b03bb39b0cf5cba8ba583bChia-I Wu
347f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   if (handle) {
348f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu      if (!tex_import_handle(tex, handle))
349f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu         return false;
350f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   } else {
351f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu      ilo_image_init(img, &is->dev, templ);
352f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   }
3537395432f2e792f8719b03bb39b0cf5cba8ba583bChia-I Wu
354ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   if (img->bo_height > ilo_max_resource_size / img->bo_stride)
355fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      return false;
3565b1c516080989c950796a1e9087a07284887602bChia-I Wu
357fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   if (templ->flags & PIPE_RESOURCE_FLAG_MAP_PERSISTENT) {
358fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      /* require on-the-fly tiling/untiling or format conversion */
359ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu      if (img->tiling == GEN8_TILING_W || img->separate_stencil ||
360ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu          img->format != templ->format)
361fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu         return false;
362fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   }
3636b894e6900c2705c31d1af920a85389262e90bb3Chia-I Wu
364fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   if (!tex_alloc_slices(tex))
365fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      return false;
36681d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
367fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu   return true;
3683a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
3693a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
3703a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wustatic struct pipe_resource *
371176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wutex_create(struct pipe_screen *screen,
372176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu           const struct pipe_resource *templ,
373176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu           const struct winsys_handle *handle)
3743a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{
375768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   struct ilo_texture *tex;
3763a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
377768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   tex = CALLOC_STRUCT(ilo_texture);
378768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   if (!tex)
3793a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu      return NULL;
3803a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
381768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   tex->base = *templ;
382768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   tex->base.screen = screen;
383768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   pipe_reference_init(&tex->base.reference, 1);
3843a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
385f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   if (!tex_init_image(tex, handle)) {
386fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      FREE(tex);
3873a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu      return NULL;
3883a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   }
3893a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
390f6ca4084c7eca649e5444ac20218d94bd2a88057Chia-I Wu   if (!tex_alloc_bos(tex)) {
391e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu      tex_destroy(tex);
392e372819589c2a66620e63a2cd11582c6ce5fb8f0Chia-I Wu      return NULL;
3936b894e6900c2705c31d1af920a85389262e90bb3Chia-I Wu   }
3946b894e6900c2705c31d1af920a85389262e90bb3Chia-I Wu
395768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu   return &tex->base;
3963a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
3973a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
398176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wustatic bool
399176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wutex_get_handle(struct ilo_texture *tex, struct winsys_handle *handle)
400176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
40139226705b7ee79504b5b09669e5420cd7c374713Chia-I Wu   struct ilo_screen *is = ilo_screen(tex->base.screen);
4020ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   enum intel_tiling_mode tiling;
403176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   int err;
404176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
40570ef171e91582f60a010a4f0ea9f7ff5ba971ab4Chia-I Wu   /* must match what tex_create_bo() sets */
406ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   if (tex->image.tiling == GEN8_TILING_W)
4070ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu      tiling = INTEL_TILING_NONE;
4080ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu   else
409ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu      tiling = surface_to_winsys_tiling(tex->image.tiling);
4100ac706535a07d003b9a40f8bad5445dd50f6c35bChia-I Wu
4113afbeb115ab19164fb2e5bf8df88b6d03d39254bChia-I Wu   err = intel_winsys_export_handle(is->dev.winsys, tex->image.bo, tiling,
412ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu         tex->image.bo_stride, tex->image.bo_height, handle);
413176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
414176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   return !err;
415176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu}
416176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
4173f79188854fd7f63ad1eb0d4ab1fc24117fd0d78Chia-I Wustatic bool
4188ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wubuf_create_bo(struct ilo_buffer_resource *buf)
419176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
420176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   struct ilo_screen *is = ilo_screen(buf->base.screen);
421cf8c9947a844c570eb420eefc3a0ab2bef82dc96Chia-I Wu   const char *name = resource_get_bo_name(&buf->base);
422fbb869c1aaf6aa5400028556e23bbbb1ba41ce42Chia-I Wu   const bool cpu_init = resource_get_cpu_init(&buf->base);
4238ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   struct intel_bo *bo;
4248ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu
4258ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   bo = intel_winsys_alloc_bo(is->dev.winsys, name,
4268ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu         buf->buffer.bo_size, cpu_init);
4278ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   if (!bo)
4288ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      return false;
429176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
4308ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   ilo_buffer_set_bo(&buf->buffer, bo);
4318ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   intel_bo_unref(bo);
432176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
4338ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   return true;
434176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu}
435176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
436176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wustatic void
4378ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wubuf_destroy(struct ilo_buffer_resource *buf)
438176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
4398ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   ilo_buffer_cleanup(&buf->buffer);
440176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   FREE(buf);
441176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu}
442176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
443176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wustatic struct pipe_resource *
444176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wubuf_create(struct pipe_screen *screen, const struct pipe_resource *templ)
445176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
446c1a1a627c47f7d6eca1c36afc81ca4584e965963Chia-I Wu   const struct ilo_screen *is = ilo_screen(screen);
4478ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   struct ilo_buffer_resource *buf;
448176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
4498ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   buf = CALLOC_STRUCT(ilo_buffer_resource);
450176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (!buf)
451176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return NULL;
452176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
453176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   buf->base = *templ;
454176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   buf->base.screen = screen;
455176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   pipe_reference_init(&buf->base.reference, 1);
456176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
4578ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   ilo_buffer_init(&buf->buffer, &is->dev,
4588ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu         templ->width0, templ->bind, templ->flags);
45976713ed5d64028a434c15f4eb6572b01e5acaccaChia-I Wu
4608ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   if (buf->buffer.bo_size < templ->width0 ||
4618ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu       buf->buffer.bo_size > ilo_max_resource_size ||
46281d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu       !buf_create_bo(buf)) {
463176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      FREE(buf);
464176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return NULL;
465176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   }
466176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
467176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   return &buf->base;
468176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu}
469176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
4703a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wustatic boolean
4713a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wuilo_can_create_resource(struct pipe_screen *screen,
4723a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu                        const struct pipe_resource *templ)
4733a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{
474ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   struct ilo_image img;
475176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
476176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (templ->target == PIPE_BUFFER)
477fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu      return (templ->width0 <= ilo_max_resource_size);
47881d7f33e30e7f54c5b721085057a53f9cd958fe2Chia-I Wu
479ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   memset(&img, 0, sizeof(img));
480ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   ilo_image_init(&img, &ilo_screen(screen)->dev, templ);
4813a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
482ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu   return (img.bo_height <= ilo_max_resource_size / img.bo_stride);
4833a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
4843a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
4853a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wustatic struct pipe_resource *
4863a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wuilo_resource_create(struct pipe_screen *screen,
4873a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu                    const struct pipe_resource *templ)
4883a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{
489176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (templ->target == PIPE_BUFFER)
490176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return buf_create(screen, templ);
491176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   else
492176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return tex_create(screen, templ, NULL);
4933a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
4943a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
4953a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wustatic struct pipe_resource *
4963a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wuilo_resource_from_handle(struct pipe_screen *screen,
4973a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu                         const struct pipe_resource *templ,
4983a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu                         struct winsys_handle *handle)
4993a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{
500176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (templ->target == PIPE_BUFFER)
501176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return NULL;
502176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   else
503176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return tex_create(screen, templ, handle);
5043a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
5053a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
5063a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wustatic boolean
5073a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wuilo_resource_get_handle(struct pipe_screen *screen,
508768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu                        struct pipe_resource *res,
5093a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu                        struct winsys_handle *handle)
5103a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{
511176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (res->target == PIPE_BUFFER)
512176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return false;
513176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   else
514176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      return tex_get_handle(ilo_texture(res), handle);
5153a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
5163a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
5173a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
5183a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wustatic void
5193a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wuilo_resource_destroy(struct pipe_screen *screen,
520768296dd05fce98b7ad5219c647ded087b287742Chia-I Wu                     struct pipe_resource *res)
5213a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{
522176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   if (res->target == PIPE_BUFFER)
5238ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      buf_destroy((struct ilo_buffer_resource *) res);
524176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu   else
525176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu      tex_destroy(ilo_texture(res));
5263a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}
5273a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu
52863b572010554d62c3463c8db4e016ecbed117178Chia-I Wu/**
52963b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Initialize resource-related functions.
53063b572010554d62c3463c8db4e016ecbed117178Chia-I Wu */
53163b572010554d62c3463c8db4e016ecbed117178Chia-I Wuvoid
53263b572010554d62c3463c8db4e016ecbed117178Chia-I Wuilo_init_resource_functions(struct ilo_screen *is)
53363b572010554d62c3463c8db4e016ecbed117178Chia-I Wu{
5343a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   is->base.can_create_resource = ilo_can_create_resource;
5353a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   is->base.resource_create = ilo_resource_create;
5363a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   is->base.resource_from_handle = ilo_resource_from_handle;
5373a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   is->base.resource_get_handle = ilo_resource_get_handle;
5383a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu   is->base.resource_destroy = ilo_resource_destroy;
53963b572010554d62c3463c8db4e016ecbed117178Chia-I Wu}
54063b572010554d62c3463c8db4e016ecbed117178Chia-I Wu
541176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wubool
5428ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wuilo_resource_rename_bo(struct pipe_resource *res)
543176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{
5448ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   if (res->target == PIPE_BUFFER) {
5458ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      return buf_create_bo((struct ilo_buffer_resource *) res);
5468ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   } else {
5478ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      struct ilo_texture *tex = ilo_texture(res);
548176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
5498ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      /* an imported texture cannot be renamed */
5508ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      if (tex->imported)
5518ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu         return false;
552176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu
5538ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu      return tex_create_bo(tex);
5548ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu   }
555176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu}
556