dusk: no more dependency to Ast type structures from IR

This commit is contained in:
Ali Chraghi 2023-03-27 18:22:07 +03:30 committed by Stephen Gutekanst
parent 059411fa97
commit 0a09a4b118
3 changed files with 121 additions and 15 deletions

View file

@ -650,7 +650,6 @@ pub const InterpolationSample = enum {
};
pub const AddressSpace = enum {
none, // TODO
function,
private,
workgroup,
@ -659,7 +658,6 @@ pub const AddressSpace = enum {
};
pub const AccessMode = enum {
none, // TODO
read,
write,
read_write,

View file

@ -146,16 +146,28 @@ pub fn genGlobalVariable(self: *AstGen, scope: *Scope, node: Ast.Index) !IR.Inst
var_type = try self.genType(scope, gv.type);
}
var addr_space: Ast.AddressSpace = .none;
var addr_space: IR.Inst.GlobalVariableDecl.AddressSpace = .none;
if (gv.access_mode != Ast.null_index) {
const addr_space_loc = self.tree.tokenLoc(gv.addr_space);
addr_space = std.meta.stringToEnum(Ast.AddressSpace, addr_space_loc.slice(self.tree.source)).?;
const ast_addr_space = std.meta.stringToEnum(Ast.AddressSpace, addr_space_loc.slice(self.tree.source)).?;
addr_space = switch (ast_addr_space) {
.function => .function,
.private => .private,
.workgroup => .workgroup,
.uniform => .uniform,
.storage => .storage,
};
}
var access_mode: Ast.AccessMode = .none;
var access_mode: IR.Inst.GlobalVariableDecl.AccessMode = .none;
if (gv.access_mode != Ast.null_index) {
const access_mode_loc = self.tree.tokenLoc(gv.access_mode);
access_mode = std.meta.stringToEnum(Ast.AccessMode, access_mode_loc.slice(self.tree.source)).?;
const ast_access_mode = std.meta.stringToEnum(Ast.AccessMode, access_mode_loc.slice(self.tree.source)).?;
access_mode = switch (ast_access_mode) {
.read => .read,
.write => .write,
.read_write => .read_write,
};
}
const name_index = try self.addString(self.declNameLoc(node).?.slice(self.tree.source));
@ -579,7 +591,26 @@ pub fn genStorageTextureType(self: *AstGen, node: Ast.Index) !IR.Inst.Ref {
std.debug.assert(self.tree.nodeTag(node) == .storage_texture_type);
const texel_format_loc = self.tree.tokenLoc(self.tree.nodeLHS(node));
const texel_format = std.meta.stringToEnum(Ast.TexelFormat, texel_format_loc.slice(self.tree.source)).?;
const ast_texel_format = std.meta.stringToEnum(Ast.TexelFormat, texel_format_loc.slice(self.tree.source)).?;
const texel_format: IR.Inst.StorageTextureType.TexelFormat = switch (ast_texel_format) {
.rgba8unorm => .rgba8unorm,
.rgba8snorm => .rgba8snorm,
.rgba8uint => .rgba8uint,
.rgba8sint => .rgba8sint,
.rgba16uint => .rgba16uint,
.rgba16sint => .rgba16sint,
.rgba16float => .rgba16float,
.r32uint => .r32uint,
.r32sint => .r32sint,
.r32float => .r32float,
.rg32uint => .rg32uint,
.rg32sint => .rg32sint,
.rg32float => .rg32float,
.rgba32uint => .rgba32uint,
.rgba32sint => .rgba32sint,
.rgba32float => .rgba32float,
.bgra8unorm => .bgra8unorm,
};
const access_mode_loc = self.tree.tokenLoc(self.tree.nodeRHS(node));
const access_mode_full = std.meta.stringToEnum(Ast.AccessMode, access_mode_loc.slice(self.tree.source)).?;

View file

@ -205,7 +205,7 @@ pub const Inst = struct {
/// attributes with an expression argument.
attr_expr: AttrExpr,
/// @builtin attribute which accepts a BuiltinValue argument.
attr_builtin: Ast.BuiltinValue,
attr_builtin: BuiltinValue,
/// @workgroup attribute. accepts at laest 1 argument.
attr_workgroup: AttrWorkgroup,
/// @interpolate attribute. accepts 2 arguments.
@ -230,10 +230,26 @@ pub const Inst = struct {
/// index to null-terminated string in `strings`
name: u32,
type: Ref,
addr_space: Ast.AddressSpace = .none,
access_mode: Ast.AccessMode = .none,
addr_space: AddressSpace,
access_mode: AccessMode,
/// length of attributes
attrs: u4 = 0,
pub const AddressSpace = enum {
none,
function,
private,
workgroup,
uniform,
storage,
};
pub const AccessMode = enum {
none,
read,
write,
read_write,
};
};
pub const StructDecl = struct {
@ -250,6 +266,21 @@ pub const Inst = struct {
@"align": u29, // 0 means null
};
pub const BuiltinValue = enum {
vertex_index,
instance_index,
position,
front_facing,
frag_depth,
local_invocation_id,
local_invocation_index,
global_invocation_id,
workgroup_id,
num_workgroups,
sample_index,
sample_mask,
};
pub const AttrSimple = enum {
invariant,
@"const",
@ -279,8 +310,20 @@ pub const Inst = struct {
};
pub const AttrInterpolate = struct {
type: Ast.InterpolationType,
sample: Ast.InterpolationSample,
type: InterpolationType,
sample: InterpolationSample,
pub const InterpolationType = enum {
perspective,
linear,
flat,
};
pub const InterpolationSample = enum {
center,
centroid,
sample,
};
};
pub const VectorType = struct {
@ -305,8 +348,22 @@ pub const Inst = struct {
pub const PointerType = struct {
component_type: Ref,
addr_space: Ast.AddressSpace,
access_mode: Ast.AccessMode,
addr_space: AddressSpace,
access_mode: AccessMode,
pub const AddressSpace = enum {
function,
private,
workgroup,
uniform,
storage,
};
pub const AccessMode = enum {
read,
write,
read_write,
};
};
pub const SampledTextureType = struct {
@ -332,7 +389,7 @@ pub const Inst = struct {
pub const StorageTextureType = struct {
kind: Kind,
texel_format: Ast.TexelFormat,
texel_format: TexelFormat,
access_mode: AccessMode,
pub const Kind = enum {
@ -342,6 +399,26 @@ pub const Inst = struct {
@"3d",
};
pub const TexelFormat = enum {
rgba8unorm,
rgba8snorm,
rgba8uint,
rgba8sint,
rgba16uint,
rgba16sint,
rgba16float,
r32uint,
r32sint,
r32float,
rg32uint,
rg32sint,
rg32float,
rgba32uint,
rgba32sint,
rgba32float,
bgra8unorm,
};
pub const AccessMode = enum { write };
};