glsl: stop adding pointers from bindless structs to the cache
[mesa.git] / src / compiler / glsl / shader_cache.cpp
1 /*
2 * Copyright © 2014 Intel Corporation
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, sublicense,
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 next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * 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 NONINFRINGEMENT. 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 * \file shader_cache.cpp
26 *
27 * GLSL shader cache implementation
28 *
29 * This uses disk_cache.c to write out a serialization of various
30 * state that's required in order to successfully load and use a
31 * binary written out by a drivers backend, this state is referred to as
32 * "metadata" throughout the implementation.
33 *
34 * The hash key for glsl metadata is a hash of the hashes of each GLSL
35 * source string as well as some API settings that change the final program
36 * such as SSO, attribute bindings, frag data bindings, etc.
37 *
38 * In order to avoid caching any actual IR we use the put_key/get_key support
39 * in the disk_cache to put the SHA-1 hash for each successfully compiled
40 * shader into the cache, and optimisticly return early from glCompileShader
41 * (if the identical shader had been successfully compiled in the past),
42 * in the hope that the final linked shader will be found in the cache.
43 * If anything goes wrong (shader variant not found, backend cache item is
44 * corrupt, etc) we will use a fallback path to compile and link the IR.
45 */
46
47 #include "blob.h"
48 #include "compiler/shader_info.h"
49 #include "glsl_symbol_table.h"
50 #include "glsl_parser_extras.h"
51 #include "ir.h"
52 #include "ir_optimization.h"
53 #include "ir_rvalue_visitor.h"
54 #include "ir_uniform.h"
55 #include "linker.h"
56 #include "link_varyings.h"
57 #include "main/core.h"
58 #include "nir.h"
59 #include "program.h"
60 #include "shader_cache.h"
61 #include "util/mesa-sha1.h"
62 #include "util/string_to_uint_map.h"
63
64 extern "C" {
65 #include "main/enums.h"
66 #include "main/shaderobj.h"
67 #include "program/program.h"
68 }
69
70 static void
71 compile_shaders(struct gl_context *ctx, struct gl_shader_program *prog) {
72 for (unsigned i = 0; i < prog->NumShaders; i++) {
73 _mesa_glsl_compile_shader(ctx, prog->Shaders[i], false, false, true);
74 }
75 }
76
77 static void
78 get_struct_type_field_and_pointer_sizes(size_t *s_field_size,
79 size_t *s_field_ptrs,
80 unsigned num_fields)
81 {
82 *s_field_size = sizeof(glsl_struct_field) * num_fields;
83 *s_field_ptrs =
84 sizeof(((glsl_struct_field *)0)->type) +
85 sizeof(((glsl_struct_field *)0)->name);
86 }
87
88 static void
89 encode_type_to_blob(struct blob *blob, const glsl_type *type)
90 {
91 uint32_t encoding;
92
93 if (!type) {
94 blob_write_uint32(blob, 0);
95 return;
96 }
97
98 switch (type->base_type) {
99 case GLSL_TYPE_UINT:
100 case GLSL_TYPE_INT:
101 case GLSL_TYPE_FLOAT:
102 case GLSL_TYPE_BOOL:
103 case GLSL_TYPE_DOUBLE:
104 case GLSL_TYPE_UINT64:
105 case GLSL_TYPE_INT64:
106 encoding = (type->base_type << 24) |
107 (type->vector_elements << 4) |
108 (type->matrix_columns);
109 break;
110 case GLSL_TYPE_SAMPLER:
111 encoding = (type->base_type) << 24 |
112 (type->sampler_dimensionality << 4) |
113 (type->sampler_shadow << 3) |
114 (type->sampler_array << 2) |
115 (type->sampled_type);
116 break;
117 case GLSL_TYPE_SUBROUTINE:
118 encoding = type->base_type << 24;
119 blob_write_uint32(blob, encoding);
120 blob_write_string(blob, type->name);
121 return;
122 case GLSL_TYPE_IMAGE:
123 encoding = (type->base_type) << 24 |
124 (type->sampler_dimensionality << 3) |
125 (type->sampler_array << 2) |
126 (type->sampled_type);
127 break;
128 case GLSL_TYPE_ATOMIC_UINT:
129 encoding = (type->base_type << 24);
130 break;
131 case GLSL_TYPE_ARRAY:
132 blob_write_uint32(blob, (type->base_type) << 24);
133 blob_write_uint32(blob, type->length);
134 encode_type_to_blob(blob, type->fields.array);
135 return;
136 case GLSL_TYPE_STRUCT:
137 case GLSL_TYPE_INTERFACE:
138 blob_write_uint32(blob, (type->base_type) << 24);
139 blob_write_string(blob, type->name);
140 blob_write_uint32(blob, type->length);
141
142 size_t s_field_size, s_field_ptrs;
143 get_struct_type_field_and_pointer_sizes(&s_field_size, &s_field_ptrs,
144 type->length);
145
146 for (unsigned i = 0; i < type->length; i++) {
147 encode_type_to_blob(blob, type->fields.structure[i].type);
148 blob_write_string(blob, type->fields.structure[i].name);
149
150 /* Write the struct field skipping the pointers */
151 blob_write_bytes(blob,
152 ((char *)&type->fields.structure[i]) + s_field_ptrs,
153 s_field_size - s_field_ptrs);
154 }
155
156 if (type->is_interface()) {
157 blob_write_uint32(blob, type->interface_packing);
158 blob_write_uint32(blob, type->interface_row_major);
159 }
160 return;
161 case GLSL_TYPE_VOID:
162 case GLSL_TYPE_ERROR:
163 default:
164 assert(!"Cannot encode type!");
165 encoding = 0;
166 break;
167 }
168
169 blob_write_uint32(blob, encoding);
170 }
171
172 static const glsl_type *
173 decode_type_from_blob(struct blob_reader *blob)
174 {
175 uint32_t u = blob_read_uint32(blob);
176
177 if (u == 0) {
178 return NULL;
179 }
180
181 glsl_base_type base_type = (glsl_base_type) (u >> 24);
182
183 switch (base_type) {
184 case GLSL_TYPE_UINT:
185 case GLSL_TYPE_INT:
186 case GLSL_TYPE_FLOAT:
187 case GLSL_TYPE_BOOL:
188 case GLSL_TYPE_DOUBLE:
189 case GLSL_TYPE_UINT64:
190 case GLSL_TYPE_INT64:
191 return glsl_type::get_instance(base_type, (u >> 4) & 0x0f, u & 0x0f);
192 case GLSL_TYPE_SAMPLER:
193 return glsl_type::get_sampler_instance((enum glsl_sampler_dim) ((u >> 4) & 0x07),
194 (u >> 3) & 0x01,
195 (u >> 2) & 0x01,
196 (glsl_base_type) ((u >> 0) & 0x03));
197 case GLSL_TYPE_SUBROUTINE:
198 return glsl_type::get_subroutine_instance(blob_read_string(blob));
199 case GLSL_TYPE_IMAGE:
200 return glsl_type::get_image_instance((enum glsl_sampler_dim) ((u >> 3) & 0x07),
201 (u >> 2) & 0x01,
202 (glsl_base_type) ((u >> 0) & 0x03));
203 case GLSL_TYPE_ATOMIC_UINT:
204 return glsl_type::atomic_uint_type;
205 case GLSL_TYPE_ARRAY: {
206 unsigned length = blob_read_uint32(blob);
207 return glsl_type::get_array_instance(decode_type_from_blob(blob),
208 length);
209 }
210 case GLSL_TYPE_STRUCT:
211 case GLSL_TYPE_INTERFACE: {
212 char *name = blob_read_string(blob);
213 unsigned num_fields = blob_read_uint32(blob);
214
215 size_t s_field_size, s_field_ptrs;
216 get_struct_type_field_and_pointer_sizes(&s_field_size, &s_field_ptrs,
217 num_fields);
218
219 glsl_struct_field *fields =
220 (glsl_struct_field *) malloc(s_field_size * num_fields);
221 for (unsigned i = 0; i < num_fields; i++) {
222 fields[i].type = decode_type_from_blob(blob);
223 fields[i].name = blob_read_string(blob);
224
225 blob_copy_bytes(blob, ((uint8_t *) &fields[i]) + s_field_ptrs,
226 s_field_size - s_field_ptrs);
227 }
228
229 const glsl_type *t;
230 if (base_type == GLSL_TYPE_INTERFACE) {
231 enum glsl_interface_packing packing =
232 (glsl_interface_packing) blob_read_uint32(blob);
233 bool row_major = blob_read_uint32(blob);
234 t = glsl_type::get_interface_instance(fields, num_fields, packing,
235 row_major, name);
236 } else {
237 t = glsl_type::get_record_instance(fields, num_fields, name);
238 }
239
240 free(fields);
241 return t;
242 }
243 case GLSL_TYPE_VOID:
244 case GLSL_TYPE_ERROR:
245 default:
246 assert(!"Cannot decode type!");
247 return NULL;
248 }
249 }
250
251 static void
252 write_subroutines(struct blob *metadata, struct gl_shader_program *prog)
253 {
254 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
255 struct gl_linked_shader *sh = prog->_LinkedShaders[i];
256 if (!sh)
257 continue;
258
259 struct gl_program *glprog = sh->Program;
260
261 blob_write_uint32(metadata, glprog->sh.NumSubroutineUniforms);
262 blob_write_uint32(metadata, glprog->sh.MaxSubroutineFunctionIndex);
263 blob_write_uint32(metadata, glprog->sh.NumSubroutineFunctions);
264 for (unsigned j = 0; j < glprog->sh.NumSubroutineFunctions; j++) {
265 int num_types = glprog->sh.SubroutineFunctions[j].num_compat_types;
266
267 blob_write_string(metadata, glprog->sh.SubroutineFunctions[j].name);
268 blob_write_uint32(metadata, glprog->sh.SubroutineFunctions[j].index);
269 blob_write_uint32(metadata, num_types);
270
271 for (int k = 0; k < num_types; k++) {
272 encode_type_to_blob(metadata,
273 glprog->sh.SubroutineFunctions[j].types[k]);
274 }
275 }
276 }
277 }
278
279 static void
280 read_subroutines(struct blob_reader *metadata, struct gl_shader_program *prog)
281 {
282 struct gl_subroutine_function *subs;
283
284 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
285 struct gl_linked_shader *sh = prog->_LinkedShaders[i];
286 if (!sh)
287 continue;
288
289 struct gl_program *glprog = sh->Program;
290
291 glprog->sh.NumSubroutineUniforms = blob_read_uint32(metadata);
292 glprog->sh.MaxSubroutineFunctionIndex = blob_read_uint32(metadata);
293 glprog->sh.NumSubroutineFunctions = blob_read_uint32(metadata);
294
295 subs = rzalloc_array(prog, struct gl_subroutine_function,
296 glprog->sh.NumSubroutineFunctions);
297 glprog->sh.SubroutineFunctions = subs;
298
299 for (unsigned j = 0; j < glprog->sh.NumSubroutineFunctions; j++) {
300 subs[j].name = ralloc_strdup(prog, blob_read_string (metadata));
301 subs[j].index = (int) blob_read_uint32(metadata);
302 subs[j].num_compat_types = (int) blob_read_uint32(metadata);
303
304 subs[j].types = rzalloc_array(prog, const struct glsl_type *,
305 subs[j].num_compat_types);
306 for (int k = 0; k < subs[j].num_compat_types; k++) {
307 subs[j].types[k] = decode_type_from_blob(metadata);
308 }
309 }
310 }
311 }
312
313 static void
314 write_buffer_block(struct blob *metadata, struct gl_uniform_block *b)
315 {
316 blob_write_string(metadata, b->Name);
317 blob_write_uint32(metadata, b->NumUniforms);
318 blob_write_uint32(metadata, b->Binding);
319 blob_write_uint32(metadata, b->UniformBufferSize);
320 blob_write_uint32(metadata, b->stageref);
321
322 for (unsigned j = 0; j < b->NumUniforms; j++) {
323 blob_write_string(metadata, b->Uniforms[j].Name);
324 blob_write_string(metadata, b->Uniforms[j].IndexName);
325 encode_type_to_blob(metadata, b->Uniforms[j].Type);
326 blob_write_uint32(metadata, b->Uniforms[j].Offset);
327 }
328 }
329
330 static void
331 write_buffer_blocks(struct blob *metadata, struct gl_shader_program *prog)
332 {
333 blob_write_uint32(metadata, prog->data->NumUniformBlocks);
334 blob_write_uint32(metadata, prog->data->NumShaderStorageBlocks);
335
336 for (unsigned i = 0; i < prog->data->NumUniformBlocks; i++) {
337 write_buffer_block(metadata, &prog->data->UniformBlocks[i]);
338 }
339
340 for (unsigned i = 0; i < prog->data->NumShaderStorageBlocks; i++) {
341 write_buffer_block(metadata, &prog->data->ShaderStorageBlocks[i]);
342 }
343
344 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
345 struct gl_linked_shader *sh = prog->_LinkedShaders[i];
346 if (!sh)
347 continue;
348
349 struct gl_program *glprog = sh->Program;
350
351 blob_write_uint32(metadata, glprog->info.num_ubos);
352 blob_write_uint32(metadata, glprog->info.num_ssbos);
353
354 for (unsigned j = 0; j < glprog->info.num_ubos; j++) {
355 uint32_t offset =
356 glprog->sh.UniformBlocks[j] - prog->data->UniformBlocks;
357 blob_write_uint32(metadata, offset);
358 }
359
360 for (unsigned j = 0; j < glprog->info.num_ssbos; j++) {
361 uint32_t offset = glprog->sh.ShaderStorageBlocks[j] -
362 prog->data->ShaderStorageBlocks;
363 blob_write_uint32(metadata, offset);
364 }
365 }
366 }
367
368 static void
369 read_buffer_block(struct blob_reader *metadata, struct gl_uniform_block *b,
370 struct gl_shader_program *prog)
371 {
372 b->Name = ralloc_strdup(prog->data, blob_read_string (metadata));
373 b->NumUniforms = blob_read_uint32(metadata);
374 b->Binding = blob_read_uint32(metadata);
375 b->UniformBufferSize = blob_read_uint32(metadata);
376 b->stageref = blob_read_uint32(metadata);
377
378 b->Uniforms =
379 rzalloc_array(prog->data, struct gl_uniform_buffer_variable,
380 b->NumUniforms);
381 for (unsigned j = 0; j < b->NumUniforms; j++) {
382 b->Uniforms[j].Name = ralloc_strdup(prog->data,
383 blob_read_string (metadata));
384
385 char *index_name = blob_read_string(metadata);
386 if (strcmp(b->Uniforms[j].Name, index_name) == 0) {
387 b->Uniforms[j].IndexName = b->Uniforms[j].Name;
388 } else {
389 b->Uniforms[j].IndexName = ralloc_strdup(prog->data, index_name);
390 }
391
392 b->Uniforms[j].Type = decode_type_from_blob(metadata);
393 b->Uniforms[j].Offset = blob_read_uint32(metadata);
394 }
395 }
396
397 static void
398 read_buffer_blocks(struct blob_reader *metadata,
399 struct gl_shader_program *prog)
400 {
401 prog->data->NumUniformBlocks = blob_read_uint32(metadata);
402 prog->data->NumShaderStorageBlocks = blob_read_uint32(metadata);
403
404 prog->data->UniformBlocks =
405 rzalloc_array(prog->data, struct gl_uniform_block,
406 prog->data->NumUniformBlocks);
407
408 prog->data->ShaderStorageBlocks =
409 rzalloc_array(prog->data, struct gl_uniform_block,
410 prog->data->NumShaderStorageBlocks);
411
412 for (unsigned i = 0; i < prog->data->NumUniformBlocks; i++) {
413 read_buffer_block(metadata, &prog->data->UniformBlocks[i], prog);
414 }
415
416 for (unsigned i = 0; i < prog->data->NumShaderStorageBlocks; i++) {
417 read_buffer_block(metadata, &prog->data->ShaderStorageBlocks[i], prog);
418 }
419
420 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
421 struct gl_linked_shader *sh = prog->_LinkedShaders[i];
422 if (!sh)
423 continue;
424
425 struct gl_program *glprog = sh->Program;
426
427 glprog->info.num_ubos = blob_read_uint32(metadata);
428 glprog->info.num_ssbos = blob_read_uint32(metadata);
429
430 glprog->sh.UniformBlocks =
431 rzalloc_array(glprog, gl_uniform_block *, glprog->info.num_ubos);
432 glprog->sh.ShaderStorageBlocks =
433 rzalloc_array(glprog, gl_uniform_block *, glprog->info.num_ssbos);
434
435 for (unsigned j = 0; j < glprog->info.num_ubos; j++) {
436 uint32_t offset = blob_read_uint32(metadata);
437 glprog->sh.UniformBlocks[j] = prog->data->UniformBlocks + offset;
438 }
439
440 for (unsigned j = 0; j < glprog->info.num_ssbos; j++) {
441 uint32_t offset = blob_read_uint32(metadata);
442 glprog->sh.ShaderStorageBlocks[j] =
443 prog->data->ShaderStorageBlocks + offset;
444 }
445 }
446 }
447
448 static void
449 write_atomic_buffers(struct blob *metadata, struct gl_shader_program *prog)
450 {
451 blob_write_uint32(metadata, prog->data->NumAtomicBuffers);
452
453 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
454 if (prog->_LinkedShaders[i]) {
455 struct gl_program *glprog = prog->_LinkedShaders[i]->Program;
456 blob_write_uint32(metadata, glprog->info.num_abos);
457 }
458 }
459
460 for (unsigned i = 0; i < prog->data->NumAtomicBuffers; i++) {
461 blob_write_uint32(metadata, prog->data->AtomicBuffers[i].Binding);
462 blob_write_uint32(metadata, prog->data->AtomicBuffers[i].MinimumSize);
463 blob_write_uint32(metadata, prog->data->AtomicBuffers[i].NumUniforms);
464
465 blob_write_bytes(metadata, prog->data->AtomicBuffers[i].StageReferences,
466 sizeof(prog->data->AtomicBuffers[i].StageReferences));
467
468 for (unsigned j = 0; j < prog->data->AtomicBuffers[i].NumUniforms; j++) {
469 blob_write_uint32(metadata, prog->data->AtomicBuffers[i].Uniforms[j]);
470 }
471 }
472 }
473
474 static void
475 read_atomic_buffers(struct blob_reader *metadata,
476 struct gl_shader_program *prog)
477 {
478 prog->data->NumAtomicBuffers = blob_read_uint32(metadata);
479 prog->data->AtomicBuffers =
480 rzalloc_array(prog, gl_active_atomic_buffer,
481 prog->data->NumAtomicBuffers);
482
483 struct gl_active_atomic_buffer **stage_buff_list[MESA_SHADER_STAGES];
484 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
485 if (prog->_LinkedShaders[i]) {
486 struct gl_program *glprog = prog->_LinkedShaders[i]->Program;
487
488 glprog->info.num_abos = blob_read_uint32(metadata);
489 glprog->sh.AtomicBuffers =
490 rzalloc_array(glprog, gl_active_atomic_buffer *,
491 glprog->info.num_abos);
492 stage_buff_list[i] = glprog->sh.AtomicBuffers;
493 }
494 }
495
496 for (unsigned i = 0; i < prog->data->NumAtomicBuffers; i++) {
497 prog->data->AtomicBuffers[i].Binding = blob_read_uint32(metadata);
498 prog->data->AtomicBuffers[i].MinimumSize = blob_read_uint32(metadata);
499 prog->data->AtomicBuffers[i].NumUniforms = blob_read_uint32(metadata);
500
501 blob_copy_bytes(metadata,
502 (uint8_t *) &prog->data->AtomicBuffers[i].StageReferences,
503 sizeof(prog->data->AtomicBuffers[i].StageReferences));
504
505 prog->data->AtomicBuffers[i].Uniforms = rzalloc_array(prog, unsigned,
506 prog->data->AtomicBuffers[i].NumUniforms);
507
508 for (unsigned j = 0; j < prog->data->AtomicBuffers[i].NumUniforms; j++) {
509 prog->data->AtomicBuffers[i].Uniforms[j] = blob_read_uint32(metadata);
510 }
511
512 for (unsigned j = 0; j < MESA_SHADER_STAGES; j++) {
513 if (prog->data->AtomicBuffers[i].StageReferences[j]) {
514 *stage_buff_list[j] = &prog->data->AtomicBuffers[i];
515 stage_buff_list[j]++;
516 }
517 }
518 }
519 }
520
521 static void
522 write_xfb(struct blob *metadata, struct gl_shader_program *shProg)
523 {
524 struct gl_program *prog = shProg->last_vert_prog;
525
526 if (!prog) {
527 blob_write_uint32(metadata, ~0u);
528 return;
529 }
530
531 struct gl_transform_feedback_info *ltf = prog->sh.LinkedTransformFeedback;
532
533 blob_write_uint32(metadata, prog->info.stage);
534
535 blob_write_uint32(metadata, ltf->NumOutputs);
536 blob_write_uint32(metadata, ltf->ActiveBuffers);
537 blob_write_uint32(metadata, ltf->NumVarying);
538
539 blob_write_bytes(metadata, ltf->Outputs,
540 sizeof(struct gl_transform_feedback_output) *
541 ltf->NumOutputs);
542
543 for (int i = 0; i < ltf->NumVarying; i++) {
544 blob_write_string(metadata, ltf->Varyings[i].Name);
545 blob_write_uint32(metadata, ltf->Varyings[i].Type);
546 blob_write_uint32(metadata, ltf->Varyings[i].BufferIndex);
547 blob_write_uint32(metadata, ltf->Varyings[i].Size);
548 blob_write_uint32(metadata, ltf->Varyings[i].Offset);
549 }
550
551 blob_write_bytes(metadata, ltf->Buffers,
552 sizeof(struct gl_transform_feedback_buffer) *
553 MAX_FEEDBACK_BUFFERS);
554 }
555
556 static void
557 read_xfb(struct blob_reader *metadata, struct gl_shader_program *shProg)
558 {
559 unsigned xfb_stage = blob_read_uint32(metadata);
560
561 if (xfb_stage == ~0u)
562 return;
563
564 struct gl_program *prog = shProg->_LinkedShaders[xfb_stage]->Program;
565 struct gl_transform_feedback_info *ltf =
566 rzalloc(prog, struct gl_transform_feedback_info);
567
568 prog->sh.LinkedTransformFeedback = ltf;
569 shProg->last_vert_prog = prog;
570
571 ltf->NumOutputs = blob_read_uint32(metadata);
572 ltf->ActiveBuffers = blob_read_uint32(metadata);
573 ltf->NumVarying = blob_read_uint32(metadata);
574
575 ltf->Outputs = rzalloc_array(prog, struct gl_transform_feedback_output,
576 ltf->NumOutputs);
577
578 blob_copy_bytes(metadata, (uint8_t *) ltf->Outputs,
579 sizeof(struct gl_transform_feedback_output) *
580 ltf->NumOutputs);
581
582 ltf->Varyings = rzalloc_array(prog,
583 struct gl_transform_feedback_varying_info,
584 ltf->NumVarying);
585
586 for (int i = 0; i < ltf->NumVarying; i++) {
587 ltf->Varyings[i].Name = ralloc_strdup(prog, blob_read_string(metadata));
588 ltf->Varyings[i].Type = blob_read_uint32(metadata);
589 ltf->Varyings[i].BufferIndex = blob_read_uint32(metadata);
590 ltf->Varyings[i].Size = blob_read_uint32(metadata);
591 ltf->Varyings[i].Offset = blob_read_uint32(metadata);
592 }
593
594 blob_copy_bytes(metadata, (uint8_t *) ltf->Buffers,
595 sizeof(struct gl_transform_feedback_buffer) *
596 MAX_FEEDBACK_BUFFERS);
597 }
598
599 static bool
600 has_uniform_storage(struct gl_shader_program *prog, unsigned idx)
601 {
602 if (!prog->data->UniformStorage[idx].builtin &&
603 !prog->data->UniformStorage[idx].is_shader_storage &&
604 prog->data->UniformStorage[idx].block_index == -1)
605 return true;
606
607 return false;
608 }
609
610 static void
611 write_uniforms(struct blob *metadata, struct gl_shader_program *prog)
612 {
613 blob_write_uint32(metadata, prog->SamplersValidated);
614 blob_write_uint32(metadata, prog->data->NumUniformStorage);
615 blob_write_uint32(metadata, prog->data->NumUniformDataSlots);
616
617 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
618 encode_type_to_blob(metadata, prog->data->UniformStorage[i].type);
619 blob_write_uint32(metadata, prog->data->UniformStorage[i].array_elements);
620 blob_write_string(metadata, prog->data->UniformStorage[i].name);
621 blob_write_uint32(metadata, prog->data->UniformStorage[i].builtin);
622 blob_write_uint32(metadata, prog->data->UniformStorage[i].remap_location);
623 blob_write_uint32(metadata, prog->data->UniformStorage[i].block_index);
624 blob_write_uint32(metadata, prog->data->UniformStorage[i].atomic_buffer_index);
625 blob_write_uint32(metadata, prog->data->UniformStorage[i].offset);
626 blob_write_uint32(metadata, prog->data->UniformStorage[i].array_stride);
627 blob_write_uint32(metadata, prog->data->UniformStorage[i].hidden);
628 blob_write_uint32(metadata, prog->data->UniformStorage[i].is_shader_storage);
629 blob_write_uint32(metadata, prog->data->UniformStorage[i].active_shader_mask);
630 blob_write_uint32(metadata, prog->data->UniformStorage[i].matrix_stride);
631 blob_write_uint32(metadata, prog->data->UniformStorage[i].row_major);
632 blob_write_uint32(metadata, prog->data->UniformStorage[i].is_bindless);
633 blob_write_uint32(metadata,
634 prog->data->UniformStorage[i].num_compatible_subroutines);
635 blob_write_uint32(metadata,
636 prog->data->UniformStorage[i].top_level_array_size);
637 blob_write_uint32(metadata,
638 prog->data->UniformStorage[i].top_level_array_stride);
639
640 if (has_uniform_storage(prog, i)) {
641 blob_write_uint32(metadata, prog->data->UniformStorage[i].storage -
642 prog->data->UniformDataSlots);
643 }
644
645 blob_write_bytes(metadata, prog->data->UniformStorage[i].opaque,
646 sizeof(prog->data->UniformStorage[i].opaque));
647 }
648
649 /* Here we cache all uniform values. We do this to retain values for
650 * uniforms with initialisers and also hidden uniforms that may be lowered
651 * constant arrays. We could possibly just store the values we need but for
652 * now we just store everything.
653 */
654 blob_write_uint32(metadata, prog->data->NumHiddenUniforms);
655 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
656 if (has_uniform_storage(prog, i)) {
657 unsigned vec_size =
658 prog->data->UniformStorage[i].type->component_slots() *
659 MAX2(prog->data->UniformStorage[i].array_elements, 1);
660 blob_write_bytes(metadata, prog->data->UniformStorage[i].storage,
661 sizeof(union gl_constant_value) * vec_size);
662 }
663 }
664 }
665
666 static void
667 read_uniforms(struct blob_reader *metadata, struct gl_shader_program *prog)
668 {
669 struct gl_uniform_storage *uniforms;
670 union gl_constant_value *data;
671
672 prog->SamplersValidated = blob_read_uint32(metadata);
673 prog->data->NumUniformStorage = blob_read_uint32(metadata);
674 prog->data->NumUniformDataSlots = blob_read_uint32(metadata);
675
676 uniforms = rzalloc_array(prog, struct gl_uniform_storage,
677 prog->data->NumUniformStorage);
678 prog->data->UniformStorage = uniforms;
679
680 data = rzalloc_array(uniforms, union gl_constant_value,
681 prog->data->NumUniformDataSlots);
682 prog->data->UniformDataSlots = data;
683
684 prog->UniformHash = new string_to_uint_map;
685
686 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
687 uniforms[i].type = decode_type_from_blob(metadata);
688 uniforms[i].array_elements = blob_read_uint32(metadata);
689 uniforms[i].name = ralloc_strdup(prog, blob_read_string (metadata));
690 uniforms[i].builtin = blob_read_uint32(metadata);
691 uniforms[i].remap_location = blob_read_uint32(metadata);
692 uniforms[i].block_index = blob_read_uint32(metadata);
693 uniforms[i].atomic_buffer_index = blob_read_uint32(metadata);
694 uniforms[i].offset = blob_read_uint32(metadata);
695 uniforms[i].array_stride = blob_read_uint32(metadata);
696 uniforms[i].hidden = blob_read_uint32(metadata);
697 uniforms[i].is_shader_storage = blob_read_uint32(metadata);
698 uniforms[i].active_shader_mask = blob_read_uint32(metadata);
699 uniforms[i].matrix_stride = blob_read_uint32(metadata);
700 uniforms[i].row_major = blob_read_uint32(metadata);
701 uniforms[i].is_bindless = blob_read_uint32(metadata);
702 uniforms[i].num_compatible_subroutines = blob_read_uint32(metadata);
703 uniforms[i].top_level_array_size = blob_read_uint32(metadata);
704 uniforms[i].top_level_array_stride = blob_read_uint32(metadata);
705 prog->UniformHash->put(i, uniforms[i].name);
706
707 if (has_uniform_storage(prog, i)) {
708 uniforms[i].storage = data + blob_read_uint32(metadata);
709 }
710
711 memcpy(uniforms[i].opaque,
712 blob_read_bytes(metadata, sizeof(uniforms[i].opaque)),
713 sizeof(uniforms[i].opaque));
714 }
715
716 /* Restore uniform values. */
717 prog->data->NumHiddenUniforms = blob_read_uint32(metadata);
718 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
719 if (has_uniform_storage(prog, i)) {
720 unsigned vec_size =
721 prog->data->UniformStorage[i].type->component_slots() *
722 MAX2(prog->data->UniformStorage[i].array_elements, 1);
723 blob_copy_bytes(metadata,
724 (uint8_t *) prog->data->UniformStorage[i].storage,
725 sizeof(union gl_constant_value) * vec_size);
726
727 assert(vec_size + prog->data->UniformStorage[i].storage <=
728 data + prog->data->NumUniformDataSlots);
729 }
730 }
731 }
732
733 enum uniform_remap_type
734 {
735 remap_type_inactive_explicit_location,
736 remap_type_null_ptr,
737 remap_type_uniform_offset
738 };
739
740 static void
741 write_uniform_remap_table_entry(struct blob *metadata,
742 gl_uniform_storage *uniform_storage,
743 gl_uniform_storage *entry)
744 {
745 if (entry == INACTIVE_UNIFORM_EXPLICIT_LOCATION) {
746 blob_write_uint32(metadata, remap_type_inactive_explicit_location);
747 } else if (entry == NULL) {
748 blob_write_uint32(metadata, remap_type_null_ptr);
749 } else {
750 blob_write_uint32(metadata, remap_type_uniform_offset);
751
752 uint32_t offset = entry - uniform_storage;
753 blob_write_uint32(metadata, offset);
754 }
755 }
756
757 static void
758 write_uniform_remap_tables(struct blob *metadata,
759 struct gl_shader_program *prog)
760 {
761 blob_write_uint32(metadata, prog->NumUniformRemapTable);
762
763 for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) {
764 write_uniform_remap_table_entry(metadata, prog->data->UniformStorage,
765 prog->UniformRemapTable[i]);
766 }
767
768 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
769 struct gl_linked_shader *sh = prog->_LinkedShaders[i];
770 if (sh) {
771 struct gl_program *glprog = sh->Program;
772 blob_write_uint32(metadata, glprog->sh.NumSubroutineUniformRemapTable);
773
774 for (unsigned j = 0; j < glprog->sh.NumSubroutineUniformRemapTable; j++) {
775 write_uniform_remap_table_entry(metadata,
776 prog->data->UniformStorage,
777 glprog->sh.SubroutineUniformRemapTable[j]);
778 }
779 }
780 }
781 }
782
783 static void
784 read_uniform_remap_table_entry(struct blob_reader *metadata,
785 gl_uniform_storage *uniform_storage,
786 gl_uniform_storage **entry,
787 enum uniform_remap_type type)
788 {
789 if (type == remap_type_inactive_explicit_location) {
790 *entry = INACTIVE_UNIFORM_EXPLICIT_LOCATION;
791 } else if (type == remap_type_null_ptr) {
792 *entry = NULL;
793 } else {
794 uint32_t uni_offset = blob_read_uint32(metadata);
795 *entry = uniform_storage + uni_offset;
796 }
797 }
798
799 static void
800 read_uniform_remap_tables(struct blob_reader *metadata,
801 struct gl_shader_program *prog)
802 {
803 prog->NumUniformRemapTable = blob_read_uint32(metadata);
804
805 prog->UniformRemapTable = rzalloc_array(prog, struct gl_uniform_storage *,
806 prog->NumUniformRemapTable);
807
808 for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) {
809 enum uniform_remap_type type =
810 (enum uniform_remap_type) blob_read_uint32(metadata);
811
812 read_uniform_remap_table_entry(metadata, prog->data->UniformStorage,
813 &prog->UniformRemapTable[i], type);
814 }
815
816 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
817 struct gl_linked_shader *sh = prog->_LinkedShaders[i];
818 if (sh) {
819 struct gl_program *glprog = sh->Program;
820 glprog->sh.NumSubroutineUniformRemapTable = blob_read_uint32(metadata);
821
822 glprog->sh.SubroutineUniformRemapTable =
823 rzalloc_array(glprog, struct gl_uniform_storage *,
824 glprog->sh.NumSubroutineUniformRemapTable);
825
826 for (unsigned j = 0; j < glprog->sh.NumSubroutineUniformRemapTable; j++) {
827 enum uniform_remap_type type =
828 (enum uniform_remap_type) blob_read_uint32(metadata);
829
830 read_uniform_remap_table_entry(metadata,
831 prog->data->UniformStorage,
832 &glprog->sh.SubroutineUniformRemapTable[j],
833 type);
834 }
835 }
836 }
837 }
838
839 struct whte_closure
840 {
841 struct blob *blob;
842 size_t num_entries;
843 };
844
845 static void
846 write_hash_table_entry(const char *key, unsigned value, void *closure)
847 {
848 struct whte_closure *whte = (struct whte_closure *) closure;
849
850 blob_write_string(whte->blob, key);
851 blob_write_uint32(whte->blob, value);
852
853 whte->num_entries++;
854 }
855
856 static void
857 write_hash_table(struct blob *metadata, struct string_to_uint_map *hash)
858 {
859 size_t offset;
860 struct whte_closure whte;
861
862 whte.blob = metadata;
863 whte.num_entries = 0;
864
865 offset = metadata->size;
866
867 /* Write a placeholder for the hashtable size. */
868 blob_write_uint32 (metadata, 0);
869
870 hash->iterate(write_hash_table_entry, &whte);
871
872 /* Overwrite with the computed number of entries written. */
873 blob_overwrite_uint32 (metadata, offset, whte.num_entries);
874 }
875
876 static void
877 read_hash_table(struct blob_reader *metadata, struct string_to_uint_map *hash)
878 {
879 size_t i, num_entries;
880 const char *key;
881 uint32_t value;
882
883 num_entries = blob_read_uint32 (metadata);
884
885 for (i = 0; i < num_entries; i++) {
886 key = blob_read_string(metadata);
887 value = blob_read_uint32(metadata);
888
889 hash->put(value, key);
890 }
891 }
892
893 static void
894 write_hash_tables(struct blob *metadata, struct gl_shader_program *prog)
895 {
896 write_hash_table(metadata, prog->AttributeBindings);
897 write_hash_table(metadata, prog->FragDataBindings);
898 write_hash_table(metadata, prog->FragDataIndexBindings);
899 }
900
901 static void
902 read_hash_tables(struct blob_reader *metadata, struct gl_shader_program *prog)
903 {
904 read_hash_table(metadata, prog->AttributeBindings);
905 read_hash_table(metadata, prog->FragDataBindings);
906 read_hash_table(metadata, prog->FragDataIndexBindings);
907 }
908
909 static void
910 write_shader_subroutine_index(struct blob *metadata,
911 struct gl_linked_shader *sh,
912 struct gl_program_resource *res)
913 {
914 assert(sh);
915
916 for (unsigned j = 0; j < sh->Program->sh.NumSubroutineFunctions; j++) {
917 if (strcmp(((gl_subroutine_function *)res->Data)->name,
918 sh->Program->sh.SubroutineFunctions[j].name) == 0) {
919 blob_write_uint32(metadata, j);
920 break;
921 }
922 }
923 }
924
925 static void
926 get_shader_var_and_pointer_sizes(size_t *s_var_size, size_t *s_var_ptrs,
927 const gl_shader_variable *var)
928 {
929 *s_var_size = sizeof(gl_shader_variable);
930 *s_var_ptrs =
931 sizeof(var->type) +
932 sizeof(var->interface_type) +
933 sizeof(var->outermost_struct_type) +
934 sizeof(var->name);
935 }
936
937 static void
938 write_program_resource_data(struct blob *metadata,
939 struct gl_shader_program *prog,
940 struct gl_program_resource *res)
941 {
942 struct gl_linked_shader *sh;
943
944 switch(res->Type) {
945 case GL_PROGRAM_INPUT:
946 case GL_PROGRAM_OUTPUT: {
947 const gl_shader_variable *var = (gl_shader_variable *)res->Data;
948
949 encode_type_to_blob(metadata, var->type);
950 encode_type_to_blob(metadata, var->interface_type);
951 encode_type_to_blob(metadata, var->outermost_struct_type);
952
953 blob_write_string(metadata, var->name);
954
955 size_t s_var_size, s_var_ptrs;
956 get_shader_var_and_pointer_sizes(&s_var_size, &s_var_ptrs, var);
957
958 /* Write gl_shader_variable skipping over the pointers */
959 blob_write_bytes(metadata, ((char *)var) + s_var_ptrs,
960 s_var_size - s_var_ptrs);
961 break;
962 }
963 case GL_UNIFORM_BLOCK:
964 for (unsigned i = 0; i < prog->data->NumUniformBlocks; i++) {
965 if (strcmp(((gl_uniform_block *)res->Data)->Name,
966 prog->data->UniformBlocks[i].Name) == 0) {
967 blob_write_uint32(metadata, i);
968 break;
969 }
970 }
971 break;
972 case GL_SHADER_STORAGE_BLOCK:
973 for (unsigned i = 0; i < prog->data->NumShaderStorageBlocks; i++) {
974 if (strcmp(((gl_uniform_block *)res->Data)->Name,
975 prog->data->ShaderStorageBlocks[i].Name) == 0) {
976 blob_write_uint32(metadata, i);
977 break;
978 }
979 }
980 break;
981 case GL_BUFFER_VARIABLE:
982 case GL_VERTEX_SUBROUTINE_UNIFORM:
983 case GL_GEOMETRY_SUBROUTINE_UNIFORM:
984 case GL_FRAGMENT_SUBROUTINE_UNIFORM:
985 case GL_COMPUTE_SUBROUTINE_UNIFORM:
986 case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
987 case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
988 case GL_UNIFORM:
989 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
990 if (strcmp(((gl_uniform_storage *)res->Data)->name,
991 prog->data->UniformStorage[i].name) == 0) {
992 blob_write_uint32(metadata, i);
993 break;
994 }
995 }
996 break;
997 case GL_ATOMIC_COUNTER_BUFFER:
998 for (unsigned i = 0; i < prog->data->NumAtomicBuffers; i++) {
999 if (((gl_active_atomic_buffer *)res->Data)->Binding ==
1000 prog->data->AtomicBuffers[i].Binding) {
1001 blob_write_uint32(metadata, i);
1002 break;
1003 }
1004 }
1005 break;
1006 case GL_TRANSFORM_FEEDBACK_BUFFER:
1007 for (unsigned i = 0; i < MAX_FEEDBACK_BUFFERS; i++) {
1008 if (((gl_transform_feedback_buffer *)res->Data)->Binding ==
1009 prog->last_vert_prog->sh.LinkedTransformFeedback->Buffers[i].Binding) {
1010 blob_write_uint32(metadata, i);
1011 break;
1012 }
1013 }
1014 break;
1015 case GL_TRANSFORM_FEEDBACK_VARYING:
1016 for (int i = 0; i < prog->last_vert_prog->sh.LinkedTransformFeedback->NumVarying; i++) {
1017 if (strcmp(((gl_transform_feedback_varying_info *)res->Data)->Name,
1018 prog->last_vert_prog->sh.LinkedTransformFeedback->Varyings[i].Name) == 0) {
1019 blob_write_uint32(metadata, i);
1020 break;
1021 }
1022 }
1023 break;
1024 case GL_VERTEX_SUBROUTINE:
1025 case GL_TESS_CONTROL_SUBROUTINE:
1026 case GL_TESS_EVALUATION_SUBROUTINE:
1027 case GL_GEOMETRY_SUBROUTINE:
1028 case GL_FRAGMENT_SUBROUTINE:
1029 case GL_COMPUTE_SUBROUTINE:
1030 sh =
1031 prog->_LinkedShaders[_mesa_shader_stage_from_subroutine(res->Type)];
1032 write_shader_subroutine_index(metadata, sh, res);
1033 break;
1034 default:
1035 assert(!"Support for writing resource not yet implemented.");
1036 }
1037 }
1038
1039 static void
1040 read_program_resource_data(struct blob_reader *metadata,
1041 struct gl_shader_program *prog,
1042 struct gl_program_resource *res)
1043 {
1044 struct gl_linked_shader *sh;
1045
1046 switch(res->Type) {
1047 case GL_PROGRAM_INPUT:
1048 case GL_PROGRAM_OUTPUT: {
1049 gl_shader_variable *var = ralloc(prog, struct gl_shader_variable);
1050
1051 var->type = decode_type_from_blob(metadata);
1052 var->interface_type = decode_type_from_blob(metadata);
1053 var->outermost_struct_type = decode_type_from_blob(metadata);
1054
1055 var->name = ralloc_strdup(prog, blob_read_string(metadata));
1056
1057 size_t s_var_size, s_var_ptrs;
1058 get_shader_var_and_pointer_sizes(&s_var_size, &s_var_ptrs, var);
1059
1060 blob_copy_bytes(metadata, ((uint8_t *) var) + s_var_ptrs,
1061 s_var_size - s_var_ptrs);
1062
1063 res->Data = var;
1064 break;
1065 }
1066 case GL_UNIFORM_BLOCK:
1067 res->Data = &prog->data->UniformBlocks[blob_read_uint32(metadata)];
1068 break;
1069 case GL_SHADER_STORAGE_BLOCK:
1070 res->Data = &prog->data->ShaderStorageBlocks[blob_read_uint32(metadata)];
1071 break;
1072 case GL_BUFFER_VARIABLE:
1073 case GL_VERTEX_SUBROUTINE_UNIFORM:
1074 case GL_GEOMETRY_SUBROUTINE_UNIFORM:
1075 case GL_FRAGMENT_SUBROUTINE_UNIFORM:
1076 case GL_COMPUTE_SUBROUTINE_UNIFORM:
1077 case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
1078 case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
1079 case GL_UNIFORM:
1080 res->Data = &prog->data->UniformStorage[blob_read_uint32(metadata)];
1081 break;
1082 case GL_ATOMIC_COUNTER_BUFFER:
1083 res->Data = &prog->data->AtomicBuffers[blob_read_uint32(metadata)];
1084 break;
1085 case GL_TRANSFORM_FEEDBACK_BUFFER:
1086 res->Data = &prog->last_vert_prog->
1087 sh.LinkedTransformFeedback->Buffers[blob_read_uint32(metadata)];
1088 break;
1089 case GL_TRANSFORM_FEEDBACK_VARYING:
1090 res->Data = &prog->last_vert_prog->
1091 sh.LinkedTransformFeedback->Varyings[blob_read_uint32(metadata)];
1092 break;
1093 case GL_VERTEX_SUBROUTINE:
1094 case GL_TESS_CONTROL_SUBROUTINE:
1095 case GL_TESS_EVALUATION_SUBROUTINE:
1096 case GL_GEOMETRY_SUBROUTINE:
1097 case GL_FRAGMENT_SUBROUTINE:
1098 case GL_COMPUTE_SUBROUTINE:
1099 sh =
1100 prog->_LinkedShaders[_mesa_shader_stage_from_subroutine(res->Type)];
1101 res->Data =
1102 &sh->Program->sh.SubroutineFunctions[blob_read_uint32(metadata)];
1103 break;
1104 default:
1105 assert(!"Support for reading resource not yet implemented.");
1106 }
1107 }
1108
1109 static void
1110 write_program_resource_list(struct blob *metadata,
1111 struct gl_shader_program *prog)
1112 {
1113 blob_write_uint32(metadata, prog->data->NumProgramResourceList);
1114
1115 for (unsigned i = 0; i < prog->data->NumProgramResourceList; i++) {
1116 blob_write_uint32(metadata, prog->data->ProgramResourceList[i].Type);
1117 write_program_resource_data(metadata, prog,
1118 &prog->data->ProgramResourceList[i]);
1119 blob_write_bytes(metadata,
1120 &prog->data->ProgramResourceList[i].StageReferences,
1121 sizeof(prog->data->ProgramResourceList[i].StageReferences));
1122 }
1123 }
1124
1125 static void
1126 read_program_resource_list(struct blob_reader *metadata,
1127 struct gl_shader_program *prog)
1128 {
1129 prog->data->NumProgramResourceList = blob_read_uint32(metadata);
1130
1131 prog->data->ProgramResourceList =
1132 ralloc_array(prog, gl_program_resource,
1133 prog->data->NumProgramResourceList);
1134
1135 for (unsigned i = 0; i < prog->data->NumProgramResourceList; i++) {
1136 prog->data->ProgramResourceList[i].Type = blob_read_uint32(metadata);
1137 read_program_resource_data(metadata, prog,
1138 &prog->data->ProgramResourceList[i]);
1139 blob_copy_bytes(metadata,
1140 (uint8_t *) &prog->data->ProgramResourceList[i].StageReferences,
1141 sizeof(prog->data->ProgramResourceList[i].StageReferences));
1142 }
1143 }
1144
1145 static void
1146 write_shader_parameters(struct blob *metadata,
1147 struct gl_program_parameter_list *params)
1148 {
1149 blob_write_uint32(metadata, params->NumParameters);
1150 uint32_t i = 0;
1151
1152 while (i < params->NumParameters) {
1153 struct gl_program_parameter *param = &params->Parameters[i];
1154
1155 blob_write_uint32(metadata, param->Type);
1156 blob_write_string(metadata, param->Name);
1157 blob_write_uint32(metadata, param->Size);
1158 blob_write_uint32(metadata, param->DataType);
1159 blob_write_bytes(metadata, param->StateIndexes,
1160 sizeof(param->StateIndexes));
1161
1162 i += (param->Size + 3) / 4;
1163 }
1164
1165 blob_write_bytes(metadata, params->ParameterValues,
1166 sizeof(gl_constant_value) * 4 * params->NumParameters);
1167
1168 blob_write_uint32(metadata, params->StateFlags);
1169 }
1170
1171 static void
1172 read_shader_parameters(struct blob_reader *metadata,
1173 struct gl_program_parameter_list *params)
1174 {
1175 gl_state_index state_indexes[STATE_LENGTH];
1176 uint32_t i = 0;
1177 uint32_t num_parameters = blob_read_uint32(metadata);
1178
1179 _mesa_reserve_parameter_storage(params, num_parameters);
1180 while (i < num_parameters) {
1181 gl_register_file type = (gl_register_file) blob_read_uint32(metadata);
1182 const char *name = blob_read_string(metadata);
1183 unsigned size = blob_read_uint32(metadata);
1184 unsigned data_type = blob_read_uint32(metadata);
1185 blob_copy_bytes(metadata, (uint8_t *) state_indexes,
1186 sizeof(state_indexes));
1187
1188 _mesa_add_parameter(params, type, name, size, data_type,
1189 NULL, state_indexes);
1190
1191 i += (size + 3) / 4;
1192 }
1193
1194 blob_copy_bytes(metadata, (uint8_t *) params->ParameterValues,
1195 sizeof(gl_constant_value) * 4 * params->NumParameters);
1196
1197 params->StateFlags = blob_read_uint32(metadata);
1198 }
1199
1200 static void
1201 write_shader_metadata(struct blob *metadata, gl_linked_shader *shader)
1202 {
1203 assert(shader->Program);
1204 struct gl_program *glprog = shader->Program;
1205 unsigned i;
1206
1207 blob_write_bytes(metadata, glprog->TexturesUsed,
1208 sizeof(glprog->TexturesUsed));
1209 blob_write_uint64(metadata, glprog->SamplersUsed);
1210
1211 blob_write_bytes(metadata, glprog->SamplerUnits,
1212 sizeof(glprog->SamplerUnits));
1213 blob_write_bytes(metadata, glprog->sh.SamplerTargets,
1214 sizeof(glprog->sh.SamplerTargets));
1215 blob_write_uint32(metadata, glprog->ShadowSamplers);
1216
1217 blob_write_bytes(metadata, glprog->sh.ImageAccess,
1218 sizeof(glprog->sh.ImageAccess));
1219 blob_write_bytes(metadata, glprog->sh.ImageUnits,
1220 sizeof(glprog->sh.ImageUnits));
1221
1222 size_t ptr_size = sizeof(GLvoid *);
1223
1224 blob_write_uint32(metadata, glprog->sh.NumBindlessSamplers);
1225 blob_write_uint32(metadata, glprog->sh.HasBoundBindlessSampler);
1226 for (i = 0; i < glprog->sh.NumBindlessSamplers; i++) {
1227 blob_write_bytes(metadata, &glprog->sh.BindlessSamplers[i],
1228 sizeof(struct gl_bindless_sampler) - ptr_size);
1229 }
1230
1231 blob_write_uint32(metadata, glprog->sh.NumBindlessImages);
1232 blob_write_uint32(metadata, glprog->sh.HasBoundBindlessImage);
1233 for (i = 0; i < glprog->sh.NumBindlessImages; i++) {
1234 blob_write_bytes(metadata, &glprog->sh.BindlessImages[i],
1235 sizeof(struct gl_bindless_image) - ptr_size);
1236 }
1237
1238 write_shader_parameters(metadata, glprog->Parameters);
1239 }
1240
1241 static void
1242 read_shader_metadata(struct blob_reader *metadata,
1243 struct gl_program *glprog,
1244 gl_linked_shader *linked)
1245 {
1246 unsigned i;
1247
1248 blob_copy_bytes(metadata, (uint8_t *) glprog->TexturesUsed,
1249 sizeof(glprog->TexturesUsed));
1250 glprog->SamplersUsed = blob_read_uint64(metadata);
1251
1252 blob_copy_bytes(metadata, (uint8_t *) glprog->SamplerUnits,
1253 sizeof(glprog->SamplerUnits));
1254 blob_copy_bytes(metadata, (uint8_t *) glprog->sh.SamplerTargets,
1255 sizeof(glprog->sh.SamplerTargets));
1256 glprog->ShadowSamplers = blob_read_uint32(metadata);
1257
1258 blob_copy_bytes(metadata, (uint8_t *) glprog->sh.ImageAccess,
1259 sizeof(glprog->sh.ImageAccess));
1260 blob_copy_bytes(metadata, (uint8_t *) glprog->sh.ImageUnits,
1261 sizeof(glprog->sh.ImageUnits));
1262
1263 size_t ptr_size = sizeof(GLvoid *);
1264
1265 glprog->sh.NumBindlessSamplers = blob_read_uint32(metadata);
1266 glprog->sh.HasBoundBindlessSampler = blob_read_uint32(metadata);
1267 if (glprog->sh.NumBindlessSamplers > 0) {
1268 glprog->sh.BindlessSamplers =
1269 rzalloc_array(glprog, gl_bindless_sampler,
1270 glprog->sh.NumBindlessSamplers);
1271
1272 for (i = 0; i < glprog->sh.NumBindlessSamplers; i++) {
1273 blob_copy_bytes(metadata, (uint8_t *) &glprog->sh.BindlessSamplers[i],
1274 sizeof(struct gl_bindless_sampler) - ptr_size);
1275 }
1276 }
1277
1278 glprog->sh.NumBindlessImages = blob_read_uint32(metadata);
1279 glprog->sh.HasBoundBindlessImage = blob_read_uint32(metadata);
1280 if (glprog->sh.NumBindlessImages > 0) {
1281 glprog->sh.BindlessImages =
1282 rzalloc_array(glprog, gl_bindless_image,
1283 glprog->sh.NumBindlessImages);
1284
1285 for (i = 0; i < glprog->sh.NumBindlessImages; i++) {
1286 blob_copy_bytes(metadata, (uint8_t *) &glprog->sh.BindlessImages[i],
1287 sizeof(struct gl_bindless_image) - ptr_size);
1288 }
1289 }
1290
1291 glprog->Parameters = _mesa_new_parameter_list();
1292 read_shader_parameters(metadata, glprog->Parameters);
1293 }
1294
1295 static void
1296 create_binding_str(const char *key, unsigned value, void *closure)
1297 {
1298 char **bindings_str = (char **) closure;
1299 ralloc_asprintf_append(bindings_str, "%s:%u,", key, value);
1300 }
1301
1302 static void
1303 get_shader_info_and_pointer_sizes(size_t *s_info_size, size_t *s_info_ptrs,
1304 shader_info *info)
1305 {
1306 *s_info_size = sizeof(shader_info);
1307 *s_info_ptrs = sizeof(info->name) + sizeof(info->label);
1308 }
1309
1310 static void
1311 create_linked_shader_and_program(struct gl_context *ctx,
1312 gl_shader_stage stage,
1313 struct gl_shader_program *prog,
1314 struct blob_reader *metadata)
1315 {
1316 struct gl_program *glprog;
1317
1318 struct gl_linked_shader *linked = rzalloc(NULL, struct gl_linked_shader);
1319 linked->Stage = stage;
1320
1321 glprog = ctx->Driver.NewProgram(ctx, _mesa_shader_stage_to_program(stage),
1322 prog->Name, false);
1323 glprog->info.stage = stage;
1324 linked->Program = glprog;
1325
1326 read_shader_metadata(metadata, glprog, linked);
1327
1328 glprog->info.name = ralloc_strdup(glprog, blob_read_string(metadata));
1329 glprog->info.label = ralloc_strdup(glprog, blob_read_string(metadata));
1330
1331 size_t s_info_size, s_info_ptrs;
1332 get_shader_info_and_pointer_sizes(&s_info_size, &s_info_ptrs,
1333 &glprog->info);
1334
1335 /* Restore shader info */
1336 blob_copy_bytes(metadata, ((uint8_t *) &glprog->info) + s_info_ptrs,
1337 s_info_size - s_info_ptrs);
1338
1339 _mesa_reference_shader_program_data(ctx, &glprog->sh.data, prog->data);
1340 _mesa_reference_program(ctx, &linked->Program, glprog);
1341 prog->_LinkedShaders[stage] = linked;
1342 }
1343
1344 void
1345 shader_cache_write_program_metadata(struct gl_context *ctx,
1346 struct gl_shader_program *prog)
1347 {
1348 struct disk_cache *cache = ctx->Cache;
1349 if (!cache)
1350 return;
1351
1352 /* Exit early when we are dealing with a ff shader with no source file to
1353 * generate a source from.
1354 *
1355 * TODO: In future we should use another method to generate a key for ff
1356 * programs.
1357 */
1358 static const char zero[sizeof(prog->data->sha1)] = {0};
1359 if (memcmp(prog->data->sha1, zero, sizeof(prog->data->sha1)) == 0)
1360 return;
1361
1362 struct blob *metadata = blob_create();
1363
1364 write_uniforms(metadata, prog);
1365
1366 write_hash_tables(metadata, prog);
1367
1368 blob_write_uint32(metadata, prog->data->Version);
1369 blob_write_uint32(metadata, prog->data->linked_stages);
1370
1371 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
1372 struct gl_linked_shader *sh = prog->_LinkedShaders[i];
1373 if (sh) {
1374 write_shader_metadata(metadata, sh);
1375
1376 if (sh->Program->info.name)
1377 blob_write_string(metadata, sh->Program->info.name);
1378 else
1379 blob_write_string(metadata, "");
1380
1381 if (sh->Program->info.label)
1382 blob_write_string(metadata, sh->Program->info.label);
1383 else
1384 blob_write_string(metadata, "");
1385
1386 size_t s_info_size, s_info_ptrs;
1387 get_shader_info_and_pointer_sizes(&s_info_size, &s_info_ptrs,
1388 &sh->Program->info);
1389
1390 /* Store shader info */
1391 blob_write_bytes(metadata,
1392 ((char *) &sh->Program->info) + s_info_ptrs,
1393 s_info_size - s_info_ptrs);
1394 }
1395 }
1396
1397 write_xfb(metadata, prog);
1398
1399 write_uniform_remap_tables(metadata, prog);
1400
1401 write_atomic_buffers(metadata, prog);
1402
1403 write_buffer_blocks(metadata, prog);
1404
1405 write_subroutines(metadata, prog);
1406
1407 write_program_resource_list(metadata, prog);
1408
1409 char sha1_buf[41];
1410 for (unsigned i = 0; i < prog->NumShaders; i++) {
1411 disk_cache_put_key(cache, prog->Shaders[i]->sha1);
1412 if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
1413 _mesa_sha1_format(sha1_buf, prog->Shaders[i]->sha1);
1414 fprintf(stderr, "marking shader: %s\n", sha1_buf);
1415 }
1416 }
1417
1418 disk_cache_put(cache, prog->data->sha1, metadata->data, metadata->size);
1419
1420 blob_destroy(metadata);
1421
1422 if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
1423 _mesa_sha1_format(sha1_buf, prog->data->sha1);
1424 fprintf(stderr, "putting program metadata in cache: %s\n", sha1_buf);
1425 }
1426 }
1427
1428 bool
1429 shader_cache_read_program_metadata(struct gl_context *ctx,
1430 struct gl_shader_program *prog)
1431 {
1432 /* Fixed function programs generated by Mesa are not cached. So don't
1433 * try to read metadata for them from the cache.
1434 */
1435 if (prog->Name == 0)
1436 return false;
1437
1438 struct disk_cache *cache = ctx->Cache;
1439 if (!cache || prog->data->cache_fallback || prog->data->skip_cache)
1440 return false;
1441
1442 /* Include bindings when creating sha1. These bindings change the resulting
1443 * binary so they are just as important as the shader source.
1444 */
1445 char *buf = ralloc_strdup(NULL, "vb: ");
1446 prog->AttributeBindings->iterate(create_binding_str, &buf);
1447 ralloc_strcat(&buf, "fb: ");
1448 prog->FragDataBindings->iterate(create_binding_str, &buf);
1449 ralloc_strcat(&buf, "fbi: ");
1450 prog->FragDataIndexBindings->iterate(create_binding_str, &buf);
1451
1452 /* SSO has an effect on the linked program so include this when generating
1453 * the sha also.
1454 */
1455 ralloc_asprintf_append(&buf, "sso: %s\n",
1456 prog->SeparateShader ? "T" : "F");
1457
1458 /* A shader might end up producing different output depending on the glsl
1459 * version supported by the compiler. For example a different path might be
1460 * taken by the preprocessor, so add the version to the hash input.
1461 */
1462 ralloc_asprintf_append(&buf, "api: %d glsl: %d fglsl: %d\n",
1463 ctx->API, ctx->Const.GLSLVersion,
1464 ctx->Const.ForceGLSLVersion);
1465
1466 /* We run the preprocessor on shaders after hashing them, so we need to
1467 * add any extension override vars to the hash. If we don't do this the
1468 * preprocessor could result in different output and we could load the
1469 * wrong shader.
1470 */
1471 char *ext_override = getenv("MESA_EXTENSION_OVERRIDE");
1472 if (ext_override) {
1473 ralloc_asprintf_append(&buf, "ext:%s", ext_override);
1474 }
1475
1476 /* DRI config options may also change the output from the compiler so
1477 * include them as an input to sha1 creation.
1478 */
1479 char sha1buf[41];
1480 _mesa_sha1_format(sha1buf, ctx->Const.dri_config_options_sha1);
1481 ralloc_strcat(&buf, sha1buf);
1482
1483 for (unsigned i = 0; i < prog->NumShaders; i++) {
1484 struct gl_shader *sh = prog->Shaders[i];
1485 _mesa_sha1_format(sha1buf, sh->sha1);
1486 ralloc_asprintf_append(&buf, "%s: %s\n",
1487 _mesa_shader_stage_to_abbrev(sh->Stage), sha1buf);
1488 }
1489 disk_cache_compute_key(cache, buf, strlen(buf), prog->data->sha1);
1490 ralloc_free(buf);
1491
1492 size_t size;
1493 uint8_t *buffer = (uint8_t *) disk_cache_get(cache, prog->data->sha1,
1494 &size);
1495 if (buffer == NULL) {
1496 /* Cached program not found. We may have seen the individual shaders
1497 * before and skipped compiling but they may not have been used together
1498 * in this combination before. Fall back to linking shaders but first
1499 * re-compile the shaders.
1500 *
1501 * We could probably only compile the shaders which were skipped here
1502 * but we need to be careful because the source may also have been
1503 * changed since the last compile so for now we just recompile
1504 * everything.
1505 */
1506 compile_shaders(ctx, prog);
1507 return false;
1508 }
1509
1510 if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
1511 _mesa_sha1_format(sha1buf, prog->data->sha1);
1512 fprintf(stderr, "loading shader program meta data from cache: %s\n",
1513 sha1buf);
1514 }
1515
1516 struct blob_reader metadata;
1517 blob_reader_init(&metadata, buffer, size);
1518
1519 assert(prog->data->UniformStorage == NULL);
1520
1521 read_uniforms(&metadata, prog);
1522
1523 read_hash_tables(&metadata, prog);
1524
1525 prog->data->Version = blob_read_uint32(&metadata);
1526 prog->data->linked_stages = blob_read_uint32(&metadata);
1527
1528 unsigned mask = prog->data->linked_stages;
1529 while (mask) {
1530 const int j = u_bit_scan(&mask);
1531 create_linked_shader_and_program(ctx, (gl_shader_stage) j, prog,
1532 &metadata);
1533 }
1534
1535 read_xfb(&metadata, prog);
1536
1537 read_uniform_remap_tables(&metadata, prog);
1538
1539 read_atomic_buffers(&metadata, prog);
1540
1541 read_buffer_blocks(&metadata, prog);
1542
1543 read_subroutines(&metadata, prog);
1544
1545 read_program_resource_list(&metadata, prog);
1546
1547 if (metadata.current != metadata.end || metadata.overrun) {
1548 /* Something has gone wrong discard the item from the cache and rebuild
1549 * from source.
1550 */
1551 assert(!"Invalid GLSL shader disk cache item!");
1552
1553 if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
1554 fprintf(stderr, "Error reading program from cache (invalid GLSL "
1555 "cache item)\n");
1556 }
1557
1558 disk_cache_remove(cache, prog->data->sha1);
1559 compile_shaders(ctx, prog);
1560 free(buffer);
1561 return false;
1562 }
1563
1564 /* This is used to flag a shader retrieved from cache */
1565 prog->data->LinkStatus = linking_skipped;
1566
1567 /* Since the program load was successful, CompileStatus of all shaders at
1568 * this point should normally be compile_skipped. However because of how
1569 * the eviction works, it may happen that some of the individual shader keys
1570 * have been evicted, resulting in unnecessary recompiles on this load, so
1571 * mark them again to skip such recompiles next time.
1572 */
1573 char sha1_buf[41];
1574 for (unsigned i = 0; i < prog->NumShaders; i++) {
1575 if (prog->Shaders[i]->CompileStatus == compiled_no_opts) {
1576 disk_cache_put_key(cache, prog->Shaders[i]->sha1);
1577 if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
1578 _mesa_sha1_format(sha1_buf, prog->Shaders[i]->sha1);
1579 fprintf(stderr, "re-marking shader: %s\n", sha1_buf);
1580 }
1581 }
1582 }
1583
1584 free (buffer);
1585
1586 return true;
1587 }