Files
mesa/src/kosmickrisp/vulkan/kk_device.h
T

138 lines
3.5 KiB
C

/*
* Copyright © 2022 Collabora Ltd. and Red Hat Inc.
* Copyright 2025 LunarG, Inc.
* Copyright 2025 Google LLC
* SPDX-License-Identifier: MIT
*/
#ifndef KK_DEVICE_H
#define KK_DEVICE_H 1
#include "kk_private.h"
#include "kk_query_table.h"
#include "kk_queue.h"
#include "kosmickrisp/bridge/mtl_types.h"
#include "util/u_dynarray.h"
#include "vk_device.h"
#include "vk_meta.h"
#include "vk_queue.h"
struct kk_bo;
struct kk_physical_device;
struct vk_pipeline_cache;
enum kk_device_lib_pipeline {
KK_LIB_IMM_WRITE = 0,
KK_LIB_COPY_QUERY,
KK_LIB_TRIANGLE_FAN,
KK_LIB_COUNT,
};
struct kk_user_heap_cache {
simple_mtx_t mutex;
uint32_t hash;
struct util_dynarray handles;
};
struct mtl_sampler_packed {
enum mtl_sampler_address_mode mode_u;
enum mtl_sampler_address_mode mode_v;
enum mtl_sampler_address_mode mode_w;
enum mtl_sampler_border_color border_color;
enum mtl_sampler_min_mag_filter min_filter;
enum mtl_sampler_min_mag_filter mag_filter;
enum mtl_sampler_mip_filter mip_filter;
enum mtl_compare_function compare_func;
float min_lod;
float max_lod;
uint32_t max_anisotropy;
bool normalized_coordinates;
};
struct kk_rc_sampler {
struct mtl_sampler_packed key;
mtl_sampler *handle;
/* Reference count for this hardware sampler, protected by the heap mutex */
uint16_t refcount;
/* Index of this hardware sampler in the hardware sampler heap */
uint16_t index;
};
struct kk_sampler_heap {
simple_mtx_t lock;
struct kk_query_table table;
/* Map of agx_sampler_packed to hk_rc_sampler */
struct hash_table *ht;
};
struct kk_device {
struct vk_device vk;
mtl_device *mtl_handle;
/* Dispatch table exposed to the user. Required since we need to record all
* commands due to Metal limitations */
struct vk_device_dispatch_table exposed_dispatch_table;
struct kk_bo *null_descriptor;
struct kk_sampler_heap samplers;
struct kk_query_table occlusion_queries;
/* Track all heaps the user allocated so we can set them all as resident when
* recording as required by Metal. */
struct kk_user_heap_cache user_heap_cache;
mtl_compute_pipeline_state *lib_pipelines[KK_LIB_COUNT];
struct kk_queue queue;
struct vk_meta_device meta;
bool gpu_capture_enabled;
};
VK_DEFINE_HANDLE_CASTS(kk_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
static inline mtl_compute_pipeline_state *
kk_device_lib_pipeline(const struct kk_device *dev,
enum kk_device_lib_pipeline pipeline)
{
assert(pipeline < KK_LIB_COUNT);
return dev->lib_pipelines[pipeline];
}
static inline struct kk_physical_device *
kk_device_physical(const struct kk_device *dev)
{
return (struct kk_physical_device *)dev->vk.physical;
}
VkResult kk_device_init_meta(struct kk_device *dev);
void kk_device_finish_meta(struct kk_device *dev);
VkResult kk_device_init_lib(struct kk_device *dev);
void kk_device_finish_lib(struct kk_device *dev);
void kk_device_add_user_heap(struct kk_device *dev, mtl_heap *heap);
void kk_device_remove_user_heap(struct kk_device *dev, mtl_heap *heap);
/* Required to create a sampler */
mtl_sampler *kk_sampler_create(struct kk_device *dev,
const struct mtl_sampler_packed *packed);
VkResult kk_sampler_heap_add(struct kk_device *dev,
struct mtl_sampler_packed desc,
struct kk_rc_sampler **out);
void kk_sampler_heap_remove(struct kk_device *dev, struct kk_rc_sampler *rc);
#endif // KK_DEVICE_H