Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/drivers/zink/zink_context.h
4570 views
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_CONTEXT_H
25
#define ZINK_CONTEXT_H
26
27
#define ZINK_SHADER_COUNT (PIPE_SHADER_TYPES - 1)
28
29
#define ZINK_DEFAULT_MAX_DESCS 5000
30
31
#include "zink_clear.h"
32
#include "zink_pipeline.h"
33
#include "zink_batch.h"
34
#include "zink_compiler.h"
35
#include "zink_descriptors.h"
36
#include "zink_surface.h"
37
38
#include "pipe/p_context.h"
39
#include "pipe/p_state.h"
40
#include "util/u_rect.h"
41
#include "util/u_threaded_context.h"
42
43
#include "util/slab.h"
44
#include "util/list.h"
45
#include "util/u_dynarray.h"
46
47
#include <vulkan/vulkan.h>
48
49
#ifdef __cplusplus
50
extern "C" {
51
#endif
52
53
struct blitter_context;
54
struct list_head;
55
56
struct zink_blend_state;
57
struct zink_depth_stencil_alpha_state;
58
struct zink_gfx_program;
59
struct zink_rasterizer_state;
60
struct zink_resource;
61
struct zink_vertex_elements_state;
62
63
enum zink_blit_flags {
64
ZINK_BLIT_NORMAL = 1 << 0,
65
ZINK_BLIT_SAVE_FS = 1 << 1,
66
ZINK_BLIT_SAVE_FB = 1 << 2,
67
ZINK_BLIT_SAVE_TEXTURES = 1 << 3,
68
ZINK_BLIT_NO_COND_RENDER = 1 << 4,
69
};
70
71
struct zink_sampler_state {
72
VkSampler sampler;
73
uint32_t hash;
74
struct zink_descriptor_refs desc_set_refs;
75
struct zink_batch_usage *batch_uses;
76
bool custom_border_color;
77
};
78
79
struct zink_buffer_view {
80
struct pipe_reference reference;
81
VkBufferViewCreateInfo bvci;
82
VkBufferView buffer_view;
83
uint32_t hash;
84
struct zink_batch_usage *batch_uses;
85
struct zink_descriptor_refs desc_set_refs;
86
};
87
88
struct zink_sampler_view {
89
struct pipe_sampler_view base;
90
union {
91
struct zink_surface *image_view;
92
struct zink_buffer_view *buffer_view;
93
};
94
};
95
96
struct zink_image_view {
97
struct pipe_image_view base;
98
union {
99
struct zink_surface *surface;
100
struct zink_buffer_view *buffer_view;
101
};
102
};
103
104
static inline struct zink_sampler_view *
105
zink_sampler_view(struct pipe_sampler_view *pview)
106
{
107
return (struct zink_sampler_view *)pview;
108
}
109
110
struct zink_so_target {
111
struct pipe_stream_output_target base;
112
struct pipe_resource *counter_buffer;
113
VkDeviceSize counter_buffer_offset;
114
uint32_t stride;
115
bool counter_buffer_valid;
116
};
117
118
static inline struct zink_so_target *
119
zink_so_target(struct pipe_stream_output_target *so_target)
120
{
121
return (struct zink_so_target *)so_target;
122
}
123
124
struct zink_viewport_state {
125
struct pipe_viewport_state viewport_states[PIPE_MAX_VIEWPORTS];
126
struct pipe_scissor_state scissor_states[PIPE_MAX_VIEWPORTS];
127
uint8_t num_viewports;
128
};
129
130
131
struct zink_descriptor_surface {
132
union {
133
struct zink_surface *surface;
134
struct zink_buffer_view *bufferview;
135
};
136
bool is_buffer;
137
};
138
139
struct zink_context {
140
struct pipe_context base;
141
struct threaded_context *tc;
142
struct slab_child_pool transfer_pool;
143
struct slab_child_pool transfer_pool_unsync;
144
struct blitter_context *blitter;
145
146
struct pipe_device_reset_callback reset;
147
148
uint32_t curr_batch; //the current batch id
149
150
simple_mtx_t batch_mtx;
151
struct zink_fence *deferred_fence;
152
struct zink_fence *last_fence; //the last command buffer submitted
153
struct hash_table batch_states; //submitted batch states
154
struct util_dynarray free_batch_states; //unused batch states
155
VkDeviceSize resource_size; //the accumulated size of resources in submitted buffers
156
struct zink_batch batch;
157
158
unsigned shader_has_inlinable_uniforms_mask;
159
unsigned inlinable_uniforms_valid_mask;
160
uint32_t inlinable_uniforms[PIPE_SHADER_TYPES][MAX_INLINABLE_UNIFORMS];
161
162
struct pipe_constant_buffer ubos[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];
163
struct pipe_shader_buffer ssbos[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_BUFFERS];
164
uint32_t writable_ssbos[PIPE_SHADER_TYPES];
165
struct zink_image_view image_views[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_IMAGES];
166
167
struct pipe_framebuffer_state fb_state;
168
169
struct zink_vertex_elements_state *element_state;
170
struct zink_rasterizer_state *rast_state;
171
struct zink_depth_stencil_alpha_state *dsa_state;
172
173
struct hash_table desc_set_layouts[ZINK_DESCRIPTOR_TYPES];
174
bool pipeline_changed[2]; //gfx, compute
175
176
struct zink_shader *gfx_stages[ZINK_SHADER_COUNT];
177
struct zink_shader *last_vertex_stage;
178
struct zink_gfx_pipeline_state gfx_pipeline_state;
179
enum pipe_prim_type gfx_prim_mode;
180
struct hash_table *program_cache;
181
struct zink_gfx_program *curr_program;
182
183
struct zink_descriptor_data *dd;
184
185
struct zink_shader *compute_stage;
186
struct zink_compute_pipeline_state compute_pipeline_state;
187
struct hash_table *compute_program_cache;
188
struct zink_compute_program *curr_compute;
189
190
unsigned dirty_shader_stages : 6; /* mask of changed shader stages */
191
bool last_vertex_stage_dirty;
192
193
struct hash_table *render_pass_cache;
194
bool new_swapchain;
195
bool fb_changed;
196
bool rp_changed;
197
198
struct zink_framebuffer *framebuffer;
199
struct zink_framebuffer_clear fb_clears[PIPE_MAX_COLOR_BUFS + 1];
200
uint16_t clears_enabled;
201
uint16_t rp_clears_enabled;
202
203
struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS];
204
bool vertex_buffers_dirty;
205
206
void *sampler_states[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
207
struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
208
209
struct zink_viewport_state vp_state;
210
bool vp_state_changed;
211
bool scissor_changed;
212
213
float line_width;
214
float blend_constants[4];
215
216
bool sample_locations_changed;
217
VkSampleLocationEXT vk_sample_locations[PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE * PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE];
218
uint8_t sample_locations[2 * 4 * 8 * 16];
219
220
bool drawid_broken;
221
222
struct pipe_stencil_ref stencil_ref;
223
224
union {
225
struct {
226
float default_inner_level[2];
227
float default_outer_level[4];
228
};
229
float tess_levels[6];
230
};
231
232
struct list_head suspended_queries;
233
struct list_head primitives_generated_queries;
234
bool queries_disabled, render_condition_active;
235
struct {
236
struct zink_query *query;
237
bool inverted;
238
} render_condition;
239
240
struct pipe_resource *dummy_vertex_buffer;
241
struct pipe_resource *dummy_xfb_buffer;
242
struct pipe_surface *dummy_surface;
243
struct zink_buffer_view *dummy_bufferview;
244
245
struct {
246
/* descriptor info */
247
VkDescriptorBufferInfo ubos[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];
248
uint32_t push_valid;
249
uint8_t num_ubos[PIPE_SHADER_TYPES];
250
251
VkDescriptorBufferInfo ssbos[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_BUFFERS];
252
uint8_t num_ssbos[PIPE_SHADER_TYPES];
253
254
VkDescriptorImageInfo textures[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
255
VkBufferView tbos[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
256
uint8_t num_samplers[PIPE_SHADER_TYPES];
257
uint8_t num_sampler_views[PIPE_SHADER_TYPES];
258
259
VkDescriptorImageInfo images[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_IMAGES];
260
VkBufferView texel_images[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_IMAGES];
261
uint8_t num_images[PIPE_SHADER_TYPES];
262
263
struct zink_resource *descriptor_res[ZINK_DESCRIPTOR_TYPES][PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
264
struct zink_descriptor_surface sampler_surfaces[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
265
struct zink_descriptor_surface image_surfaces[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_IMAGES];
266
} di;
267
bool descriptor_refs_dirty[2];
268
struct set *need_barriers[2]; //gfx, compute
269
struct set update_barriers[2][2]; //[gfx, compute][current, next]
270
uint8_t barrier_set_idx[2];
271
272
uint32_t num_so_targets;
273
struct pipe_stream_output_target *so_targets[PIPE_MAX_SO_OUTPUTS];
274
bool dirty_so_targets;
275
bool xfb_barrier;
276
bool first_frame_done;
277
bool have_timelines;
278
279
bool is_device_lost;
280
bool rast_state_changed : 1;
281
bool dsa_state_changed : 1;
282
bool stencil_ref_changed : 1;
283
};
284
285
static inline struct zink_context *
286
zink_context(struct pipe_context *context)
287
{
288
return (struct zink_context *)context;
289
}
290
291
static inline bool
292
zink_fb_clear_enabled(const struct zink_context *ctx, unsigned idx)
293
{
294
if (idx == PIPE_MAX_COLOR_BUFS)
295
return ctx->clears_enabled & PIPE_CLEAR_DEPTHSTENCIL;
296
return ctx->clears_enabled & (PIPE_CLEAR_COLOR0 << idx);
297
}
298
299
struct zink_batch *
300
zink_batch_rp(struct zink_context *ctx);
301
302
struct zink_batch *
303
zink_batch_no_rp(struct zink_context *ctx);
304
305
void
306
zink_fence_wait(struct pipe_context *ctx);
307
308
void
309
zink_wait_on_batch(struct zink_context *ctx, uint32_t batch_id);
310
311
bool
312
zink_check_batch_completion(struct zink_context *ctx, uint32_t batch_id);
313
314
void
315
zink_flush_queue(struct zink_context *ctx);
316
317
void
318
zink_maybe_flush_or_stall(struct zink_context *ctx);
319
320
bool
321
zink_resource_access_is_write(VkAccessFlags flags);
322
323
void
324
zink_resource_buffer_barrier(struct zink_context *ctx, struct zink_batch *batch, struct zink_resource *res, VkAccessFlags flags, VkPipelineStageFlags pipeline);
325
void
326
zink_fake_buffer_barrier(struct zink_resource *res, VkAccessFlags flags, VkPipelineStageFlags pipeline);
327
bool
328
zink_resource_image_needs_barrier(struct zink_resource *res, VkImageLayout new_layout, VkAccessFlags flags, VkPipelineStageFlags pipeline);
329
bool
330
zink_resource_image_barrier_init(VkImageMemoryBarrier *imb, struct zink_resource *res, VkImageLayout new_layout, VkAccessFlags flags, VkPipelineStageFlags pipeline);
331
void
332
zink_resource_image_barrier(struct zink_context *ctx, struct zink_batch *batch, struct zink_resource *res,
333
VkImageLayout new_layout, VkAccessFlags flags, VkPipelineStageFlags pipeline);
334
335
bool
336
zink_resource_needs_barrier(struct zink_resource *res, VkImageLayout layout, VkAccessFlags flags, VkPipelineStageFlags pipeline);
337
void
338
zink_resource_barrier(struct zink_context *ctx, struct zink_batch *batch, struct zink_resource *res, VkImageLayout layout, VkAccessFlags flags, VkPipelineStageFlags pipeline);
339
340
void
341
zink_begin_render_pass(struct zink_context *ctx,
342
struct zink_batch *batch);
343
344
VkPipelineStageFlags
345
zink_pipeline_flags_from_stage(VkShaderStageFlagBits stage);
346
347
VkShaderStageFlagBits
348
zink_shader_stage(enum pipe_shader_type type);
349
350
struct pipe_context *
351
zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags);
352
353
void
354
zink_context_query_init(struct pipe_context *ctx);
355
356
void
357
zink_blit_begin(struct zink_context *ctx, enum zink_blit_flags flags);
358
359
void
360
zink_blit(struct pipe_context *pctx,
361
const struct pipe_blit_info *info);
362
363
bool
364
zink_blit_region_fills(struct u_rect region, unsigned width, unsigned height);
365
366
bool
367
zink_blit_region_covers(struct u_rect region, struct u_rect covers);
368
369
static inline struct u_rect
370
zink_rect_from_box(const struct pipe_box *box)
371
{
372
return (struct u_rect){box->x, box->x + box->width, box->y, box->y + box->height};
373
}
374
375
void
376
zink_resource_rebind(struct zink_context *ctx, struct zink_resource *res);
377
378
void
379
zink_rebind_framebuffer(struct zink_context *ctx, struct zink_resource *res);
380
381
void
382
zink_draw_vbo(struct pipe_context *pctx,
383
const struct pipe_draw_info *dinfo,
384
unsigned drawid_offset,
385
const struct pipe_draw_indirect_info *indirect,
386
const struct pipe_draw_start_count_bias *draws,
387
unsigned num_draws);
388
389
void
390
zink_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info);
391
392
void
393
zink_copy_buffer(struct zink_context *ctx, struct zink_batch *batch, struct zink_resource *dst, struct zink_resource *src,
394
unsigned dst_offset, unsigned src_offset, unsigned size);
395
396
void
397
zink_copy_image_buffer(struct zink_context *ctx, struct zink_batch *batch, struct zink_resource *dst, struct zink_resource *src,
398
unsigned dst_level, unsigned dstx, unsigned dsty, unsigned dstz,
399
unsigned src_level, const struct pipe_box *src_box, enum pipe_map_flags map_flags);
400
401
void
402
zink_destroy_buffer_view(struct zink_screen *screen, struct zink_buffer_view *buffer_view);
403
404
void
405
debug_describe_zink_buffer_view(char *buf, const struct zink_buffer_view *ptr);
406
407
static inline void
408
zink_buffer_view_reference(struct zink_screen *screen,
409
struct zink_buffer_view **dst,
410
struct zink_buffer_view *src)
411
{
412
struct zink_buffer_view *old_dst = dst ? *dst : NULL;
413
414
if (pipe_reference_described(old_dst ? &old_dst->reference : NULL, &src->reference,
415
(debug_reference_descriptor)debug_describe_zink_buffer_view))
416
zink_destroy_buffer_view(screen, old_dst);
417
if (dst) *dst = src;
418
}
419
420
void
421
zink_update_descriptor_refs(struct zink_context *ctx, bool compute);
422
423
void
424
zink_init_vk_sample_locations(struct zink_context *ctx, VkSampleLocationsInfoEXT *loc);
425
426
427
static inline VkPipelineStageFlags
428
zink_pipeline_flags_from_pipe_stage(enum pipe_shader_type pstage)
429
{
430
switch (pstage) {
431
case PIPE_SHADER_VERTEX:
432
return VK_PIPELINE_STAGE_VERTEX_SHADER_BIT;
433
case PIPE_SHADER_FRAGMENT:
434
return VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
435
case PIPE_SHADER_GEOMETRY:
436
return VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT;
437
case PIPE_SHADER_TESS_CTRL:
438
return VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT;
439
case PIPE_SHADER_TESS_EVAL:
440
return VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT;
441
case PIPE_SHADER_COMPUTE:
442
return VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
443
default:
444
unreachable("unknown shader stage");
445
}
446
}
447
448
#ifdef __cplusplus
449
}
450
#endif
451
452
#endif
453
454