authorgravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2026-08-29 22:30:18+03:30
committergravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2026-08-29 22:30:18+03:30
log4d2e831300f1f32da5d51ccc4ab7be48d8f6b9f5
treee90746eeb5d384dc8001d33699479fb0beee9939
parente2669015901e52069a9fdc82bb44e21119dcceab

spirv: only Block-decorate elements of descriptor array variables


3 files changed, 18 insertions(+), 45 deletions(-)

src/Sema.zig+5-5
......@@ -22732,6 +22732,8 @@ fn checkLogicalPtrCast(
2273222732 const zcu = pt.zcu;
2273322733 const src_info = operand_ty.ptrInfo(zcu);
2273422734 const dest_info = dest_ty.ptrInfo(zcu);
22735 const src_child: Type = .fromInterned(src_info.child);
22736 const dest_child: Type = .fromInterned(dest_info.child);
2273522737
2273622738 if (block.isComptime() or block.is_typeof) return;
2273722739 switch (zcu.getTarget().os.tag) {
......@@ -22739,8 +22741,9 @@ fn checkLogicalPtrCast(
2273922741 else => return,
2274022742 }
2274122743 if (src_info.flags.address_space == .physical_storage_buffer) return;
22744 if (!dest_child.hasRuntimeBits(zcu)) return;
2274222745
22743 var cur: Type = .fromInterned(src_info.child);
22746 var cur = src_child;
2274422747 while (cur.toIntern() != dest_info.child) {
2274522748 cur = switch (cur.zigTypeTag(zcu)) {
2274622749 .array, .vector => cur.childType(zcu),
......@@ -22755,10 +22758,7 @@ fn checkLogicalPtrCast(
2275522758 } orelse return sema.failWithOwnedErrorMsg(block, msg: {
2275622759 const msg = try sema.errMsg(src, "cannot cast pointer '{f}' to '{f}'", .{ operand_ty.fmt(pt), dest_ty.fmt(pt) });
2275722760 errdefer msg.destroy(sema.gpa);
22758 try sema.errNote(src, msg, "'{f}' must appear at offset 0 inside '{f}'", .{
22759 Type.fromInterned(dest_info.child).fmt(pt),
22760 Type.fromInterned(src_info.child).fmt(pt),
22761 });
22761 try sema.errNote(src, msg, "'{f}' must appear at offset 0 inside '{f}'", .{ dest_child.fmt(pt), src_child.fmt(pt) });
2276222762 break :msg msg;
2276322763 });
2276422764 }
src/codegen/spirv/CodeGen.zig+3-16
......@@ -1975,13 +1975,8 @@ fn derivePtr(cg: *CodeGen, derivation: Value.PointerDeriveStep) !Id {
19751975
19761976 const nav_ty_id = try cg.resolveType(nav_ty, .indirect);
19771977 const decl_ptr_ty_id = try cg.ptrType(nav_ty_id, storage_class);
1978 switch (nav_ty.zigTypeTag(zcu)) {
1979 .@"struct", .@"union" => {
1980 if (cg.needsLayout(nav.resolved.?.@"addrspace", nav_ty)) {
1981 try cg.block_var_ids.put(gpa, spv_decl.result_id, {});
1982 }
1983 },
1984 else => {},
1978 if (cg.needsLayout(nav.resolved.?.@"addrspace", nav_ty)) {
1979 try cg.block_var_ids.put(gpa, spv_decl.result_id, {});
19851980 }
19861981 if (decl_ptr_ty_id == ty_id) return spv_decl.result_id;
19871982 switch (target.os.tag) {
......@@ -6764,16 +6759,8 @@ fn ptrElemPtr(cg: *CodeGen, ptr_ty: Type, ptr_id: Id, index_id: Id) !Id {
67646759 const zcu = cg.zcu;
67656760 // Construct new pointer type for the resulting pointer
67666761 const as = ptr_ty.ptrAddressSpace(zcu);
6767 const child_ty = ptr_ty.childType(zcu);
67686762 const is_single_ptr = ptr_ty.isSinglePointer(zcu);
6769 const elem_is_block = switch (as) {
6770 .uniform, .storage_buffer => switch (child_ty.zigTypeTag(cg.zcu)) {
6771 .array => is_single_ptr,
6772 .spirv => is_single_ptr and child_ty.isSpirvRuntimeArray(cg.zcu),
6773 else => false,
6774 },
6775 else => false,
6776 };
6763 const elem_is_block = cg.block_var_ids.contains(ptr_id);
67776764 const elem_ty_id = try cg.pointeeType(as, ptr_ty.indexableElem(zcu), elem_is_block);
67786765 const elem_ptr_ty_id = try cg.ptrType(elem_ty_id, cg.storageClass(as));
67796766 if (is_single_ptr) {
test/cases/compile_errors/callconv_spirv_invalid_options.zig+10-24
......@@ -1,29 +1,15 @@
1const F1 = fn () callconv(.{ .spirv_kernel = .{ .x = 0, .y = 1, .z = 1 } }) void;
2const F2 = fn () callconv(.{ .spirv_task = .{ .x = 1, .y = 0, .z = 1 } }) void;
3const F3 = fn () callconv(.{ .spirv_mesh = .{ .max_vertices = 0 } }) void;
4const F4 = fn () callconv(.{ .spirv_fragment = .{ .pixel_centered_integer = true } }) void;
5export fn entry1() void {
6 const a: F1 = undefined;
7 _ = a;
8}
9export fn entry2() void {
10 const a: F2 = undefined;
11 _ = a;
12}
13export fn entry3() void {
14 const a: F3 = undefined;
15 _ = a;
16}
17export fn entry4() void {
18 const a: F4 = undefined;
19 _ = a;
20}
1export fn a() callconv(.{ .spirv_kernel = .{ .x = 0, .y = 1, .z = 1 } }) void {}
2export fn b() callconv(.{ .spirv_task = .{ .x = 1, .y = 0, .z = 1 } }) void {}
3export fn c() callconv(.{ .spirv_mesh = .{ .max_vertices = 0, .x = 1, .y = 1, .z = 1 } }) void {}
4export fn d() callconv(.{ .spirv_mesh = .{ .x = 1, .y = 1, .z = 0 } }) void {}
5export fn e() callconv(.{ .spirv_fragment = .{ .pixel_centered_integer = true } }) void {}
216
227// error
238// backend=selfhosted
249// target=spirv32-vulkan
2510//
26// :1:28: error: kernel workgroup dimensions must be at least 1
27// :2:28: error: kernel workgroup dimensions must be at least 1
28// :3:28: error: mesh shader 'max_vertices' and 'max_primitives' must be at least 1
29// :4:28: error: 'pixel_centered_integer' is not supported on this target
11// :1:25: error: kernel workgroup dimensions must be at least 1
12// :2:25: error: kernel workgroup dimensions must be at least 1
13// :3:25: error: mesh shader 'max_vertices' and 'max_primitives' must be at least 1
14// :4:25: error: mesh shader workgroup dimensions must be at least 1
15// :5:25: error: 'pixel_centered_integer' is not supported on this target