blob: 2eb71a27f1edac817e4d708186f04b4e33ce2b8b [file] [log] [blame]
/*
* Copyright © 2021 Collabora Ltd.
*
* derived from tu_private.h driver which is:
* Copyright © 2016 Red Hat.
* Copyright © 2016 Bas Nieuwenhuizen
* Copyright © 2015 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef PANVK_PRIVATE_H
#define PANVK_PRIVATE_H
#include <assert.h>
#include <pthread.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef HAVE_VALGRIND
#include <memcheck.h>
#include <valgrind.h>
#define VG(x) x
#else
#define VG(x)
#endif
#include "c11/threads.h"
#include "compiler/shader_enums.h"
#include "util/list.h"
#include "util/macros.h"
#include "vk_alloc.h"
#include "vk_buffer.h"
#include "vk_command_buffer.h"
#include "vk_command_pool.h"
#include "vk_descriptor_set_layout.h"
#include "vk_device.h"
#include "vk_image.h"
#include "vk_instance.h"
#include "vk_log.h"
#include "vk_object.h"
#include "vk_physical_device.h"
#include "vk_pipeline_layout.h"
#include "vk_queue.h"
#include "vk_sync.h"
#include "wsi_common.h"
#include "drm-uapi/panfrost_drm.h"
#include "pan_blend.h"
#include "pan_cs.h"
#include "pan_device.h"
#include "panvk_mempool.h"
#include "pan_texture.h"
#include "pan_scoreboard.h"
#include "vk_extensions.h"
#include "panvk_varyings.h"
/* Pre-declarations needed for WSI entrypoints */
struct wl_surface;
struct wl_display;
typedef struct xcb_connection_t xcb_connection_t;
typedef uint32_t xcb_visualid_t;
typedef uint32_t xcb_window_t;
#include <vulkan/vk_android_native_buffer.h>
#include <vulkan/vk_icd.h>
#include <vulkan/vulkan.h>
#include "panvk_entrypoints.h"
#define MAX_BIND_POINTS 2 /* compute + graphics */
#define MAX_VBS 16
#define MAX_VERTEX_ATTRIBS 16
#define MAX_RTS 8
#define MAX_VSC_PIPES 32
#define MAX_VIEWPORTS 1
#define MAX_SCISSORS 16
#define MAX_DISCARD_RECTANGLES 4
#define MAX_PUSH_CONSTANTS_SIZE 128
#define MAX_PUSH_DESCRIPTORS 32
#define MAX_DYNAMIC_UNIFORM_BUFFERS 16
#define MAX_DYNAMIC_STORAGE_BUFFERS 8
#define MAX_DYNAMIC_BUFFERS \
(MAX_DYNAMIC_UNIFORM_BUFFERS + MAX_DYNAMIC_STORAGE_BUFFERS)
#define MAX_SAMPLES_LOG2 4
#define NUM_META_FS_KEYS 13
#define MAX_VIEWS 8
#define NUM_DEPTH_CLEAR_PIPELINES 3
#define PANVK_SYSVAL_UBO_INDEX 0
#define PANVK_PUSH_CONST_UBO_INDEX 1
#define PANVK_NUM_BUILTIN_UBOS 2
#define panvk_printflike(a, b) __attribute__((__format__(__printf__, a, b)))
void
panvk_logi(const char *format, ...) panvk_printflike(1, 2);
void
panvk_logi_v(const char *format, va_list va);
#define panvk_stub() assert(!"stub")
#define PANVK_META_COPY_BUF2IMG_NUM_FORMATS 12
#define PANVK_META_COPY_IMG2BUF_NUM_FORMATS 12
#define PANVK_META_COPY_IMG2IMG_NUM_FORMATS 14
#define PANVK_META_COPY_NUM_TEX_TYPES 5
#define PANVK_META_COPY_BUF2BUF_NUM_BLKSIZES 5
static inline unsigned
panvk_meta_copy_tex_type(unsigned dim, bool isarray)
{
assert(dim > 0 && dim <= 3);
assert(dim < 3 || !isarray);
return (((dim - 1) << 1) | (isarray ? 1 : 0));
}
struct panvk_meta {
struct panvk_pool bin_pool;
struct panvk_pool desc_pool;
/* Access to the blitter pools are protected by the blitter
* shader/rsd locks. They can't be merged with other binary/desc
* pools unless we patch pan_blitter.c to external pool locks.
*/
struct {
struct panvk_pool bin_pool;
struct panvk_pool desc_pool;
} blitter;
struct {
struct {
mali_ptr shader;
struct pan_shader_info shader_info;
} color[3]; /* 3 base types */
} clear_attachment;
struct {
struct {
mali_ptr rsd;
} buf2img[PANVK_META_COPY_BUF2IMG_NUM_FORMATS];
struct {
mali_ptr rsd;
} img2buf[PANVK_META_COPY_NUM_TEX_TYPES][PANVK_META_COPY_IMG2BUF_NUM_FORMATS];
struct {
mali_ptr rsd;
} img2img[2][PANVK_META_COPY_NUM_TEX_TYPES][PANVK_META_COPY_IMG2IMG_NUM_FORMATS];
struct {
mali_ptr rsd;
} buf2buf[PANVK_META_COPY_BUF2BUF_NUM_BLKSIZES];
struct {
mali_ptr rsd;
} fillbuf;
} copy;
};
struct panvk_physical_device {
struct vk_physical_device vk;
/* The API agnostic device object. */
struct panfrost_device pdev;
struct panvk_instance *instance;
char path[20];
char name[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE];
uint8_t driver_uuid[VK_UUID_SIZE];
uint8_t device_uuid[VK_UUID_SIZE];
uint8_t cache_uuid[VK_UUID_SIZE];
struct vk_sync_type drm_syncobj_type;
const struct vk_sync_type *sync_types[2];
struct wsi_device wsi_device;
struct panvk_meta meta;
int master_fd;
};
enum panvk_debug_flags {
PANVK_DEBUG_STARTUP = 1 << 0,
PANVK_DEBUG_NIR = 1 << 1,
PANVK_DEBUG_TRACE = 1 << 2,
PANVK_DEBUG_SYNC = 1 << 3,
PANVK_DEBUG_AFBC = 1 << 4,
PANVK_DEBUG_LINEAR = 1 << 5,
PANVK_DEBUG_DUMP = 1 << 6,
};
struct panvk_instance {
struct vk_instance vk;
uint32_t api_version;
enum panvk_debug_flags debug_flags;
};
VkResult
panvk_wsi_init(struct panvk_physical_device *physical_device);
void
panvk_wsi_finish(struct panvk_physical_device *physical_device);
bool
panvk_instance_extension_supported(const char *name);
uint32_t
panvk_physical_device_api_version(struct panvk_physical_device *dev);
bool
panvk_physical_device_extension_supported(struct panvk_physical_device *dev,
const char *name);
struct panvk_pipeline_cache {
struct vk_object_base base;
VkAllocationCallbacks alloc;
};
/* queue types */
#define PANVK_QUEUE_GENERAL 0
#define PANVK_MAX_QUEUE_FAMILIES 1
struct panvk_queue {
struct vk_queue vk;
struct panvk_device *device;
uint32_t sync;
};
struct panvk_device {
struct vk_device vk;
struct vk_device_dispatch_table cmd_dispatch;
struct panvk_instance *instance;
struct panvk_queue *queues[PANVK_MAX_QUEUE_FAMILIES];
int queue_count[PANVK_MAX_QUEUE_FAMILIES];
struct panvk_physical_device *physical_device;
int _lost;
};
VkResult _panvk_device_set_lost(struct panvk_device *device,
const char *file, int line,
const char *msg, ...) PRINTFLIKE(4, 5);
#define panvk_device_set_lost(dev, ...) \
_panvk_device_set_lost(dev, __FILE__, __LINE__, __VA_ARGS__)
static inline bool
panvk_device_is_lost(struct panvk_device *device)
{
return unlikely(p_atomic_read(&device->_lost));
}
#define TILER_DESC_WORDS 56
struct panvk_batch {
struct list_head node;
struct util_dynarray jobs;
struct util_dynarray event_ops;
struct pan_scoreboard scoreboard;
struct {
const struct panvk_framebuffer *info;
struct panfrost_ptr desc;
} fb;
struct {
struct panfrost_bo *src, *dst;
} blit;
struct panfrost_ptr tls;
mali_ptr fragment_job;
struct {
struct pan_tiler_context ctx;
struct panfrost_ptr descs;
uint32_t templ[TILER_DESC_WORDS];
} tiler;
struct pan_tls_info tlsinfo;
unsigned wls_total_size;
bool issued;
};
enum panvk_event_op_type {
PANVK_EVENT_OP_SET,
PANVK_EVENT_OP_RESET,
PANVK_EVENT_OP_WAIT,
};
struct panvk_event_op {
enum panvk_event_op_type type;
struct panvk_event *event;
};
struct panvk_device_memory {
struct vk_object_base base;
struct panfrost_bo *bo;
};
struct panvk_buffer_desc {
struct panvk_buffer *buffer;
VkDeviceSize offset;
VkDeviceSize size;
};
struct panvk_descriptor_set {
struct vk_object_base base;
struct panvk_descriptor_pool *pool;
const struct panvk_descriptor_set_layout *layout;
struct panvk_buffer_desc *dyn_ssbos;
void *ubos;
struct panvk_buffer_desc *dyn_ubos;
void *samplers;
void *textures;
void *img_attrib_bufs;
uint32_t *img_fmts;
struct panfrost_bo *desc_bo;
};
#define MAX_SETS 4
struct panvk_descriptor_set_binding_layout {
VkDescriptorType type;
/* Number of array elements in this binding */
unsigned array_size;
/* Indices in the desc arrays */
union {
struct {
union {
unsigned sampler_idx;
unsigned img_idx;
};
unsigned tex_idx;
};
unsigned dyn_ssbo_idx;
unsigned ubo_idx;
unsigned dyn_ubo_idx;
};
/* Offset into the descriptor UBO where this binding starts */
uint32_t desc_ubo_offset;
/* Stride between descriptors in this binding in the UBO */
uint16_t desc_ubo_stride;
/* Shader stages affected by this set+binding */
uint16_t shader_stages;
struct panvk_sampler **immutable_samplers;
};
struct panvk_descriptor_set_layout {
struct vk_descriptor_set_layout vk;
/* Shader stages affected by this descriptor set */
uint16_t shader_stages;
unsigned num_samplers;
unsigned num_textures;
unsigned num_ubos;
unsigned num_dyn_ubos;
unsigned num_dyn_ssbos;
unsigned num_imgs;
/* Size of the descriptor UBO */
uint32_t desc_ubo_size;
/* Index of the descriptor UBO */
unsigned desc_ubo_index;
/* Number of bindings in this descriptor set */
uint32_t binding_count;
/* Bindings in this descriptor set */
struct panvk_descriptor_set_binding_layout bindings[0];
};
static inline const struct panvk_descriptor_set_layout *
vk_to_panvk_descriptor_set_layout(const struct vk_descriptor_set_layout *layout)
{
return container_of(layout, const struct panvk_descriptor_set_layout, vk);
}
struct panvk_pipeline_layout {
struct vk_pipeline_layout vk;
unsigned char sha1[20];
unsigned num_samplers;
unsigned num_textures;
unsigned num_ubos;
unsigned num_dyn_ubos;
unsigned num_dyn_ssbos;
uint32_t num_imgs;
uint32_t num_sets;
struct {
uint32_t size;
} push_constants;
struct {
unsigned sampler_offset;
unsigned tex_offset;
unsigned ubo_offset;
unsigned dyn_ubo_offset;
unsigned dyn_ssbo_offset;
unsigned img_offset;
} sets[MAX_SETS];
};
static unsigned
panvk_pipeline_layout_ubo_start(const struct panvk_pipeline_layout *layout,
unsigned set, bool is_dynamic)
{
const struct panvk_descriptor_set_layout *set_layout =
vk_to_panvk_descriptor_set_layout(layout->vk.set_layouts[set]);
unsigned offset = PANVK_NUM_BUILTIN_UBOS +
layout->sets[set].ubo_offset +
layout->sets[set].dyn_ubo_offset;
if (is_dynamic)
offset += set_layout->num_ubos;
return offset;
}
static unsigned
panvk_pipeline_layout_ubo_index(const struct panvk_pipeline_layout *layout,
unsigned set, unsigned binding,
unsigned array_index)
{
const struct panvk_descriptor_set_layout *set_layout =
vk_to_panvk_descriptor_set_layout(layout->vk.set_layouts[set]);
const struct panvk_descriptor_set_binding_layout *binding_layout =
&set_layout->bindings[binding];
const bool is_dynamic =
binding_layout->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
const uint32_t ubo_idx = is_dynamic ? binding_layout->dyn_ubo_idx :
binding_layout->ubo_idx;
return panvk_pipeline_layout_ubo_start(layout, set, is_dynamic) +
ubo_idx + array_index;
}
struct panvk_desc_pool_counters {
unsigned samplers;
unsigned combined_image_samplers;
unsigned sampled_images;
unsigned storage_images;
unsigned uniform_texel_bufs;
unsigned storage_texel_bufs;
unsigned input_attachments;
unsigned uniform_bufs;
unsigned storage_bufs;
unsigned uniform_dyn_bufs;
unsigned storage_dyn_bufs;
unsigned sets;
};
struct panvk_descriptor_pool {
struct vk_object_base base;
struct panvk_desc_pool_counters max;
struct panvk_desc_pool_counters cur;
struct panvk_descriptor_set *sets;
};
struct panvk_buffer {
struct vk_buffer vk;
struct panfrost_bo *bo;
VkDeviceSize bo_offset;
};
static inline mali_ptr
panvk_buffer_gpu_ptr(const struct panvk_buffer *buffer, uint64_t offset)
{
if (buffer->bo == NULL)
return 0;
return buffer->bo->ptr.gpu + buffer->bo_offset + offset;
}
static inline uint64_t
panvk_buffer_range(const struct panvk_buffer *buffer,
uint64_t offset, uint64_t range)
{
if (buffer->bo == NULL)
return 0;
return vk_buffer_range(&buffer->vk, offset, range);
}
enum panvk_dynamic_state_bits {
PANVK_DYNAMIC_VIEWPORT = 1 << 0,
PANVK_DYNAMIC_SCISSOR = 1 << 1,
PANVK_DYNAMIC_LINE_WIDTH = 1 << 2,
PANVK_DYNAMIC_DEPTH_BIAS = 1 << 3,
PANVK_DYNAMIC_BLEND_CONSTANTS = 1 << 4,
PANVK_DYNAMIC_DEPTH_BOUNDS = 1 << 5,
PANVK_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 6,
PANVK_DYNAMIC_STENCIL_WRITE_MASK = 1 << 7,
PANVK_DYNAMIC_STENCIL_REFERENCE = 1 << 8,
PANVK_DYNAMIC_DISCARD_RECTANGLE = 1 << 9,
PANVK_DYNAMIC_SSBO = 1 << 10,
PANVK_DYNAMIC_VERTEX_INSTANCE_OFFSETS = 1 << 11,
PANVK_DYNAMIC_ALL = (1 << 12) - 1,
};
/* This has to match nir_address_format_64bit_bounded_global */
struct panvk_ssbo_addr {
uint64_t base_addr;
uint32_t size;
uint32_t zero; /* Must be zero! */
};
union panvk_sysval_vec4 {
float f32[4];
uint32_t u32[4];
};
struct panvk_sysvals {
union {
struct {
/* Only for graphics */
union panvk_sysval_vec4 viewport_scale;
union panvk_sysval_vec4 viewport_offset;
union {
union panvk_sysval_vec4 vertex_instance_offsets;
struct {
uint32_t first_vertex;
uint32_t base_vertex;
uint32_t base_instance;
};
};
union panvk_sysval_vec4 blend_constants;
};
struct {
/* Only for compute */
union panvk_sysval_vec4 num_work_groups;
union panvk_sysval_vec4 local_group_size;
};
};
/* The back-end compiler doesn't know about any sysvals after this point */
struct panvk_ssbo_addr dyn_ssbos[MAX_DYNAMIC_STORAGE_BUFFERS];
};
struct panvk_descriptor_state {
uint32_t dirty;
const struct panvk_descriptor_set *sets[MAX_SETS];
struct panvk_sysvals sysvals;
struct {
struct panvk_buffer_desc ubos[MAX_DYNAMIC_UNIFORM_BUFFERS];
struct panvk_buffer_desc ssbos[MAX_DYNAMIC_STORAGE_BUFFERS];
} dyn;
mali_ptr sysvals_ptr;
mali_ptr ubos;
mali_ptr textures;
mali_ptr samplers;
mali_ptr push_constants;
mali_ptr vs_attribs;
mali_ptr vs_attrib_bufs;
mali_ptr non_vs_attribs;
mali_ptr non_vs_attrib_bufs;
};
#define INVOCATION_DESC_WORDS 2
struct panvk_draw_info {
unsigned first_index;
unsigned index_count;
unsigned index_size;
unsigned first_vertex;
unsigned vertex_count;
unsigned vertex_range;
unsigned padded_vertex_count;
unsigned first_instance;
unsigned instance_count;
int vertex_offset;
unsigned offset_start;
uint32_t invocation[INVOCATION_DESC_WORDS];
struct {
mali_ptr varyings;
mali_ptr attributes;
mali_ptr attribute_bufs;
mali_ptr push_constants;
} stages[MESA_SHADER_STAGES];
mali_ptr varying_bufs;
mali_ptr textures;
mali_ptr samplers;
mali_ptr ubos;
mali_ptr position;
mali_ptr indices;
union {
mali_ptr psiz;
float line_width;
};
mali_ptr tls;
mali_ptr fb;
const struct pan_tiler_context *tiler_ctx;
mali_ptr fs_rsd;
mali_ptr viewport;
struct {
struct panfrost_ptr vertex;
struct panfrost_ptr tiler;
} jobs;
};
struct panvk_dispatch_info {
struct pan_compute_dim wg_count;
mali_ptr attributes;
mali_ptr attribute_bufs;
mali_ptr tsd;
mali_ptr ubos;
mali_ptr push_uniforms;
mali_ptr textures;
mali_ptr samplers;
};
struct panvk_attrib_info {
unsigned buf;
unsigned offset;
enum pipe_format format;
};
struct panvk_attrib_buf_info {
bool special;
union {
struct {
unsigned stride;
bool per_instance;
uint32_t instance_divisor;
};
unsigned special_id;
};
};
struct panvk_attribs_info {
struct panvk_attrib_info attrib[PAN_MAX_ATTRIBUTE];
unsigned attrib_count;
struct panvk_attrib_buf_info buf[PAN_MAX_ATTRIBUTE];
unsigned buf_count;
};
struct panvk_attrib_buf {
mali_ptr address;
unsigned size;
};
struct panvk_cmd_state {
uint32_t dirty;
struct panvk_varyings_info varyings;
mali_ptr fs_rsd;
struct {
float constants[4];
} blend;
struct {
struct {
float constant_factor;
float clamp;
float slope_factor;
} depth_bias;
float line_width;
} rast;
struct {
struct panvk_attrib_buf bufs[MAX_VBS];
unsigned count;
} vb;
/* Index buffer */
struct {
struct panvk_buffer *buffer;
uint64_t offset;
uint8_t index_size;
uint32_t first_vertex, base_vertex, base_instance;
} ib;
struct {
struct {
uint8_t compare_mask;
uint8_t write_mask;
uint8_t ref;
} s_front, s_back;
} zs;
struct {
struct pan_fb_info info;
bool crc_valid[MAX_RTS];
} fb;
const struct panvk_render_pass *pass;
const struct panvk_subpass *subpass;
const struct panvk_framebuffer *framebuffer;
VkRect2D render_area;
struct panvk_clear_value *clear;
mali_ptr vpd;
VkViewport viewport;
VkRect2D scissor;
struct panvk_batch *batch;
};
struct panvk_cmd_pool {
struct vk_command_pool vk;
struct list_head active_cmd_buffers;
struct list_head free_cmd_buffers;
struct panvk_bo_pool desc_bo_pool;
struct panvk_bo_pool varying_bo_pool;
struct panvk_bo_pool tls_bo_pool;
};
enum panvk_cmd_buffer_status {
PANVK_CMD_BUFFER_STATUS_INVALID,
PANVK_CMD_BUFFER_STATUS_INITIAL,
PANVK_CMD_BUFFER_STATUS_RECORDING,
PANVK_CMD_BUFFER_STATUS_EXECUTABLE,
PANVK_CMD_BUFFER_STATUS_PENDING,
};
struct panvk_cmd_bind_point_state {
struct panvk_descriptor_state desc_state;
const struct panvk_pipeline *pipeline;
};
struct panvk_cmd_buffer {
struct vk_command_buffer vk;
struct panvk_device *device;
struct panvk_cmd_pool *pool;
struct list_head pool_link;
struct panvk_pool desc_pool;
struct panvk_pool varying_pool;
struct panvk_pool tls_pool;
struct list_head batches;
VkCommandBufferUsageFlags usage_flags;
enum panvk_cmd_buffer_status status;
struct panvk_cmd_state state;
uint32_t queue_family_index;
uint8_t push_constants[MAX_PUSH_CONSTANTS_SIZE];
VkShaderStageFlags push_constant_stages;
struct panvk_descriptor_set meta_push_descriptors;
struct panvk_cmd_bind_point_state bind_points[MAX_BIND_POINTS];
};
#define panvk_cmd_get_bind_point_state(cmdbuf, bindpoint) \
&(cmdbuf)->bind_points[VK_PIPELINE_BIND_POINT_ ## bindpoint]
#define panvk_cmd_get_pipeline(cmdbuf, bindpoint) \
(cmdbuf)->bind_points[VK_PIPELINE_BIND_POINT_ ## bindpoint].pipeline
#define panvk_cmd_get_desc_state(cmdbuf, bindpoint) \
&(cmdbuf)->bind_points[VK_PIPELINE_BIND_POINT_ ## bindpoint].desc_state
struct panvk_batch *
panvk_cmd_open_batch(struct panvk_cmd_buffer *cmdbuf);
void
panvk_cmd_fb_info_set_subpass(struct panvk_cmd_buffer *cmdbuf);
void
panvk_cmd_fb_info_init(struct panvk_cmd_buffer *cmdbuf);
void
panvk_cmd_preload_fb_after_batch_split(struct panvk_cmd_buffer *cmdbuf);
void
panvk_pack_color(struct panvk_clear_value *out,
const VkClearColorValue *in,
enum pipe_format format);
struct panvk_event {
struct vk_object_base base;
uint32_t syncobj;
};
struct panvk_shader {
struct pan_shader_info info;
struct util_dynarray binary;
unsigned sysval_ubo;
struct pan_compute_dim local_size;
bool has_img_access;
};
struct panvk_shader *
panvk_shader_create(struct panvk_device *dev,
gl_shader_stage stage,
const VkPipelineShaderStageCreateInfo *stage_info,
const struct panvk_pipeline_layout *layout,
unsigned sysval_ubo,
struct pan_blend_state *blend_state,
bool static_blend_constants,
const VkAllocationCallbacks *alloc);
void
panvk_shader_destroy(struct panvk_device *dev,
struct panvk_shader *shader,
const VkAllocationCallbacks *alloc);
#define RSD_WORDS 16
#define BLEND_DESC_WORDS 4
struct panvk_pipeline {
struct vk_object_base base;
struct panvk_varyings_info varyings;
struct panvk_attribs_info attribs;
const struct panvk_pipeline_layout *layout;
unsigned active_stages;
uint32_t dynamic_state_mask;
struct panfrost_bo *binary_bo;
struct panfrost_bo *state_bo;
mali_ptr vpd;
mali_ptr rsds[MESA_SHADER_STAGES];
/* shader stage bit is set of the stage accesses storage images */
uint32_t img_access_mask;
unsigned num_ubos;
struct {
unsigned ubo_idx;
struct panfrost_sysvals ids;
} sysvals[MESA_SHADER_STAGES];
unsigned tls_size;
unsigned wls_size;
struct {
mali_ptr address;
struct pan_shader_info info;
uint32_t rsd_template[RSD_WORDS];
bool required;
bool dynamic_rsd;
uint8_t rt_mask;
} fs;
struct {
struct pan_compute_dim local_size;
} cs;
struct {
unsigned topology;
bool writes_point_size;
bool primitive_restart;
} ia;
struct {
bool clamp_depth;
float line_width;
struct {
bool enable;
float constant_factor;
float clamp;
float slope_factor;
} depth_bias;
bool front_ccw;
bool cull_front_face;
bool cull_back_face;
bool enable;
} rast;
struct {
bool z_test;
bool z_write;
unsigned z_compare_func;
bool s_test;
struct {
unsigned fail_op;
unsigned pass_op;
unsigned z_fail_op;
unsigned compare_func;
uint8_t compare_mask;
uint8_t write_mask;
uint8_t ref;
} s_front, s_back;
} zs;
struct {
uint8_t rast_samples;
uint8_t min_samples;
uint16_t sample_mask;
bool alpha_to_coverage;
bool alpha_to_one;
} ms;
struct {
struct pan_blend_state state;
uint32_t bd_template[8][BLEND_DESC_WORDS];
struct {
uint8_t index;
uint16_t bifrost_factor;
} constant[8];
bool reads_dest;
} blend;
VkViewport viewport;
VkRect2D scissor;
};
#define PANVK_MAX_PLANES 1
struct panvk_image {
struct vk_image vk;
struct pan_image pimage;
};
unsigned
panvk_image_get_plane_size(const struct panvk_image *image, unsigned plane);
unsigned
panvk_image_get_total_size(const struct panvk_image *image);
#define TEXTURE_DESC_WORDS 8
#define ATTRIB_BUF_DESC_WORDS 4
struct panvk_image_view {
struct vk_image_view vk;
struct pan_image_view pview;
struct panfrost_bo *bo;
struct {
uint32_t tex[TEXTURE_DESC_WORDS];
uint32_t img_attrib_buf[ATTRIB_BUF_DESC_WORDS * 2];
} descs;
};
#define SAMPLER_DESC_WORDS 8
struct panvk_sampler {
struct vk_object_base base;
uint32_t desc[SAMPLER_DESC_WORDS];
};
struct panvk_buffer_view {
struct vk_object_base base;
struct panfrost_bo *bo;
struct {
uint32_t tex[TEXTURE_DESC_WORDS];
uint32_t img_attrib_buf[ATTRIB_BUF_DESC_WORDS * 2];
} descs;
enum pipe_format fmt;
uint32_t elems;
};
struct panvk_attachment_info {
struct panvk_image_view *iview;
};
struct panvk_framebuffer {
struct vk_object_base base;
uint32_t width;
uint32_t height;
uint32_t layers;
uint32_t attachment_count;
struct panvk_attachment_info attachments[0];
};
struct panvk_clear_value {
union {
uint32_t color[4];
struct {
float depth;
uint8_t stencil;
};
};
};
struct panvk_subpass_attachment {
uint32_t idx;
VkImageLayout layout;
bool clear;
bool preload;
};
struct panvk_subpass {
uint32_t input_count;
uint32_t color_count;
struct panvk_subpass_attachment *input_attachments;
uint8_t active_color_attachments;
struct panvk_subpass_attachment *color_attachments;
struct panvk_subpass_attachment *resolve_attachments;
struct panvk_subpass_attachment zs_attachment;
uint32_t view_mask;
};
struct panvk_render_pass_attachment {
VkAttachmentDescriptionFlags flags;
enum pipe_format format;
unsigned samples;
VkAttachmentLoadOp load_op;
VkAttachmentStoreOp store_op;
VkAttachmentLoadOp stencil_load_op;
VkAttachmentStoreOp stencil_store_op;
VkImageLayout initial_layout;
VkImageLayout final_layout;
unsigned view_mask;
unsigned first_used_in_subpass;
};
struct panvk_render_pass {
struct vk_object_base base;
uint32_t attachment_count;
uint32_t subpass_count;
struct panvk_subpass_attachment *subpass_attachments;
struct panvk_render_pass_attachment *attachments;
struct panvk_subpass subpasses[0];
};
VK_DEFINE_HANDLE_CASTS(panvk_cmd_buffer, vk.base, VkCommandBuffer, VK_OBJECT_TYPE_COMMAND_BUFFER)
VK_DEFINE_HANDLE_CASTS(panvk_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
VK_DEFINE_HANDLE_CASTS(panvk_instance, vk.base, VkInstance, VK_OBJECT_TYPE_INSTANCE)
VK_DEFINE_HANDLE_CASTS(panvk_physical_device, vk.base, VkPhysicalDevice, VK_OBJECT_TYPE_PHYSICAL_DEVICE)
VK_DEFINE_HANDLE_CASTS(panvk_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_cmd_pool, vk.base, VkCommandPool, VK_OBJECT_TYPE_COMMAND_POOL)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_buffer, vk.base, VkBuffer, VK_OBJECT_TYPE_BUFFER)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_buffer_view, base, VkBufferView, VK_OBJECT_TYPE_BUFFER_VIEW)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_descriptor_pool, base, VkDescriptorPool, VK_OBJECT_TYPE_DESCRIPTOR_POOL)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_descriptor_set, base, VkDescriptorSet, VK_OBJECT_TYPE_DESCRIPTOR_SET)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_descriptor_set_layout, vk.base,
VkDescriptorSetLayout, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_device_memory, base, VkDeviceMemory, VK_OBJECT_TYPE_DEVICE_MEMORY)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_event, base, VkEvent, VK_OBJECT_TYPE_EVENT)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_framebuffer, base, VkFramebuffer, VK_OBJECT_TYPE_FRAMEBUFFER)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_image, vk.base, VkImage, VK_OBJECT_TYPE_IMAGE)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_image_view, vk.base, VkImageView, VK_OBJECT_TYPE_IMAGE_VIEW);
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline_cache, base, VkPipelineCache, VK_OBJECT_TYPE_PIPELINE_CACHE)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline, base, VkPipeline, VK_OBJECT_TYPE_PIPELINE)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline_layout, vk.base, VkPipelineLayout, VK_OBJECT_TYPE_PIPELINE_LAYOUT)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_render_pass, base, VkRenderPass, VK_OBJECT_TYPE_RENDER_PASS)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_sampler, base, VkSampler, VK_OBJECT_TYPE_SAMPLER)
#define panvk_arch_name(name, version) panvk_## version ## _ ## name
#define panvk_arch_dispatch(arch, name, ...) \
do { \
switch (arch) { \
case 6: panvk_arch_name(name, v6)(__VA_ARGS__); break; \
case 7: panvk_arch_name(name, v7)(__VA_ARGS__); break; \
default: unreachable("Invalid arch"); \
} \
} while (0)
#ifdef PAN_ARCH
#if PAN_ARCH == 6
#define panvk_per_arch(name) panvk_arch_name(name, v6)
#elif PAN_ARCH == 7
#define panvk_per_arch(name) panvk_arch_name(name, v7)
#endif
#include "panvk_vX_cmd_buffer.h"
#include "panvk_vX_cs.h"
#include "panvk_vX_device.h"
#include "panvk_vX_meta.h"
#else
#define PAN_ARCH 6
#define panvk_per_arch(name) panvk_arch_name(name, v6)
#include "panvk_vX_cmd_buffer.h"
#include "panvk_vX_cs.h"
#include "panvk_vX_device.h"
#include "panvk_vX_meta.h"
#undef PAN_ARCH
#undef panvk_per_arch
#define PAN_ARCH 7
#define panvk_per_arch(name) panvk_arch_name(name, v7)
#include "panvk_vX_cmd_buffer.h"
#include "panvk_vX_cs.h"
#include "panvk_vX_device.h"
#include "panvk_vX_meta.h"
#undef PAN_ARCH
#undef panvk_per_arch
#endif
#ifdef PAN_ARCH
bool
panvk_per_arch(blend_needs_lowering)(const struct panfrost_device *dev,
const struct pan_blend_state *state,
unsigned rt);
struct panvk_shader *
panvk_per_arch(shader_create)(struct panvk_device *dev,
gl_shader_stage stage,
const VkPipelineShaderStageCreateInfo *stage_info,
const struct panvk_pipeline_layout *layout,
unsigned sysval_ubo,
struct pan_blend_state *blend_state,
bool static_blend_constants,
const VkAllocationCallbacks *alloc);
struct nir_shader;
bool
panvk_per_arch(nir_lower_descriptors)(struct nir_shader *nir,
struct panvk_device *dev,
const struct panvk_pipeline_layout *layout,
bool *has_img_access_out);
#endif
#endif /* PANVK_PRIVATE_H */