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