Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/drivers/lima/lima_context.h
4565 views
1
/*
2
* Copyright (c) 2017-2019 Lima Project
3
*
4
* Permission is hereby granted, free of charge, to any person obtaining a
5
* copy of this software and associated documentation files (the "Software"),
6
* to deal in the Software without restriction, including without limitation
7
* the rights to use, copy, modify, merge, publish, distribute, sub license,
8
* and/or sell copies of the Software, and to permit persons to whom the
9
* Software is furnished to do so, subject to the following conditions:
10
*
11
* The above copyright notice and this permission notice (including the
12
* next paragraph) shall be included in all copies or substantial portions
13
* of the Software.
14
*
15
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21
* DEALINGS IN THE SOFTWARE.
22
*
23
*/
24
25
#ifndef H_LIMA_CONTEXT
26
#define H_LIMA_CONTEXT
27
28
#include "util/list.h"
29
#include "util/slab.h"
30
31
#include "pipe/p_context.h"
32
#include "pipe/p_state.h"
33
34
struct lima_context_framebuffer {
35
struct pipe_framebuffer_state base;
36
int tiled_w, tiled_h;
37
int shift_w, shift_h;
38
int block_w, block_h;
39
int shift_min;
40
};
41
42
struct lima_depth_stencil_alpha_state {
43
struct pipe_depth_stencil_alpha_state base;
44
};
45
46
struct lima_fs_compiled_shader {
47
struct lima_bo *bo;
48
void *shader;
49
struct {
50
int shader_size;
51
int stack_size;
52
bool uses_discard;
53
} state;
54
};
55
56
struct lima_fs_uncompiled_shader {
57
struct pipe_shader_state base;
58
unsigned char nir_sha1[20];
59
};
60
61
struct lima_fs_key {
62
unsigned char nir_sha1[20];
63
struct {
64
uint8_t swizzle[4];
65
} tex[PIPE_MAX_SAMPLERS];
66
};
67
68
#define LIMA_MAX_VARYING_NUM 13
69
70
struct lima_varying_info {
71
int components;
72
int component_size;
73
int offset;
74
};
75
76
struct lima_vs_compiled_shader {
77
struct lima_bo *bo;
78
void *shader;
79
void *constant;
80
struct {
81
int shader_size;
82
int prefetch;
83
int uniform_size;
84
int constant_size;
85
struct lima_varying_info varying[LIMA_MAX_VARYING_NUM];
86
int varying_stride;
87
int num_outputs;
88
int num_varyings;
89
int gl_pos_idx;
90
int point_size_idx;
91
} state;
92
};
93
94
struct lima_vs_uncompiled_shader {
95
struct pipe_shader_state base;
96
unsigned char nir_sha1[20];
97
};
98
99
struct lima_vs_key {
100
unsigned char nir_sha1[20];
101
};
102
103
struct lima_rasterizer_state {
104
struct pipe_rasterizer_state base;
105
};
106
107
struct lima_blend_state {
108
struct pipe_blend_state base;
109
};
110
111
struct lima_vertex_element_state {
112
struct pipe_vertex_element pipe[PIPE_MAX_ATTRIBS];
113
unsigned num_elements;
114
};
115
116
struct lima_context_vertex_buffer {
117
struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS];
118
unsigned count;
119
uint32_t enabled_mask;
120
};
121
122
struct lima_context_viewport_state {
123
struct pipe_viewport_state transform;
124
float left, right, bottom, top;
125
float near, far;
126
};
127
128
struct lima_context_constant_buffer {
129
const void *buffer;
130
uint32_t size;
131
bool dirty;
132
};
133
134
enum lima_ctx_buff {
135
lima_ctx_buff_gp_varying_info,
136
lima_ctx_buff_gp_attribute_info,
137
lima_ctx_buff_gp_uniform,
138
lima_ctx_buff_pp_plb_rsw,
139
lima_ctx_buff_pp_uniform_array,
140
lima_ctx_buff_pp_uniform,
141
lima_ctx_buff_pp_tex_desc,
142
lima_ctx_buff_num,
143
lima_ctx_buff_num_gp = lima_ctx_buff_pp_plb_rsw,
144
};
145
146
struct lima_ctx_buff_state {
147
struct pipe_resource *res;
148
unsigned offset;
149
unsigned size;
150
};
151
152
struct lima_texture_stateobj {
153
struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS];
154
unsigned num_textures;
155
struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
156
unsigned num_samplers;
157
};
158
159
struct lima_ctx_plb_pp_stream_key {
160
uint16_t plb_index;
161
/* Coordinates are in tiles */
162
uint16_t minx, miny, maxx, maxy;
163
/* FB params */
164
uint16_t shift_w, shift_h;
165
uint16_t block_w, block_h;
166
};
167
168
struct lima_ctx_plb_pp_stream {
169
struct list_head lru_list;
170
struct lima_ctx_plb_pp_stream_key key;
171
struct lima_bo *bo;
172
uint32_t offset[8];
173
};
174
175
struct lima_pp_stream_state {
176
void *map;
177
uint32_t va;
178
uint32_t offset[8];
179
};
180
181
struct lima_context {
182
struct pipe_context base;
183
184
enum {
185
LIMA_CONTEXT_DIRTY_FRAMEBUFFER = (1 << 0),
186
LIMA_CONTEXT_DIRTY_CLEAR = (1 << 1),
187
LIMA_CONTEXT_DIRTY_COMPILED_VS = (1 << 2),
188
LIMA_CONTEXT_DIRTY_COMPILED_FS = (1 << 3),
189
LIMA_CONTEXT_DIRTY_VERTEX_ELEM = (1 << 4),
190
LIMA_CONTEXT_DIRTY_VERTEX_BUFF = (1 << 5),
191
LIMA_CONTEXT_DIRTY_VIEWPORT = (1 << 6),
192
LIMA_CONTEXT_DIRTY_SCISSOR = (1 << 7),
193
LIMA_CONTEXT_DIRTY_RASTERIZER = (1 << 8),
194
LIMA_CONTEXT_DIRTY_ZSA = (1 << 9),
195
LIMA_CONTEXT_DIRTY_BLEND_COLOR = (1 << 10),
196
LIMA_CONTEXT_DIRTY_BLEND = (1 << 11),
197
LIMA_CONTEXT_DIRTY_STENCIL_REF = (1 << 12),
198
LIMA_CONTEXT_DIRTY_CONST_BUFF = (1 << 13),
199
LIMA_CONTEXT_DIRTY_TEXTURES = (1 << 14),
200
LIMA_CONTEXT_DIRTY_CLIP = (1 << 15),
201
LIMA_CONTEXT_DIRTY_UNCOMPILED_VS = (1 << 16),
202
LIMA_CONTEXT_DIRTY_UNCOMPILED_FS = (1 << 17),
203
} dirty;
204
205
struct u_upload_mgr *uploader;
206
struct blitter_context *blitter;
207
208
struct slab_child_pool transfer_pool;
209
210
struct lima_context_framebuffer framebuffer;
211
struct lima_context_viewport_state viewport;
212
struct pipe_scissor_state scissor;
213
struct pipe_scissor_state clipped_scissor;
214
struct lima_vs_compiled_shader *vs;
215
struct lima_fs_compiled_shader *fs;
216
struct lima_vs_uncompiled_shader *uncomp_vs;
217
struct lima_fs_uncompiled_shader *uncomp_fs;
218
struct lima_vertex_element_state *vertex_elements;
219
struct lima_context_vertex_buffer vertex_buffers;
220
struct lima_rasterizer_state *rasterizer;
221
struct lima_depth_stencil_alpha_state *zsa;
222
struct pipe_blend_color blend_color;
223
struct lima_blend_state *blend;
224
struct pipe_stencil_ref stencil_ref;
225
struct pipe_clip_state clip;
226
struct lima_context_constant_buffer const_buffer[PIPE_SHADER_TYPES];
227
struct lima_texture_stateobj tex_stateobj;
228
struct lima_pp_stream_state pp_stream;
229
230
unsigned min_index;
231
unsigned max_index;
232
233
#define LIMA_CTX_PLB_MIN_NUM 1
234
#define LIMA_CTX_PLB_MAX_NUM 4
235
#define LIMA_CTX_PLB_DEF_NUM 2
236
#define LIMA_CTX_PLB_BLK_SIZE 512
237
unsigned plb_size;
238
unsigned plb_gp_size;
239
240
struct lima_bo *plb[LIMA_CTX_PLB_MAX_NUM];
241
struct lima_bo *gp_tile_heap[LIMA_CTX_PLB_MAX_NUM];
242
uint32_t gp_tile_heap_size;
243
struct lima_bo *plb_gp_stream;
244
struct lima_bo *gp_output;
245
uint32_t gp_output_varyings_offt;
246
uint32_t gp_output_point_size_offt;
247
248
struct hash_table *plb_pp_stream;
249
struct list_head plb_pp_stream_lru_list;
250
uint32_t plb_index;
251
size_t plb_stream_cache_size;
252
253
struct hash_table *fs_cache;
254
struct hash_table *vs_cache;
255
256
struct lima_ctx_buff_state buffer_state[lima_ctx_buff_num];
257
258
/* current job */
259
struct lima_job *job;
260
261
/* map from lima_job_key to lima_job */
262
struct hash_table *jobs;
263
264
/* map from pipe_resource to lima_job which write to it */
265
struct hash_table *write_jobs;
266
267
int in_sync_fd;
268
uint32_t in_sync[2];
269
uint32_t out_sync[2];
270
271
int id;
272
273
struct pipe_debug_callback debug;
274
275
unsigned index_offset;
276
struct lima_resource *index_res;
277
};
278
279
static inline struct lima_context *
280
lima_context(struct pipe_context *pctx)
281
{
282
return (struct lima_context *)pctx;
283
}
284
285
struct lima_sampler_state {
286
struct pipe_sampler_state base;
287
};
288
289
static inline struct lima_sampler_state *
290
lima_sampler_state(struct pipe_sampler_state *psstate)
291
{
292
return (struct lima_sampler_state *)psstate;
293
}
294
295
struct lima_sampler_view {
296
struct pipe_sampler_view base;
297
uint8_t swizzle[4];
298
};
299
300
static inline struct lima_sampler_view *
301
lima_sampler_view(struct pipe_sampler_view *psview)
302
{
303
return (struct lima_sampler_view *)psview;
304
}
305
306
uint32_t lima_ctx_buff_va(struct lima_context *ctx, enum lima_ctx_buff buff);
307
void *lima_ctx_buff_map(struct lima_context *ctx, enum lima_ctx_buff buff);
308
void *lima_ctx_buff_alloc(struct lima_context *ctx, enum lima_ctx_buff buff,
309
unsigned size);
310
311
void lima_state_init(struct lima_context *ctx);
312
void lima_state_fini(struct lima_context *ctx);
313
void lima_draw_init(struct lima_context *ctx);
314
void lima_program_init(struct lima_context *ctx);
315
void lima_program_fini(struct lima_context *ctx);
316
void lima_query_init(struct lima_context *ctx);
317
318
struct pipe_context *
319
lima_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags);
320
321
void lima_flush(struct lima_context *ctx);
322
void lima_flush_job_accessing_bo(
323
struct lima_context *ctx, struct lima_bo *bo, bool write);
324
void lima_flush_previous_job_writing_resource(
325
struct lima_context *ctx, struct pipe_resource *prsc);
326
327
#endif
328
329