Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/frontends/lavapipe/lvp_private.h
4565 views
1
/*
2
* Copyright © 2019 Red Hat.
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
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
* and/or sell copies of the Software, and to permit persons to whom the
9
* 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 NONINFRINGEMENT. IN NO EVENT SHALL
18
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
* IN THE SOFTWARE.
22
*/
23
24
#pragma once
25
#include <stdlib.h>
26
#include <stdio.h>
27
#include <stdbool.h>
28
#include <string.h>
29
#include <assert.h>
30
#include <stdint.h>
31
32
#include "util/macros.h"
33
#include "util/list.h"
34
35
#include "compiler/shader_enums.h"
36
#include "pipe/p_screen.h"
37
#include "pipe/p_state.h"
38
#include "cso_cache/cso_context.h"
39
#include "nir.h"
40
41
/* Pre-declarations needed for WSI entrypoints */
42
struct wl_surface;
43
struct wl_display;
44
typedef struct xcb_connection_t xcb_connection_t;
45
typedef uint32_t xcb_visualid_t;
46
typedef uint32_t xcb_window_t;
47
48
#define VK_PROTOTYPES
49
#include <vulkan/vulkan.h>
50
#include <vulkan/vk_icd.h>
51
52
#include "lvp_entrypoints.h"
53
#include "vk_device.h"
54
#include "vk_instance.h"
55
#include "vk_physical_device.h"
56
#include "vk_shader_module.h"
57
#include "vk_util.h"
58
#include "vk_format.h"
59
60
#include "wsi_common.h"
61
62
#include <assert.h>
63
#ifdef __cplusplus
64
extern "C" {
65
#endif
66
67
#define MAX_SETS 8
68
#define MAX_PUSH_CONSTANTS_SIZE 128
69
#define MAX_PUSH_DESCRIPTORS 32
70
71
#ifdef _WIN32
72
#define lvp_printflike(a, b)
73
#else
74
#define lvp_printflike(a, b) __attribute__((__format__(__printf__, a, b)))
75
#endif
76
77
int lvp_get_instance_entrypoint_index(const char *name);
78
int lvp_get_device_entrypoint_index(const char *name);
79
int lvp_get_physical_device_entrypoint_index(const char *name);
80
81
const char *lvp_get_instance_entry_name(int index);
82
const char *lvp_get_physical_device_entry_name(int index);
83
const char *lvp_get_device_entry_name(int index);
84
85
bool lvp_instance_entrypoint_is_enabled(int index, uint32_t core_version,
86
const struct vk_instance_extension_table *instance);
87
bool lvp_physical_device_entrypoint_is_enabled(int index, uint32_t core_version,
88
const struct vk_instance_extension_table *instance);
89
bool lvp_device_entrypoint_is_enabled(int index, uint32_t core_version,
90
const struct vk_instance_extension_table *instance,
91
const struct vk_device_extension_table *device);
92
93
94
/* Whenever we generate an error, pass it through this function. Useful for
95
* debugging, where we can break on it. Only call at error site, not when
96
* propagating errors. Might be useful to plug in a stack trace here.
97
*/
98
99
struct lvp_instance;
100
VkResult __vk_errorf(struct lvp_instance *instance, VkResult error, const char *file, int line, const char *format, ...);
101
102
#define LVP_DEBUG_ALL_ENTRYPOINTS (1 << 0)
103
104
#define vk_error(instance, error) __vk_errorf(instance, error, __FILE__, __LINE__, NULL);
105
#define vk_errorf(instance, error, format, ...) __vk_errorf(instance, error, __FILE__, __LINE__, format, ## __VA_ARGS__);
106
107
void __lvp_finishme(const char *file, int line, const char *format, ...)
108
lvp_printflike(3, 4);
109
110
#define lvp_finishme(format, ...) \
111
__lvp_finishme(__FILE__, __LINE__, format, ##__VA_ARGS__);
112
113
#define stub_return(v) \
114
do { \
115
lvp_finishme("stub %s", __func__); \
116
return (v); \
117
} while (0)
118
119
#define stub() \
120
do { \
121
lvp_finishme("stub %s", __func__); \
122
return; \
123
} while (0)
124
125
#define LVP_STAGE_MASK ((1 << MESA_SHADER_STAGES) - 1)
126
127
#define lvp_foreach_stage(stage, stage_bits) \
128
for (gl_shader_stage stage, \
129
__tmp = (gl_shader_stage)((stage_bits) & LVP_STAGE_MASK); \
130
stage = ffs(__tmp) - 1, __tmp; \
131
__tmp &= ~(1 << (stage)))
132
133
struct lvp_physical_device {
134
struct vk_physical_device vk;
135
136
struct pipe_loader_device *pld;
137
struct pipe_screen *pscreen;
138
uint32_t max_images;
139
140
struct wsi_device wsi_device;
141
};
142
143
struct lvp_instance {
144
struct vk_instance vk;
145
146
uint32_t apiVersion;
147
int physicalDeviceCount;
148
struct lvp_physical_device physicalDevice;
149
150
uint64_t debug_flags;
151
152
struct pipe_loader_device *devs;
153
int num_devices;
154
};
155
156
VkResult lvp_init_wsi(struct lvp_physical_device *physical_device);
157
void lvp_finish_wsi(struct lvp_physical_device *physical_device);
158
159
bool lvp_physical_device_extension_supported(struct lvp_physical_device *dev,
160
const char *name);
161
162
struct lvp_queue {
163
struct vk_object_base base;
164
VkDeviceQueueCreateFlags flags;
165
struct lvp_device * device;
166
struct pipe_context *ctx;
167
struct cso_context *cso;
168
bool shutdown;
169
thrd_t exec_thread;
170
mtx_t m;
171
cnd_t new_work;
172
struct list_head workqueue;
173
volatile int count;
174
};
175
176
struct lvp_queue_work {
177
struct list_head list;
178
uint32_t cmd_buffer_count;
179
struct lvp_cmd_buffer **cmd_buffers;
180
struct lvp_fence *fence;
181
};
182
183
struct lvp_pipeline_cache {
184
struct vk_object_base base;
185
struct lvp_device * device;
186
VkAllocationCallbacks alloc;
187
};
188
189
struct lvp_device {
190
struct vk_device vk;
191
192
struct lvp_queue queue;
193
struct lvp_instance * instance;
194
struct lvp_physical_device *physical_device;
195
struct pipe_screen *pscreen;
196
197
mtx_t fence_lock;
198
};
199
200
void lvp_device_get_cache_uuid(void *uuid);
201
202
struct lvp_device_memory {
203
struct vk_object_base base;
204
struct pipe_memory_allocation *pmem;
205
uint32_t type_index;
206
VkDeviceSize map_size;
207
void * map;
208
};
209
210
struct lvp_image {
211
struct vk_object_base base;
212
VkImageType type;
213
VkDeviceSize size;
214
uint32_t alignment;
215
struct pipe_memory_allocation *pmem;
216
unsigned memory_offset;
217
struct pipe_resource *bo;
218
};
219
220
static inline uint32_t
221
lvp_get_layerCount(const struct lvp_image *image,
222
const VkImageSubresourceRange *range)
223
{
224
return range->layerCount == VK_REMAINING_ARRAY_LAYERS ?
225
image->bo->array_size - range->baseArrayLayer : range->layerCount;
226
}
227
228
static inline uint32_t
229
lvp_get_levelCount(const struct lvp_image *image,
230
const VkImageSubresourceRange *range)
231
{
232
return range->levelCount == VK_REMAINING_MIP_LEVELS ?
233
(image->bo->last_level + 1) - range->baseMipLevel : range->levelCount;
234
}
235
236
struct lvp_image_create_info {
237
const VkImageCreateInfo *vk_info;
238
uint32_t bind_flags;
239
uint32_t stride;
240
};
241
242
VkResult
243
lvp_image_create(VkDevice _device,
244
const struct lvp_image_create_info *create_info,
245
const VkAllocationCallbacks* alloc,
246
VkImage *pImage);
247
248
struct lvp_image_view {
249
struct vk_object_base base;
250
const struct lvp_image *image; /**< VkImageViewCreateInfo::image */
251
252
VkImageViewType view_type;
253
VkFormat format;
254
enum pipe_format pformat;
255
VkComponentMapping components;
256
VkImageSubresourceRange subresourceRange;
257
258
struct pipe_surface *surface; /* have we created a pipe surface for this? */
259
};
260
261
struct lvp_subpass_attachment {
262
uint32_t attachment;
263
VkImageLayout layout;
264
bool in_render_loop;
265
};
266
267
struct lvp_subpass {
268
uint32_t attachment_count;
269
struct lvp_subpass_attachment * attachments;
270
271
uint32_t input_count;
272
uint32_t color_count;
273
struct lvp_subpass_attachment * input_attachments;
274
struct lvp_subpass_attachment * color_attachments;
275
struct lvp_subpass_attachment * resolve_attachments;
276
struct lvp_subpass_attachment * depth_stencil_attachment;
277
struct lvp_subpass_attachment * ds_resolve_attachment;
278
279
/** Subpass has at least one color resolve attachment */
280
bool has_color_resolve;
281
282
/** Subpass has at least one color attachment */
283
bool has_color_att;
284
285
VkSampleCountFlagBits max_sample_count;
286
287
uint32_t view_mask;
288
};
289
290
struct lvp_render_pass_attachment {
291
VkFormat format;
292
uint32_t samples;
293
VkAttachmentLoadOp load_op;
294
VkAttachmentLoadOp stencil_load_op;
295
VkImageLayout initial_layout;
296
VkImageLayout final_layout;
297
298
/* The subpass id in which the attachment will be used first/last. */
299
uint32_t first_subpass_idx;
300
uint32_t last_subpass_idx;
301
};
302
303
struct lvp_render_pass {
304
struct vk_object_base base;
305
uint32_t attachment_count;
306
uint32_t subpass_count;
307
struct lvp_subpass_attachment * subpass_attachments;
308
struct lvp_render_pass_attachment * attachments;
309
bool has_color_attachment;
310
bool has_zs_attachment;
311
struct lvp_subpass subpasses[0];
312
};
313
314
struct lvp_sampler {
315
struct vk_object_base base;
316
VkSamplerCreateInfo create_info;
317
union pipe_color_union border_color;
318
VkSamplerReductionMode reduction_mode;
319
uint32_t state[4];
320
};
321
322
struct lvp_framebuffer {
323
struct vk_object_base base;
324
uint32_t width;
325
uint32_t height;
326
uint32_t layers;
327
328
bool imageless;
329
uint32_t attachment_count;
330
struct lvp_image_view * attachments[0];
331
};
332
333
struct lvp_descriptor_set_binding_layout {
334
uint16_t descriptor_index;
335
/* Number of array elements in this binding */
336
VkDescriptorType type;
337
uint16_t array_size;
338
bool valid;
339
340
int16_t dynamic_index;
341
struct {
342
int16_t const_buffer_index;
343
int16_t shader_buffer_index;
344
int16_t sampler_index;
345
int16_t sampler_view_index;
346
int16_t image_index;
347
} stage[MESA_SHADER_STAGES];
348
349
/* Immutable samplers (or NULL if no immutable samplers) */
350
struct lvp_sampler **immutable_samplers;
351
};
352
353
struct lvp_descriptor_set_layout {
354
struct vk_object_base base;
355
356
const VkAllocationCallbacks *alloc;
357
/* Descriptor set layouts can be destroyed at almost any time */
358
uint32_t ref_cnt;
359
360
/* Number of bindings in this descriptor set */
361
uint16_t binding_count;
362
363
/* Total size of the descriptor set with room for all array entries */
364
uint16_t size;
365
366
/* Shader stages affected by this descriptor set */
367
uint16_t shader_stages;
368
369
struct {
370
uint16_t const_buffer_count;
371
uint16_t shader_buffer_count;
372
uint16_t sampler_count;
373
uint16_t sampler_view_count;
374
uint16_t image_count;
375
} stage[MESA_SHADER_STAGES];
376
377
/* Number of dynamic offsets used by this descriptor set */
378
uint16_t dynamic_offset_count;
379
380
/* Bindings in this descriptor set */
381
struct lvp_descriptor_set_binding_layout binding[0];
382
};
383
384
void lvp_descriptor_set_layout_destroy(struct lvp_device *device,
385
struct lvp_descriptor_set_layout *layout);
386
387
static inline void
388
lvp_descriptor_set_layout_ref(struct lvp_descriptor_set_layout *layout)
389
{
390
assert(layout && layout->ref_cnt >= 1);
391
p_atomic_inc(&layout->ref_cnt);
392
}
393
394
static inline void
395
lvp_descriptor_set_layout_unref(struct lvp_device *device,
396
struct lvp_descriptor_set_layout *layout)
397
{
398
assert(layout && layout->ref_cnt >= 1);
399
if (p_atomic_dec_zero(&layout->ref_cnt))
400
lvp_descriptor_set_layout_destroy(device, layout);
401
}
402
403
union lvp_descriptor_info {
404
struct {
405
struct lvp_sampler *sampler;
406
struct lvp_image_view *iview;
407
VkImageLayout image_layout;
408
};
409
struct {
410
struct lvp_buffer *buffer;
411
VkDeviceSize offset;
412
VkDeviceSize range;
413
};
414
struct lvp_buffer_view *buffer_view;
415
};
416
417
struct lvp_descriptor {
418
VkDescriptorType type;
419
420
union lvp_descriptor_info info;
421
};
422
423
struct lvp_descriptor_set {
424
struct vk_object_base base;
425
struct lvp_descriptor_set_layout *layout;
426
struct list_head link;
427
struct lvp_descriptor descriptors[0];
428
};
429
430
struct lvp_descriptor_pool {
431
struct vk_object_base base;
432
VkDescriptorPoolCreateFlags flags;
433
uint32_t max_sets;
434
435
struct list_head sets;
436
};
437
438
struct lvp_descriptor_update_template {
439
struct vk_object_base base;
440
uint32_t entry_count;
441
uint32_t set;
442
VkDescriptorUpdateTemplateType type;
443
VkPipelineBindPoint bind_point;
444
struct lvp_pipeline_layout *pipeline_layout;
445
VkDescriptorUpdateTemplateEntry entry[0];
446
};
447
448
VkResult
449
lvp_descriptor_set_create(struct lvp_device *device,
450
struct lvp_descriptor_set_layout *layout,
451
struct lvp_descriptor_set **out_set);
452
453
void
454
lvp_descriptor_set_destroy(struct lvp_device *device,
455
struct lvp_descriptor_set *set);
456
457
struct lvp_pipeline_layout {
458
struct vk_object_base base;
459
struct {
460
struct lvp_descriptor_set_layout *layout;
461
uint32_t dynamic_offset_start;
462
} set[MAX_SETS];
463
464
uint32_t num_sets;
465
uint32_t push_constant_size;
466
struct {
467
bool has_dynamic_offsets;
468
} stage[MESA_SHADER_STAGES];
469
};
470
471
struct lvp_pipeline {
472
struct vk_object_base base;
473
struct lvp_device * device;
474
struct lvp_pipeline_layout * layout;
475
476
void *mem_ctx;
477
bool is_compute_pipeline;
478
bool force_min_sample;
479
nir_shader *pipeline_nir[MESA_SHADER_STAGES];
480
void *shader_cso[PIPE_SHADER_TYPES];
481
VkGraphicsPipelineCreateInfo graphics_create_info;
482
VkComputePipelineCreateInfo compute_create_info;
483
uint32_t line_stipple_factor;
484
uint16_t line_stipple_pattern;
485
bool line_stipple_enable;
486
bool line_smooth;
487
bool disable_multisample;
488
bool line_rectangular;
489
bool gs_output_lines;
490
bool provoking_vertex_last;
491
};
492
493
struct lvp_event {
494
struct vk_object_base base;
495
volatile uint64_t event_storage;
496
};
497
498
struct lvp_fence {
499
struct vk_object_base base;
500
bool signaled;
501
struct pipe_fence_handle *handle;
502
};
503
504
struct lvp_semaphore {
505
struct vk_object_base base;
506
bool dummy;
507
};
508
509
struct lvp_buffer {
510
struct vk_object_base base;
511
512
VkDeviceSize size;
513
514
VkBufferUsageFlags usage;
515
VkDeviceSize offset;
516
517
struct pipe_memory_allocation *pmem;
518
struct pipe_resource *bo;
519
uint64_t total_size;
520
};
521
522
struct lvp_buffer_view {
523
struct vk_object_base base;
524
VkFormat format;
525
enum pipe_format pformat;
526
struct lvp_buffer *buffer;
527
uint32_t offset;
528
uint64_t range;
529
};
530
531
struct lvp_query_pool {
532
struct vk_object_base base;
533
VkQueryType type;
534
uint32_t count;
535
VkQueryPipelineStatisticFlags pipeline_stats;
536
enum pipe_query_type base_type;
537
struct pipe_query *queries[0];
538
};
539
540
struct lvp_cmd_pool {
541
struct vk_object_base base;
542
VkAllocationCallbacks alloc;
543
struct list_head cmd_buffers;
544
struct list_head free_cmd_buffers;
545
};
546
547
548
enum lvp_cmd_buffer_status {
549
LVP_CMD_BUFFER_STATUS_INVALID,
550
LVP_CMD_BUFFER_STATUS_INITIAL,
551
LVP_CMD_BUFFER_STATUS_RECORDING,
552
LVP_CMD_BUFFER_STATUS_EXECUTABLE,
553
LVP_CMD_BUFFER_STATUS_PENDING,
554
};
555
556
struct lvp_cmd_buffer {
557
struct vk_object_base base;
558
559
struct lvp_device * device;
560
561
VkCommandBufferLevel level;
562
enum lvp_cmd_buffer_status status;
563
struct lvp_cmd_pool * pool;
564
struct list_head pool_link;
565
566
struct list_head cmds;
567
struct list_head *last_emit;
568
569
uint8_t push_constants[MAX_PUSH_CONSTANTS_SIZE];
570
};
571
572
573
#define LVP_FROM_HANDLE(__lvp_type, __name, __handle) \
574
struct __lvp_type *__name = __lvp_type ## _from_handle(__handle)
575
576
VK_DEFINE_HANDLE_CASTS(lvp_cmd_buffer, base, VkCommandBuffer,
577
VK_OBJECT_TYPE_COMMAND_BUFFER)
578
VK_DEFINE_HANDLE_CASTS(lvp_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
579
VK_DEFINE_HANDLE_CASTS(lvp_instance, vk.base, VkInstance, VK_OBJECT_TYPE_INSTANCE)
580
VK_DEFINE_HANDLE_CASTS(lvp_physical_device, vk.base, VkPhysicalDevice,
581
VK_OBJECT_TYPE_PHYSICAL_DEVICE)
582
VK_DEFINE_HANDLE_CASTS(lvp_queue, base, VkQueue, VK_OBJECT_TYPE_QUEUE)
583
584
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_cmd_pool, base,VkCommandPool,
585
VK_OBJECT_TYPE_COMMAND_POOL)
586
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_buffer, base, VkBuffer,
587
VK_OBJECT_TYPE_BUFFER)
588
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_buffer_view, base, VkBufferView,
589
VK_OBJECT_TYPE_BUFFER_VIEW)
590
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_descriptor_pool, base, VkDescriptorPool,
591
VK_OBJECT_TYPE_DESCRIPTOR_POOL)
592
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_descriptor_set, base, VkDescriptorSet,
593
VK_OBJECT_TYPE_DESCRIPTOR_SET)
594
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_descriptor_set_layout, base, VkDescriptorSetLayout,
595
VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
596
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_descriptor_update_template, base, VkDescriptorUpdateTemplate,
597
VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE)
598
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_device_memory, base, VkDeviceMemory,
599
VK_OBJECT_TYPE_DEVICE_MEMORY)
600
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_event, base, VkEvent, VK_OBJECT_TYPE_EVENT)
601
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_framebuffer, base, VkFramebuffer,
602
VK_OBJECT_TYPE_FRAMEBUFFER)
603
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_image, base, VkImage, VK_OBJECT_TYPE_IMAGE)
604
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_image_view, base, VkImageView,
605
VK_OBJECT_TYPE_IMAGE_VIEW);
606
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_pipeline_cache, base, VkPipelineCache,
607
VK_OBJECT_TYPE_PIPELINE_CACHE)
608
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_pipeline, base, VkPipeline,
609
VK_OBJECT_TYPE_PIPELINE)
610
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_pipeline_layout, base, VkPipelineLayout,
611
VK_OBJECT_TYPE_PIPELINE_LAYOUT)
612
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_query_pool, base, VkQueryPool,
613
VK_OBJECT_TYPE_QUERY_POOL)
614
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_render_pass, base, VkRenderPass,
615
VK_OBJECT_TYPE_RENDER_PASS)
616
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_sampler, base, VkSampler,
617
VK_OBJECT_TYPE_SAMPLER)
618
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_fence, base, VkFence, VK_OBJECT_TYPE_FENCE);
619
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_semaphore, base, VkSemaphore,
620
VK_OBJECT_TYPE_SEMAPHORE);
621
622
/* in same order and buffer building commands in spec. */
623
enum lvp_cmds {
624
LVP_CMD_BIND_PIPELINE,
625
LVP_CMD_SET_VIEWPORT,
626
LVP_CMD_SET_SCISSOR,
627
LVP_CMD_SET_LINE_WIDTH,
628
LVP_CMD_SET_DEPTH_BIAS,
629
LVP_CMD_SET_BLEND_CONSTANTS,
630
LVP_CMD_SET_DEPTH_BOUNDS,
631
LVP_CMD_SET_STENCIL_COMPARE_MASK,
632
LVP_CMD_SET_STENCIL_WRITE_MASK,
633
LVP_CMD_SET_STENCIL_REFERENCE,
634
LVP_CMD_BIND_DESCRIPTOR_SETS,
635
LVP_CMD_BIND_INDEX_BUFFER,
636
LVP_CMD_BIND_VERTEX_BUFFERS,
637
LVP_CMD_DRAW,
638
LVP_CMD_DRAW_INDEXED,
639
LVP_CMD_DRAW_INDIRECT,
640
LVP_CMD_DRAW_INDEXED_INDIRECT,
641
LVP_CMD_DISPATCH,
642
LVP_CMD_DISPATCH_INDIRECT,
643
LVP_CMD_COPY_BUFFER,
644
LVP_CMD_COPY_IMAGE,
645
LVP_CMD_BLIT_IMAGE,
646
LVP_CMD_COPY_BUFFER_TO_IMAGE,
647
LVP_CMD_COPY_IMAGE_TO_BUFFER,
648
LVP_CMD_UPDATE_BUFFER,
649
LVP_CMD_FILL_BUFFER,
650
LVP_CMD_CLEAR_COLOR_IMAGE,
651
LVP_CMD_CLEAR_DEPTH_STENCIL_IMAGE,
652
LVP_CMD_CLEAR_ATTACHMENTS,
653
LVP_CMD_RESOLVE_IMAGE,
654
LVP_CMD_SET_EVENT,
655
LVP_CMD_RESET_EVENT,
656
LVP_CMD_WAIT_EVENTS,
657
LVP_CMD_PIPELINE_BARRIER,
658
LVP_CMD_BEGIN_QUERY,
659
LVP_CMD_END_QUERY,
660
LVP_CMD_RESET_QUERY_POOL,
661
LVP_CMD_WRITE_TIMESTAMP,
662
LVP_CMD_COPY_QUERY_POOL_RESULTS,
663
LVP_CMD_PUSH_CONSTANTS,
664
LVP_CMD_BEGIN_RENDER_PASS,
665
LVP_CMD_NEXT_SUBPASS,
666
LVP_CMD_END_RENDER_PASS,
667
LVP_CMD_EXECUTE_COMMANDS,
668
LVP_CMD_DRAW_INDIRECT_COUNT,
669
LVP_CMD_DRAW_INDEXED_INDIRECT_COUNT,
670
LVP_CMD_PUSH_DESCRIPTOR_SET,
671
LVP_CMD_BIND_TRANSFORM_FEEDBACK_BUFFERS,
672
LVP_CMD_BEGIN_TRANSFORM_FEEDBACK,
673
LVP_CMD_END_TRANSFORM_FEEDBACK,
674
LVP_CMD_DRAW_INDIRECT_BYTE_COUNT,
675
LVP_CMD_BEGIN_CONDITIONAL_RENDERING,
676
LVP_CMD_END_CONDITIONAL_RENDERING,
677
LVP_CMD_SET_VERTEX_INPUT,
678
LVP_CMD_SET_CULL_MODE,
679
LVP_CMD_SET_FRONT_FACE,
680
LVP_CMD_SET_PRIMITIVE_TOPOLOGY,
681
LVP_CMD_SET_DEPTH_TEST_ENABLE,
682
LVP_CMD_SET_DEPTH_WRITE_ENABLE,
683
LVP_CMD_SET_DEPTH_COMPARE_OP,
684
LVP_CMD_SET_DEPTH_BOUNDS_TEST_ENABLE,
685
LVP_CMD_SET_STENCIL_TEST_ENABLE,
686
LVP_CMD_SET_STENCIL_OP,
687
LVP_CMD_SET_LINE_STIPPLE,
688
LVP_CMD_SET_DEPTH_BIAS_ENABLE,
689
LVP_CMD_SET_LOGIC_OP,
690
LVP_CMD_SET_PATCH_CONTROL_POINTS,
691
LVP_CMD_SET_PRIMITIVE_RESTART_ENABLE,
692
LVP_CMD_SET_RASTERIZER_DISCARD_ENABLE,
693
};
694
695
struct lvp_cmd_bind_pipeline {
696
VkPipelineBindPoint bind_point;
697
struct lvp_pipeline *pipeline;
698
};
699
700
struct lvp_cmd_set_viewport {
701
uint32_t first_viewport;
702
uint32_t viewport_count;
703
VkViewport viewports[16];
704
};
705
706
struct lvp_cmd_set_scissor {
707
uint32_t first_scissor;
708
uint32_t scissor_count;
709
VkRect2D scissors[16];
710
};
711
712
struct lvp_cmd_set_line_width {
713
float line_width;
714
};
715
716
struct lvp_cmd_set_depth_bias {
717
float constant_factor;
718
float clamp;
719
float slope_factor;
720
};
721
722
struct lvp_cmd_set_blend_constants {
723
float blend_constants[4];
724
};
725
726
struct lvp_cmd_set_depth_bounds {
727
float min_depth;
728
float max_depth;
729
};
730
731
struct lvp_cmd_set_stencil_vals {
732
VkStencilFaceFlags face_mask;
733
uint32_t value;
734
};
735
736
struct lvp_cmd_bind_descriptor_sets {
737
VkPipelineBindPoint bind_point;
738
struct lvp_descriptor_set_layout *set_layout[MAX_SETS];
739
uint32_t first;
740
uint32_t count;
741
struct lvp_descriptor_set **sets;
742
uint32_t dynamic_offset_count;
743
const uint32_t *dynamic_offsets;
744
};
745
746
struct lvp_cmd_bind_index_buffer {
747
const struct lvp_buffer *buffer;
748
VkDeviceSize offset;
749
VkIndexType index_type;
750
};
751
752
struct lvp_cmd_bind_vertex_buffers {
753
uint32_t first;
754
uint32_t binding_count;
755
struct lvp_buffer **buffers;
756
const VkDeviceSize *offsets;
757
const VkDeviceSize *sizes;
758
const VkDeviceSize *strides;
759
};
760
761
struct lvp_cmd_draw {
762
uint32_t instance_count;
763
uint32_t first_instance;
764
uint32_t draw_count;
765
struct pipe_draw_start_count_bias draws[0];
766
};
767
768
struct lvp_cmd_draw_indexed {
769
uint32_t instance_count;
770
uint32_t first_instance;
771
bool calc_start;
772
uint32_t draw_count;
773
bool vertex_offset_changes;
774
struct pipe_draw_start_count_bias draws[0];
775
};
776
777
struct lvp_cmd_draw_indirect {
778
VkDeviceSize offset;
779
struct lvp_buffer *buffer;
780
uint32_t draw_count;
781
uint32_t stride;
782
};
783
784
struct lvp_cmd_dispatch {
785
uint32_t x;
786
uint32_t y;
787
uint32_t z;
788
uint32_t base_x;
789
uint32_t base_y;
790
uint32_t base_z;
791
};
792
793
struct lvp_cmd_dispatch_indirect {
794
const struct lvp_buffer *buffer;
795
VkDeviceSize offset;
796
};
797
798
struct lvp_cmd_copy_buffer {
799
struct lvp_buffer *src;
800
struct lvp_buffer *dst;
801
uint32_t region_count;
802
const VkBufferCopy *regions;
803
};
804
805
struct lvp_cmd_copy_image {
806
struct lvp_image *src;
807
struct lvp_image *dst;
808
VkImageLayout src_layout;
809
VkImageLayout dst_layout;
810
uint32_t region_count;
811
const VkImageCopy *regions;
812
};
813
814
struct lvp_cmd_blit_image {
815
struct lvp_image *src;
816
struct lvp_image *dst;
817
VkImageLayout src_layout;
818
VkImageLayout dst_layout;
819
uint32_t region_count;
820
const VkImageBlit *regions;
821
VkFilter filter;
822
};
823
824
struct lvp_cmd_copy_buffer_to_image {
825
struct lvp_buffer *src;
826
struct lvp_image *dst;
827
VkImageLayout dst_layout;
828
uint32_t region_count;
829
const VkBufferImageCopy *regions;
830
};
831
832
struct lvp_cmd_copy_image_to_buffer {
833
struct lvp_image *src;
834
struct lvp_buffer *dst;
835
VkImageLayout src_layout;
836
uint32_t region_count;
837
const VkBufferImageCopy *regions;
838
};
839
840
struct lvp_cmd_update_buffer {
841
struct lvp_buffer *buffer;
842
VkDeviceSize offset;
843
VkDeviceSize data_size;
844
char data[0];
845
};
846
847
struct lvp_cmd_fill_buffer {
848
struct lvp_buffer *buffer;
849
VkDeviceSize offset;
850
VkDeviceSize fill_size;
851
uint32_t data;
852
};
853
854
struct lvp_cmd_clear_color_image {
855
struct lvp_image *image;
856
VkImageLayout layout;
857
VkClearColorValue clear_val;
858
uint32_t range_count;
859
VkImageSubresourceRange *ranges;
860
};
861
862
struct lvp_cmd_clear_ds_image {
863
struct lvp_image *image;
864
VkImageLayout layout;
865
VkClearDepthStencilValue clear_val;
866
uint32_t range_count;
867
VkImageSubresourceRange *ranges;
868
};
869
870
struct lvp_cmd_clear_attachments {
871
uint32_t attachment_count;
872
VkClearAttachment *attachments;
873
uint32_t rect_count;
874
VkClearRect *rects;
875
};
876
877
struct lvp_cmd_resolve_image {
878
struct lvp_image *src;
879
struct lvp_image *dst;
880
VkImageLayout src_layout;
881
VkImageLayout dst_layout;
882
uint32_t region_count;
883
VkImageResolve *regions;
884
};
885
886
struct lvp_cmd_event_set {
887
struct lvp_event *event;
888
bool value;
889
bool flush;
890
};
891
892
struct lvp_cmd_wait_events {
893
uint32_t event_count;
894
struct lvp_event **events;
895
VkPipelineStageFlags src_stage_mask;
896
VkPipelineStageFlags dst_stage_mask;
897
uint32_t memory_barrier_count;
898
VkMemoryBarrier *memory_barriers;
899
uint32_t buffer_memory_barrier_count;
900
VkBufferMemoryBarrier *buffer_memory_barriers;
901
uint32_t image_memory_barrier_count;
902
VkImageMemoryBarrier *image_memory_barriers;
903
};
904
905
struct lvp_cmd_pipeline_barrier {
906
VkPipelineStageFlags src_stage_mask;
907
VkPipelineStageFlags dst_stage_mask;
908
bool by_region;
909
uint32_t memory_barrier_count;
910
VkMemoryBarrier *memory_barriers;
911
uint32_t buffer_memory_barrier_count;
912
VkBufferMemoryBarrier *buffer_memory_barriers;
913
uint32_t image_memory_barrier_count;
914
VkImageMemoryBarrier *image_memory_barriers;
915
};
916
917
struct lvp_cmd_query_cmd {
918
struct lvp_query_pool *pool;
919
uint32_t query;
920
uint32_t index;
921
bool precise;
922
bool flush;
923
};
924
925
struct lvp_cmd_copy_query_pool_results {
926
struct lvp_query_pool *pool;
927
uint32_t first_query;
928
uint32_t query_count;
929
struct lvp_buffer *dst;
930
VkDeviceSize dst_offset;
931
VkDeviceSize stride;
932
VkQueryResultFlags flags;
933
};
934
935
struct lvp_cmd_push_constants {
936
VkShaderStageFlags stage;
937
uint32_t offset;
938
uint32_t size;
939
uint32_t val[1];
940
};
941
942
struct lvp_attachment_state {
943
VkImageAspectFlags pending_clear_aspects;
944
VkClearValue clear_value;
945
};
946
947
struct lvp_cmd_begin_render_pass {
948
struct lvp_framebuffer *framebuffer;
949
struct lvp_render_pass *render_pass;
950
VkRect2D render_area;
951
struct lvp_attachment_state *attachments;
952
struct lvp_image_view **imageless_views;
953
};
954
955
struct lvp_cmd_next_subpass {
956
VkSubpassContents contents;
957
};
958
959
struct lvp_cmd_execute_commands {
960
uint32_t command_buffer_count;
961
struct lvp_cmd_buffer *cmd_buffers[0];
962
};
963
964
struct lvp_cmd_draw_indirect_count {
965
VkDeviceSize offset;
966
struct lvp_buffer *buffer;
967
VkDeviceSize count_buffer_offset;
968
struct lvp_buffer *count_buffer;
969
uint32_t max_draw_count;
970
uint32_t stride;
971
};
972
973
struct lvp_write_descriptor {
974
uint32_t dst_binding;
975
uint32_t dst_array_element;
976
uint32_t descriptor_count;
977
VkDescriptorType descriptor_type;
978
};
979
980
struct lvp_cmd_push_descriptor_set {
981
VkPipelineBindPoint bind_point;
982
struct lvp_pipeline_layout *layout;
983
uint32_t set;
984
uint32_t descriptor_write_count;
985
struct lvp_write_descriptor *descriptors;
986
union lvp_descriptor_info *infos;
987
};
988
989
struct lvp_cmd_bind_transform_feedback_buffers {
990
uint32_t first_binding;
991
uint32_t binding_count;
992
struct lvp_buffer **buffers;
993
VkDeviceSize *offsets;
994
VkDeviceSize *sizes;
995
};
996
997
struct lvp_cmd_begin_transform_feedback {
998
uint32_t first_counter_buffer;
999
uint32_t counter_buffer_count;
1000
struct lvp_buffer **counter_buffers;
1001
VkDeviceSize *counter_buffer_offsets;
1002
};
1003
1004
struct lvp_cmd_end_transform_feedback {
1005
uint32_t first_counter_buffer;
1006
uint32_t counter_buffer_count;
1007
struct lvp_buffer **counter_buffers;
1008
VkDeviceSize *counter_buffer_offsets;
1009
};
1010
1011
struct lvp_cmd_draw_indirect_byte_count {
1012
uint32_t instance_count;
1013
uint32_t first_instance;
1014
struct lvp_buffer *counter_buffer;
1015
VkDeviceSize counter_buffer_offset;
1016
uint32_t counter_offset;
1017
uint32_t vertex_stride;
1018
};
1019
1020
struct lvp_cmd_begin_conditional_rendering {
1021
struct lvp_buffer *buffer;
1022
VkDeviceSize offset;
1023
bool inverted;
1024
};
1025
1026
struct lvp_cmd_set_vertex_input {
1027
uint32_t binding_count;
1028
uint32_t attr_count;
1029
uint8_t data[0];
1030
//VkVertexInputBindingDescription2EXT bindings[binding_count];
1031
//VkVertexInputAttributeDescription2EXT attrs[attr_count];
1032
};
1033
1034
struct lvp_cmd_set_cull_mode {
1035
VkCullModeFlags cull_mode;
1036
};
1037
1038
struct lvp_cmd_set_front_face {
1039
VkFrontFace front_face;
1040
};
1041
1042
struct lvp_cmd_set_primitive_topology {
1043
VkPrimitiveTopology prim;
1044
};
1045
1046
struct lvp_cmd_set_depth_test_enable {
1047
VkBool32 depth_test_enable;
1048
};
1049
1050
struct lvp_cmd_set_depth_write_enable {
1051
VkBool32 depth_write_enable;
1052
};
1053
1054
struct lvp_cmd_set_depth_bounds_test_enable {
1055
VkBool32 depth_bounds_test_enable;
1056
};
1057
1058
struct lvp_cmd_set_depth_compare_op {
1059
VkCompareOp depth_op;
1060
};
1061
1062
struct lvp_cmd_set_stencil_test_enable {
1063
VkBool32 stencil_test_enable;
1064
};
1065
1066
struct lvp_cmd_set_stencil_op {
1067
VkStencilFaceFlags face_mask;
1068
VkStencilOp fail_op;
1069
VkStencilOp pass_op;
1070
VkStencilOp depth_fail_op;
1071
VkCompareOp compare_op;
1072
};
1073
1074
struct lvp_cmd_set_line_stipple {
1075
uint32_t line_stipple_factor;
1076
uint16_t line_stipple_pattern;
1077
};
1078
1079
struct lvp_cmd_set_depth_bias_enable {
1080
bool enable;
1081
};
1082
1083
struct lvp_cmd_set_logic_op {
1084
VkLogicOp op;
1085
};
1086
1087
struct lvp_cmd_set_patch_control_points {
1088
uint32_t vertices_per_patch;
1089
};
1090
1091
struct lvp_cmd_set_primitive_restart_enable {
1092
bool enable;
1093
};
1094
1095
struct lvp_cmd_set_rasterizer_discard_enable {
1096
bool enable;
1097
};
1098
1099
struct lvp_cmd_buffer_entry {
1100
struct list_head cmd_link;
1101
uint32_t cmd_type;
1102
union {
1103
struct lvp_cmd_bind_pipeline pipeline;
1104
struct lvp_cmd_set_viewport set_viewport;
1105
struct lvp_cmd_set_scissor set_scissor;
1106
struct lvp_cmd_set_line_width set_line_width;
1107
struct lvp_cmd_set_depth_bias set_depth_bias;
1108
struct lvp_cmd_set_blend_constants set_blend_constants;
1109
struct lvp_cmd_set_depth_bounds set_depth_bounds;
1110
struct lvp_cmd_set_stencil_vals stencil_vals;
1111
struct lvp_cmd_bind_descriptor_sets descriptor_sets;
1112
struct lvp_cmd_bind_vertex_buffers vertex_buffers;
1113
struct lvp_cmd_bind_index_buffer index_buffer;
1114
struct lvp_cmd_draw draw;
1115
struct lvp_cmd_draw_indexed draw_indexed;
1116
struct lvp_cmd_draw_indirect draw_indirect;
1117
struct lvp_cmd_dispatch dispatch;
1118
struct lvp_cmd_dispatch_indirect dispatch_indirect;
1119
struct lvp_cmd_copy_buffer copy_buffer;
1120
struct lvp_cmd_copy_image copy_image;
1121
struct lvp_cmd_blit_image blit_image;
1122
struct lvp_cmd_copy_buffer_to_image buffer_to_img;
1123
struct lvp_cmd_copy_image_to_buffer img_to_buffer;
1124
struct lvp_cmd_update_buffer update_buffer;
1125
struct lvp_cmd_fill_buffer fill_buffer;
1126
struct lvp_cmd_clear_color_image clear_color_image;
1127
struct lvp_cmd_clear_ds_image clear_ds_image;
1128
struct lvp_cmd_clear_attachments clear_attachments;
1129
struct lvp_cmd_resolve_image resolve_image;
1130
struct lvp_cmd_event_set event_set;
1131
struct lvp_cmd_wait_events wait_events;
1132
struct lvp_cmd_pipeline_barrier pipeline_barrier;
1133
struct lvp_cmd_query_cmd query;
1134
struct lvp_cmd_copy_query_pool_results copy_query_pool_results;
1135
struct lvp_cmd_push_constants push_constants;
1136
struct lvp_cmd_begin_render_pass begin_render_pass;
1137
struct lvp_cmd_next_subpass next_subpass;
1138
struct lvp_cmd_execute_commands execute_commands;
1139
struct lvp_cmd_draw_indirect_count draw_indirect_count;
1140
struct lvp_cmd_push_descriptor_set push_descriptor_set;
1141
struct lvp_cmd_bind_transform_feedback_buffers bind_transform_feedback_buffers;
1142
struct lvp_cmd_begin_transform_feedback begin_transform_feedback;
1143
struct lvp_cmd_end_transform_feedback end_transform_feedback;
1144
struct lvp_cmd_draw_indirect_byte_count draw_indirect_byte_count;
1145
struct lvp_cmd_begin_conditional_rendering begin_conditional_rendering;
1146
struct lvp_cmd_set_vertex_input set_vertex_input;
1147
struct lvp_cmd_set_cull_mode set_cull_mode;
1148
struct lvp_cmd_set_front_face set_front_face;
1149
struct lvp_cmd_set_primitive_topology set_primitive_topology;
1150
struct lvp_cmd_set_depth_test_enable set_depth_test_enable;
1151
struct lvp_cmd_set_depth_write_enable set_depth_write_enable;
1152
struct lvp_cmd_set_depth_compare_op set_depth_compare_op;
1153
struct lvp_cmd_set_depth_bounds_test_enable set_depth_bounds_test_enable;
1154
struct lvp_cmd_set_stencil_test_enable set_stencil_test_enable;
1155
struct lvp_cmd_set_stencil_op set_stencil_op;
1156
struct lvp_cmd_set_line_stipple set_line_stipple;
1157
struct lvp_cmd_set_depth_bias_enable set_depth_bias_enable;
1158
struct lvp_cmd_set_logic_op set_logic_op;
1159
struct lvp_cmd_set_patch_control_points set_patch_control_points;
1160
struct lvp_cmd_set_primitive_restart_enable set_primitive_restart_enable;
1161
struct lvp_cmd_set_rasterizer_discard_enable set_rasterizer_discard_enable;
1162
} u;
1163
};
1164
1165
VkResult lvp_execute_cmds(struct lvp_device *device,
1166
struct lvp_queue *queue,
1167
struct lvp_cmd_buffer *cmd_buffer);
1168
1169
struct lvp_image *lvp_swapchain_get_image(VkSwapchainKHR swapchain,
1170
uint32_t index);
1171
1172
static inline enum pipe_format
1173
lvp_vk_format_to_pipe_format(VkFormat format)
1174
{
1175
/* Some formats cause problems with CTS right now.*/
1176
if (format == VK_FORMAT_R4G4B4A4_UNORM_PACK16 ||
1177
format == VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT || /* VK_EXT_4444_formats */
1178
format == VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT || /* VK_EXT_4444_formats */
1179
format == VK_FORMAT_R5G5B5A1_UNORM_PACK16 ||
1180
format == VK_FORMAT_R8_SRGB ||
1181
format == VK_FORMAT_R8G8_SRGB ||
1182
format == VK_FORMAT_R64G64B64A64_SFLOAT ||
1183
format == VK_FORMAT_R64_SFLOAT ||
1184
format == VK_FORMAT_R64G64_SFLOAT ||
1185
format == VK_FORMAT_R64G64B64_SFLOAT ||
1186
format == VK_FORMAT_A2R10G10B10_SINT_PACK32 ||
1187
format == VK_FORMAT_A2B10G10R10_SINT_PACK32 ||
1188
format == VK_FORMAT_G8B8G8R8_422_UNORM ||
1189
format == VK_FORMAT_B8G8R8G8_422_UNORM ||
1190
format == VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM ||
1191
format == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM ||
1192
format == VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM ||
1193
format == VK_FORMAT_G8_B8R8_2PLANE_422_UNORM ||
1194
format == VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM ||
1195
format == VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM ||
1196
format == VK_FORMAT_G16_B16R16_2PLANE_420_UNORM ||
1197
format == VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM ||
1198
format == VK_FORMAT_G16_B16R16_2PLANE_422_UNORM ||
1199
format == VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM ||
1200
format == VK_FORMAT_D16_UNORM_S8_UINT)
1201
return PIPE_FORMAT_NONE;
1202
1203
return vk_format_to_pipe_format(format);
1204
}
1205
1206
#ifdef __cplusplus
1207
}
1208
#endif
1209
1210