Path: blob/21.2-virgl/src/gallium/frontends/lavapipe/lvp_private.h
4565 views
/*1* Copyright © 2019 Red Hat.2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING19* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS20* IN THE SOFTWARE.21*/2223#pragma once24#include <stdlib.h>25#include <stdio.h>26#include <stdbool.h>27#include <string.h>28#include <assert.h>29#include <stdint.h>3031#include "util/macros.h"32#include "util/list.h"3334#include "compiler/shader_enums.h"35#include "pipe/p_screen.h"36#include "pipe/p_state.h"37#include "cso_cache/cso_context.h"38#include "nir.h"3940/* Pre-declarations needed for WSI entrypoints */41struct wl_surface;42struct wl_display;43typedef struct xcb_connection_t xcb_connection_t;44typedef uint32_t xcb_visualid_t;45typedef uint32_t xcb_window_t;4647#define VK_PROTOTYPES48#include <vulkan/vulkan.h>49#include <vulkan/vk_icd.h>5051#include "lvp_entrypoints.h"52#include "vk_device.h"53#include "vk_instance.h"54#include "vk_physical_device.h"55#include "vk_shader_module.h"56#include "vk_util.h"57#include "vk_format.h"5859#include "wsi_common.h"6061#include <assert.h>62#ifdef __cplusplus63extern "C" {64#endif6566#define MAX_SETS 867#define MAX_PUSH_CONSTANTS_SIZE 12868#define MAX_PUSH_DESCRIPTORS 326970#ifdef _WIN3271#define lvp_printflike(a, b)72#else73#define lvp_printflike(a, b) __attribute__((__format__(__printf__, a, b)))74#endif7576int lvp_get_instance_entrypoint_index(const char *name);77int lvp_get_device_entrypoint_index(const char *name);78int lvp_get_physical_device_entrypoint_index(const char *name);7980const char *lvp_get_instance_entry_name(int index);81const char *lvp_get_physical_device_entry_name(int index);82const char *lvp_get_device_entry_name(int index);8384bool lvp_instance_entrypoint_is_enabled(int index, uint32_t core_version,85const struct vk_instance_extension_table *instance);86bool lvp_physical_device_entrypoint_is_enabled(int index, uint32_t core_version,87const struct vk_instance_extension_table *instance);88bool lvp_device_entrypoint_is_enabled(int index, uint32_t core_version,89const struct vk_instance_extension_table *instance,90const struct vk_device_extension_table *device);919293/* Whenever we generate an error, pass it through this function. Useful for94* debugging, where we can break on it. Only call at error site, not when95* propagating errors. Might be useful to plug in a stack trace here.96*/9798struct lvp_instance;99VkResult __vk_errorf(struct lvp_instance *instance, VkResult error, const char *file, int line, const char *format, ...);100101#define LVP_DEBUG_ALL_ENTRYPOINTS (1 << 0)102103#define vk_error(instance, error) __vk_errorf(instance, error, __FILE__, __LINE__, NULL);104#define vk_errorf(instance, error, format, ...) __vk_errorf(instance, error, __FILE__, __LINE__, format, ## __VA_ARGS__);105106void __lvp_finishme(const char *file, int line, const char *format, ...)107lvp_printflike(3, 4);108109#define lvp_finishme(format, ...) \110__lvp_finishme(__FILE__, __LINE__, format, ##__VA_ARGS__);111112#define stub_return(v) \113do { \114lvp_finishme("stub %s", __func__); \115return (v); \116} while (0)117118#define stub() \119do { \120lvp_finishme("stub %s", __func__); \121return; \122} while (0)123124#define LVP_STAGE_MASK ((1 << MESA_SHADER_STAGES) - 1)125126#define lvp_foreach_stage(stage, stage_bits) \127for (gl_shader_stage stage, \128__tmp = (gl_shader_stage)((stage_bits) & LVP_STAGE_MASK); \129stage = ffs(__tmp) - 1, __tmp; \130__tmp &= ~(1 << (stage)))131132struct lvp_physical_device {133struct vk_physical_device vk;134135struct pipe_loader_device *pld;136struct pipe_screen *pscreen;137uint32_t max_images;138139struct wsi_device wsi_device;140};141142struct lvp_instance {143struct vk_instance vk;144145uint32_t apiVersion;146int physicalDeviceCount;147struct lvp_physical_device physicalDevice;148149uint64_t debug_flags;150151struct pipe_loader_device *devs;152int num_devices;153};154155VkResult lvp_init_wsi(struct lvp_physical_device *physical_device);156void lvp_finish_wsi(struct lvp_physical_device *physical_device);157158bool lvp_physical_device_extension_supported(struct lvp_physical_device *dev,159const char *name);160161struct lvp_queue {162struct vk_object_base base;163VkDeviceQueueCreateFlags flags;164struct lvp_device * device;165struct pipe_context *ctx;166struct cso_context *cso;167bool shutdown;168thrd_t exec_thread;169mtx_t m;170cnd_t new_work;171struct list_head workqueue;172volatile int count;173};174175struct lvp_queue_work {176struct list_head list;177uint32_t cmd_buffer_count;178struct lvp_cmd_buffer **cmd_buffers;179struct lvp_fence *fence;180};181182struct lvp_pipeline_cache {183struct vk_object_base base;184struct lvp_device * device;185VkAllocationCallbacks alloc;186};187188struct lvp_device {189struct vk_device vk;190191struct lvp_queue queue;192struct lvp_instance * instance;193struct lvp_physical_device *physical_device;194struct pipe_screen *pscreen;195196mtx_t fence_lock;197};198199void lvp_device_get_cache_uuid(void *uuid);200201struct lvp_device_memory {202struct vk_object_base base;203struct pipe_memory_allocation *pmem;204uint32_t type_index;205VkDeviceSize map_size;206void * map;207};208209struct lvp_image {210struct vk_object_base base;211VkImageType type;212VkDeviceSize size;213uint32_t alignment;214struct pipe_memory_allocation *pmem;215unsigned memory_offset;216struct pipe_resource *bo;217};218219static inline uint32_t220lvp_get_layerCount(const struct lvp_image *image,221const VkImageSubresourceRange *range)222{223return range->layerCount == VK_REMAINING_ARRAY_LAYERS ?224image->bo->array_size - range->baseArrayLayer : range->layerCount;225}226227static inline uint32_t228lvp_get_levelCount(const struct lvp_image *image,229const VkImageSubresourceRange *range)230{231return range->levelCount == VK_REMAINING_MIP_LEVELS ?232(image->bo->last_level + 1) - range->baseMipLevel : range->levelCount;233}234235struct lvp_image_create_info {236const VkImageCreateInfo *vk_info;237uint32_t bind_flags;238uint32_t stride;239};240241VkResult242lvp_image_create(VkDevice _device,243const struct lvp_image_create_info *create_info,244const VkAllocationCallbacks* alloc,245VkImage *pImage);246247struct lvp_image_view {248struct vk_object_base base;249const struct lvp_image *image; /**< VkImageViewCreateInfo::image */250251VkImageViewType view_type;252VkFormat format;253enum pipe_format pformat;254VkComponentMapping components;255VkImageSubresourceRange subresourceRange;256257struct pipe_surface *surface; /* have we created a pipe surface for this? */258};259260struct lvp_subpass_attachment {261uint32_t attachment;262VkImageLayout layout;263bool in_render_loop;264};265266struct lvp_subpass {267uint32_t attachment_count;268struct lvp_subpass_attachment * attachments;269270uint32_t input_count;271uint32_t color_count;272struct lvp_subpass_attachment * input_attachments;273struct lvp_subpass_attachment * color_attachments;274struct lvp_subpass_attachment * resolve_attachments;275struct lvp_subpass_attachment * depth_stencil_attachment;276struct lvp_subpass_attachment * ds_resolve_attachment;277278/** Subpass has at least one color resolve attachment */279bool has_color_resolve;280281/** Subpass has at least one color attachment */282bool has_color_att;283284VkSampleCountFlagBits max_sample_count;285286uint32_t view_mask;287};288289struct lvp_render_pass_attachment {290VkFormat format;291uint32_t samples;292VkAttachmentLoadOp load_op;293VkAttachmentLoadOp stencil_load_op;294VkImageLayout initial_layout;295VkImageLayout final_layout;296297/* The subpass id in which the attachment will be used first/last. */298uint32_t first_subpass_idx;299uint32_t last_subpass_idx;300};301302struct lvp_render_pass {303struct vk_object_base base;304uint32_t attachment_count;305uint32_t subpass_count;306struct lvp_subpass_attachment * subpass_attachments;307struct lvp_render_pass_attachment * attachments;308bool has_color_attachment;309bool has_zs_attachment;310struct lvp_subpass subpasses[0];311};312313struct lvp_sampler {314struct vk_object_base base;315VkSamplerCreateInfo create_info;316union pipe_color_union border_color;317VkSamplerReductionMode reduction_mode;318uint32_t state[4];319};320321struct lvp_framebuffer {322struct vk_object_base base;323uint32_t width;324uint32_t height;325uint32_t layers;326327bool imageless;328uint32_t attachment_count;329struct lvp_image_view * attachments[0];330};331332struct lvp_descriptor_set_binding_layout {333uint16_t descriptor_index;334/* Number of array elements in this binding */335VkDescriptorType type;336uint16_t array_size;337bool valid;338339int16_t dynamic_index;340struct {341int16_t const_buffer_index;342int16_t shader_buffer_index;343int16_t sampler_index;344int16_t sampler_view_index;345int16_t image_index;346} stage[MESA_SHADER_STAGES];347348/* Immutable samplers (or NULL if no immutable samplers) */349struct lvp_sampler **immutable_samplers;350};351352struct lvp_descriptor_set_layout {353struct vk_object_base base;354355const VkAllocationCallbacks *alloc;356/* Descriptor set layouts can be destroyed at almost any time */357uint32_t ref_cnt;358359/* Number of bindings in this descriptor set */360uint16_t binding_count;361362/* Total size of the descriptor set with room for all array entries */363uint16_t size;364365/* Shader stages affected by this descriptor set */366uint16_t shader_stages;367368struct {369uint16_t const_buffer_count;370uint16_t shader_buffer_count;371uint16_t sampler_count;372uint16_t sampler_view_count;373uint16_t image_count;374} stage[MESA_SHADER_STAGES];375376/* Number of dynamic offsets used by this descriptor set */377uint16_t dynamic_offset_count;378379/* Bindings in this descriptor set */380struct lvp_descriptor_set_binding_layout binding[0];381};382383void lvp_descriptor_set_layout_destroy(struct lvp_device *device,384struct lvp_descriptor_set_layout *layout);385386static inline void387lvp_descriptor_set_layout_ref(struct lvp_descriptor_set_layout *layout)388{389assert(layout && layout->ref_cnt >= 1);390p_atomic_inc(&layout->ref_cnt);391}392393static inline void394lvp_descriptor_set_layout_unref(struct lvp_device *device,395struct lvp_descriptor_set_layout *layout)396{397assert(layout && layout->ref_cnt >= 1);398if (p_atomic_dec_zero(&layout->ref_cnt))399lvp_descriptor_set_layout_destroy(device, layout);400}401402union lvp_descriptor_info {403struct {404struct lvp_sampler *sampler;405struct lvp_image_view *iview;406VkImageLayout image_layout;407};408struct {409struct lvp_buffer *buffer;410VkDeviceSize offset;411VkDeviceSize range;412};413struct lvp_buffer_view *buffer_view;414};415416struct lvp_descriptor {417VkDescriptorType type;418419union lvp_descriptor_info info;420};421422struct lvp_descriptor_set {423struct vk_object_base base;424struct lvp_descriptor_set_layout *layout;425struct list_head link;426struct lvp_descriptor descriptors[0];427};428429struct lvp_descriptor_pool {430struct vk_object_base base;431VkDescriptorPoolCreateFlags flags;432uint32_t max_sets;433434struct list_head sets;435};436437struct lvp_descriptor_update_template {438struct vk_object_base base;439uint32_t entry_count;440uint32_t set;441VkDescriptorUpdateTemplateType type;442VkPipelineBindPoint bind_point;443struct lvp_pipeline_layout *pipeline_layout;444VkDescriptorUpdateTemplateEntry entry[0];445};446447VkResult448lvp_descriptor_set_create(struct lvp_device *device,449struct lvp_descriptor_set_layout *layout,450struct lvp_descriptor_set **out_set);451452void453lvp_descriptor_set_destroy(struct lvp_device *device,454struct lvp_descriptor_set *set);455456struct lvp_pipeline_layout {457struct vk_object_base base;458struct {459struct lvp_descriptor_set_layout *layout;460uint32_t dynamic_offset_start;461} set[MAX_SETS];462463uint32_t num_sets;464uint32_t push_constant_size;465struct {466bool has_dynamic_offsets;467} stage[MESA_SHADER_STAGES];468};469470struct lvp_pipeline {471struct vk_object_base base;472struct lvp_device * device;473struct lvp_pipeline_layout * layout;474475void *mem_ctx;476bool is_compute_pipeline;477bool force_min_sample;478nir_shader *pipeline_nir[MESA_SHADER_STAGES];479void *shader_cso[PIPE_SHADER_TYPES];480VkGraphicsPipelineCreateInfo graphics_create_info;481VkComputePipelineCreateInfo compute_create_info;482uint32_t line_stipple_factor;483uint16_t line_stipple_pattern;484bool line_stipple_enable;485bool line_smooth;486bool disable_multisample;487bool line_rectangular;488bool gs_output_lines;489bool provoking_vertex_last;490};491492struct lvp_event {493struct vk_object_base base;494volatile uint64_t event_storage;495};496497struct lvp_fence {498struct vk_object_base base;499bool signaled;500struct pipe_fence_handle *handle;501};502503struct lvp_semaphore {504struct vk_object_base base;505bool dummy;506};507508struct lvp_buffer {509struct vk_object_base base;510511VkDeviceSize size;512513VkBufferUsageFlags usage;514VkDeviceSize offset;515516struct pipe_memory_allocation *pmem;517struct pipe_resource *bo;518uint64_t total_size;519};520521struct lvp_buffer_view {522struct vk_object_base base;523VkFormat format;524enum pipe_format pformat;525struct lvp_buffer *buffer;526uint32_t offset;527uint64_t range;528};529530struct lvp_query_pool {531struct vk_object_base base;532VkQueryType type;533uint32_t count;534VkQueryPipelineStatisticFlags pipeline_stats;535enum pipe_query_type base_type;536struct pipe_query *queries[0];537};538539struct lvp_cmd_pool {540struct vk_object_base base;541VkAllocationCallbacks alloc;542struct list_head cmd_buffers;543struct list_head free_cmd_buffers;544};545546547enum lvp_cmd_buffer_status {548LVP_CMD_BUFFER_STATUS_INVALID,549LVP_CMD_BUFFER_STATUS_INITIAL,550LVP_CMD_BUFFER_STATUS_RECORDING,551LVP_CMD_BUFFER_STATUS_EXECUTABLE,552LVP_CMD_BUFFER_STATUS_PENDING,553};554555struct lvp_cmd_buffer {556struct vk_object_base base;557558struct lvp_device * device;559560VkCommandBufferLevel level;561enum lvp_cmd_buffer_status status;562struct lvp_cmd_pool * pool;563struct list_head pool_link;564565struct list_head cmds;566struct list_head *last_emit;567568uint8_t push_constants[MAX_PUSH_CONSTANTS_SIZE];569};570571572#define LVP_FROM_HANDLE(__lvp_type, __name, __handle) \573struct __lvp_type *__name = __lvp_type ## _from_handle(__handle)574575VK_DEFINE_HANDLE_CASTS(lvp_cmd_buffer, base, VkCommandBuffer,576VK_OBJECT_TYPE_COMMAND_BUFFER)577VK_DEFINE_HANDLE_CASTS(lvp_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)578VK_DEFINE_HANDLE_CASTS(lvp_instance, vk.base, VkInstance, VK_OBJECT_TYPE_INSTANCE)579VK_DEFINE_HANDLE_CASTS(lvp_physical_device, vk.base, VkPhysicalDevice,580VK_OBJECT_TYPE_PHYSICAL_DEVICE)581VK_DEFINE_HANDLE_CASTS(lvp_queue, base, VkQueue, VK_OBJECT_TYPE_QUEUE)582583VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_cmd_pool, base,VkCommandPool,584VK_OBJECT_TYPE_COMMAND_POOL)585VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_buffer, base, VkBuffer,586VK_OBJECT_TYPE_BUFFER)587VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_buffer_view, base, VkBufferView,588VK_OBJECT_TYPE_BUFFER_VIEW)589VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_descriptor_pool, base, VkDescriptorPool,590VK_OBJECT_TYPE_DESCRIPTOR_POOL)591VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_descriptor_set, base, VkDescriptorSet,592VK_OBJECT_TYPE_DESCRIPTOR_SET)593VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_descriptor_set_layout, base, VkDescriptorSetLayout,594VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)595VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_descriptor_update_template, base, VkDescriptorUpdateTemplate,596VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE)597VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_device_memory, base, VkDeviceMemory,598VK_OBJECT_TYPE_DEVICE_MEMORY)599VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_event, base, VkEvent, VK_OBJECT_TYPE_EVENT)600VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_framebuffer, base, VkFramebuffer,601VK_OBJECT_TYPE_FRAMEBUFFER)602VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_image, base, VkImage, VK_OBJECT_TYPE_IMAGE)603VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_image_view, base, VkImageView,604VK_OBJECT_TYPE_IMAGE_VIEW);605VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_pipeline_cache, base, VkPipelineCache,606VK_OBJECT_TYPE_PIPELINE_CACHE)607VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_pipeline, base, VkPipeline,608VK_OBJECT_TYPE_PIPELINE)609VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_pipeline_layout, base, VkPipelineLayout,610VK_OBJECT_TYPE_PIPELINE_LAYOUT)611VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_query_pool, base, VkQueryPool,612VK_OBJECT_TYPE_QUERY_POOL)613VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_render_pass, base, VkRenderPass,614VK_OBJECT_TYPE_RENDER_PASS)615VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_sampler, base, VkSampler,616VK_OBJECT_TYPE_SAMPLER)617VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_fence, base, VkFence, VK_OBJECT_TYPE_FENCE);618VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_semaphore, base, VkSemaphore,619VK_OBJECT_TYPE_SEMAPHORE);620621/* in same order and buffer building commands in spec. */622enum lvp_cmds {623LVP_CMD_BIND_PIPELINE,624LVP_CMD_SET_VIEWPORT,625LVP_CMD_SET_SCISSOR,626LVP_CMD_SET_LINE_WIDTH,627LVP_CMD_SET_DEPTH_BIAS,628LVP_CMD_SET_BLEND_CONSTANTS,629LVP_CMD_SET_DEPTH_BOUNDS,630LVP_CMD_SET_STENCIL_COMPARE_MASK,631LVP_CMD_SET_STENCIL_WRITE_MASK,632LVP_CMD_SET_STENCIL_REFERENCE,633LVP_CMD_BIND_DESCRIPTOR_SETS,634LVP_CMD_BIND_INDEX_BUFFER,635LVP_CMD_BIND_VERTEX_BUFFERS,636LVP_CMD_DRAW,637LVP_CMD_DRAW_INDEXED,638LVP_CMD_DRAW_INDIRECT,639LVP_CMD_DRAW_INDEXED_INDIRECT,640LVP_CMD_DISPATCH,641LVP_CMD_DISPATCH_INDIRECT,642LVP_CMD_COPY_BUFFER,643LVP_CMD_COPY_IMAGE,644LVP_CMD_BLIT_IMAGE,645LVP_CMD_COPY_BUFFER_TO_IMAGE,646LVP_CMD_COPY_IMAGE_TO_BUFFER,647LVP_CMD_UPDATE_BUFFER,648LVP_CMD_FILL_BUFFER,649LVP_CMD_CLEAR_COLOR_IMAGE,650LVP_CMD_CLEAR_DEPTH_STENCIL_IMAGE,651LVP_CMD_CLEAR_ATTACHMENTS,652LVP_CMD_RESOLVE_IMAGE,653LVP_CMD_SET_EVENT,654LVP_CMD_RESET_EVENT,655LVP_CMD_WAIT_EVENTS,656LVP_CMD_PIPELINE_BARRIER,657LVP_CMD_BEGIN_QUERY,658LVP_CMD_END_QUERY,659LVP_CMD_RESET_QUERY_POOL,660LVP_CMD_WRITE_TIMESTAMP,661LVP_CMD_COPY_QUERY_POOL_RESULTS,662LVP_CMD_PUSH_CONSTANTS,663LVP_CMD_BEGIN_RENDER_PASS,664LVP_CMD_NEXT_SUBPASS,665LVP_CMD_END_RENDER_PASS,666LVP_CMD_EXECUTE_COMMANDS,667LVP_CMD_DRAW_INDIRECT_COUNT,668LVP_CMD_DRAW_INDEXED_INDIRECT_COUNT,669LVP_CMD_PUSH_DESCRIPTOR_SET,670LVP_CMD_BIND_TRANSFORM_FEEDBACK_BUFFERS,671LVP_CMD_BEGIN_TRANSFORM_FEEDBACK,672LVP_CMD_END_TRANSFORM_FEEDBACK,673LVP_CMD_DRAW_INDIRECT_BYTE_COUNT,674LVP_CMD_BEGIN_CONDITIONAL_RENDERING,675LVP_CMD_END_CONDITIONAL_RENDERING,676LVP_CMD_SET_VERTEX_INPUT,677LVP_CMD_SET_CULL_MODE,678LVP_CMD_SET_FRONT_FACE,679LVP_CMD_SET_PRIMITIVE_TOPOLOGY,680LVP_CMD_SET_DEPTH_TEST_ENABLE,681LVP_CMD_SET_DEPTH_WRITE_ENABLE,682LVP_CMD_SET_DEPTH_COMPARE_OP,683LVP_CMD_SET_DEPTH_BOUNDS_TEST_ENABLE,684LVP_CMD_SET_STENCIL_TEST_ENABLE,685LVP_CMD_SET_STENCIL_OP,686LVP_CMD_SET_LINE_STIPPLE,687LVP_CMD_SET_DEPTH_BIAS_ENABLE,688LVP_CMD_SET_LOGIC_OP,689LVP_CMD_SET_PATCH_CONTROL_POINTS,690LVP_CMD_SET_PRIMITIVE_RESTART_ENABLE,691LVP_CMD_SET_RASTERIZER_DISCARD_ENABLE,692};693694struct lvp_cmd_bind_pipeline {695VkPipelineBindPoint bind_point;696struct lvp_pipeline *pipeline;697};698699struct lvp_cmd_set_viewport {700uint32_t first_viewport;701uint32_t viewport_count;702VkViewport viewports[16];703};704705struct lvp_cmd_set_scissor {706uint32_t first_scissor;707uint32_t scissor_count;708VkRect2D scissors[16];709};710711struct lvp_cmd_set_line_width {712float line_width;713};714715struct lvp_cmd_set_depth_bias {716float constant_factor;717float clamp;718float slope_factor;719};720721struct lvp_cmd_set_blend_constants {722float blend_constants[4];723};724725struct lvp_cmd_set_depth_bounds {726float min_depth;727float max_depth;728};729730struct lvp_cmd_set_stencil_vals {731VkStencilFaceFlags face_mask;732uint32_t value;733};734735struct lvp_cmd_bind_descriptor_sets {736VkPipelineBindPoint bind_point;737struct lvp_descriptor_set_layout *set_layout[MAX_SETS];738uint32_t first;739uint32_t count;740struct lvp_descriptor_set **sets;741uint32_t dynamic_offset_count;742const uint32_t *dynamic_offsets;743};744745struct lvp_cmd_bind_index_buffer {746const struct lvp_buffer *buffer;747VkDeviceSize offset;748VkIndexType index_type;749};750751struct lvp_cmd_bind_vertex_buffers {752uint32_t first;753uint32_t binding_count;754struct lvp_buffer **buffers;755const VkDeviceSize *offsets;756const VkDeviceSize *sizes;757const VkDeviceSize *strides;758};759760struct lvp_cmd_draw {761uint32_t instance_count;762uint32_t first_instance;763uint32_t draw_count;764struct pipe_draw_start_count_bias draws[0];765};766767struct lvp_cmd_draw_indexed {768uint32_t instance_count;769uint32_t first_instance;770bool calc_start;771uint32_t draw_count;772bool vertex_offset_changes;773struct pipe_draw_start_count_bias draws[0];774};775776struct lvp_cmd_draw_indirect {777VkDeviceSize offset;778struct lvp_buffer *buffer;779uint32_t draw_count;780uint32_t stride;781};782783struct lvp_cmd_dispatch {784uint32_t x;785uint32_t y;786uint32_t z;787uint32_t base_x;788uint32_t base_y;789uint32_t base_z;790};791792struct lvp_cmd_dispatch_indirect {793const struct lvp_buffer *buffer;794VkDeviceSize offset;795};796797struct lvp_cmd_copy_buffer {798struct lvp_buffer *src;799struct lvp_buffer *dst;800uint32_t region_count;801const VkBufferCopy *regions;802};803804struct lvp_cmd_copy_image {805struct lvp_image *src;806struct lvp_image *dst;807VkImageLayout src_layout;808VkImageLayout dst_layout;809uint32_t region_count;810const VkImageCopy *regions;811};812813struct lvp_cmd_blit_image {814struct lvp_image *src;815struct lvp_image *dst;816VkImageLayout src_layout;817VkImageLayout dst_layout;818uint32_t region_count;819const VkImageBlit *regions;820VkFilter filter;821};822823struct lvp_cmd_copy_buffer_to_image {824struct lvp_buffer *src;825struct lvp_image *dst;826VkImageLayout dst_layout;827uint32_t region_count;828const VkBufferImageCopy *regions;829};830831struct lvp_cmd_copy_image_to_buffer {832struct lvp_image *src;833struct lvp_buffer *dst;834VkImageLayout src_layout;835uint32_t region_count;836const VkBufferImageCopy *regions;837};838839struct lvp_cmd_update_buffer {840struct lvp_buffer *buffer;841VkDeviceSize offset;842VkDeviceSize data_size;843char data[0];844};845846struct lvp_cmd_fill_buffer {847struct lvp_buffer *buffer;848VkDeviceSize offset;849VkDeviceSize fill_size;850uint32_t data;851};852853struct lvp_cmd_clear_color_image {854struct lvp_image *image;855VkImageLayout layout;856VkClearColorValue clear_val;857uint32_t range_count;858VkImageSubresourceRange *ranges;859};860861struct lvp_cmd_clear_ds_image {862struct lvp_image *image;863VkImageLayout layout;864VkClearDepthStencilValue clear_val;865uint32_t range_count;866VkImageSubresourceRange *ranges;867};868869struct lvp_cmd_clear_attachments {870uint32_t attachment_count;871VkClearAttachment *attachments;872uint32_t rect_count;873VkClearRect *rects;874};875876struct lvp_cmd_resolve_image {877struct lvp_image *src;878struct lvp_image *dst;879VkImageLayout src_layout;880VkImageLayout dst_layout;881uint32_t region_count;882VkImageResolve *regions;883};884885struct lvp_cmd_event_set {886struct lvp_event *event;887bool value;888bool flush;889};890891struct lvp_cmd_wait_events {892uint32_t event_count;893struct lvp_event **events;894VkPipelineStageFlags src_stage_mask;895VkPipelineStageFlags dst_stage_mask;896uint32_t memory_barrier_count;897VkMemoryBarrier *memory_barriers;898uint32_t buffer_memory_barrier_count;899VkBufferMemoryBarrier *buffer_memory_barriers;900uint32_t image_memory_barrier_count;901VkImageMemoryBarrier *image_memory_barriers;902};903904struct lvp_cmd_pipeline_barrier {905VkPipelineStageFlags src_stage_mask;906VkPipelineStageFlags dst_stage_mask;907bool by_region;908uint32_t memory_barrier_count;909VkMemoryBarrier *memory_barriers;910uint32_t buffer_memory_barrier_count;911VkBufferMemoryBarrier *buffer_memory_barriers;912uint32_t image_memory_barrier_count;913VkImageMemoryBarrier *image_memory_barriers;914};915916struct lvp_cmd_query_cmd {917struct lvp_query_pool *pool;918uint32_t query;919uint32_t index;920bool precise;921bool flush;922};923924struct lvp_cmd_copy_query_pool_results {925struct lvp_query_pool *pool;926uint32_t first_query;927uint32_t query_count;928struct lvp_buffer *dst;929VkDeviceSize dst_offset;930VkDeviceSize stride;931VkQueryResultFlags flags;932};933934struct lvp_cmd_push_constants {935VkShaderStageFlags stage;936uint32_t offset;937uint32_t size;938uint32_t val[1];939};940941struct lvp_attachment_state {942VkImageAspectFlags pending_clear_aspects;943VkClearValue clear_value;944};945946struct lvp_cmd_begin_render_pass {947struct lvp_framebuffer *framebuffer;948struct lvp_render_pass *render_pass;949VkRect2D render_area;950struct lvp_attachment_state *attachments;951struct lvp_image_view **imageless_views;952};953954struct lvp_cmd_next_subpass {955VkSubpassContents contents;956};957958struct lvp_cmd_execute_commands {959uint32_t command_buffer_count;960struct lvp_cmd_buffer *cmd_buffers[0];961};962963struct lvp_cmd_draw_indirect_count {964VkDeviceSize offset;965struct lvp_buffer *buffer;966VkDeviceSize count_buffer_offset;967struct lvp_buffer *count_buffer;968uint32_t max_draw_count;969uint32_t stride;970};971972struct lvp_write_descriptor {973uint32_t dst_binding;974uint32_t dst_array_element;975uint32_t descriptor_count;976VkDescriptorType descriptor_type;977};978979struct lvp_cmd_push_descriptor_set {980VkPipelineBindPoint bind_point;981struct lvp_pipeline_layout *layout;982uint32_t set;983uint32_t descriptor_write_count;984struct lvp_write_descriptor *descriptors;985union lvp_descriptor_info *infos;986};987988struct lvp_cmd_bind_transform_feedback_buffers {989uint32_t first_binding;990uint32_t binding_count;991struct lvp_buffer **buffers;992VkDeviceSize *offsets;993VkDeviceSize *sizes;994};995996struct lvp_cmd_begin_transform_feedback {997uint32_t first_counter_buffer;998uint32_t counter_buffer_count;999struct lvp_buffer **counter_buffers;1000VkDeviceSize *counter_buffer_offsets;1001};10021003struct lvp_cmd_end_transform_feedback {1004uint32_t first_counter_buffer;1005uint32_t counter_buffer_count;1006struct lvp_buffer **counter_buffers;1007VkDeviceSize *counter_buffer_offsets;1008};10091010struct lvp_cmd_draw_indirect_byte_count {1011uint32_t instance_count;1012uint32_t first_instance;1013struct lvp_buffer *counter_buffer;1014VkDeviceSize counter_buffer_offset;1015uint32_t counter_offset;1016uint32_t vertex_stride;1017};10181019struct lvp_cmd_begin_conditional_rendering {1020struct lvp_buffer *buffer;1021VkDeviceSize offset;1022bool inverted;1023};10241025struct lvp_cmd_set_vertex_input {1026uint32_t binding_count;1027uint32_t attr_count;1028uint8_t data[0];1029//VkVertexInputBindingDescription2EXT bindings[binding_count];1030//VkVertexInputAttributeDescription2EXT attrs[attr_count];1031};10321033struct lvp_cmd_set_cull_mode {1034VkCullModeFlags cull_mode;1035};10361037struct lvp_cmd_set_front_face {1038VkFrontFace front_face;1039};10401041struct lvp_cmd_set_primitive_topology {1042VkPrimitiveTopology prim;1043};10441045struct lvp_cmd_set_depth_test_enable {1046VkBool32 depth_test_enable;1047};10481049struct lvp_cmd_set_depth_write_enable {1050VkBool32 depth_write_enable;1051};10521053struct lvp_cmd_set_depth_bounds_test_enable {1054VkBool32 depth_bounds_test_enable;1055};10561057struct lvp_cmd_set_depth_compare_op {1058VkCompareOp depth_op;1059};10601061struct lvp_cmd_set_stencil_test_enable {1062VkBool32 stencil_test_enable;1063};10641065struct lvp_cmd_set_stencil_op {1066VkStencilFaceFlags face_mask;1067VkStencilOp fail_op;1068VkStencilOp pass_op;1069VkStencilOp depth_fail_op;1070VkCompareOp compare_op;1071};10721073struct lvp_cmd_set_line_stipple {1074uint32_t line_stipple_factor;1075uint16_t line_stipple_pattern;1076};10771078struct lvp_cmd_set_depth_bias_enable {1079bool enable;1080};10811082struct lvp_cmd_set_logic_op {1083VkLogicOp op;1084};10851086struct lvp_cmd_set_patch_control_points {1087uint32_t vertices_per_patch;1088};10891090struct lvp_cmd_set_primitive_restart_enable {1091bool enable;1092};10931094struct lvp_cmd_set_rasterizer_discard_enable {1095bool enable;1096};10971098struct lvp_cmd_buffer_entry {1099struct list_head cmd_link;1100uint32_t cmd_type;1101union {1102struct lvp_cmd_bind_pipeline pipeline;1103struct lvp_cmd_set_viewport set_viewport;1104struct lvp_cmd_set_scissor set_scissor;1105struct lvp_cmd_set_line_width set_line_width;1106struct lvp_cmd_set_depth_bias set_depth_bias;1107struct lvp_cmd_set_blend_constants set_blend_constants;1108struct lvp_cmd_set_depth_bounds set_depth_bounds;1109struct lvp_cmd_set_stencil_vals stencil_vals;1110struct lvp_cmd_bind_descriptor_sets descriptor_sets;1111struct lvp_cmd_bind_vertex_buffers vertex_buffers;1112struct lvp_cmd_bind_index_buffer index_buffer;1113struct lvp_cmd_draw draw;1114struct lvp_cmd_draw_indexed draw_indexed;1115struct lvp_cmd_draw_indirect draw_indirect;1116struct lvp_cmd_dispatch dispatch;1117struct lvp_cmd_dispatch_indirect dispatch_indirect;1118struct lvp_cmd_copy_buffer copy_buffer;1119struct lvp_cmd_copy_image copy_image;1120struct lvp_cmd_blit_image blit_image;1121struct lvp_cmd_copy_buffer_to_image buffer_to_img;1122struct lvp_cmd_copy_image_to_buffer img_to_buffer;1123struct lvp_cmd_update_buffer update_buffer;1124struct lvp_cmd_fill_buffer fill_buffer;1125struct lvp_cmd_clear_color_image clear_color_image;1126struct lvp_cmd_clear_ds_image clear_ds_image;1127struct lvp_cmd_clear_attachments clear_attachments;1128struct lvp_cmd_resolve_image resolve_image;1129struct lvp_cmd_event_set event_set;1130struct lvp_cmd_wait_events wait_events;1131struct lvp_cmd_pipeline_barrier pipeline_barrier;1132struct lvp_cmd_query_cmd query;1133struct lvp_cmd_copy_query_pool_results copy_query_pool_results;1134struct lvp_cmd_push_constants push_constants;1135struct lvp_cmd_begin_render_pass begin_render_pass;1136struct lvp_cmd_next_subpass next_subpass;1137struct lvp_cmd_execute_commands execute_commands;1138struct lvp_cmd_draw_indirect_count draw_indirect_count;1139struct lvp_cmd_push_descriptor_set push_descriptor_set;1140struct lvp_cmd_bind_transform_feedback_buffers bind_transform_feedback_buffers;1141struct lvp_cmd_begin_transform_feedback begin_transform_feedback;1142struct lvp_cmd_end_transform_feedback end_transform_feedback;1143struct lvp_cmd_draw_indirect_byte_count draw_indirect_byte_count;1144struct lvp_cmd_begin_conditional_rendering begin_conditional_rendering;1145struct lvp_cmd_set_vertex_input set_vertex_input;1146struct lvp_cmd_set_cull_mode set_cull_mode;1147struct lvp_cmd_set_front_face set_front_face;1148struct lvp_cmd_set_primitive_topology set_primitive_topology;1149struct lvp_cmd_set_depth_test_enable set_depth_test_enable;1150struct lvp_cmd_set_depth_write_enable set_depth_write_enable;1151struct lvp_cmd_set_depth_compare_op set_depth_compare_op;1152struct lvp_cmd_set_depth_bounds_test_enable set_depth_bounds_test_enable;1153struct lvp_cmd_set_stencil_test_enable set_stencil_test_enable;1154struct lvp_cmd_set_stencil_op set_stencil_op;1155struct lvp_cmd_set_line_stipple set_line_stipple;1156struct lvp_cmd_set_depth_bias_enable set_depth_bias_enable;1157struct lvp_cmd_set_logic_op set_logic_op;1158struct lvp_cmd_set_patch_control_points set_patch_control_points;1159struct lvp_cmd_set_primitive_restart_enable set_primitive_restart_enable;1160struct lvp_cmd_set_rasterizer_discard_enable set_rasterizer_discard_enable;1161} u;1162};11631164VkResult lvp_execute_cmds(struct lvp_device *device,1165struct lvp_queue *queue,1166struct lvp_cmd_buffer *cmd_buffer);11671168struct lvp_image *lvp_swapchain_get_image(VkSwapchainKHR swapchain,1169uint32_t index);11701171static inline enum pipe_format1172lvp_vk_format_to_pipe_format(VkFormat format)1173{1174/* Some formats cause problems with CTS right now.*/1175if (format == VK_FORMAT_R4G4B4A4_UNORM_PACK16 ||1176format == VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT || /* VK_EXT_4444_formats */1177format == VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT || /* VK_EXT_4444_formats */1178format == VK_FORMAT_R5G5B5A1_UNORM_PACK16 ||1179format == VK_FORMAT_R8_SRGB ||1180format == VK_FORMAT_R8G8_SRGB ||1181format == VK_FORMAT_R64G64B64A64_SFLOAT ||1182format == VK_FORMAT_R64_SFLOAT ||1183format == VK_FORMAT_R64G64_SFLOAT ||1184format == VK_FORMAT_R64G64B64_SFLOAT ||1185format == VK_FORMAT_A2R10G10B10_SINT_PACK32 ||1186format == VK_FORMAT_A2B10G10R10_SINT_PACK32 ||1187format == VK_FORMAT_G8B8G8R8_422_UNORM ||1188format == VK_FORMAT_B8G8R8G8_422_UNORM ||1189format == VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM ||1190format == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM ||1191format == VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM ||1192format == VK_FORMAT_G8_B8R8_2PLANE_422_UNORM ||1193format == VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM ||1194format == VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM ||1195format == VK_FORMAT_G16_B16R16_2PLANE_420_UNORM ||1196format == VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM ||1197format == VK_FORMAT_G16_B16R16_2PLANE_422_UNORM ||1198format == VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM ||1199format == VK_FORMAT_D16_UNORM_S8_UINT)1200return PIPE_FORMAT_NONE;12011202return vk_format_to_pipe_format(format);1203}12041205#ifdef __cplusplus1206}1207#endif120812091210