Skip to content

Commit 0da4120

Browse files
committed
fix a few more spirv issues
1 parent 6699d9b commit 0da4120

File tree

5 files changed

+50
-11
lines changed

5 files changed

+50
-11
lines changed

src/shady/emit/spirv/emit_spv_instructions.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,12 @@ static const IselTableEntry isel_table[] = {
7979

8080
[neg_op] = {Plain, FirstOp, Same, .fo = {SpvOpSNegate, SpvOpSNegate, SpvOpFNegate }},
8181

82-
[eq_op] = {Plain, FirstOp, Bool, .fo = {SpvOpIEqual, SpvOpIEqual, SpvOpFOrdEqual, SpvOpLogicalEqual }},
83-
[neq_op] = {Plain, FirstOp, Bool, .fo = {SpvOpINotEqual, SpvOpINotEqual, SpvOpFOrdNotEqual, SpvOpLogicalNotEqual }},
84-
[lt_op] = {Plain, FirstOp, Bool, .fo = {SpvOpSLessThan, SpvOpULessThan, SpvOpFOrdLessThan, ISEL_IDENTITY }},
85-
[lte_op] = {Plain, FirstOp, Bool, .fo = {SpvOpSLessThanEqual, SpvOpULessThanEqual, SpvOpFOrdLessThanEqual, ISEL_IDENTITY }},
86-
[gt_op] = {Plain, FirstOp, Bool, .fo = {SpvOpSGreaterThan, SpvOpUGreaterThan, SpvOpFOrdGreaterThan, ISEL_IDENTITY }},
87-
[gte_op] = {Plain, FirstOp, Bool, .fo = {SpvOpSGreaterThanEqual, SpvOpUGreaterThanEqual, SpvOpFOrdGreaterThanEqual, ISEL_IDENTITY }},
82+
[eq_op] = {Plain, FirstOp, Bool, .fo = {SpvOpIEqual, SpvOpIEqual, SpvOpFOrdEqual, SpvOpLogicalEqual, SpvOpPtrEqual }},
83+
[neq_op] = {Plain, FirstOp, Bool, .fo = {SpvOpINotEqual, SpvOpINotEqual, SpvOpFOrdNotEqual, SpvOpLogicalNotEqual, SpvOpPtrNotEqual }},
84+
[lt_op] = {Plain, FirstOp, Bool, .fo = {SpvOpSLessThan, SpvOpULessThan, SpvOpFOrdLessThan, ISEL_ILLEGAL, ISEL_ILLEGAL }},
85+
[lte_op] = {Plain, FirstOp, Bool, .fo = {SpvOpSLessThanEqual, SpvOpULessThanEqual, SpvOpFOrdLessThanEqual, ISEL_ILLEGAL, ISEL_ILLEGAL}},
86+
[gt_op] = {Plain, FirstOp, Bool, .fo = {SpvOpSGreaterThan, SpvOpUGreaterThan, SpvOpFOrdGreaterThan, ISEL_ILLEGAL, ISEL_ILLEGAL}},
87+
[gte_op] = {Plain, FirstOp, Bool, .fo = {SpvOpSGreaterThanEqual, SpvOpUGreaterThanEqual, SpvOpFOrdGreaterThanEqual, ISEL_ILLEGAL, ISEL_ILLEGAL }},
8888

8989
[not_op] = {Plain, FirstOp, Same, .fo = {SpvOpNot, SpvOpNot, ISEL_ILLEGAL, SpvOpLogicalNot }},
9090

@@ -109,7 +109,7 @@ static const IselTableEntry isel_table[] = {
109109
{ SpvOpBitcast, ISEL_ILLEGAL, SpvOpBitcast, ISEL_ILLEGAL, SpvOpConvertUToPtr },
110110
{ SpvOpBitcast, SpvOpBitcast, ISEL_IDENTITY, ISEL_ILLEGAL, ISEL_ILLEGAL /* no fp-ptr casts */ },
111111
{ ISEL_ILLEGAL, ISEL_ILLEGAL, ISEL_ILLEGAL, ISEL_IDENTITY, ISEL_ILLEGAL /* no bool reinterpret */ },
112-
{ SpvOpConvertPtrToU, SpvOpConvertPtrToU, ISEL_ILLEGAL, ISEL_ILLEGAL, ISEL_IDENTITY }
112+
{ SpvOpConvertPtrToU, SpvOpConvertPtrToU, ISEL_ILLEGAL, ISEL_ILLEGAL, ISEL_CUSTOM }
113113
}},
114114

