| /* |
| * Copyright 2024 Valve Corporation |
| * Copyright 2024 Alyssa Rosenzweig |
| * Copyright 2022-2023 Collabora Ltd. and Red Hat Inc. |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #pragma once |
| |
| #include "asahi/lib/agx_device.h" |
| #include "util/simple_mtx.h" |
| #include "agx_bg_eot.h" |
| #include "agx_pack.h" |
| #include "agx_scratch.h" |
| #include "decode.h" |
| #include "vk_cmd_queue.h" |
| #include "vk_dispatch_table.h" |
| |
| #include "hk_private.h" |
| |
| #include "hk_descriptor_table.h" |
| #include "hk_queue.h" |
| #include "vk_device.h" |
| #include "vk_meta.h" |
| #include "vk_queue.h" |
| |
| struct hk_physical_device; |
| struct vk_pipeline_cache; |
| |
| /* Fixed offsets for reserved null image descriptors */ |
| #define HK_NULL_TEX_OFFSET (0) |
| #define HK_NULL_PBE_OFFSET (24) |
| |
| typedef void (*hk_internal_builder_t)(struct nir_builder *b, const void *key); |
| |
| struct hk_internal_key { |
| hk_internal_builder_t builder; |
| size_t key_size; |
| uint8_t key[]; |
| }; |
| |
| struct hk_internal_shaders { |
| simple_mtx_t lock; |
| struct hash_table *ht; |
| }; |
| |
| struct hk_rc_sampler { |
| struct agx_sampler_packed key; |
| |
| /* 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 hk_sampler_heap { |
| simple_mtx_t lock; |
| |
| struct hk_descriptor_table table; |
| |
| /* Map of agx_sampler_packed to hk_rc_sampler */ |
| struct hash_table *ht; |
| }; |
| |
| struct hk_device { |
| struct vk_device vk; |
| struct agx_device dev; |
| struct agxdecode_ctx *decode_ctx; |
| |
| struct hk_descriptor_table images; |
| struct hk_descriptor_table occlusion_queries; |
| struct hk_sampler_heap samplers; |
| |
| struct hk_queue queue; |
| |
| struct vk_pipeline_cache *mem_cache; |
| |
| struct vk_meta_device meta; |
| struct agx_bg_eot_cache bg_eot; |
| |
| struct { |
| struct agx_bo *bo; |
| struct agx_usc_sampler_packed txf_sampler; |
| struct agx_usc_uniform_packed image_heap; |
| uint64_t null_sink, zero_sink; |
| uint64_t geometry_state; |
| } rodata; |
| |
| struct hk_internal_shaders prolog_epilog; |
| struct hk_internal_shaders kernels; |
| struct hk_api_shader *write_shader; |
| |
| /* Indirected for common secondary emulation */ |
| struct vk_device_dispatch_table cmd_dispatch; |
| |
| /* Heap used for GPU-side memory allocation for geometry/tessellation. |
| * |
| * Control streams accessing the heap must be serialized. This is not |
| * expected to be a legitimate problem. If it is, we can rework later. |
| */ |
| struct agx_bo *heap; |
| |
| struct { |
| struct agx_scratch vs, fs, cs; |
| simple_mtx_t lock; |
| } scratch; |
| }; |
| |
| VK_DEFINE_HANDLE_CASTS(hk_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE) |
| |
| static inline struct hk_physical_device * |
| hk_device_physical(struct hk_device *dev) |
| { |
| return (struct hk_physical_device *)dev->vk.physical; |
| } |
| |
| VkResult hk_device_init_meta(struct hk_device *dev); |
| void hk_device_finish_meta(struct hk_device *dev); |
| |
| VkResult hk_sampler_heap_add(struct hk_device *dev, |
| struct agx_sampler_packed desc, |
| struct hk_rc_sampler **out); |
| |
| void hk_sampler_heap_remove(struct hk_device *dev, struct hk_rc_sampler *rc); |
| |
| static inline struct agx_scratch * |
| hk_device_scratch_locked(struct hk_device *dev, enum pipe_shader_type stage) |
| { |
| simple_mtx_assert_locked(&dev->scratch.lock); |
| |
| switch (stage) { |
| case PIPE_SHADER_FRAGMENT: |
| return &dev->scratch.fs; |
| case PIPE_SHADER_VERTEX: |
| return &dev->scratch.vs; |
| default: |
| return &dev->scratch.cs; |
| } |
| } |
| |
| static inline void |
| hk_device_alloc_scratch(struct hk_device *dev, enum pipe_shader_type stage, |
| unsigned size) |
| { |
| simple_mtx_lock(&dev->scratch.lock); |
| agx_scratch_alloc(hk_device_scratch_locked(dev, stage), size, 0); |
| simple_mtx_unlock(&dev->scratch.lock); |
| } |