OSDN Git Service

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