zink_resource.h revision 7ec681f3
1/*
2 * Copyright 2018 Collabora Ltd.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23
24#ifndef ZINK_RESOURCE_H
25#define ZINK_RESOURCE_H
26
27struct pipe_screen;
28struct sw_displaytarget;
29struct zink_batch;
30struct zink_context;
31struct zink_bo;
32
33#include "util/hash_table.h"
34#include "util/simple_mtx.h"
35#include "util/u_transfer.h"
36#include "util/u_range.h"
37#include "util/u_dynarray.h"
38#include "util/u_threaded_context.h"
39
40#include "zink_batch.h"
41#include "zink_descriptors.h"
42
43#include <vulkan/vulkan.h>
44
45#define ZINK_MAP_TEMPORARY (PIPE_MAP_DRV_PRV << 0)
46#define ZINK_BIND_TRANSIENT (1 << 30) //transient fb attachment
47
48struct mem_key {
49   unsigned seen_count;
50   struct {
51      unsigned heap_index;
52      VkMemoryRequirements reqs;
53   } key;
54};
55
56struct zink_resource_object {
57   struct pipe_reference reference;
58
59   VkPipelineStageFlagBits access_stage;
60   VkAccessFlags access;
61   bool unordered_barrier;
62
63   unsigned persistent_maps; //if nonzero, requires vkFlushMappedMemoryRanges during batch use
64   struct zink_descriptor_refs desc_set_refs;
65
66   struct util_dynarray tmp;
67
68   union {
69      VkBuffer buffer;
70      VkImage image;
71   };
72
73   VkSampleLocationsInfoEXT zs_evaluate;
74   bool needs_zs_evaluate;
75
76   bool storage_init; //layout was set for image
77   bool transfer_dst;
78   bool is_buffer;
79   VkImageAspectFlags modifier_aspect;
80
81   struct zink_bo *bo;
82   VkDeviceSize offset, size, alignment;
83   VkImageCreateFlags vkflags;
84   VkImageUsageFlags vkusage;
85
86   bool host_visible;
87   bool coherent;
88};
89
90struct zink_resource {
91   struct threaded_resource base;
92
93   enum pipe_format internal_format:16;
94
95   struct zink_resource_object *obj;
96   struct zink_resource_object *scanout_obj; //TODO: remove for wsi
97   bool scanout_obj_init;
98   union {
99      struct {
100         struct util_range valid_buffer_range;
101         uint32_t vbo_bind_mask : PIPE_MAX_ATTRIBS;
102         uint8_t ubo_bind_count[2];
103         uint8_t so_bind_count;
104         bool so_valid;
105         uint32_t ubo_bind_mask[PIPE_SHADER_TYPES];
106         uint32_t ssbo_bind_mask[PIPE_SHADER_TYPES];
107      };
108      struct {
109         VkFormat format;
110         VkImageLayout layout;
111         VkImageAspectFlags aspect;
112         bool optimal_tiling;
113         uint8_t fb_binds;
114      };
115   };
116   uint32_t sampler_binds[PIPE_SHADER_TYPES];
117   uint16_t image_bind_count[2]; //gfx, compute
118   uint16_t write_bind_count[2]; //gfx, compute
119   uint16_t bindless[2]; //tex, img
120   union {
121      uint16_t bind_count[2]; //gfx, compute
122      uint32_t all_binds;
123   };
124
125   union {
126      struct {
127         struct hash_table bufferview_cache;
128         simple_mtx_t bufferview_mtx;
129      };
130      struct {
131         struct hash_table surface_cache;
132         simple_mtx_t surface_mtx;
133      };
134   };
135
136   bool dmabuf_acquire;
137   struct sw_displaytarget *dt;
138   unsigned dt_stride;
139
140   uint8_t modifiers_count;
141   uint64_t *modifiers;
142};
143
144struct zink_transfer {
145   struct threaded_transfer base;
146   struct pipe_resource *staging_res;
147   unsigned offset;
148   unsigned depthPitch;
149};
150
151static inline struct zink_resource *
152zink_resource(struct pipe_resource *r)
153{
154   return (struct zink_resource *)r;
155}
156
157bool
158zink_screen_resource_init(struct pipe_screen *pscreen);
159
160void
161zink_context_resource_init(struct pipe_context *pctx);
162
163void
164zink_get_depth_stencil_resources(struct pipe_resource *res,
165                                 struct zink_resource **out_z,
166                                 struct zink_resource **out_s);
167VkMappedMemoryRange
168zink_resource_init_mem_range(struct zink_screen *screen, struct zink_resource_object *obj, VkDeviceSize offset, VkDeviceSize size);
169void
170zink_resource_setup_transfer_layouts(struct zink_context *ctx, struct zink_resource *src, struct zink_resource *dst);
171
172void
173zink_destroy_resource_object(struct zink_screen *screen, struct zink_resource_object *resource_object);
174
175void
176debug_describe_zink_resource_object(char *buf, const struct zink_resource_object *ptr);
177
178static inline void
179zink_resource_object_reference(struct zink_screen *screen,
180                             struct zink_resource_object **dst,
181                             struct zink_resource_object *src)
182{
183   struct zink_resource_object *old_dst = dst ? *dst : NULL;
184
185   if (pipe_reference_described(old_dst ? &old_dst->reference : NULL, &src->reference,
186                                (debug_reference_descriptor)debug_describe_zink_resource_object))
187      zink_destroy_resource_object(screen, old_dst);
188   if (dst) *dst = src;
189}
190
191VkBuffer
192zink_resource_tmp_buffer(struct zink_screen *screen, struct zink_resource *res, unsigned offset_add, unsigned add_binds, unsigned *offset);
193
194bool
195zink_resource_object_init_storage(struct zink_context *ctx, struct zink_resource *res);
196
197static inline bool
198zink_resource_has_binds(const struct zink_resource *res)
199{
200   return res->all_binds > 0;
201}
202
203#ifndef __cplusplus
204#include "zink_bo.h"
205
206static inline bool
207zink_resource_usage_is_unflushed(const struct zink_resource *res)
208{
209   return zink_bo_has_unflushed_usage(res->obj->bo);
210}
211
212static inline bool
213zink_resource_usage_is_unflushed_write(const struct zink_resource *res)
214{
215   return zink_batch_usage_is_unflushed(res->obj->bo->writes);
216}
217
218
219static inline bool
220zink_resource_usage_matches(const struct zink_resource *res, const struct zink_batch_state *bs)
221{
222   return zink_bo_usage_matches(res->obj->bo, bs);
223}
224
225static inline bool
226zink_resource_has_usage(const struct zink_resource *res)
227{
228   return zink_bo_has_usage(res->obj->bo);
229}
230
231static inline bool
232zink_resource_has_unflushed_usage(const struct zink_resource *res)
233{
234   return zink_bo_has_unflushed_usage(res->obj->bo);
235}
236
237static inline bool
238zink_resource_usage_check_completion(struct zink_screen *screen, struct zink_resource *res, enum zink_resource_access access)
239{
240   return zink_bo_usage_check_completion(screen, res->obj->bo, access);
241}
242
243static inline void
244zink_resource_usage_wait(struct zink_context *ctx, struct zink_resource *res, enum zink_resource_access access)
245{
246   zink_bo_usage_wait(ctx, res->obj->bo, access);
247}
248
249static inline void
250zink_resource_usage_set(struct zink_resource *res, struct zink_batch_state *bs, bool write)
251{
252   zink_bo_usage_set(res->obj->bo, bs, write);
253}
254
255static inline bool
256zink_resource_object_usage_unset(struct zink_resource_object *obj, struct zink_batch_state *bs)
257{
258   return zink_bo_usage_unset(obj->bo, bs);
259}
260
261#endif
262#endif
263