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