About Social Code
aboutsummaryrefslogtreecommitdiff
path: root/src/kosmickrisp/vulkan/kk_cmd_buffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/kosmickrisp/vulkan/kk_cmd_buffer.h')
-rw-r--r--src/kosmickrisp/vulkan/kk_cmd_buffer.h270
1 files changed, 270 insertions, 0 deletions
diff --git a/src/kosmickrisp/vulkan/kk_cmd_buffer.h b/src/kosmickrisp/vulkan/kk_cmd_buffer.h
new file mode 100644
index 00000000000..83d91f4e0b2
--- /dev/null
+++ b/src/kosmickrisp/vulkan/kk_cmd_buffer.h
@@ -0,0 +1,270 @@
+/*
+ * 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 "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];
+ } 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];
+ mtl_resource **resources[KK_MAX_SETS];
+ /* Non resident sets can either be sets or push. If sets[index] == NULL, then
+ * push[index] != NULL */
+ uint32_t sets_not_resident;
+
+ uint32_t push_dirty;
+ struct kk_push_descriptor_set *push[KK_MAX_SETS];
+};
+
+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_INDEX = BITFIELD_BIT(0),
+ KK_DIRTY_VB = BITFIELD_BIT(1),
+ KK_DIRTY_OCCLUSION = BITFIELD_BIT(2),
+ KK_DIRTY_PROVOKING = BITFIELD_BIT(3),
+ KK_DIRTY_VARYINGS = BITFIELD_BIT(4),
+ KK_DIRTY_PIPELINE = BITFIELD_BIT(5),
+};
+
+struct kk_graphics_state {
+ struct kk_rendering_state render;
+ struct kk_descriptor_state descriptors;
+
+ mtl_render_pipeline_state *pipeline_state;
+ 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 restart_disabled;
+
+ enum mtl_primitive_type primitive_type;
+ enum mesa_prim prim;
+ enum kk_dirty dirty;
+
+ 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];
+ uint32_t attribs_read;
+ /* Required to understand maximum size of index buffer if primitive is
+ * triangle fans */
+ uint32_t max_vertices;
+ } 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;
+ mtl_compute_pipeline_state *pipeline_state;
+ struct mtl_size local_size;
+ enum kk_dirty dirty;
+};
+
+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;
+ } state;
+
+ /* Owned large BOs */
+ struct util_dynarray large_bos;
+};
+
+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.gfx.dirty = ~0u;
+}
+
+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_make_descriptor_resources_resident(struct kk_cmd_buffer *cmd,
+ VkPipelineBindPoint bind_point);
+
+void kk_cmd_write(struct kk_cmd_buffer *cmd, mtl_buffer *buffer, uint64_t addr,
+ uint64_t value);
+
+void kk_cmd_dispatch_pipeline(struct kk_cmd_buffer *cmd,
+ mtl_compute_encoder *encoder,
+ mtl_compute_pipeline_state *pipeline,
+ const void *push_data, size_t push_size,
+ uint32_t groupCountX, uint32_t groupCountY,
+ uint32_t groupCountZ);
+
+#endif