163b572010554d62c3463c8db4e016ecbed117178Chia-I Wu/* 263b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Mesa 3-D graphics library 363b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * 463b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Copyright (C) 2012-2013 LunarG, Inc. 563b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * 663b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 763b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * copy of this software and associated documentation files (the "Software"), 863b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * to deal in the Software without restriction, including without limitation 963b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1063b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 1163b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Software is furnished to do so, subject to the following conditions: 1263b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * 1363b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * The above copyright notice and this permission notice shall be included 1463b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * in all copies or substantial portions of the Software. 1563b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * 1663b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1763b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1863b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1963b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2063b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2163b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2263b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * DEALINGS IN THE SOFTWARE. 2363b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * 2463b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Authors: 2563b572010554d62c3463c8db4e016ecbed117178Chia-I Wu * Chia-I Wu <olv@lunarg.com> 2663b572010554d62c3463c8db4e016ecbed117178Chia-I Wu */ 2763b572010554d62c3463c8db4e016ecbed117178Chia-I Wu 2863b572010554d62c3463c8db4e016ecbed117178Chia-I Wu#ifndef ILO_RESOURCE_H 2963b572010554d62c3463c8db4e016ecbed117178Chia-I Wu#define ILO_RESOURCE_H 3063b572010554d62c3463c8db4e016ecbed117178Chia-I Wu 31bbe91576b7f5d69dc201f411cce5e619498cfef5Chia-I Wu#include "core/intel_winsys.h" 32ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu#include "core/ilo_image.h" 3336d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu#include "core/ilo_vma.h" 343a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu 3563b572010554d62c3463c8db4e016ecbed117178Chia-I Wu#include "ilo_common.h" 367fdab3b201bd2a011e8e0b0b15aca7b7fb5a7aa5Chia-I Wu#include "ilo_screen.h" 3763b572010554d62c3463c8db4e016ecbed117178Chia-I Wu 3877e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wuenum ilo_texture_flags { 394afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu /* 404afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * Possible writers of a texture. There can be at most one writer at any 414afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * time. 424afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * 434afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * Wine set in resolve flags (in ilo_blit_resolve_slices()), they indicate 444afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * the new writer. When set in slice flags (ilo_texture_slice::flags), 454afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * they indicate the writer since last resolve. 464afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu */ 4777e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu ILO_TEXTURE_RENDER_WRITE = 1 << 0, 4877e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu ILO_TEXTURE_BLT_WRITE = 1 << 1, 4977e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu ILO_TEXTURE_CPU_WRITE = 1 << 2, 504afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu 514afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu /* 524afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * Possible readers of a texture. There may be multiple readers at any 534afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * time. 544afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * 554afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * When set in resolve flags, they indicate the new readers. They are 564afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * never set in slice flags. 574afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu */ 5877e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu ILO_TEXTURE_RENDER_READ = 1 << 3, 5977e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu ILO_TEXTURE_BLT_READ = 1 << 4, 6077e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu ILO_TEXTURE_CPU_READ = 1 << 5, 614afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu 624afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu /* 634afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * Set when the texture is cleared. 644afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * 654afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu * When set in resolve flags, the new writer will clear. When set in slice 66f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu * flags, the slice has been cleared to ilo_texture_slice::clear_value. 674afb8a7fb5a5f0581ba1bbf608033e69dab6dbb3Chia-I Wu */ 6877e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu ILO_TEXTURE_CLEAR = 1 << 6, 6977e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu}; 7077e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu 71846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu/** 72846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu * A 3D image slice, cube face, or array layer. 73846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu */ 74846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wustruct ilo_texture_slice { 7577e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu unsigned flags; 76f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu 77f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu /* 78f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu * Slice clear value. It is served for two purposes 79f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu * 80f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu * - the clear value used in commands such as 3DSTATE_CLEAR_PARAMS 81f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu * - the clear value when ILO_TEXTURE_CLEAR is set 82f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu * 83f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu * Since commands such as 3DSTATE_CLEAR_PARAMS expect a single clear value 84f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu * for all slices, ilo_blit_resolve_slices() will silently make all slices 85f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu * to have the same clear value. 86f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu */ 87f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu uint32_t clear_value; 88846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu}; 89846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu 90768296dd05fce98b7ad5219c647ded087b287742Chia-I Wustruct ilo_texture { 913a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu struct pipe_resource base; 92176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu 93176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu bool imported; 943a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu 95cbdc26aa3f76dc20285caa7e62ca8809cb2fe638Chia-I Wu enum pipe_format image_format; 96ac47563cb40a79ec2bf149c6d9916a9d66361753Chia-I Wu struct ilo_image image; 9736d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu struct ilo_vma vma; 9836d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu struct ilo_vma aux_vma; 993a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu 100fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu /* XXX thread-safety */ 101846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu struct ilo_texture_slice *slices[PIPE_MAX_TEXTURE_LEVELS]; 1026b894e6900c2705c31d1af920a85389262e90bb3Chia-I Wu 103fb3d506431871fdb04fc84bbcc916d8f9d7c9954Chia-I Wu struct ilo_texture *separate_s8; 1043a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu}; 1053a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu 1068ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wustruct ilo_buffer_resource { 1078ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu struct pipe_resource base; 1088ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu 1099871646c132ba137709b0bfebfe285985dc351e6Chia-I Wu uint32_t bo_size; 11036d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu struct ilo_vma vma; 1118ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu}; 1128ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wu 11336d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wustatic inline struct ilo_buffer_resource * 11436d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wuilo_buffer_resource(struct pipe_resource *res) 115176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu{ 11636d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu return (struct ilo_buffer_resource *) 11736d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu ((res && res->target == PIPE_BUFFER) ? res : NULL); 118176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu} 119176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu 120768296dd05fce98b7ad5219c647ded087b287742Chia-I Wustatic inline struct ilo_texture * 121768296dd05fce98b7ad5219c647ded087b287742Chia-I Wuilo_texture(struct pipe_resource *res) 1223a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu{ 123176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu return (struct ilo_texture *) 124176ad54c04f5b945e47b61a3cad4b6c87d883a41Chia-I Wu ((res && res->target != PIPE_BUFFER) ? res : NULL); 1253a4a570c34eb20d28c24d1fd18c9781740abf6e5Chia-I Wu} 12663b572010554d62c3463c8db4e016ecbed117178Chia-I Wu 12763b572010554d62c3463c8db4e016ecbed117178Chia-I Wuvoid 12863b572010554d62c3463c8db4e016ecbed117178Chia-I Wuilo_init_resource_functions(struct ilo_screen *is); 12963b572010554d62c3463c8db4e016ecbed117178Chia-I Wu 130528ac68f7a5225be5d624b6eca91be11122dfa91Chia-I Wubool 1318ab18262c5984736b11b28a30a7facda0d6c65e8Chia-I Wuilo_resource_rename_bo(struct pipe_resource *res); 13263b572010554d62c3463c8db4e016ecbed117178Chia-I Wu 133fb1820355b0178f04622201688449cf2154feb42Chia-I Wu/** 13436d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu * Return the VMA of the resource. 135fb1820355b0178f04622201688449cf2154feb42Chia-I Wu */ 13636d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wustatic inline const struct ilo_vma * 13736d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wuilo_resource_get_vma(struct pipe_resource *res) 138fb1820355b0178f04622201688449cf2154feb42Chia-I Wu{ 139fb1820355b0178f04622201688449cf2154feb42Chia-I Wu return (res->target == PIPE_BUFFER) ? 14036d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu &((struct ilo_buffer_resource *) res)->vma : 14136d107e92cc4c1d2b60e0017dbe998af3a2e8b75Chia-I Wu &((struct ilo_texture *) res)->vma; 142fb1820355b0178f04622201688449cf2154feb42Chia-I Wu} 143fb1820355b0178f04622201688449cf2154feb42Chia-I Wu 144846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wustatic inline struct ilo_texture_slice * 145846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wuilo_texture_get_slice(const struct ilo_texture *tex, 146846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu unsigned level, unsigned slice) 147846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu{ 148846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu assert(level <= tex->base.last_level); 149846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu assert(slice < ((tex->base.target == PIPE_TEXTURE_3D) ? 150846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu u_minify(tex->base.depth0, level) : tex->base.array_size)); 151846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu 152846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu return &tex->slices[level][slice]; 153846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu} 154846f70a6ef8be5297eb6f4cf9cf8dc36ce22b818Chia-I Wu 15577e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wustatic inline void 15677e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wuilo_texture_set_slice_flags(struct ilo_texture *tex, unsigned level, 15777e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu unsigned first_slice, unsigned num_slices, 15877e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu unsigned mask, unsigned value) 15977e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu{ 160af57378e599c00711bf1109fb84e6032668ecaa4Chia-I Wu const struct ilo_texture_slice *last = 161af57378e599c00711bf1109fb84e6032668ecaa4Chia-I Wu ilo_texture_get_slice(tex, level, first_slice + num_slices - 1); 16277e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu struct ilo_texture_slice *slice = 16377e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu ilo_texture_get_slice(tex, level, first_slice); 16477e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu 165af57378e599c00711bf1109fb84e6032668ecaa4Chia-I Wu while (slice <= last) { 16677e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu slice->flags = (slice->flags & ~mask) | (value & mask); 16777e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu slice++; 16877e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu } 16977e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu} 17077e3db464f108531e5d4b3a7547aca234b5619d6Chia-I Wu 171f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wustatic inline void 172f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wuilo_texture_set_slice_clear_value(struct ilo_texture *tex, unsigned level, 173f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu unsigned first_slice, unsigned num_slices, 174f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu uint32_t clear_value) 175f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu{ 176f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu const struct ilo_texture_slice *last = 177f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu ilo_texture_get_slice(tex, level, first_slice + num_slices - 1); 178f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu struct ilo_texture_slice *slice = 179f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu ilo_texture_get_slice(tex, level, first_slice); 180f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu 181f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu while (slice <= last) { 182f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu slice->clear_value = clear_value; 183f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu slice++; 184f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu } 185f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu} 186f57bddc7e431e553e946563d1030e5f239911c8bChia-I Wu 18763b572010554d62c3463c8db4e016ecbed117178Chia-I Wu#endif /* ILO_RESOURCE_H */ 188