xref: /aosp_15_r20/external/mesa3d/src/asahi/vulkan/hk_device.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2024 Valve Corporation
3*61046927SAndroid Build Coastguard Worker  * Copyright 2024 Alyssa Rosenzweig
4*61046927SAndroid Build Coastguard Worker  * Copyright 2022-2023 Collabora Ltd. and Red Hat Inc.
5*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
6*61046927SAndroid Build Coastguard Worker  */
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #pragma once
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #include "asahi/lib/agx_device.h"
11*61046927SAndroid Build Coastguard Worker #include "util/simple_mtx.h"
12*61046927SAndroid Build Coastguard Worker #include "agx_bg_eot.h"
13*61046927SAndroid Build Coastguard Worker #include "agx_pack.h"
14*61046927SAndroid Build Coastguard Worker #include "agx_scratch.h"
15*61046927SAndroid Build Coastguard Worker #include "decode.h"
16*61046927SAndroid Build Coastguard Worker #include "vk_cmd_queue.h"
17*61046927SAndroid Build Coastguard Worker #include "vk_dispatch_table.h"
18*61046927SAndroid Build Coastguard Worker 
19*61046927SAndroid Build Coastguard Worker #include "hk_private.h"
20*61046927SAndroid Build Coastguard Worker 
21*61046927SAndroid Build Coastguard Worker #include "hk_descriptor_table.h"
22*61046927SAndroid Build Coastguard Worker #include "hk_queue.h"
23*61046927SAndroid Build Coastguard Worker #include "vk_device.h"
24*61046927SAndroid Build Coastguard Worker #include "vk_meta.h"
25*61046927SAndroid Build Coastguard Worker #include "vk_queue.h"
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker struct hk_physical_device;
28*61046927SAndroid Build Coastguard Worker struct vk_pipeline_cache;
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker /* Fixed offsets for reserved null image descriptors */
31*61046927SAndroid Build Coastguard Worker #define HK_NULL_TEX_OFFSET (0)
32*61046927SAndroid Build Coastguard Worker #define HK_NULL_PBE_OFFSET (24)
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker typedef void (*hk_internal_builder_t)(struct nir_builder *b, const void *key);
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker struct hk_internal_key {
37*61046927SAndroid Build Coastguard Worker    hk_internal_builder_t builder;
38*61046927SAndroid Build Coastguard Worker    size_t key_size;
39*61046927SAndroid Build Coastguard Worker    uint8_t key[];
40*61046927SAndroid Build Coastguard Worker };
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker struct hk_internal_shaders {
43*61046927SAndroid Build Coastguard Worker    simple_mtx_t lock;
44*61046927SAndroid Build Coastguard Worker    struct hash_table *ht;
45*61046927SAndroid Build Coastguard Worker };
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker struct hk_rc_sampler {
48*61046927SAndroid Build Coastguard Worker    struct agx_sampler_packed key;
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker    /* Reference count for this hardware sampler, protected by the heap mutex */
51*61046927SAndroid Build Coastguard Worker    uint16_t refcount;
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker    /* Index of this hardware sampler in the hardware sampler heap */
54*61046927SAndroid Build Coastguard Worker    uint16_t index;
55*61046927SAndroid Build Coastguard Worker };
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker struct hk_sampler_heap {
58*61046927SAndroid Build Coastguard Worker    simple_mtx_t lock;
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker    struct hk_descriptor_table table;
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker    /* Map of agx_sampler_packed to hk_rc_sampler */
63*61046927SAndroid Build Coastguard Worker    struct hash_table *ht;
64*61046927SAndroid Build Coastguard Worker };
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker struct hk_device {
67*61046927SAndroid Build Coastguard Worker    struct vk_device vk;
68*61046927SAndroid Build Coastguard Worker    struct agx_device dev;
69*61046927SAndroid Build Coastguard Worker    struct agxdecode_ctx *decode_ctx;
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker    struct hk_descriptor_table images;
72*61046927SAndroid Build Coastguard Worker    struct hk_descriptor_table occlusion_queries;
73*61046927SAndroid Build Coastguard Worker    struct hk_sampler_heap samplers;
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker    struct hk_queue queue;
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker    struct vk_pipeline_cache *mem_cache;
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker    struct vk_meta_device meta;
80*61046927SAndroid Build Coastguard Worker    struct agx_bg_eot_cache bg_eot;
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker    struct {
83*61046927SAndroid Build Coastguard Worker       struct agx_bo *bo;
84*61046927SAndroid Build Coastguard Worker       struct agx_usc_sampler_packed txf_sampler;
85*61046927SAndroid Build Coastguard Worker       struct agx_usc_uniform_packed image_heap;
86*61046927SAndroid Build Coastguard Worker       uint64_t null_sink, zero_sink;
87*61046927SAndroid Build Coastguard Worker       uint64_t geometry_state;
88*61046927SAndroid Build Coastguard Worker    } rodata;
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker    struct hk_internal_shaders prolog_epilog;
91*61046927SAndroid Build Coastguard Worker    struct hk_internal_shaders kernels;
92*61046927SAndroid Build Coastguard Worker    struct hk_api_shader *write_shader;
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker    /* Indirected for common secondary emulation */
95*61046927SAndroid Build Coastguard Worker    struct vk_device_dispatch_table cmd_dispatch;
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker    /* Heap used for GPU-side memory allocation for geometry/tessellation.
98*61046927SAndroid Build Coastguard Worker     *
99*61046927SAndroid Build Coastguard Worker     * Control streams accessing the heap must be serialized. This is not
100*61046927SAndroid Build Coastguard Worker     * expected to be a legitimate problem. If it is, we can rework later.
101*61046927SAndroid Build Coastguard Worker     */
102*61046927SAndroid Build Coastguard Worker    struct agx_bo *heap;
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker    struct {
105*61046927SAndroid Build Coastguard Worker       struct agx_scratch vs, fs, cs;
106*61046927SAndroid Build Coastguard Worker       simple_mtx_t lock;
107*61046927SAndroid Build Coastguard Worker    } scratch;
108*61046927SAndroid Build Coastguard Worker };
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(hk_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker static inline struct hk_physical_device *
hk_device_physical(struct hk_device * dev)113*61046927SAndroid Build Coastguard Worker hk_device_physical(struct hk_device *dev)
114*61046927SAndroid Build Coastguard Worker {
115*61046927SAndroid Build Coastguard Worker    return (struct hk_physical_device *)dev->vk.physical;
116*61046927SAndroid Build Coastguard Worker }
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker VkResult hk_device_init_meta(struct hk_device *dev);
119*61046927SAndroid Build Coastguard Worker void hk_device_finish_meta(struct hk_device *dev);
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker VkResult hk_sampler_heap_add(struct hk_device *dev,
122*61046927SAndroid Build Coastguard Worker                              struct agx_sampler_packed desc,
123*61046927SAndroid Build Coastguard Worker                              struct hk_rc_sampler **out);
124*61046927SAndroid Build Coastguard Worker 
125*61046927SAndroid Build Coastguard Worker void hk_sampler_heap_remove(struct hk_device *dev, struct hk_rc_sampler *rc);
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker static inline struct agx_scratch *
hk_device_scratch_locked(struct hk_device * dev,enum pipe_shader_type stage)128*61046927SAndroid Build Coastguard Worker hk_device_scratch_locked(struct hk_device *dev, enum pipe_shader_type stage)
129*61046927SAndroid Build Coastguard Worker {
130*61046927SAndroid Build Coastguard Worker    simple_mtx_assert_locked(&dev->scratch.lock);
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker    switch (stage) {
133*61046927SAndroid Build Coastguard Worker    case PIPE_SHADER_FRAGMENT:
134*61046927SAndroid Build Coastguard Worker       return &dev->scratch.fs;
135*61046927SAndroid Build Coastguard Worker    case PIPE_SHADER_VERTEX:
136*61046927SAndroid Build Coastguard Worker       return &dev->scratch.vs;
137*61046927SAndroid Build Coastguard Worker    default:
138*61046927SAndroid Build Coastguard Worker       return &dev->scratch.cs;
139*61046927SAndroid Build Coastguard Worker    }
140*61046927SAndroid Build Coastguard Worker }
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker static inline void
hk_device_alloc_scratch(struct hk_device * dev,enum pipe_shader_type stage,unsigned size)143*61046927SAndroid Build Coastguard Worker hk_device_alloc_scratch(struct hk_device *dev, enum pipe_shader_type stage,
144*61046927SAndroid Build Coastguard Worker                         unsigned size)
145*61046927SAndroid Build Coastguard Worker {
146*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&dev->scratch.lock);
147*61046927SAndroid Build Coastguard Worker    agx_scratch_alloc(hk_device_scratch_locked(dev, stage), size, 0);
148*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&dev->scratch.lock);
149*61046927SAndroid Build Coastguard Worker }
150