• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © Microsoft 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 DEALINGS
21  * IN THE SOFTWARE.
22  */
23 
24 #include "dxil_buffer.h"
25 #include <assert.h>
26 #include <stdio.h>
27 
28 static void
init()29 init()
30 {
31    struct dxil_buffer buf;
32    dxil_buffer_init(&buf, 2);
33    assert(!buf.buf);
34    assert(!buf.buf_bits);
35 }
36 
37 static void
assert_blob_data(const struct dxil_buffer * m,const uint8_t * data,size_t len)38 assert_blob_data(const struct dxil_buffer *m, const uint8_t *data,
39                    size_t len)
40 {
41    if (m->blob.size != len) {
42       fprintf(stderr, "blob-size mismatch, expected %zd, got %zd",
43                       len, m->blob.size);
44       abort();
45    }
46 
47    for (size_t i = 0; i < len; ++i) {
48       if (m->blob.data[i] != data[i]) {
49          fprintf(stderr, "blob-data mismatch at index %zd, "
50                          "expected 0x%02x, got 0x%02x", i,
51                          data[i], m->blob.data[i]);
52          abort();
53       }
54    }
55 }
56 
57 #define ASSERT_BLOB_DATA(m, data) \
58    assert_blob_data(m, data, sizeof(data))
59 
60 static void
align()61 align()
62 {
63    struct dxil_buffer buf;
64    dxil_buffer_init(&buf, 2);
65    assert_blob_data(&buf, NULL, 0);
66 
67    dxil_buffer_init(&buf, 2);
68    dxil_buffer_emit_bits(&buf, 0xbeef, 16);
69    dxil_buffer_align(&buf);
70    assert(!buf.buf);
71    assert(!buf.buf_bits);
72    uint8_t expected0[] = { 0xef, 0xbe, 0x00, 0x00 };
73    ASSERT_BLOB_DATA(&buf, expected0);
74    dxil_buffer_align(&buf);
75    ASSERT_BLOB_DATA(&buf, expected0);
76 }
77 
78 static void
emit_bits()79 emit_bits()
80 {
81    struct dxil_buffer buf;
82    dxil_buffer_init(&buf, 2);
83    dxil_buffer_emit_bits(&buf, 0xbeef, 16);
84    dxil_buffer_align(&buf);
85    assert(!buf.buf);
86    assert(!buf.buf_bits);
87    uint8_t expected0[] = { 0xef, 0xbe, 0x00, 0x00 };
88    ASSERT_BLOB_DATA(&buf, expected0);
89 
90    dxil_buffer_init(&buf, 2);
91    dxil_buffer_emit_bits(&buf, 0xdead, 16);
92    dxil_buffer_emit_bits(&buf, 0xbeef, 16);
93    assert(!buf.buf);
94    assert(!buf.buf_bits);
95    uint8_t expected1[] = { 0xad, 0xde, 0xef, 0xbe };
96    ASSERT_BLOB_DATA(&buf, expected1);
97 
98    dxil_buffer_init(&buf, 2);
99    dxil_buffer_emit_bits(&buf, 0x1111111, 28);
100    dxil_buffer_emit_bits(&buf, 0x22222222, 32);
101    dxil_buffer_align(&buf);
102    uint8_t expected2[] = { 0x11, 0x11, 0x11, 0x21, 0x22, 0x22, 0x22, 0x02 };
103    ASSERT_BLOB_DATA(&buf, expected2);
104 }
105 
106 static void
emit_vbr_bits()107 emit_vbr_bits()
108 {
109    struct dxil_buffer buf;
110    dxil_buffer_init(&buf, 2);
111    dxil_buffer_emit_vbr_bits(&buf, 0x1a, 8);
112    dxil_buffer_emit_vbr_bits(&buf, 0x1a, 6);
113    dxil_buffer_emit_vbr_bits(&buf, 0x00, 2);
114    dxil_buffer_emit_vbr_bits(&buf, 0x0a, 4);
115    dxil_buffer_emit_vbr_bits(&buf, 0x04, 2);
116    dxil_buffer_emit_vbr_bits(&buf, 0x00, 2);
117    uint8_t expected[] = { 0x1a, 0x1a, 0x1a, 0x1a };
118    ASSERT_BLOB_DATA(&buf, expected);
119 }
120 
121 int
main()122 main()
123 {
124    init();
125    align();
126    emit_bits();
127    emit_vbr_bits();
128    return 0;
129 }
130