mesa/src/kosmickrisp/vulkan/kk_cmd_buffer.h
squidbus 6afe042105 kk: Enable VK_(EXT/KHR)_line_rasterization
For multi-sampled bresenham lines, we need to break the render pass to
center the sample positions.

Reviewed-by: Aitor Camacho <aitor@lunarg.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41499>
2026-05-12 12:02:51 +00:00

273 lines
7.2 KiB
C

/*
* Copyright © 2022 Collabora Ltd. and Red Hat Inc.
* Copyright 2025 LunarG, Inc.
* Copyright 2025 Google LLC
* SPDX-License-Identifier: MIT
*/
#ifndef KK_CMD_BUFFER_H
#define KK_CMD_BUFFER_H 1
#include "kk_private.h"
#include "kk_descriptor_set.h"
#include "kk_image.h"
#include "kk_nir_lower_vbo.h"
#include "kk_shader.h"
#include "kosmickrisp/bridge/mtl_types.h"
#include "kosmickrisp/libkk/kk_query.h"
#include "util/u_dynarray.h"
#include "vk_command_buffer.h"
#include <stdio.h>
struct kk_query_pool;
struct kk_root_descriptor_table {
struct kk_bo *root_buffer;
union {
struct {
/* Vertex input state */
uint32_t buffer_strides[KK_MAX_VBUFS];
uint64_t attrib_base[KK_MAX_ATTRIBS];
uint32_t attrib_clamps[KK_MAX_ATTRIBS];
float blend_constant[4];
float clip_z_coeff;
uint32_t draw_id;
} draw;
struct {
uint32_t base_group[3];
} cs;
};
/* Client push constants */
uint8_t push[KK_MAX_PUSH_SIZE];
/* Descriptor set base addresses */
uint64_t sets[KK_MAX_SETS];
/* Dynamic buffer bindings */
struct kk_buffer_address dynamic_buffers[KK_MAX_DYNAMIC_BUFFERS];
/* Start index in dynamic_buffers where each set starts */
uint8_t set_dynamic_buffer_start[KK_MAX_SETS];
};
struct kk_descriptor_state {
bool root_dirty;
struct kk_root_descriptor_table root;
uint32_t set_sizes[KK_MAX_SETS];
struct kk_descriptor_set *sets[KK_MAX_SETS];
uint32_t push_dirty;
struct kk_push_descriptor_set *push[KK_MAX_SETS];
};
struct kk_per_draw_data {
/* Mask of stages that need per-draw data uploaded */
uint32_t upload_mask;
uint32_t draw_id;
};
struct kk_attachment {
VkFormat vk_format;
struct kk_image_view *iview;
VkResolveModeFlagBits resolve_mode;
struct kk_image_view *resolve_iview;
/* Needed to track the value of storeOp in case we need to copy images for
* the DRM_FORMAT_MOD_LINEAR case */
VkAttachmentStoreOp store_op;
};
struct kk_rendering_state {
VkRenderingFlagBits flags;
VkRect2D area;
uint32_t layer_count;
uint32_t view_mask;
uint32_t samples;
uint32_t color_att_count;
struct kk_attachment color_att[KK_MAX_RTS];
struct kk_attachment depth_att;
struct kk_attachment stencil_att;
struct kk_attachment fsr_att;
};
/* Dirty tracking bits for state not tracked by vk_dynamic_graphics_state or
* shaders_dirty.
*/
enum kk_dirty {
KK_DIRTY_VB = BITFIELD_BIT(0),
KK_DIRTY_OCCLUSION = BITFIELD_BIT(1),
};
struct kk_graphics_state {
struct kk_rendering_state render;
struct kk_descriptor_state descriptors;
mtl_depth_stencil_state *depth_stencil_state;
mtl_render_pass_descriptor *render_pass_descriptor;
bool is_depth_stencil_dynamic;
bool is_cull_front_and_back;
bool is_ms_bresenham_lines;
bool need_to_start_render_pass;
enum kk_dirty dirty;
uint32_t pipeline_sample_count;
struct {
enum mtl_visibility_result_mode mode;
/* If enabled, index of the current occlusion query in the occlusion heap.
* There can only be one active at a time (hardware constraint).
*/
uint16_t index;
} occlusion;
/* Index buffer */
struct {
mtl_buffer *handle;
uint32_t size;
uint32_t offset;
uint32_t restart;
uint8_t bytes_per_index;
} index;
/* Vertex buffers */
struct {
struct kk_addr_range addr_range[KK_MAX_VBUFS];
mtl_buffer *handles[KK_MAX_VBUFS];
} vb;
/* Needed by vk_command_buffer::dynamic_graphics_state */
struct vk_vertex_input_state _dynamic_vi;
struct vk_sample_locations_state _dynamic_sl;
};
struct kk_compute_state {
struct kk_descriptor_state descriptors;
};
struct kk_encoder;
struct kk_cmd_buffer {
struct vk_command_buffer vk;
struct kk_encoder *encoder;
void *drawable;
struct {
struct kk_graphics_state gfx;
struct kk_compute_state cs;
struct kk_shader *shaders[MESA_SHADER_STAGES];
/* Only tracks graphics shaders since compute is always bound for now. */
uint32_t dirty_shaders;
} state;
/* Owned large BOs */
struct util_dynarray large_bos;
/* Does the command buffer use the geometry heap? */
bool uses_heap;
};
VK_DEFINE_HANDLE_CASTS(kk_cmd_buffer, vk.base, VkCommandBuffer,
VK_OBJECT_TYPE_COMMAND_BUFFER)
extern const struct vk_command_buffer_ops kk_cmd_buffer_ops;
static inline struct kk_device *
kk_cmd_buffer_device(struct kk_cmd_buffer *cmd)
{
return (struct kk_device *)cmd->vk.base.device;
}
static inline struct kk_cmd_pool *
kk_cmd_buffer_pool(struct kk_cmd_buffer *cmd)
{
return (struct kk_cmd_pool *)cmd->vk.pool;
}
static inline struct kk_descriptor_state *
kk_get_descriptors_state(struct kk_cmd_buffer *cmd,
VkPipelineBindPoint bind_point)
{
switch (bind_point) {
case VK_PIPELINE_BIND_POINT_GRAPHICS:
return &cmd->state.gfx.descriptors;
case VK_PIPELINE_BIND_POINT_COMPUTE:
return &cmd->state.cs.descriptors;
default:
UNREACHABLE("Unhandled bind point");
}
};
void kk_cmd_release_resources(struct kk_device *dev, struct kk_cmd_buffer *cmd);
static void
kk_cmd_buffer_dirty_all_gfx(struct kk_cmd_buffer *cmd)
{
/* Ensure we flush all graphics state */
vk_dynamic_graphics_state_dirty_all(&cmd->vk.dynamic_graphics_state);
cmd->state.dirty_shaders = ~0u;
cmd->state.gfx.dirty = ~0u;
cmd->state.gfx.descriptors.root_dirty = true;
/* We just flushed out the heap use. If we want to use it again, we'll need
* to queue a free for it again.
*/
cmd->uses_heap = false;
}
void kk_cmd_release_dynamic_ds_state(struct kk_cmd_buffer *cmd);
mtl_depth_stencil_state *
kk_compile_depth_stencil_state(struct kk_device *device,
const struct vk_depth_stencil_state *ds,
bool has_depth, bool has_stencil);
void kk_meta_resolve_rendering(struct kk_cmd_buffer *cmd,
const VkRenderingInfo *pRenderingInfo);
void kk_cmd_buffer_write_descriptor_buffer(struct kk_cmd_buffer *cmd,
struct kk_descriptor_state *desc,
size_t size, size_t offset);
/* Allocates temporary buffer that will be released once the command buffer has
* completed */
struct kk_bo *kk_cmd_allocate_buffer(struct kk_cmd_buffer *cmd, size_t size_B,
size_t alignment_B);
struct kk_pool {
mtl_buffer *handle;
uint64_t gpu;
void *cpu;
};
struct kk_pool kk_pool_upload(struct kk_cmd_buffer *cmd, void *data,
size_t size_B, size_t alignment_B);
uint64_t kk_upload_descriptor_root(struct kk_cmd_buffer *cmd,
VkPipelineBindPoint bind_point);
void kk_cmd_buffer_flush_push_descriptors(struct kk_cmd_buffer *cmd,
struct kk_descriptor_state *desc);
void kk_dispatch_precomp(struct kk_cmd_buffer *cmd, struct mtl_size grid,
bool pre_gfx, enum libkk_program idx, void *data,
size_t data_size);
#define MESA_DISPATCH_PRECOMP kk_dispatch_precomp
void kk_cmd_write(struct kk_cmd_buffer *cmd, struct libkk_imm_write write);
#endif