ReactOS 0.4.17-dev-934-g091855f
dxbc.c
Go to the documentation of this file.
1/*
2 * Copyright 2008-2009 Henri Verbeet for CodeWeavers
3 * Copyright 2010 Rico Schüller
4 * Copyright 2017 Józef Kucia for CodeWeavers
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
22
23#define DXBC_CHECKSUM_SKIP_BYTE_COUNT 20
24
25static void compute_dxbc_checksum(const void *dxbc, size_t size, uint32_t checksum[4])
26{
27 const uint8_t *ptr = dxbc;
28
32
34}
35
36void dxbc_writer_init(struct dxbc_writer *dxbc)
37{
38 memset(dxbc, 0, sizeof(*dxbc));
39}
40
41void dxbc_writer_add_section(struct dxbc_writer *dxbc, uint32_t tag, const void *data, size_t size)
42{
44
46
47 section = &dxbc->sections[dxbc->section_count++];
48 section->tag = tag;
49 section->data.code = data;
50 section->data.size = size;
51}
52
54 struct vkd3d_shader_code *dxbc, char **messages)
55{
56 size_t size_position, offsets_position, checksum_position, i;
57 struct vkd3d_bytecode_buffer buffer = {0};
59
60 TRACE("section_count %zu, sections %p, dxbc %p, messages %p.\n", section_count, sections, dxbc, messages);
61
62 if (messages)
63 *messages = NULL;
64
66
67 checksum_position = bytecode_get_size(&buffer);
68 for (i = 0; i < 4; ++i)
69 put_u32(&buffer, 0);
70
71 put_u32(&buffer, 1); /* version */
72 size_position = put_u32(&buffer, 0);
73 put_u32(&buffer, section_count);
74
75 offsets_position = bytecode_get_size(&buffer);
76 for (i = 0; i < section_count; ++i)
77 put_u32(&buffer, 0);
78
79 for (i = 0; i < section_count; ++i)
80 {
81 set_u32(&buffer, offsets_position + i * sizeof(uint32_t), bytecode_align(&buffer));
83 put_u32(&buffer, sections[i].data.size);
84 bytecode_put_bytes(&buffer, sections[i].data.code, sections[i].data.size);
85 }
86 set_u32(&buffer, size_position, bytecode_get_size(&buffer));
87
89 for (i = 0; i < 4; ++i)
90 set_u32(&buffer, checksum_position + i * sizeof(uint32_t), checksum[i]);
91
92 if (!buffer.status)
93 {
94 dxbc->code = buffer.data;
95 dxbc->size = buffer.size;
96 }
97 return buffer.status;
98}
99
101{
103}
104
105static bool require_space(size_t offset, size_t count, size_t size, size_t data_size)
106{
107 return !count || (data_size - offset) / count >= size;
108}
109
110static uint32_t read_u32(const char **ptr)
111{
112 unsigned int ret;
113 memcpy(&ret, *ptr, sizeof(ret));
114 *ptr += sizeof(ret);
115 return ret;
116}
117
118static float read_float(const char **ptr)
119{
120 union
121 {
122 uint32_t i;
123 float f;
124 } u;
125 STATIC_ASSERT(sizeof(float) == sizeof(uint32_t));
126 u.i = read_u32(ptr);
127 return u.f;
128}
129
130static void skip_dword_unknown(const char **ptr, unsigned int count)
131{
132 unsigned int i;
133 uint32_t d;
134
135 if (!count)
136 return;
137
138 WARN("Skipping %u unknown DWORDs:\n", count);
139 for (i = 0; i < count; ++i)
140 {
141 d = read_u32(ptr);
142 WARN("\t0x%08x\n", d);
143 }
144}
145
146static const char *shader_get_string(const char *data, size_t data_size, size_t offset)
147{
148 size_t len, max_len;
149
150 if (offset >= data_size)
151 {
152 WARN("Invalid offset %#zx (data size %#zx).\n", offset, data_size);
153 return NULL;
154 }
155
156 max_len = data_size - offset;
157 len = strnlen(data + offset, max_len);
158
159 if (len == max_len)
160 return NULL;
161
162 return data + offset;
163}
164
165static int parse_dxbc(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context,
166 const char *source_name, uint32_t flags, struct vkd3d_shader_dxbc_desc *desc)
167{
168 const struct vkd3d_shader_location location = {.source_name = source_name};
170 uint32_t checksum[4], calculated_checksum[4];
171 const char *data = dxbc->code;
172 size_t data_size = dxbc->size;
173 const char *ptr = data;
174 uint32_t chunk_count;
175 uint32_t total_size;
177 unsigned int i;
179
180 if (data_size < VKD3D_DXBC_HEADER_SIZE)
181 {
182 WARN("Invalid data size %zu.\n", data_size);
184 "DXBC size %zu is smaller than the DXBC header size.", data_size);
186 }
187
188 tag = read_u32(&ptr);
189 TRACE("tag: %#x.\n", tag);
190
191 if (tag != TAG_DXBC)
192 {
193 WARN("Wrong tag.\n");
194 vkd3d_shader_error(message_context, &location, VKD3D_SHADER_ERROR_DXBC_INVALID_MAGIC, "Invalid DXBC magic.");
196 }
197
198 checksum[0] = read_u32(&ptr);
199 checksum[1] = read_u32(&ptr);
200 checksum[2] = read_u32(&ptr);
201 checksum[3] = read_u32(&ptr);
203 {
204 compute_dxbc_checksum(data, data_size, calculated_checksum);
205 if (memcmp(checksum, calculated_checksum, sizeof(checksum)))
206 {
207 WARN("Checksum {0x%08x, 0x%08x, 0x%08x, 0x%08x} does not match "
208 "calculated checksum {0x%08x, 0x%08x, 0x%08x, 0x%08x}.\n",
209 checksum[0], checksum[1], checksum[2], checksum[3],
210 calculated_checksum[0], calculated_checksum[1],
211 calculated_checksum[2], calculated_checksum[3]);
213 "Invalid DXBC checksum.");
215 }
216 }
217
218 version = read_u32(&ptr);
219 TRACE("version: %#x.\n", version);
220 if (version != 0x00000001)
221 {
222 WARN("Got unexpected DXBC version %#x.\n", version);
224 "DXBC version %#x is not supported.", version);
226 }
227
228 total_size = read_u32(&ptr);
229 TRACE("total size: %#x\n", total_size);
230
231 chunk_count = read_u32(&ptr);
232 TRACE("chunk count: %#x\n", chunk_count);
233
234 if (!(sections = vkd3d_calloc(chunk_count, sizeof(*sections))))
235 {
236 vkd3d_shader_error(message_context, &location, VKD3D_SHADER_ERROR_DXBC_OUT_OF_MEMORY, "Out of memory.");
238 }
239
240 for (i = 0; i < chunk_count; ++i)
241 {
242 uint32_t chunk_tag, chunk_size;
243 const char *chunk_ptr;
244 uint32_t chunk_offset;
245
246 chunk_offset = read_u32(&ptr);
247 TRACE("chunk %u at offset %#x\n", i, chunk_offset);
248
249 if (chunk_offset >= data_size || !require_space(chunk_offset, 2, sizeof(uint32_t), data_size))
250 {
251 WARN("Invalid chunk offset %#x (data size %zu).\n", chunk_offset, data_size);
253 "DXBC chunk %u has invalid offset %#x (data size %#zx).", i, chunk_offset, data_size);
256 }
257
258 chunk_ptr = data + chunk_offset;
259
260 chunk_tag = read_u32(&chunk_ptr);
261 chunk_size = read_u32(&chunk_ptr);
262
263 if (!require_space(chunk_ptr - data, 1, chunk_size, data_size))
264 {
265 WARN("Invalid chunk size %#x (data size %zu, chunk offset %#x).\n",
266 chunk_size, data_size, chunk_offset);
268 "DXBC chunk %u has invalid size %#x (data size %#zx, chunk offset %#x).",
269 i, chunk_offset, data_size, chunk_offset);
272 }
273
274 section = &sections[i];
275 section->tag = chunk_tag;
276 section->data.code = chunk_ptr;
277 section->data.size = chunk_size;
278 }
279
280 desc->tag = tag;
281 memcpy(desc->checksum, checksum, sizeof(checksum));
282 desc->version = version;
283 desc->size = total_size;
284 desc->section_count = chunk_count;
285 desc->sections = sections;
286
287 return VKD3D_OK;
288}
289
291{
292 TRACE("dxbc %p.\n", dxbc);
293
294 vkd3d_free(dxbc->sections);
295}
296
297static int for_each_dxbc_section(const struct vkd3d_shader_code *dxbc,
298 struct vkd3d_shader_message_context *message_context, const char *source_name,
299 int (*section_handler)(const struct vkd3d_shader_dxbc_section_desc *section,
300 struct vkd3d_shader_message_context *message_context, void *ctx), void *ctx)
301{
303 unsigned int i;
304 int ret;
305
306 if ((ret = parse_dxbc(dxbc, message_context, source_name, 0, &desc)) < 0)
307 return ret;
308
309 for (i = 0; i < desc.section_count; ++i)
310 {
311 if ((ret = section_handler(&desc.sections[i], message_context, ctx)) < 0)
312 break;
313 }
314
316
317 return ret;
318}
319
322{
323 struct vkd3d_shader_message_context message_context;
324 int ret;
325
326 TRACE("dxbc {%p, %zu}, flags %#x, desc %p, messages %p.\n", dxbc->code, dxbc->size, flags, desc, messages);
327
328 if (messages)
329 *messages = NULL;
331
332 ret = parse_dxbc(dxbc, &message_context, NULL, flags, desc);
333
335 if (!vkd3d_shader_message_context_copy_messages(&message_context, messages) && ret >= 0)
336 {
339 }
340 vkd3d_shader_message_context_cleanup(&message_context);
341
342 if (ret < 0)
343 memset(desc, 0, sizeof(*desc));
344
345 return ret;
346}
347
348/* Shader Model 6 shaders use these special values in the output signature,
349 * but Shader Model 4/5 just use VKD3D_SHADER_SV_NONE. Normalize to SM6. */
351{
352 if (!ascii_strcasecmp(name, "sv_target"))
354 if (!ascii_strcasecmp(name, "sv_depth"))
356 if (!ascii_strcasecmp(name, "sv_coverage"))
358 if (!ascii_strcasecmp(name, "sv_depthgreaterequal"))
360 if (!ascii_strcasecmp(name, "sv_depthlessequal"))
362 if (!ascii_strcasecmp(name, "sv_stencilref"))
364
366}
367
369 struct vkd3d_shader_message_context *message_context, struct shader_signature *s)
370{
371 bool has_stream_index, has_min_precision;
372 const char *data = section->data.code;
373 uint32_t count, header_size;
374 struct signature_element *e;
375 const char *ptr = data;
376 unsigned int i, j;
377
378 if (!require_space(0, 2, sizeof(uint32_t), section->data.size))
379 {
380 WARN("Invalid data size %#zx.\n", section->data.size);
382 "Section size %zu is smaller than the minimum signature header size.\n", section->data.size);
384 }
385
386 count = read_u32(&ptr);
387 TRACE("%u elements.\n", count);
388
389 header_size = read_u32(&ptr);
390 i = header_size / sizeof(uint32_t);
391 if (align(header_size, sizeof(uint32_t)) != header_size || i < 2
392 || !require_space(2, i - 2, sizeof(uint32_t), section->data.size))
393 {
394 WARN("Invalid header size %#x.\n", header_size);
396 "Signature header size %#x is invalid.\n", header_size);
398 }
399 skip_dword_unknown(&ptr, i - 2);
400
401 if (!require_space(ptr - data, count, 6 * sizeof(uint32_t), section->data.size))
402 {
403 WARN("Invalid count %#x (data size %#zx).\n", count, section->data.size);
405 }
406
407 if (!(e = vkd3d_calloc(count, sizeof(*e))))
408 {
409 ERR("Failed to allocate input signature memory.\n");
411 }
412
413 has_min_precision = section->tag == TAG_OSG1 || section->tag == TAG_PSG1 || section->tag == TAG_ISG1;
414 has_stream_index = section->tag == TAG_OSG5 || has_min_precision;
415
416 for (i = 0; i < count; ++i)
417 {
418 size_t name_offset;
419 const char *name;
421
422 if (has_stream_index)
423 e[i].stream_index = read_u32(&ptr);
424 else
425 e[i].stream_index = 0;
426
427 name_offset = read_u32(&ptr);
428 if (!(name = shader_get_string(data, section->data.size, name_offset))
429 || !(e[i].semantic_name = vkd3d_strdup(name)))
430 {
431 WARN("Invalid name offset %#zx (data size %#zx).\n", name_offset, section->data.size);
432 for (j = 0; j < i; ++j)
433 {
434 vkd3d_free((void *)e[j].semantic_name);
435 }
436 vkd3d_free(e);
438 }
439 e[i].semantic_index = read_u32(&ptr);
440 e[i].sysval_semantic = read_u32(&ptr);
441 e[i].component_type = read_u32(&ptr);
442 e[i].register_index = read_u32(&ptr);
443 e[i].target_location = e[i].register_index;
444 e[i].register_count = 1;
445 mask = read_u32(&ptr);
446 e[i].mask = mask & 0xff;
447 e[i].used_mask = (mask >> 8) & 0xff;
448 switch (section->tag)
449 {
450 case TAG_OSGN:
451 case TAG_OSG1:
452 case TAG_OSG5:
454 e[i].sysval_semantic = map_fragment_output_sysval(e[i].semantic_name);
455 break;
456 }
457
458 if (has_min_precision)
459 e[i].min_precision = read_u32(&ptr);
460 else
461 e[i].min_precision = VKD3D_SHADER_MINIMUM_PRECISION_NONE;
462
463 e[i].interpolation_mode = VKD3DSIM_NONE;
464
465 TRACE("Stream: %u, semantic: %s, semantic idx: %u, sysval_semantic %#x, "
466 "type %u, register idx: %u, use_mask %#x, input_mask %#x, precision %u.\n",
469 }
470
471 s->elements = e;
472 s->element_count = count;
473
474 return VKD3D_OK;
475}
476
478 struct vkd3d_shader_message_context *message_context, void *ctx)
479{
480 struct shader_signature *is = ctx;
481
482 if (section->tag != TAG_ISGN && section->tag != TAG_ISG1)
483 return VKD3D_OK;
484
485 if (is->elements)
486 {
487 FIXME("Multiple input signatures.\n");
489 }
490 return shader_parse_signature(section, message_context, is);
491}
492
494 struct vkd3d_shader_message_context *message_context, struct shader_signature *signature)
495{
496 int ret;
497
498 memset(signature, 0, sizeof(*signature));
499 if ((ret = for_each_dxbc_section(dxbc, message_context, NULL, isgn_handler, signature)) < 0)
500 ERR("Failed to parse input signature.\n");
501
502 return ret;
503}
504
506 struct vkd3d_shader_message_context *message_context, void *context)
507{
508 struct dxbc_shader_desc *desc = context;
509 int ret;
510
511 switch (section->tag)
512 {
513 case TAG_ISGN:
514 case TAG_ISG1:
515 if (desc->input_signature.elements)
516 {
517 FIXME("Multiple input signatures.\n");
518 break;
519 }
520 if ((ret = shader_parse_signature(section, message_context, &desc->input_signature)) < 0)
521 return ret;
522 break;
523
524 case TAG_OSGN:
525 case TAG_OSG5:
526 case TAG_OSG1:
527 if (desc->output_signature.elements)
528 {
529 FIXME("Multiple output signatures.\n");
530 break;
531 }
532 if ((ret = shader_parse_signature(section, message_context, &desc->output_signature)) < 0)
533 return ret;
534 break;
535
536 case TAG_PCSG:
537 case TAG_PSG1:
538 if (desc->patch_constant_signature.elements)
539 {
540 FIXME("Multiple patch constant signatures.\n");
541 break;
542 }
543 if ((ret = shader_parse_signature(section, message_context, &desc->patch_constant_signature)) < 0)
544 return ret;
545 break;
546
547 case TAG_DXIL:
548 case TAG_SHDR:
549 case TAG_SHEX:
550 if ((section->tag == TAG_DXIL) != desc->is_dxil)
551 {
552 TRACE("Skipping chunk %#x.\n", section->tag);
553 break;
554 }
555 if (desc->byte_code)
556 FIXME("Multiple shader code chunks.\n");
557 desc->byte_code = section->data.code;
558 desc->byte_code_size = section->data.size;
559 break;
560
561 case TAG_AON9:
562 TRACE("Skipping AON9 shader code chunk.\n");
563 break;
564
565 default:
566 TRACE("Skipping chunk %#x.\n", section->tag);
567 break;
568 }
569
570 return VKD3D_OK;
571}
572
574{
575 shader_signature_cleanup(&desc->input_signature);
576 shader_signature_cleanup(&desc->output_signature);
577 shader_signature_cleanup(&desc->patch_constant_signature);
578}
579
581 struct vkd3d_shader_message_context *message_context, const char *source_name, struct dxbc_shader_desc *desc)
582{
583 int ret;
584
585 ret = for_each_dxbc_section(dxbc, message_context, source_name, shdr_handler, desc);
586 if (!desc->byte_code)
588
589 if (ret < 0)
590 {
591 WARN("Failed to parse shader, vkd3d result %d.\n", ret);
593 }
594
595 return ret;
596}
597
598/* root signatures */
599#define VKD3D_ROOT_SIGNATURE_1_0_ROOT_DESCRIPTOR_FLAGS VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_DATA_VOLATILE
600
601#define VKD3D_ROOT_SIGNATURE_1_0_DESCRIPTOR_RANGE_FLAGS \
602 (VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE | VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE)
603
605{
606 const char *data;
607 unsigned int data_size;
608};
609
611 unsigned int offset, unsigned int count, struct vkd3d_shader_descriptor_range *ranges)
612{
613 const char *ptr;
614 unsigned int i;
615
616 if (!require_space(offset, 5 * count, sizeof(uint32_t), context->data_size))
617 {
618 WARN("Invalid data size %#x (offset %u, count %u).\n", context->data_size, offset, count);
620 }
621 ptr = &context->data[offset];
622
623 for (i = 0; i < count; ++i)
624 {
625 ranges[i].range_type = read_u32(&ptr);
626 ranges[i].descriptor_count = read_u32(&ptr);
628 ranges[i].register_space = read_u32(&ptr);
630
631 TRACE("Type %#x, descriptor count %u, base shader register %u, "
632 "register space %u, offset %u.\n",
633 ranges[i].range_type, ranges[i].descriptor_count,
634 ranges[i].base_shader_register, ranges[i].register_space,
635 ranges[i].descriptor_table_offset);
636 }
637
638 return VKD3D_OK;
639}
640
642{
643 unsigned int unknown_flags = range->flags & ~(VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_NONE
649
650 if (unknown_flags)
651 FIXME("Unknown descriptor range flags %#x.\n", unknown_flags);
652}
653
655 unsigned int offset, unsigned int count, struct vkd3d_shader_descriptor_range1 *ranges)
656{
657 const char *ptr;
658 unsigned int i;
659
660 if (!require_space(offset, 6 * count, sizeof(uint32_t), context->data_size))
661 {
662 WARN("Invalid data size %#x (offset %u, count %u).\n", context->data_size, offset, count);
664 }
665 ptr = &context->data[offset];
666
667 for (i = 0; i < count; ++i)
668 {
669 ranges[i].range_type = read_u32(&ptr);
670 ranges[i].descriptor_count = read_u32(&ptr);
672 ranges[i].register_space = read_u32(&ptr);
673 ranges[i].flags = read_u32(&ptr);
675
676 TRACE("Type %#x, descriptor count %u, base shader register %u, "
677 "register space %u, flags %#x, offset %u.\n",
678 ranges[i].range_type, ranges[i].descriptor_count,
679 ranges[i].base_shader_register, ranges[i].register_space,
680 ranges[i].flags, ranges[i].descriptor_table_offset);
681
683 }
684
685 return VKD3D_OK;
686}
687
689 unsigned int offset, struct vkd3d_shader_root_descriptor_table *table)
690{
691 struct vkd3d_shader_descriptor_range *ranges;
692 unsigned int count;
693 const char *ptr;
694
695 if (!require_space(offset, 2, sizeof(uint32_t), context->data_size))
696 {
697 WARN("Invalid data size %#x (offset %u).\n", context->data_size, offset);
699 }
700 ptr = &context->data[offset];
701
702 count = read_u32(&ptr);
703 offset = read_u32(&ptr);
704
705 TRACE("Descriptor range count %u.\n", count);
706
707 table->descriptor_range_count = count;
708
709 if (!(ranges = vkd3d_calloc(count, sizeof(*ranges))))
711 table->descriptor_ranges = ranges;
713}
714
717{
718 struct vkd3d_shader_descriptor_range1 *ranges;
719 unsigned int count;
720 const char *ptr;
721
722 if (!require_space(offset, 2, sizeof(uint32_t), context->data_size))
723 {
724 WARN("Invalid data size %#x (offset %u).\n", context->data_size, offset);
726 }
727 ptr = &context->data[offset];
728
729 count = read_u32(&ptr);
730 offset = read_u32(&ptr);
731
732 TRACE("Descriptor range count %u.\n", count);
733
734 table->descriptor_range_count = count;
735
736 if (!(ranges = vkd3d_calloc(count, sizeof(*ranges))))
738 table->descriptor_ranges = ranges;
740}
741
743 unsigned int offset, struct vkd3d_shader_root_constants *constants)
744{
745 const char *ptr;
746
747 if (!require_space(offset, 3, sizeof(uint32_t), context->data_size))
748 {
749 WARN("Invalid data size %#x (offset %u).\n", context->data_size, offset);
751 }
752 ptr = &context->data[offset];
753
754 constants->shader_register = read_u32(&ptr);
755 constants->register_space = read_u32(&ptr);
756 constants->value_count = read_u32(&ptr);
757
758 TRACE("Shader register %u, register space %u, 32-bit value count %u.\n",
759 constants->shader_register, constants->register_space, constants->value_count);
760
761 return VKD3D_OK;
762}
763
765 unsigned int offset, struct vkd3d_shader_root_descriptor *descriptor)
766{
767 const char *ptr;
768
769 if (!require_space(offset, 2, sizeof(uint32_t), context->data_size))
770 {
771 WARN("Invalid data size %#x (offset %u).\n", context->data_size, offset);
773 }
774 ptr = &context->data[offset];
775
776 descriptor->shader_register = read_u32(&ptr);
777 descriptor->register_space = read_u32(&ptr);
778
779 TRACE("Shader register %u, register space %u.\n",
780 descriptor->shader_register, descriptor->register_space);
781
782 return VKD3D_OK;
783}
784
786{
787 unsigned int unknown_flags = descriptor->flags & ~(VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_NONE
791
792 if (unknown_flags)
793 FIXME("Unknown root descriptor flags %#x.\n", unknown_flags);
794}
795
797 unsigned int offset, struct vkd3d_shader_root_descriptor1 *descriptor)
798{
799 const char *ptr;
800
801 if (!require_space(offset, 3, sizeof(uint32_t), context->data_size))
802 {
803 WARN("Invalid data size %#x (offset %u).\n", context->data_size, offset);
805 }
806 ptr = &context->data[offset];
807
808 descriptor->shader_register = read_u32(&ptr);
809 descriptor->register_space = read_u32(&ptr);
810 descriptor->flags = read_u32(&ptr);
811
812 TRACE("Shader register %u, register space %u, flags %#x.\n",
813 descriptor->shader_register, descriptor->register_space, descriptor->flags);
814
816
817 return VKD3D_OK;
818}
819
821 unsigned int offset, unsigned int count, struct vkd3d_shader_root_parameter *parameters)
822{
823 const char *ptr;
824 unsigned int i;
825 int ret;
826
827 if (!require_space(offset, 3 * count, sizeof(uint32_t), context->data_size))
828 {
829 WARN("Invalid data size %#x (offset %u, count %u).\n", context->data_size, offset, count);
831 }
832 ptr = &context->data[offset];
833
834 for (i = 0; i < count; ++i)
835 {
836 parameters[i].parameter_type = read_u32(&ptr);
837 parameters[i].shader_visibility = read_u32(&ptr);
838 offset = read_u32(&ptr);
839
840 TRACE("Type %#x, shader visibility %#x.\n",
841 parameters[i].parameter_type, parameters[i].shader_visibility);
842
843 switch (parameters[i].parameter_type)
844 {
847 break;
850 break;
855 break;
856 default:
857 FIXME("Unrecognized type %#x.\n", parameters[i].parameter_type);
859 }
860
861 if (ret < 0)
862 return ret;
863 }
864
865 return VKD3D_OK;
866}
867
870{
871 const char *ptr;
872 unsigned int i;
873 int ret;
874
875 if (!require_space(offset, 3 * count, sizeof(uint32_t), context->data_size))
876 {
877 WARN("Invalid data size %#x (offset %u, count %u).\n", context->data_size, offset, count);
879 }
880 ptr = &context->data[offset];
881
882 for (i = 0; i < count; ++i)
883 {
884 parameters[i].parameter_type = read_u32(&ptr);
885 parameters[i].shader_visibility = read_u32(&ptr);
886 offset = read_u32(&ptr);
887
888 TRACE("Type %#x, shader visibility %#x.\n",
889 parameters[i].parameter_type, parameters[i].shader_visibility);
890
891 switch (parameters[i].parameter_type)
892 {
895 break;
898 break;
903 break;
904 default:
905 FIXME("Unrecognized type %#x.\n", parameters[i].parameter_type);
907 }
908
909 if (ret < 0)
910 return ret;
911 }
912
913 return VKD3D_OK;
914}
915
917 unsigned int offset, unsigned int count, struct vkd3d_shader_static_sampler_desc *sampler_descs)
918{
919 const char *ptr;
920 unsigned int i;
921
922 if (!require_space(offset, 13 * count, sizeof(uint32_t), context->data_size))
923 {
924 WARN("Invalid data size %#x (offset %u, count %u).\n", context->data_size, offset, count);
926 }
927 ptr = &context->data[offset];
928
929 for (i = 0; i < count; ++i)
930 {
931 sampler_descs[i].filter = read_u32(&ptr);
932 sampler_descs[i].address_u = read_u32(&ptr);
933 sampler_descs[i].address_v = read_u32(&ptr);
934 sampler_descs[i].address_w = read_u32(&ptr);
935 sampler_descs[i].mip_lod_bias = read_float(&ptr);
936 sampler_descs[i].max_anisotropy = read_u32(&ptr);
937 sampler_descs[i].comparison_func = read_u32(&ptr);
938 sampler_descs[i].border_colour = read_u32(&ptr);
939 sampler_descs[i].min_lod = read_float(&ptr);
940 sampler_descs[i].max_lod = read_float(&ptr);
941 sampler_descs[i].shader_register = read_u32(&ptr);
942 sampler_descs[i].register_space = read_u32(&ptr);
943 sampler_descs[i].shader_visibility = read_u32(&ptr);
944 }
945
946 return VKD3D_OK;
947}
948
951{
952 struct vkd3d_shader_root_signature_desc *v_1_0 = &desc->u.v_1_0;
954 unsigned int count, offset, version;
955 const char *ptr = data->code;
956 int ret;
957
958 context.data = data->code;
959 context.data_size = data->size;
960
961 if (!require_space(0, 6, sizeof(uint32_t), data->size))
962 {
963 WARN("Invalid data size %#zx.\n", data->size);
965 }
966
967 version = read_u32(&ptr);
968 TRACE("Version %#x.\n", version);
970 {
971 FIXME("Unknown version %#x.\n", version);
973 }
974 desc->version = version;
975
976 count = read_u32(&ptr);
977 offset = read_u32(&ptr);
978 TRACE("Parameter count %u, offset %u.\n", count, offset);
979
981 {
982 v_1_0->parameter_count = count;
983 if (v_1_0->parameter_count)
984 {
986 if (!(parameters = vkd3d_calloc(v_1_0->parameter_count, sizeof(*parameters))))
988 v_1_0->parameters = parameters;
990 return ret;
991 }
992 }
993 else
994 {
995 struct vkd3d_shader_root_signature_desc1 *v_1_1 = &desc->u.v_1_1;
996
998
999 v_1_1->parameter_count = count;
1000 if (v_1_1->parameter_count)
1001 {
1003 if (!(parameters = vkd3d_calloc(v_1_1->parameter_count, sizeof(*parameters))))
1005 v_1_1->parameters = parameters;
1007 return ret;
1008 }
1009 }
1010
1011 count = read_u32(&ptr);
1012 offset = read_u32(&ptr);
1013 TRACE("Static sampler count %u, offset %u.\n", count, offset);
1014
1015 v_1_0->static_sampler_count = count;
1016 if (v_1_0->static_sampler_count)
1017 {
1019 if (!(samplers = vkd3d_calloc(v_1_0->static_sampler_count, sizeof(*samplers))))
1021 v_1_0->static_samplers = samplers;
1023 return ret;
1024 }
1025
1026 v_1_0->flags = read_u32(&ptr);
1027 TRACE("Flags %#x.\n", v_1_0->flags);
1028
1029 return VKD3D_OK;
1030}
1031
1033 struct vkd3d_shader_message_context *message_context, void *context)
1034{
1036
1037 if (section->tag != TAG_RTS0)
1038 return VKD3D_OK;
1039
1041}
1042
1044 struct vkd3d_shader_versioned_root_signature_desc *root_signature, char **messages)
1045{
1046 struct vkd3d_shader_message_context message_context;
1047 int ret;
1048
1049 TRACE("dxbc {%p, %zu}, root_signature %p, messages %p.\n", dxbc->code, dxbc->size, root_signature, messages);
1050
1051 memset(root_signature, 0, sizeof(*root_signature));
1052 if (messages)
1053 *messages = NULL;
1055
1056 ret = for_each_dxbc_section(dxbc, &message_context, NULL, rts0_handler, root_signature);
1060
1061 vkd3d_shader_message_context_cleanup(&message_context);
1062 if (ret < 0)
1063 vkd3d_shader_free_root_signature(root_signature);
1064
1065 return ret;
1066}
1067
1070{
1072 return desc->u.v_1_0.parameter_count;
1073 else
1074 return desc->u.v_1_1.parameter_count;
1075}
1076
1078 const struct vkd3d_shader_versioned_root_signature_desc *desc, unsigned int i)
1079{
1081 return desc->u.v_1_0.parameters[i].parameter_type;
1082 else
1083 return desc->u.v_1_1.parameters[i].parameter_type;
1084}
1085
1087 const struct vkd3d_shader_versioned_root_signature_desc *desc, unsigned int i)
1088{
1090 return desc->u.v_1_0.parameters[i].shader_visibility;
1091 else
1092 return desc->u.v_1_1.parameters[i].shader_visibility;
1093}
1094
1096 const struct vkd3d_shader_versioned_root_signature_desc *desc, unsigned int i)
1097{
1099 return &desc->u.v_1_0.parameters[i].u.constants;
1100 else
1101 return &desc->u.v_1_1.parameters[i].u.constants;
1102}
1103
1106{
1108 return desc->u.v_1_0.static_sampler_count;
1109 else
1110 return desc->u.v_1_1.static_sampler_count;
1111}
1112
1115{
1117 return desc->u.v_1_0.static_samplers;
1118 else
1119 return desc->u.v_1_1.static_samplers;
1120}
1121
1123{
1125 return desc->u.v_1_0.flags;
1126 else
1127 return desc->u.v_1_1.flags;
1128}
1129
1131{
1133
1135
1138};
1139
1141{
1142 return bytecode_get_size(&context->buffer) - context->chunk_position;
1143}
1144
1146{
1147 struct vkd3d_bytecode_buffer *buffer = &context->buffer;
1148 unsigned int i;
1149
1151
1152 /* The checksum is computed when all data is generated. */
1153 for (i = 0; i < 4; ++i)
1154 put_u32(buffer, 0);
1155 put_u32(buffer, 1);
1156 context->total_size_position = put_u32(buffer, 0xffffffff);
1157 put_u32(buffer, 1); /* chunk count */
1158 put_u32(buffer, bytecode_get_size(buffer) + sizeof(uint32_t)); /* chunk offset */
1160 put_u32(buffer, 0xffffffff);
1161 context->chunk_position = bytecode_get_size(buffer);
1162}
1163
1166{
1167 const struct vkd3d_shader_descriptor_range *ranges = table->descriptor_ranges;
1168 unsigned int i;
1169
1170 for (i = 0; i < table->descriptor_range_count; ++i)
1171 {
1172 put_u32(buffer, ranges[i].range_type);
1173 put_u32(buffer, ranges[i].descriptor_count);
1175 put_u32(buffer, ranges[i].register_space);
1177 }
1178}
1179
1182{
1183 const struct vkd3d_shader_descriptor_range1 *ranges = table->descriptor_ranges;
1184 unsigned int i;
1185
1186 for (i = 0; i < table->descriptor_range_count; ++i)
1187 {
1188 put_u32(buffer, ranges[i].range_type);
1189 put_u32(buffer, ranges[i].descriptor_count);
1191 put_u32(buffer, ranges[i].register_space);
1192 put_u32(buffer, ranges[i].flags);
1194 }
1195}
1196
1199{
1200 struct vkd3d_bytecode_buffer *buffer = &context->buffer;
1201
1202 put_u32(buffer, table->descriptor_range_count);
1203 put_u32(buffer, get_chunk_offset(context) + sizeof(uint32_t)); /* offset */
1204
1206}
1207
1210{
1211 struct vkd3d_bytecode_buffer *buffer = &context->buffer;
1212
1213 put_u32(buffer, table->descriptor_range_count);
1214 put_u32(buffer, get_chunk_offset(context) + sizeof(uint32_t)); /* offset */
1215
1217}
1218
1221{
1222 put_u32(buffer, constants->shader_register);
1223 put_u32(buffer, constants->register_space);
1224 put_u32(buffer, constants->value_count);
1225}
1226
1229{
1230 put_u32(buffer, descriptor->shader_register);
1231 put_u32(buffer, descriptor->register_space);
1232}
1233
1236{
1237 put_u32(buffer, descriptor->shader_register);
1238 put_u32(buffer, descriptor->register_space);
1239 put_u32(buffer, descriptor->flags);
1240}
1241
1244{
1245 unsigned int parameter_count = versioned_root_signature_get_parameter_count(desc);
1246 struct vkd3d_bytecode_buffer *buffer = &context->buffer;
1247 size_t parameters_position;
1248 unsigned int i;
1249
1250 parameters_position = bytecode_align(buffer);
1251 for (i = 0; i < parameter_count; ++i)
1252 {
1255 put_u32(buffer, 0xffffffff); /* offset */
1256 }
1257
1258 for (i = 0; i < parameter_count; ++i)
1259 {
1260 set_u32(buffer, parameters_position + ((3 * i + 2) * sizeof(uint32_t)), get_chunk_offset(context));
1261
1263 {
1266 shader_write_descriptor_table(context, &desc->u.v_1_0.parameters[i].u.descriptor_table);
1267 else
1268 shader_write_descriptor_table1(context, &desc->u.v_1_1.parameters[i].u.descriptor_table);
1269 break;
1272 break;
1277 shader_write_root_descriptor(buffer, &desc->u.v_1_0.parameters[i].u.descriptor);
1278 else
1279 shader_write_root_descriptor1(buffer, &desc->u.v_1_1.parameters[i].u.descriptor);
1280 break;
1281 default:
1282 FIXME("Unrecognized type %#x.\n", versioned_root_signature_get_parameter_type(desc, i));
1284 "Invalid/unrecognised root signature root parameter type %#x.",
1287 }
1288 }
1289
1290 return VKD3D_OK;
1291}
1292
1295{
1297 unsigned int i;
1298
1300 {
1314 }
1315}
1316
1319{
1320 struct vkd3d_bytecode_buffer *buffer = &context->buffer;
1321 size_t samplers_offset_position;
1322 int ret;
1323
1324 put_u32(buffer, desc->version);
1326 put_u32(buffer, get_chunk_offset(context) + 4 * sizeof(uint32_t)); /* offset */
1328 samplers_offset_position = put_u32(buffer, 0xffffffff);
1330
1332 return ret;
1333
1334 set_u32(buffer, samplers_offset_position, get_chunk_offset(context));
1336 return 0;
1337}
1338
1340 struct vkd3d_shader_message_context *message_context)
1341{
1342 bool have_srv_uav_cbv = false;
1343 bool have_sampler = false;
1344 unsigned int i;
1345
1346 for (i = 0; i < descriptor_table->descriptor_range_count; ++i)
1347 {
1348 const struct vkd3d_shader_descriptor_range *r = &descriptor_table->descriptor_ranges[i];
1349
1350 if (r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_SRV
1351 || r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
1352 || r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_CBV)
1353 {
1354 have_srv_uav_cbv = true;
1355 }
1356 else if (r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER)
1357 {
1358 have_sampler = true;
1359 }
1360 else
1361 {
1362 WARN("Invalid descriptor range type %#x.\n", r->range_type);
1364 "Invalid root signature descriptor range type %#x.", r->range_type);
1366 }
1367 }
1368
1369 if (have_srv_uav_cbv && have_sampler)
1370 {
1371 WARN("Samplers cannot be mixed with CBVs/SRVs/UAVs in descriptor tables.\n");
1373 "Encountered both CBV/SRV/UAV and sampler descriptor ranges in the same root descriptor table.");
1375 }
1376
1377 return VKD3D_OK;
1378}
1379
1381 struct vkd3d_shader_message_context *message_context)
1382{
1383 bool have_srv_uav_cbv = false;
1384 bool have_sampler = false;
1385 unsigned int i;
1386
1387 for (i = 0; i < descriptor_table->descriptor_range_count; ++i)
1388 {
1389 const struct vkd3d_shader_descriptor_range1 *r = &descriptor_table->descriptor_ranges[i];
1390
1391 if (r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_SRV
1392 || r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
1393 || r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_CBV)
1394 {
1395 have_srv_uav_cbv = true;
1396 }
1397 else if (r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER)
1398 {
1399 have_sampler = true;
1400 }
1401 else
1402 {
1403 WARN("Invalid descriptor range type %#x.\n", r->range_type);
1405 "Invalid root signature descriptor range type %#x.", r->range_type);
1407 }
1408 }
1409
1410 if (have_srv_uav_cbv && have_sampler)
1411 {
1412 WARN("Samplers cannot be mixed with CBVs/SRVs/UAVs in descriptor tables.\n");
1414 "Encountered both CBV/SRV/UAV and sampler descriptor ranges in the same root descriptor table.");
1416 }
1417
1418 return VKD3D_OK;
1419}
1420
1422 struct vkd3d_shader_message_context *message_context)
1423{
1424 int ret = VKD3D_OK;
1425 unsigned int i;
1426
1428 {
1430
1433 {
1435 ret = validate_descriptor_table_v_1_0(&desc->u.v_1_0.parameters[i].u.descriptor_table, message_context);
1436 else
1437 ret = validate_descriptor_table_v_1_1(&desc->u.v_1_1.parameters[i].u.descriptor_table, message_context);
1438 }
1439
1440 if (ret < 0)
1441 break;
1442 }
1443
1444 return ret;
1445}
1446
1448 struct vkd3d_shader_code *dxbc, char **messages)
1449{
1451 size_t total_size, chunk_size;
1452 uint32_t checksum[4];
1453 unsigned int i;
1454 int ret;
1455
1456 TRACE("root_signature %p, dxbc %p, messages %p.\n", root_signature, dxbc, messages);
1457
1458 if (messages)
1459 *messages = NULL;
1460
1461 memset(&context, 0, sizeof(context));
1463
1466 {
1468 WARN("Root signature version %#x not supported.\n", root_signature->version);
1470 "Root signature version %#x is not supported.", root_signature->version);
1471 goto done;
1472 }
1473
1474 if ((ret = validate_root_signature_desc(root_signature, &context.message_context)) < 0)
1475 goto done;
1476
1477 memset(dxbc, 0, sizeof(*dxbc));
1479
1480 if ((ret = shader_write_root_signature(&context, root_signature)) < 0)
1481 {
1482 vkd3d_free(context.buffer.data);
1483 goto done;
1484 }
1485
1486 if (context.buffer.status)
1487 {
1489 "Out of memory while writing root signature.");
1490 vkd3d_free(context.buffer.data);
1491 goto done;
1492 }
1493
1494 total_size = bytecode_get_size(&context.buffer);
1495 chunk_size = get_chunk_offset(&context);
1496 set_u32(&context.buffer, context.total_size_position, total_size);
1497 set_u32(&context.buffer, context.chunk_position - sizeof(uint32_t), chunk_size);
1498
1499 dxbc->code = context.buffer.data;
1500 dxbc->size = total_size;
1501
1502 compute_dxbc_checksum(dxbc->code, dxbc->size, checksum);
1503 for (i = 0; i < 4; ++i)
1504 set_u32(&context.buffer, (i + 1) * sizeof(uint32_t), checksum[i]);
1505
1506 ret = VKD3D_OK;
1507
1508done:
1513 return ret;
1514}
1515
1517{
1518 unsigned int i;
1519
1520 if (!parameters)
1521 return;
1522
1523 for (i = 0; i < count; ++i)
1524 {
1525 const struct vkd3d_shader_root_parameter *p = &parameters[i];
1526
1528 vkd3d_free((void *)p->u.descriptor_table.descriptor_ranges);
1529 }
1530}
1531
1533 const struct vkd3d_shader_root_parameter1 *src, unsigned int count)
1534{
1535 const struct vkd3d_shader_descriptor_range1 *ranges1;
1536 struct vkd3d_shader_descriptor_range *ranges;
1537 unsigned int i, j;
1538 int ret;
1539
1540 for (i = 0; i < count; ++i)
1541 {
1542 const struct vkd3d_shader_root_parameter1 *p1 = &src[i];
1543 struct vkd3d_shader_root_parameter *p = &dst[i];
1544
1546 switch (p->parameter_type)
1547 {
1549 ranges = NULL;
1550 if ((p->u.descriptor_table.descriptor_range_count = p1->u.descriptor_table.descriptor_range_count))
1551 {
1552 if (!(ranges = vkd3d_calloc(p->u.descriptor_table.descriptor_range_count, sizeof(*ranges))))
1553 {
1555 goto fail;
1556 }
1557 }
1558 p->u.descriptor_table.descriptor_ranges = ranges;
1559 ranges1 = p1->u.descriptor_table.descriptor_ranges;
1560 for (j = 0; j < p->u.descriptor_table.descriptor_range_count; ++j)
1561 {
1562 ranges[j].range_type = ranges1[j].range_type;
1563 ranges[j].descriptor_count = ranges1[j].descriptor_count;
1564 ranges[j].base_shader_register = ranges1[j].base_shader_register;
1565 ranges[j].register_space = ranges1[j].register_space;
1567 }
1568 break;
1570 p->u.constants = p1->u.constants;
1571 break;
1575 p->u.descriptor.shader_register = p1->u.descriptor.shader_register;
1576 p->u.descriptor.register_space = p1->u.descriptor.register_space;
1577 break;
1578 default:
1579 WARN("Invalid root parameter type %#x.\n", p->parameter_type);
1581 goto fail;
1582
1583 }
1584 p->shader_visibility = p1->shader_visibility;
1585 }
1586
1587 return VKD3D_OK;
1588
1589fail:
1591 return ret;
1592}
1593
1596{
1597 const struct vkd3d_shader_root_signature_desc1 *src_desc = &src->u.v_1_1;
1598 struct vkd3d_shader_root_signature_desc *dst_desc = &dst->u.v_1_0;
1601 int ret;
1602
1603 if ((dst_desc->parameter_count = src_desc->parameter_count))
1604 {
1605 if (!(parameters = vkd3d_calloc(dst_desc->parameter_count, sizeof(*parameters))))
1606 {
1608 goto fail;
1609 }
1611 goto fail;
1612 }
1613 dst_desc->parameters = parameters;
1614 if ((dst_desc->static_sampler_count = src_desc->static_sampler_count))
1615 {
1616 if (!(samplers = vkd3d_calloc(dst_desc->static_sampler_count, sizeof(*samplers))))
1617 {
1619 goto fail;
1620 }
1621 memcpy(samplers, src_desc->static_samplers, src_desc->static_sampler_count * sizeof(*samplers));
1622 }
1623 dst_desc->static_samplers = samplers;
1624 dst_desc->flags = src_desc->flags;
1625
1626 return VKD3D_OK;
1627
1628fail:
1632 return ret;
1633}
1634
1636{
1637 unsigned int i;
1638
1639 if (!parameters)
1640 return;
1641
1642 for (i = 0; i < count; ++i)
1643 {
1644 const struct vkd3d_shader_root_parameter1 *p = &parameters[i];
1645
1647 vkd3d_free((void *)p->u.descriptor_table.descriptor_ranges);
1648 }
1649}
1650
1652 const struct vkd3d_shader_root_parameter *src, unsigned int count)
1653{
1654 const struct vkd3d_shader_descriptor_range *ranges;
1655 struct vkd3d_shader_descriptor_range1 *ranges1;
1656 unsigned int i, j;
1657 int ret;
1658
1659 for (i = 0; i < count; ++i)
1660 {
1661 const struct vkd3d_shader_root_parameter *p = &src[i];
1662 struct vkd3d_shader_root_parameter1 *p1 = &dst[i];
1663
1664 p1->parameter_type = p->parameter_type;
1665 switch (p1->parameter_type)
1666 {
1668 ranges1 = NULL;
1669 if ((p1->u.descriptor_table.descriptor_range_count = p->u.descriptor_table.descriptor_range_count))
1670 {
1671 if (!(ranges1 = vkd3d_calloc(p1->u.descriptor_table.descriptor_range_count, sizeof(*ranges1))))
1672 {
1674 goto fail;
1675 }
1676 }
1677 p1->u.descriptor_table.descriptor_ranges = ranges1;
1678 ranges = p->u.descriptor_table.descriptor_ranges;
1679 for (j = 0; j < p1->u.descriptor_table.descriptor_range_count; ++j)
1680 {
1681 ranges1[j].range_type = ranges[j].range_type;
1682 ranges1[j].descriptor_count = ranges[j].descriptor_count;
1683 ranges1[j].base_shader_register = ranges[j].base_shader_register;
1684 ranges1[j].register_space = ranges[j].register_space;
1687 }
1688 break;
1690 p1->u.constants = p->u.constants;
1691 break;
1695 p1->u.descriptor.shader_register = p->u.descriptor.shader_register;
1696 p1->u.descriptor.register_space = p->u.descriptor.register_space;
1698 break;
1699 default:
1700 WARN("Invalid root parameter type %#x.\n", p1->parameter_type);
1702 goto fail;
1703
1704 }
1705 p1->shader_visibility = p->shader_visibility;
1706 }
1707
1708 return VKD3D_OK;
1709
1710fail:
1712 return ret;
1713}
1714
1717{
1718 const struct vkd3d_shader_root_signature_desc *src_desc = &src->u.v_1_0;
1719 struct vkd3d_shader_root_signature_desc1 *dst_desc = &dst->u.v_1_1;
1722 int ret;
1723
1724 if ((dst_desc->parameter_count = src_desc->parameter_count))
1725 {
1726 if (!(parameters = vkd3d_calloc(dst_desc->parameter_count, sizeof(*parameters))))
1727 {
1729 goto fail;
1730 }
1732 goto fail;
1733 }
1734 dst_desc->parameters = parameters;
1735 if ((dst_desc->static_sampler_count = src_desc->static_sampler_count))
1736 {
1737 if (!(samplers = vkd3d_calloc(dst_desc->static_sampler_count, sizeof(*samplers))))
1738 {
1740 goto fail;
1741 }
1742 memcpy(samplers, src_desc->static_samplers, src_desc->static_sampler_count * sizeof(*samplers));
1743 }
1744 dst_desc->static_samplers = samplers;
1745 dst_desc->flags = src_desc->flags;
1746
1747 return VKD3D_OK;
1748
1749fail:
1753 return ret;
1754}
1755
1758{
1759 int ret;
1760
1761 TRACE("dst %p, version %#x, src %p.\n", dst, version, src);
1762
1763 if (src->version == version)
1764 {
1765 WARN("Nothing to convert.\n");
1767 }
1768
1770 {
1771 WARN("Root signature version %#x not supported.\n", version);
1773 }
1774
1777 {
1778 WARN("Root signature version %#x not supported.\n", src->version);
1780 }
1781
1782 memset(dst, 0, sizeof(*dst));
1783 dst->version = version;
1784
1786 {
1788 }
1789 else
1790 {
1793 }
1794
1795 return ret;
1796}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
static void put_u32(struct bytecode_buffer *buffer, uint32_t value)
#define TAG_SHEX
#define TAG_SHDR
#define TAG_DXBC
#define TAG_ISGN
#define TAG_OSGN
#define TAG_OSG5
#define TAG_PCSG
component_type
range
Definition: d3dx9_private.h:58
#define NULL
Definition: types.h:112
UINT32 uint32_t
Definition: types.h:75
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
Definition: fdi.c:353
static const WCHAR version[]
Definition: asmname.c:66
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
unsigned char uint8_t
Definition: stdint.h:33
_ACRTIMP size_t __cdecl strnlen(const char *, size_t)
Definition: string.c:1607
return ret
Definition: mutex.c:147
static void free_descriptor_ranges(const struct vkd3d_shader_root_parameter *parameters, unsigned int count)
Definition: dxbc.c:1516
static unsigned int versioned_root_signature_get_parameter_count(const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1068
static int shader_parse_root_descriptor(struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_descriptor *descriptor)
Definition: dxbc.c:764
static void shader_write_static_samplers(struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1293
static int validate_descriptor_table_v_1_1(const struct vkd3d_shader_root_descriptor_table1 *descriptor_table, struct vkd3d_shader_message_context *message_context)
Definition: dxbc.c:1380
static int validate_root_signature_desc(const struct vkd3d_shader_versioned_root_signature_desc *desc, struct vkd3d_shader_message_context *message_context)
Definition: dxbc.c:1421
int shader_extract_from_dxbc(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context, const char *source_name, struct dxbc_shader_desc *desc)
Definition: dxbc.c:580
static const struct vkd3d_shader_root_constants * versioned_root_signature_get_root_constants(const struct vkd3d_shader_versioned_root_signature_desc *desc, unsigned int i)
Definition: dxbc.c:1095
static bool require_space(size_t offset, size_t count, size_t size, size_t data_size)
Definition: dxbc.c:105
static enum vkd3d_shader_visibility versioned_root_signature_get_parameter_shader_visibility(const struct vkd3d_shader_versioned_root_signature_desc *desc, unsigned int i)
Definition: dxbc.c:1086
static int shader_write_root_parameters(struct root_signature_writer_context *context, const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1242
static int rts0_handler(const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *context)
Definition: dxbc.c:1032
static int shader_parse_root_signature(const struct vkd3d_shader_code *data, struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:949
static size_t get_chunk_offset(struct root_signature_writer_context *context)
Definition: dxbc.c:1140
static unsigned int versioned_root_signature_get_flags(const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1122
int dxbc_writer_write(struct dxbc_writer *dxbc, struct vkd3d_shader_code *out)
Definition: dxbc.c:100
#define VKD3D_ROOT_SIGNATURE_1_0_ROOT_DESCRIPTOR_FLAGS
Definition: dxbc.c:599
static const char * shader_get_string(const char *data, size_t data_size, size_t offset)
Definition: dxbc.c:146
static void shader_write_root_constants(struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_constants *constants)
Definition: dxbc.c:1219
#define DXBC_CHECKSUM_SKIP_BYTE_COUNT
Definition: dxbc.c:23
static int convert_root_parameters_to_v_1_1(struct vkd3d_shader_root_parameter1 *dst, const struct vkd3d_shader_root_parameter *src, unsigned int count)
Definition: dxbc.c:1651
int vkd3d_shader_parse_root_signature(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_versioned_root_signature_desc *root_signature, char **messages)
Definition: dxbc.c:1043
static void shader_write_descriptor_ranges(struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_descriptor_table *table)
Definition: dxbc.c:1164
static int isgn_handler(const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *ctx)
Definition: dxbc.c:477
static int parse_dxbc(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context, const char *source_name, uint32_t flags, struct vkd3d_shader_dxbc_desc *desc)
Definition: dxbc.c:165
#define VKD3D_ROOT_SIGNATURE_1_0_DESCRIPTOR_RANGE_FLAGS
Definition: dxbc.c:601
static int validate_descriptor_table_v_1_0(const struct vkd3d_shader_root_descriptor_table *descriptor_table, struct vkd3d_shader_message_context *message_context)
Definition: dxbc.c:1339
static void shader_write_descriptor_table(struct root_signature_writer_context *context, const struct vkd3d_shader_root_descriptor_table *table)
Definition: dxbc.c:1197
int vkd3d_shader_convert_root_signature(struct vkd3d_shader_versioned_root_signature_desc *dst, enum vkd3d_shader_root_signature_version version, const struct vkd3d_shader_versioned_root_signature_desc *src)
Definition: dxbc.c:1756
static int shader_parse_descriptor_ranges1(struct root_signature_parser_context *context, unsigned int offset, unsigned int count, struct vkd3d_shader_descriptor_range1 *ranges)
Definition: dxbc.c:654
static void shader_write_descriptor_table1(struct root_signature_writer_context *context, const struct vkd3d_shader_root_descriptor_table1 *table)
Definition: dxbc.c:1208
static uint32_t read_u32(const char **ptr)
Definition: dxbc.c:110
static int shader_parse_signature(const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, struct shader_signature *s)
Definition: dxbc.c:368
int vkd3d_shader_serialize_root_signature(const struct vkd3d_shader_versioned_root_signature_desc *root_signature, struct vkd3d_shader_code *dxbc, char **messages)
Definition: dxbc.c:1447
static int shader_parse_root_parameters(struct root_signature_parser_context *context, unsigned int offset, unsigned int count, struct vkd3d_shader_root_parameter *parameters)
Definition: dxbc.c:820
static void shader_write_root_descriptor1(struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_descriptor1 *descriptor)
Definition: dxbc.c:1234
static int shader_parse_static_samplers(struct root_signature_parser_context *context, unsigned int offset, unsigned int count, struct vkd3d_shader_static_sampler_desc *sampler_descs)
Definition: dxbc.c:916
static int shdr_handler(const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *context)
Definition: dxbc.c:505
static int shader_parse_root_descriptor1(struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_descriptor1 *descriptor)
Definition: dxbc.c:796
static void compute_dxbc_checksum(const void *dxbc, size_t size, uint32_t checksum[4])
Definition: dxbc.c:25
void vkd3d_shader_free_dxbc(struct vkd3d_shader_dxbc_desc *dxbc)
Definition: dxbc.c:290
static void shader_validate_root_descriptor1(const struct vkd3d_shader_root_descriptor1 *descriptor)
Definition: dxbc.c:785
static enum vkd3d_shader_sysval_semantic map_fragment_output_sysval(const char *name)
Definition: dxbc.c:350
static void shader_write_root_descriptor(struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_descriptor *descriptor)
Definition: dxbc.c:1227
static void skip_dword_unknown(const char **ptr, unsigned int count)
Definition: dxbc.c:130
static enum vkd3d_shader_root_parameter_type versioned_root_signature_get_parameter_type(const struct vkd3d_shader_versioned_root_signature_desc *desc, unsigned int i)
Definition: dxbc.c:1077
static void shader_write_root_signature_header(struct root_signature_writer_context *context)
Definition: dxbc.c:1145
static int shader_write_root_signature(struct root_signature_writer_context *context, const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1317
int shader_parse_input_signature(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context, struct shader_signature *signature)
Definition: dxbc.c:493
static int for_each_dxbc_section(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context, const char *source_name, int(*section_handler)(const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *ctx), void *ctx)
Definition: dxbc.c:297
static int convert_root_signature_to_v1_0(struct vkd3d_shader_versioned_root_signature_desc *dst, const struct vkd3d_shader_versioned_root_signature_desc *src)
Definition: dxbc.c:1594
static int convert_root_signature_to_v1_1(struct vkd3d_shader_versioned_root_signature_desc *dst, const struct vkd3d_shader_versioned_root_signature_desc *src)
Definition: dxbc.c:1715
static int shader_parse_root_parameters1(struct root_signature_parser_context *context, uint32_t offset, unsigned int count, struct vkd3d_shader_root_parameter1 *parameters)
Definition: dxbc.c:868
static int convert_root_parameters_to_v_1_0(struct vkd3d_shader_root_parameter *dst, const struct vkd3d_shader_root_parameter1 *src, unsigned int count)
Definition: dxbc.c:1532
static float read_float(const char **ptr)
Definition: dxbc.c:118
static const struct vkd3d_shader_static_sampler_desc * versioned_root_signature_get_static_samplers(const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1113
int vkd3d_shader_parse_dxbc(const struct vkd3d_shader_code *dxbc, uint32_t flags, struct vkd3d_shader_dxbc_desc *desc, char **messages)
Definition: dxbc.c:320
static unsigned int versioned_root_signature_get_static_sampler_count(const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1104
static int shader_parse_descriptor_table1(struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_descriptor_table1 *table)
Definition: dxbc.c:715
static int shader_parse_descriptor_table(struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_descriptor_table *table)
Definition: dxbc.c:688
void dxbc_writer_init(struct dxbc_writer *dxbc)
Definition: dxbc.c:36
void free_dxbc_shader_desc(struct dxbc_shader_desc *desc)
Definition: dxbc.c:573
static void shader_validate_descriptor_range1(const struct vkd3d_shader_descriptor_range1 *range)
Definition: dxbc.c:641
static void shader_write_descriptor_ranges1(struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_descriptor_table1 *table)
Definition: dxbc.c:1180
void dxbc_writer_add_section(struct dxbc_writer *dxbc, uint32_t tag, const void *data, size_t size)
Definition: dxbc.c:41
static int shader_parse_root_constants(struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_constants *constants)
Definition: dxbc.c:742
int vkd3d_shader_serialize_dxbc(size_t section_count, const struct vkd3d_shader_dxbc_section_desc *sections, struct vkd3d_shader_code *dxbc, char **messages)
Definition: dxbc.c:53
static int shader_parse_descriptor_ranges(struct root_signature_parser_context *context, unsigned int offset, unsigned int count, struct vkd3d_shader_descriptor_range *ranges)
Definition: dxbc.c:610
static void free_descriptor_ranges1(const struct vkd3d_shader_root_parameter1 *parameters, unsigned int count)
Definition: dxbc.c:1635
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble s
Definition: gl.h:2039
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLuint * samplers
Definition: glext.h:7280
GLenum src
Definition: glext.h:6340
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLenum GLint GLuint mask
Definition: glext.h:6028
GLenum GLenum dst
Definition: glext.h:6340
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define d
Definition: ke_i.h:81
#define e
Definition: ke_i.h:82
#define f
Definition: ke_i.h:83
#define debugstr_a
Definition: kernel32.h:31
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
constants
Definition: resource.c:30
struct section sections[2]
Definition: diskspace.c:792
static BYTE parameters[]
Definition: asn.c:558
#define uint32_t
Definition: nsiface.idl:61
descriptor
Definition: scsi.h:3997
#define memset(x, y, z)
Definition: compat.h:39
void vkd3d_compute_md5(const void *data, size_t size, uint32_t checksum[4], enum vkd3d_md5_variant variant)
Definition: checksum.c:305
#define TAG_ISG1
Definition: shader_sm4.c:1841
#define TAG_AON9
Definition: shader_sm4.c:1840
#define TAG_OSG1
Definition: shader_sm4.c:1843
#define TAG_PSG1
Definition: shader_sm4.c:1847
#define TRACE(s)
Definition: solgame.cpp:4
Definition: http.c:7252
struct vkd3d_shader_dxbc_section_desc sections[DXBC_MAX_SECTION_COUNT]
unsigned int section_count
Definition: filter.c:165
Definition: name.c:39
unsigned int data_size
Definition: dxbc.c:607
struct vkd3d_shader_message_context message_context
Definition: dxbc.c:1132
Definition: parser.c:56
struct signature_element * elements
enum vkd3d_shader_minimum_precision min_precision
enum vkd3d_shader_sysval_semantic sysval_semantic
Definition: ecma_167.h:138
const void * code
Definition: vkd3d_shader.h:413
enum vkd3d_shader_descriptor_range_flags flags
enum vkd3d_shader_descriptor_type range_type
enum vkd3d_shader_descriptor_type range_type
struct vkd3d_shader_dxbc_section_desc * sections
const struct vkd3d_shader_descriptor_range1 * descriptor_ranges
const struct vkd3d_shader_descriptor_range * descriptor_ranges
struct vkd3d_shader_root_descriptor_table1 descriptor_table
struct vkd3d_shader_root_descriptor1 descriptor
enum vkd3d_shader_root_parameter_type parameter_type
struct vkd3d_shader_root_constants constants
enum vkd3d_shader_visibility shader_visibility
union vkd3d_shader_root_parameter1::@5988 u
enum vkd3d_shader_root_parameter_type parameter_type
enum vkd3d_shader_root_signature_flags flags
const struct vkd3d_shader_static_sampler_desc * static_samplers
const struct vkd3d_shader_root_parameter1 * parameters
const struct vkd3d_shader_root_parameter * parameters
const struct vkd3d_shader_static_sampler_desc * static_samplers
enum vkd3d_shader_root_signature_flags flags
enum vkd3d_shader_comparison_func comparison_func
enum vkd3d_shader_texture_address_mode address_u
enum vkd3d_shader_texture_address_mode address_v
enum vkd3d_shader_filter filter
enum vkd3d_shader_static_border_colour border_colour
enum vkd3d_shader_visibility shader_visibility
enum vkd3d_shader_texture_address_mode address_w
enum vkd3d_shader_root_signature_version version
#define TAG_RTS0
Definition: vkd3d_common.h:80
#define VKD3D_ASSERT(cond)
Definition: vkd3d_common.h:49
static int ascii_strcasecmp(const char *a, const char *b)
Definition: vkd3d_common.h:437
#define STATIC_ASSERT(e)
Definition: vkd3d_common.h:47
#define TAG_DXIL
Definition: vkd3d_common.h:69
static void * vkd3d_calloc(size_t count, size_t size)
Definition: vkd3d_memory.h:43
static char * vkd3d_strdup(const char *string)
Definition: vkd3d_memory.h:57
static void vkd3d_free(void *ptr)
Definition: vkd3d_memory.h:52
vkd3d_shader_root_parameter_type
@ VKD3D_SHADER_ROOT_PARAMETER_TYPE_SRV
@ VKD3D_SHADER_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE
@ VKD3D_SHADER_ROOT_PARAMETER_TYPE_CBV
@ VKD3D_SHADER_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS
@ VKD3D_SHADER_ROOT_PARAMETER_TYPE_UAV
vkd3d_shader_sysval_semantic
@ VKD3D_SHADER_SV_DEPTH_LESS_EQUAL
@ VKD3D_SHADER_SV_COVERAGE
@ VKD3D_SHADER_SV_DEPTH
@ VKD3D_SHADER_SV_TARGET
@ VKD3D_SHADER_SV_NONE
@ VKD3D_SHADER_SV_DEPTH_GREATER_EQUAL
@ VKD3D_SHADER_SV_STENCIL_REF
@ VKD3D_SHADER_PARSE_DXBC_IGNORE_CHECKSUM
Definition: vkd3d_shader.h:259
@ VKD3D_SHADER_LOG_INFO
vkd3d_shader_visibility
Definition: vkd3d_shader.h:383
@ VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
Definition: vkd3d_shader.h:430
@ VKD3D_SHADER_DESCRIPTOR_TYPE_CBV
Definition: vkd3d_shader.h:435
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER
Definition: vkd3d_shader.h:440
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SRV
Definition: vkd3d_shader.h:425
@ VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_DATA_STATIC
@ VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_NONE
@ VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE
@ VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_DATA_VOLATILE
@ VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE
@ VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS
@ VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE
@ VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DATA_STATIC
@ VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_NONE
@ VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE
vkd3d_shader_root_signature_version
@ VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_1
@ VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_0
@ VKD3D_SHADER_MINIMUM_PRECISION_NONE
VKD3D_SHADER_API void vkd3d_shader_free_root_signature(struct vkd3d_shader_versioned_root_signature_desc *root_signature)
void vkd3d_shader_message_context_cleanup(struct vkd3d_shader_message_context *context)
bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context, char **out)
size_t bytecode_align(struct vkd3d_bytecode_buffer *buffer)
void vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context, enum vkd3d_shader_log_level log_level)
void shader_signature_cleanup(struct shader_signature *signature)
void set_u32(struct vkd3d_bytecode_buffer *buffer, size_t offset, uint32_t value)
size_t bytecode_put_bytes(struct vkd3d_bytecode_buffer *buffer, const void *bytes, size_t size)
@ VKD3DSIM_NONE
vkd3d_shader_error
@ VKD3D_SHADER_ERROR_DXBC_INVALID_CHUNK_OFFSET
@ VKD3D_SHADER_ERROR_DXBC_OUT_OF_MEMORY
@ VKD3D_SHADER_ERROR_DXBC_INVALID_SIZE
@ VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY
@ VKD3D_SHADER_ERROR_RS_MIXED_DESCRIPTOR_RANGE_TYPES
@ VKD3D_SHADER_ERROR_DXBC_INVALID_MAGIC
@ VKD3D_SHADER_ERROR_DXBC_INVALID_SIGNATURE
@ VKD3D_SHADER_ERROR_RS_INVALID_DESCRIPTOR_RANGE_TYPE
@ VKD3D_SHADER_ERROR_RS_INVALID_ROOT_PARAMETER_TYPE
@ VKD3D_SHADER_ERROR_RS_INVALID_VERSION
@ VKD3D_SHADER_ERROR_DXBC_INVALID_CHUNK_SIZE
@ VKD3D_SHADER_ERROR_DXBC_INVALID_CHECKSUM
@ VKD3D_SHADER_ERROR_DXBC_INVALID_VERSION
#define vkd3d_shader_message_context_trace_messages(context)
static size_t put_f32(struct vkd3d_bytecode_buffer *buffer, float value)
@ VKD3D_MD5_DXBC
#define VKD3D_DXBC_HEADER_SIZE
static size_t bytecode_get_size(struct vkd3d_bytecode_buffer *buffer)
@ VKD3D_ERROR_INVALID_ARGUMENT
Definition: vkd3d_types.h:51
@ VKD3D_OK
Definition: vkd3d_types.h:43
@ VKD3D_ERROR_OUT_OF_MEMORY
Definition: vkd3d_types.h:49
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
static size_t align(size_t addr, size_t alignment)