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