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