115115
[sqrt_op] = { Plain, Monomorphic, Same, .extended_set = "GLSL.std.450", .op = (SpvOp) GLSLstd450Sqrt },
@@ -195,7 +195,8 @@ static void emit_primop(Emitter* emitter, FnBuilder fn_builder, BBBuilder bb_bui
195195
Nodes results_ts = unwrap_multiple_yield_types(emitter->arena, instr->type);
196196
SpvId result_t = results_ts.count >= 1 ? emit_type(emitter, instr->type) : emitter->void_t;
197197

198-
assert(opcode != SpvOpMax);
198+
if (opcode == SpvOpMax)
199+
goto custom;
199200

200201
if (entry.extended_set) {
201202
SpvId set_id = get_extended_instruction_set(emitter, entry.extended_set);
@@ -215,7 +216,17 @@ static void emit_primop(Emitter* emitter, FnBuilder fn_builder, BBBuilder bb_bui
215216

216217
return;
217218
}
219+
220+
custom:
218221
switch (the_op.op) {
222+
case reinterpret_op: {
223+
const Type* dst = first(the_op.type_arguments);
224+
const Type* src = get_unqualified_type(first(the_op.operands)->type);
225+
assert(dst->tag == PtrType_TAG && src->tag == PtrType_TAG);
226+
assert(src != dst);
227+
results[0] = spvb_op(bb_builder, SpvOpBitcast, emit_type(emitter, dst), 1, (SpvId[]) {spv_emit_value(emitter, bb_builder, first(the_op.operands)) });
228+
return;
229+
}
219230
case subgroup_ballot_op: {
220231
const Type* i32x4 = pack_type(emitter->arena, (PackType) { .width = 4, .element_type = uint32_type(emitter->arena) });
221232
SpvId scope_subgroup = emit_value(emitter, bb_builder, int32_literal(emitter->arena, SpvScopeSubgroup));

src/shady/emit/spirv/emit_spv_type.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,19 @@ SpvId emit_type(Emitter* emitter, const Type* type) {
144144
new = spvb_float_type(emitter->file_builder, width);
145145
break;
146146
} case PtrType_TAG: {
147-
SpvId pointee = emit_type(emitter, type->payload.ptr_type.pointed_type);
148147
SpvStorageClass sc = emit_addr_space(emitter, type->payload.ptr_type.address_space);
148+
const Type* pointed_type = type->payload.ptr_type.pointed_type;
149+
if (get_maybe_nominal_type_decl(pointed_type) && sc == SpvStorageClassPhysicalStorageBuffer) {
150+
new = spvb_forward_ptr_type(emitter->file_builder, sc);
151+
insert_dict_and_get_result(struct Node*, SpvId, emitter->node_ids, type, new);
152+
SpvId pointee = emit_type(emitter, pointed_type);
153+
spvb_ptr_type_define(emitter->file_builder, new, sc, pointee);
154+
return new;
155+
}
156+
157+
SpvId pointee = emit_type(emitter, pointed_type);
149158
new = spvb_ptr_type(emitter->file_builder, sc, pointee);
159+
150160
//if (is_physical_as(type->payload.ptr_type.address_space) && type->payload.ptr_type.pointed_type->tag == ArrType_TAG) {
151161
// TypeMemLayout elem_mem_layout = get_mem_layout(emitter->arena, type->payload.ptr_type.pointed_type);
152162
// spvb_decorate(emitter->file_builder, new, SpvDecorationArrayStride, 1, (uint32_t[]) {elem_mem_layout.size_in_bytes});
@@ -193,8 +203,9 @@ SpvId emit_type(Emitter* emitter, const Type* type) {
193203
break;
194204
}
195205
new = spvb_fresh_id(emitter->file_builder);
206+
insert_dict_and_get_result(struct Node*, SpvId, emitter->node_ids, type, new);
196207
emit_nominal_type_body(emitter, type, new);
197-
break;
208+
return new;
198209
}
199210
case Type_TypeDeclRef_TAG: {
200211
new = emit_decl(emitter, type->payload.type_decl_ref.decl);

src/shady/emit/spirv/spirv_builder.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,21 @@ SpvId spvb_ptr_type(SpvbFileBuilder* file_builder, SpvStorageClass storage_class
349349
return id;
350350
}
351351

352+
SpvId spvb_forward_ptr_type(SpvbFileBuilder* file_builder, SpvStorageClass storage_class) {
353+
op(SpvOpTypeForwardPointer, 3);
354+
SpvId id = spvb_fresh_id(file_builder);
355+
ref_id(id);
356+
literal_int(storage_class);
357+
return id;
358+
}
359+
360+
void spvb_ptr_type_define(SpvbFileBuilder* file_builder, SpvId id, SpvStorageClass storage_class, SpvId element_type) {
361+
op(SpvOpTypePointer, 4);
362+
ref_id(id);
363+
literal_int(storage_class);
364+
ref_id(element_type);
365+
}
366+
352367
SpvId spvb_array_type(SpvbFileBuilder* file_builder, SpvId element_type, SpvId dim) {
353368
op(SpvOpTypeArray, 4);
354369
SpvId id = spvb_fresh_id(file_builder);

src/shady/emit/spirv/spirv_builder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ SpvId spvb_void_type(SpvbFileBuilder*);
4444
SpvId spvb_bool_type(SpvbFileBuilder*);
4545
SpvId spvb_int_type(SpvbFileBuilder*, int width, bool signed_);
4646
SpvId spvb_float_type(SpvbFileBuilder*, int width);
47+
SpvId spvb_forward_ptr_type(SpvbFileBuilder*, SpvStorageClass storage_class);
48+
void spvb_ptr_type_define(SpvbFileBuilder*, SpvId id, SpvStorageClass storage_class, SpvId element_type);
4749
SpvId spvb_ptr_type(SpvbFileBuilder*, SpvStorageClass storage_class, SpvId element_type);
4850
SpvId spvb_array_type(SpvbFileBuilder*, SpvId element_type, SpvId dim);
4951
SpvId spvb_runtime_array_type(SpvbFileBuilder*, SpvId element_type);

src/shady/type.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ const Type* check_type_ptr_type(IrArena* arena, PtrType ptr_type) {
410410
const Node* maybe_record_type = ptr_type.pointed_type;
411411
if (maybe_record_type->tag == TypeDeclRef_TAG)
412412
maybe_record_type = get_nominal_type_body(maybe_record_type);
413-
if (maybe_record_type->tag == RecordType_TAG && maybe_record_type->payload.record_type.special == DecorateBlock) {
413+
if (maybe_record_type && maybe_record_type->tag == RecordType_TAG && maybe_record_type->payload.record_type.special == DecorateBlock) {
414414
return NULL;
415415
}
416416
assert(is_data_type(ptr_type.pointed_type));

0 commit comments

Comments
 (0)