2 #include "codegen/nv50_ir_driver.h"
3 #include "codegen/nv50_ir.h"
4 #include "codegen/nv50_ir_target.h"
5 #include "nv50_ir_driver.h"
6 #include "tgsi/tgsi_parse.h"
7 #include "compiler/nir/nir_serialize.h"
22 nv50_ir_prog_info_out_serialize(struct blob
*blob
,
23 struct nv50_ir_prog_info_out
*info_out
)
25 blob_write_uint16(blob
, info_out
->target
);
26 blob_write_uint8(blob
, info_out
->type
);
27 blob_write_uint8(blob
, info_out
->numPatchConstants
);
29 blob_write_uint16(blob
, info_out
->bin
.maxGPR
);
30 blob_write_uint32(blob
, info_out
->bin
.tlsSpace
);
31 blob_write_uint32(blob
, info_out
->bin
.smemSize
);
32 blob_write_uint32(blob
, info_out
->bin
.codeSize
);
33 blob_write_bytes(blob
, info_out
->bin
.code
, info_out
->bin
.codeSize
);
34 blob_write_uint32(blob
, info_out
->bin
.instructions
);
36 if (!info_out
->bin
.relocData
) {
37 blob_write_uint32(blob
, 0); // reloc count 0
39 nv50_ir::RelocInfo
*reloc
= (nv50_ir::RelocInfo
*)info_out
->bin
.relocData
;
40 blob_write_uint32(blob
, reloc
->count
);
41 blob_write_uint32(blob
, reloc
->codePos
);
42 blob_write_uint32(blob
, reloc
->libPos
);
43 blob_write_uint32(blob
, reloc
->dataPos
);
44 blob_write_bytes(blob
, reloc
->entry
, sizeof(*reloc
->entry
) * reloc
->count
);
47 if (!info_out
->bin
.fixupData
) {
48 blob_write_uint32(blob
, 0); // fixup count 0
50 nv50_ir::FixupInfo
*fixup
= (nv50_ir::FixupInfo
*)info_out
->bin
.fixupData
;
51 blob_write_uint32(blob
, fixup
->count
);
53 /* Going through each entry */
54 for (uint32_t i
= 0; i
< fixup
->count
; i
++) {
55 blob_write_uint32(blob
, fixup
->entry
[i
].val
);
56 assert(fixup
->entry
[i
].apply
);
57 /* Compare function pointers, for when at serializing
58 * to know which function to apply */
59 if (fixup
->entry
[i
].apply
== nv50_ir::nv50_interpApply
)
60 blob_write_uint8(blob
, APPLY_NV50
);
61 else if (fixup
->entry
[i
].apply
== nv50_ir::nvc0_interpApply
)
62 blob_write_uint8(blob
, APPLY_NVC0
);
63 else if (fixup
->entry
[i
].apply
== nv50_ir::gk110_interpApply
)
64 blob_write_uint8(blob
, APPLY_GK110
);
65 else if (fixup
->entry
[i
].apply
== nv50_ir::gm107_interpApply
)
66 blob_write_uint8(blob
, APPLY_GM107
);
67 else if (fixup
->entry
[i
].apply
== nv50_ir::gv100_interpApply
)
68 blob_write_uint8(blob
, APPLY_GV100
);
69 else if (fixup
->entry
[i
].apply
== nv50_ir::nvc0_selpFlip
)
70 blob_write_uint8(blob
, FLIP_NVC0
);
71 else if (fixup
->entry
[i
].apply
== nv50_ir::gk110_selpFlip
)
72 blob_write_uint8(blob
, FLIP_GK110
);
73 else if (fixup
->entry
[i
].apply
== nv50_ir::gm107_selpFlip
)
74 blob_write_uint8(blob
, FLIP_GM107
);
75 else if (fixup
->entry
[i
].apply
== nv50_ir::gv100_selpFlip
)
76 blob_write_uint8(blob
, FLIP_GV100
);
78 ERROR("unhandled fixup apply function pointer\n");
85 blob_write_uint8(blob
, info_out
->numInputs
);
86 blob_write_uint8(blob
, info_out
->numOutputs
);
87 blob_write_uint8(blob
, info_out
->numSysVals
);
88 blob_write_bytes(blob
, info_out
->sv
, info_out
->numSysVals
* sizeof(info_out
->sv
[0]));
89 blob_write_bytes(blob
, info_out
->in
, info_out
->numInputs
* sizeof(info_out
->in
[0]));
90 blob_write_bytes(blob
, info_out
->out
, info_out
->numOutputs
* sizeof(info_out
->out
[0]));
92 switch(info_out
->type
) {
93 case PIPE_SHADER_VERTEX
:
94 blob_write_bytes(blob
, &info_out
->prop
.vp
, sizeof(info_out
->prop
.vp
));
96 case PIPE_SHADER_TESS_CTRL
:
97 case PIPE_SHADER_TESS_EVAL
:
98 blob_write_bytes(blob
, &info_out
->prop
.tp
, sizeof(info_out
->prop
.tp
));
100 case PIPE_SHADER_GEOMETRY
:
101 blob_write_bytes(blob
, &info_out
->prop
.gp
, sizeof(info_out
->prop
.gp
));
103 case PIPE_SHADER_FRAGMENT
:
104 blob_write_bytes(blob
, &info_out
->prop
.fp
, sizeof(info_out
->prop
.fp
));
109 blob_write_bytes(blob
, &info_out
->io
, sizeof(info_out
->io
));
110 blob_write_uint8(blob
, info_out
->numBarriers
);
116 nv50_ir_prog_info_out_deserialize(void *data
, size_t size
, size_t offset
,
117 struct nv50_ir_prog_info_out
*info_out
)
119 struct blob_reader reader
;
120 blob_reader_init(&reader
, data
, size
);
121 blob_skip_bytes(&reader
, offset
);
123 info_out
->target
= blob_read_uint16(&reader
);
124 info_out
->type
= blob_read_uint8(&reader
);
125 info_out
->numPatchConstants
= blob_read_uint8(&reader
);
127 info_out
->bin
.maxGPR
= blob_read_uint16(&reader
);
128 info_out
->bin
.tlsSpace
= blob_read_uint32(&reader
);
129 info_out
->bin
.smemSize
= blob_read_uint32(&reader
);
130 info_out
->bin
.codeSize
= blob_read_uint32(&reader
);
131 info_out
->bin
.code
= (uint32_t *)MALLOC(info_out
->bin
.codeSize
);
132 blob_copy_bytes(&reader
, info_out
->bin
.code
, info_out
->bin
.codeSize
);
133 info_out
->bin
.instructions
= blob_read_uint32(&reader
);
135 info_out
->bin
.relocData
= NULL
;
136 /* Check if data contains RelocInfo */
137 uint32_t count
= blob_read_uint32(&reader
);
139 nv50_ir::RelocInfo
*reloc
=
140 CALLOC_VARIANT_LENGTH_STRUCT(nv50_ir::RelocInfo
,
141 count
* sizeof(*reloc
->entry
));
142 reloc
->codePos
= blob_read_uint32(&reader
);
143 reloc
->libPos
= blob_read_uint32(&reader
);
144 reloc
->dataPos
= blob_read_uint32(&reader
);
145 reloc
->count
= count
;
147 blob_copy_bytes(&reader
, reloc
->entry
, sizeof(*reloc
->entry
) * reloc
->count
);
148 info_out
->bin
.relocData
= reloc
;
151 info_out
->bin
.fixupData
= NULL
;
152 /* Check if data contains FixupInfo */
153 count
= blob_read_uint32(&reader
);
155 nv50_ir::FixupInfo
*fixup
=
156 CALLOC_VARIANT_LENGTH_STRUCT(nv50_ir::FixupInfo
,
157 count
* sizeof(*fixup
->entry
));
158 fixup
->count
= count
;
160 for (uint32_t i
= 0; i
< count
; i
++) {
161 fixup
->entry
[i
].val
= blob_read_uint32(&reader
);
163 /* Assign back function pointer depending on stored enum */
164 enum FixupApplyFunc apply
= (enum FixupApplyFunc
)blob_read_uint8(&reader
);
167 fixup
->entry
[i
].apply
= nv50_ir::nv50_interpApply
;
170 fixup
->entry
[i
].apply
= nv50_ir::nvc0_interpApply
;
173 fixup
->entry
[i
].apply
= nv50_ir::gk110_interpApply
;
176 fixup
->entry
[i
].apply
= nv50_ir::gm107_interpApply
;
179 fixup
->entry
[i
].apply
= nv50_ir::gv100_interpApply
;
182 fixup
->entry
[i
].apply
= nv50_ir::nvc0_selpFlip
;
185 fixup
->entry
[i
].apply
= nv50_ir::gk110_selpFlip
;
188 fixup
->entry
[i
].apply
= nv50_ir::gm107_selpFlip
;
191 fixup
->entry
[i
].apply
= nv50_ir::gv100_selpFlip
;
194 ERROR("unhandled fixup apply function switch case");
199 info_out
->bin
.fixupData
= fixup
;
202 info_out
->numInputs
= blob_read_uint8(&reader
);
203 info_out
->numOutputs
= blob_read_uint8(&reader
);
204 info_out
->numSysVals
= blob_read_uint8(&reader
);
205 blob_copy_bytes(&reader
, info_out
->sv
, info_out
->numSysVals
* sizeof(info_out
->sv
[0]));
206 blob_copy_bytes(&reader
, info_out
->in
, info_out
->numInputs
* sizeof(info_out
->in
[0]));
207 blob_copy_bytes(&reader
, info_out
->out
, info_out
->numOutputs
* sizeof(info_out
->out
[0]));
209 switch(info_out
->type
) {
210 case PIPE_SHADER_VERTEX
:
211 blob_copy_bytes(&reader
, &info_out
->prop
.vp
, sizeof(info_out
->prop
.vp
));
213 case PIPE_SHADER_TESS_CTRL
:
214 case PIPE_SHADER_TESS_EVAL
:
215 blob_copy_bytes(&reader
, &info_out
->prop
.tp
, sizeof(info_out
->prop
.tp
));
217 case PIPE_SHADER_GEOMETRY
:
218 blob_copy_bytes(&reader
, &info_out
->prop
.gp
, sizeof(info_out
->prop
.gp
));
220 case PIPE_SHADER_FRAGMENT
:
221 blob_copy_bytes(&reader
, &info_out
->prop
.fp
, sizeof(info_out
->prop
.fp
));
226 blob_copy_bytes(&reader
, &(info_out
->io
), sizeof(info_out
->io
));
227 info_out
->numBarriers
= blob_read_uint8(&reader
);