138 lines
3.5 KiB
C
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
|