From 4d2e831300f1f32da5d51ccc4ab7be48d8f6b9f5 Mon Sep 17 00:00:00 2001 From: Ali Cheraghi Date: Sat, 29 Aug 2026 22:30:18 +0330 Subject: [PATCH] spirv: only Block-decorate elements of descriptor array variables --- src/Sema.zig | 10 +++--- src/codegen/spirv/CodeGen.zig | 19 ++--------- .../callconv_spirv_invalid_options.zig | 34 ++++++------------- 3 files changed, 18 insertions(+), 45 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 4a421d7f4210176e5256f844405011d52650c809..deef97115e3590c4f94e71c47d2b899030bcb7db 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -22732,6 +22732,8 @@ fn checkLogicalPtrCast( const zcu = pt.zcu; const src_info = operand_ty.ptrInfo(zcu); const dest_info = dest_ty.ptrInfo(zcu); + const src_child: Type = .fromInterned(src_info.child); + const dest_child: Type = .fromInterned(dest_info.child); if (block.isComptime() or block.is_typeof) return; switch (zcu.getTarget().os.tag) { @@ -22739,8 +22741,9 @@ fn checkLogicalPtrCast( else => return, } if (src_info.flags.address_space == .physical_storage_buffer) return; + if (!dest_child.hasRuntimeBits(zcu)) return; - var cur: Type = .fromInterned(src_info.child); + var cur = src_child; while (cur.toIntern() != dest_info.child) { cur = switch (cur.zigTypeTag(zcu)) { .array, .vector => cur.childType(zcu), @@ -22755,10 +22758,7 @@ fn checkLogicalPtrCast( } orelse return sema.failWithOwnedErrorMsg(block, msg: { const msg = try sema.errMsg(src, "cannot cast pointer '{f}' to '{f}'", .{ operand_ty.fmt(pt), dest_ty.fmt(pt) }); errdefer msg.destroy(sema.gpa); - try sema.errNote(src, msg, "'{f}' must appear at offset 0 inside '{f}'", .{ - Type.fromInterned(dest_info.child).fmt(pt), - Type.fromInterned(src_info.child).fmt(pt), - }); + try sema.errNote(src, msg, "'{f}' must appear at offset 0 inside '{f}'", .{ dest_child.fmt(pt), src_child.fmt(pt) }); break :msg msg; }); } diff --git a/src/codegen/spirv/CodeGen.zig b/src/codegen/spirv/CodeGen.zig index 574284d5cdd0991210c2f58697805ffe62e1ca1f..db2ffcb30bcea0d4f48f912f6ba13bb991b85da8 100644 --- a/src/codegen/spirv/CodeGen.zig +++ b/src/codegen/spirv/CodeGen.zig @@ -1975,13 +1975,8 @@ fn derivePtr(cg: *CodeGen, derivation: Value.PointerDeriveStep) !Id { const nav_ty_id = try cg.resolveType(nav_ty, .indirect); const decl_ptr_ty_id = try cg.ptrType(nav_ty_id, storage_class); - switch (nav_ty.zigTypeTag(zcu)) { - .@"struct", .@"union" => { - if (cg.needsLayout(nav.resolved.?.@"addrspace", nav_ty)) { - try cg.block_var_ids.put(gpa, spv_decl.result_id, {}); - } - }, - else => {}, + if (cg.needsLayout(nav.resolved.?.@"addrspace", nav_ty)) { + try cg.block_var_ids.put(gpa, spv_decl.result_id, {}); } if (decl_ptr_ty_id == ty_id) return spv_decl.result_id; switch (target.os.tag) { @@ -6764,16 +6759,8 @@ fn ptrElemPtr(cg: *CodeGen, ptr_ty: Type, ptr_id: Id, index_id: Id) !Id { const zcu = cg.zcu; // Construct new pointer type for the resulting pointer const as = ptr_ty.ptrAddressSpace(zcu); - const child_ty = ptr_ty.childType(zcu); const is_single_ptr = ptr_ty.isSinglePointer(zcu); - const elem_is_block = switch (as) { - .uniform, .storage_buffer => switch (child_ty.zigTypeTag(cg.zcu)) { - .array => is_single_ptr, - .spirv => is_single_ptr and child_ty.isSpirvRuntimeArray(cg.zcu), - else => false, - }, - else => false, - }; + const elem_is_block = cg.block_var_ids.contains(ptr_id); const elem_ty_id = try cg.pointeeType(as, ptr_ty.indexableElem(zcu), elem_is_block); const elem_ptr_ty_id = try cg.ptrType(elem_ty_id, cg.storageClass(as)); if (is_single_ptr) { diff --git a/test/cases/compile_errors/callconv_spirv_invalid_options.zig b/test/cases/compile_errors/callconv_spirv_invalid_options.zig index a04646f3c20ccc9387d8aea1c70fd5dbdac951d2..da6deff3239c3515c6f1799bd09775c352aa5b80 100644 --- a/test/cases/compile_errors/callconv_spirv_invalid_options.zig +++ b/test/cases/compile_errors/callconv_spirv_invalid_options.zig @@ -1,29 +1,15 @@ -const F1 = fn () callconv(.{ .spirv_kernel = .{ .x = 0, .y = 1, .z = 1 } }) void; -const F2 = fn () callconv(.{ .spirv_task = .{ .x = 1, .y = 0, .z = 1 } }) void; -const F3 = fn () callconv(.{ .spirv_mesh = .{ .max_vertices = 0 } }) void; -const F4 = fn () callconv(.{ .spirv_fragment = .{ .pixel_centered_integer = true } }) void; -export fn entry1() void { - const a: F1 = undefined; - _ = a; -} -export fn entry2() void { - const a: F2 = undefined; - _ = a; -} -export fn entry3() void { - const a: F3 = undefined; - _ = a; -} -export fn entry4() void { - const a: F4 = undefined; - _ = a; -} +export fn a() callconv(.{ .spirv_kernel = .{ .x = 0, .y = 1, .z = 1 } }) void {} +export fn b() callconv(.{ .spirv_task = .{ .x = 1, .y = 0, .z = 1 } }) void {} +export fn c() callconv(.{ .spirv_mesh = .{ .max_vertices = 0, .x = 1, .y = 1, .z = 1 } }) void {} +export fn d() callconv(.{ .spirv_mesh = .{ .x = 1, .y = 1, .z = 0 } }) void {} +export fn e() callconv(.{ .spirv_fragment = .{ .pixel_centered_integer = true } }) void {} // error // backend=selfhosted // target=spirv32-vulkan // -// :1:28: error: kernel workgroup dimensions must be at least 1 -// :2:28: error: kernel workgroup dimensions must be at least 1 -// :3:28: error: mesh shader 'max_vertices' and 'max_primitives' must be at least 1 -// :4:28: error: 'pixel_centered_integer' is not supported on this target +// :1:25: error: kernel workgroup dimensions must be at least 1 +// :2:25: error: kernel workgroup dimensions must be at least 1 +// :3:25: error: mesh shader 'max_vertices' and 'max_primitives' must be at least 1 +// :4:25: error: mesh shader workgroup dimensions must be at least 1 +// :5:25: error: 'pixel_centered_integer' is not supported on this target -- 2.54.0