From c0ad349a12270099773fec59c1528bc86015fec6 Mon Sep 17 00:00:00 2001 From: Stephen Gutekanst Date: Sun, 24 Jul 2022 15:05:16 -0700 Subject: [PATCH] gpu: convert Texture from enum(usize) to *opaque Signed-off-by: Stephen Gutekanst --- gpu/src/bind_group_layout.zig | 3 +- gpu/src/dawn.zig | 3 +- gpu/src/render_bundle_encoder.zig | 5 +- gpu/src/swap_chain.zig | 6 +- gpu/src/texture.zig | 363 +++++++++++++++--------------- gpu/src/texture_view.zig | 6 +- gpu/src/types.zig | 13 +- 7 files changed, 202 insertions(+), 197 deletions(-) diff --git a/gpu/src/bind_group_layout.zig b/gpu/src/bind_group_layout.zig index edf89b33..841cd43a 100644 --- a/gpu/src/bind_group_layout.zig +++ b/gpu/src/bind_group_layout.zig @@ -5,6 +5,7 @@ const BufferBindingLayout = @import("buffer.zig").BufferBindingLayout; const Sampler = @import("sampler.zig").Sampler; const SamplerBindingLayout = @import("sampler.zig").SamplerBindingLayout; const Texture = @import("texture.zig").Texture; +const TextureBindingLayout = @import("texture.zig").TextureBindingLayout; const StorageTextureBindingLayout = @import("types.zig").StorageTextureBindingLayout; pub const BindGroupLayout = *opaque {}; @@ -15,7 +16,7 @@ pub const BindGroupLayoutEntry = extern struct { visibility: ShaderStageFlags, buffer: BufferBindingLayout, sampler: SamplerBindingLayout, - texture: Texture.BindingLayout, + texture: TextureBindingLayout, storage_texture: StorageTextureBindingLayout, }; diff --git a/gpu/src/dawn.zig b/gpu/src/dawn.zig index 745d6a55..94adf56a 100644 --- a/gpu/src/dawn.zig +++ b/gpu/src/dawn.zig @@ -1,5 +1,6 @@ const ChainedStruct = @import("types.zig").ChainedStruct; const Texture = @import("texture.zig").Texture; +const TextureUsageFlags = @import("texture.zig").TextureUsageFlags; pub const CacheDeviceDescriptor = extern struct { // TODO: file an issue on Dawn: why not named nextInChain? @@ -21,7 +22,7 @@ pub const InstanceDescriptor = extern struct { pub const TextureInternalUsageDescriptor = extern struct { chain: ChainedStruct, - internal_usage: Texture.UsageFlags, + internal_usage: TextureUsageFlags, }; pub const TogglesDeviceDescriptor = extern struct { diff --git a/gpu/src/render_bundle_encoder.zig b/gpu/src/render_bundle_encoder.zig index 40aa95dc..eda9ed5d 100644 --- a/gpu/src/render_bundle_encoder.zig +++ b/gpu/src/render_bundle_encoder.zig @@ -1,5 +1,6 @@ const ChainedStruct = @import("types.zig").ChainedStruct; const Texture = @import("texture.zig").Texture; +const TextureFormat = @import("texture.zig").TextureFormat; pub const RenderBundleEncoder = *opaque {}; @@ -7,8 +8,8 @@ pub const RenderBundleEncoderDescriptor = extern struct { next_in_chain: *const ChainedStruct, label: ?[*:0]const u8 = null, color_formats_count: u32, - color_formats: [*]const Texture.Format, - depth_stencil_format: Texture.Format, + color_formats: [*]const TextureFormat, + depth_stencil_format: TextureFormat, sample_count: u32, depth_read_only: bool, stencil_read_only: bool, diff --git a/gpu/src/swap_chain.zig b/gpu/src/swap_chain.zig index b59391a0..23042b8a 100644 --- a/gpu/src/swap_chain.zig +++ b/gpu/src/swap_chain.zig @@ -1,14 +1,16 @@ const ChainedStruct = @import("types.zig").ChainedStruct; const PresentMode = @import("types.zig").PresentMode; const Texture = @import("texture.zig").Texture; +const TextureUsageFlags = @import("texture.zig").TextureUsageFlags; +const TextureFormat = @import("texture.zig").TextureFormat; pub const SwapChain = *opaque {}; pub const SwapChainDescriptor = extern struct { next_in_chain: *const ChainedStruct, label: ?[*:0]const u8 = null, - usage: Texture.UsageFlags, - format: Texture.Format, + usage: TextureUsageFlags, + format: TextureFormat, width: u32, height: u32, present_mode: PresentMode, diff --git a/gpu/src/texture.zig b/gpu/src/texture.zig index 27dcbb4e..253e29e1 100644 --- a/gpu/src/texture.zig +++ b/gpu/src/texture.zig @@ -4,189 +4,184 @@ const TextureView = @import("texture_view.zig").TextureView; const TextureViewDimension = @import("texture_view.zig").TextureViewDimension; const Extent3D = @import("types.zig").Extent3D; -pub const Texture = enum(usize) { - _, +pub const Texture = *opaque {}; - // TODO: verify there is a use case for nullable value of this type. - pub const none: Texture = @intToEnum(Texture, 0); - - pub const Aspect = enum(u32) { - all = 0x00000000, - stencil_only = 0x00000001, - depth_only = 0x00000002, - plane0_only = 0x00000003, - plane1_only = 0x00000004, - }; - - pub const ComponentType = enum(u32) { - float = 0x00000000, - sint = 0x00000001, - uint = 0x00000002, - depth_comparison = 0x00000003, - }; - - pub const Dimension = enum(u32) { - dimension_1d = 0x00000000, - dimension_2d = 0x00000001, - dimension_3d = 0x00000002, - }; - - pub const Format = enum(u32) { - undef = 0x00000000, - r8_unorm = 0x00000001, - r8_snorm = 0x00000002, - r8_uint = 0x00000003, - r8_sint = 0x00000004, - r16_uint = 0x00000005, - r16_sint = 0x00000006, - r16_float = 0x00000007, - rg8_unorm = 0x00000008, - rg8_snorm = 0x00000009, - rg8_uint = 0x0000000a, - rg8_sint = 0x0000000b, - r32_float = 0x0000000c, - r32_uint = 0x0000000d, - r32_sint = 0x0000000e, - rg16_uint = 0x0000000f, - rg16_sint = 0x00000010, - rg16_float = 0x00000011, - rgba8_unorm = 0x00000012, - rgba8_unorm_srgb = 0x00000013, - rgba8_snorm = 0x00000014, - rgba8_uint = 0x00000015, - rgba8_sint = 0x00000016, - bgra8_unorm = 0x00000017, - bgra8_unorm_srgb = 0x00000018, - rgb10_a2_unorm = 0x00000019, - rg11_b10_ufloat = 0x0000001a, - rgb9_e5_ufloat = 0x0000001b, - rg32_float = 0x0000001c, - rg32_uint = 0x0000001d, - rg32_sint = 0x0000001e, - rgba16_uint = 0x0000001f, - rgba16_sint = 0x00000020, - rgba16_float = 0x00000021, - rgba32_float = 0x00000022, - rgba32_uint = 0x00000023, - rgba32_sint = 0x00000024, - stencil8 = 0x00000025, - depth16_unorm = 0x00000026, - depth24_plus = 0x00000027, - depth24_plus_stencil8 = 0x00000028, - depth32_float = 0x00000029, - depth32_float_stencil8 = 0x0000002a, - bc1_rgba_unorm = 0x0000002b, - bc1_rgba_unorm_srgb = 0x0000002c, - bc2_rgba_unorm = 0x0000002d, - bc2_rgba_unorm_srgb = 0x0000002e, - bc3_rgba_unorm = 0x0000002f, - bc3_rgba_unorm_srgb = 0x00000030, - bc4_runorm = 0x00000031, - bc4_rsnorm = 0x00000032, - bc5_rg_unorm = 0x00000033, - bc5_rg_snorm = 0x00000034, - bc6_hrgb_ufloat = 0x00000035, - bc6_hrgb_float = 0x00000036, - bc7_rgba_unorm = 0x00000037, - bc7_rgba_unorm_srgb = 0x00000038, - etc2_rgb8_unorm = 0x00000039, - etc2_rgb8_unorm_srgb = 0x0000003a, - etc2_rgb8_a1_unorm = 0x0000003b, - etc2_rgb8_a1_unorm_srgb = 0x0000003c, - etc2_rgba8_unorm = 0x0000003d, - etc2_rgba8_unorm_srgb = 0x0000003e, - eacr11_unorm = 0x0000003f, - eacr11_snorm = 0x00000040, - eacrg11_unorm = 0x00000041, - eacrg11_snorm = 0x00000042, - astc4x4_unorm = 0x00000043, - astc4x4_unorm_srgb = 0x00000044, - astc5x4_unorm = 0x00000045, - astc5x4_unorm_srgb = 0x00000046, - astc5x5_unorm = 0x00000047, - astc5x5_unorm_srgb = 0x00000048, - astc6x5_unorm = 0x00000049, - astc6x5_unorm_srgb = 0x0000004a, - astc6x6_unorm = 0x0000004b, - astc6x6_unorm_srgb = 0x0000004c, - astc8x5_unorm = 0x0000004d, - astc8x5_unorm_srgb = 0x0000004e, - astc8x6_unorm = 0x0000004f, - astc8x6_unorm_srgb = 0x00000050, - astc8x8_unorm = 0x00000051, - astc8x8_unorm_srgb = 0x00000052, - astc10x5_unorm = 0x00000053, - astc10x5_unorm_srgb = 0x00000054, - astc10x6_unorm = 0x00000055, - astc10x6_unorm_srgb = 0x00000056, - astc10x8_unorm = 0x00000057, - astc10x8_unorm_srgb = 0x00000058, - astc10x10_unorm = 0x00000059, - astc10x10_unorm_srgb = 0x0000005a, - astc12x10_unorm = 0x0000005b, - astc12x10_unorm_srgb = 0x0000005c, - astc12x12_unorm = 0x0000005d, - astc12x12_unorm_srgb = 0x0000005e, - r8_bg8_biplanar420_unorm = 0x0000005f, - }; - - pub const SampleType = enum(u32) { - undef = 0x00000000, - float = 0x00000001, - unfilterable_float = 0x00000002, - depth = 0x00000003, - sint = 0x00000004, - uint = 0x00000005, - }; - - pub const UsageFlags = packed struct { - copy_src: bool = false, - copy_dst: bool = false, - texture_binding: bool = false, - storage_binding: bool = false, - render_attachment: bool = false, - present: bool = false, - - _padding: u26 = 0, - - comptime { - std.debug.assert( - @sizeOf(@This()) == @sizeOf(u32) and - @bitSizeOf(@This()) == @bitSizeOf(u32), - ); - } - - pub const none = UsageFlags{}; - - pub fn equal(a: UsageFlags, b: UsageFlags) bool { - return @truncate(u6, @bitCast(u32, a)) == @truncate(u6, @bitCast(u32, b)); - } - }; - - pub const BindingLayout = extern struct { - next_in_chain: *const ChainedStruct, - sample_type: SampleType, - view_dimension: TextureViewDimension, - multisampled: bool, - }; - - pub const DataLayout = extern struct { - next_in_chain: *const ChainedStruct, - offset: u64, - bytes_per_row: u32, - rows_per_image: u32, - }; - - pub const Descriptor = extern struct { - next_in_chain: *const ChainedStruct, - label: ?[*:0]const u8 = null, - usage: UsageFlags, - dimension: Dimension, - size: Extent3D, - format: Format, - mip_level_count: u32, - sample_count: u32, - view_format_count: u32, - view_formats: [*]const Format, - }; +pub const TextureAspect = enum(u32) { + all = 0x00000000, + stencil_only = 0x00000001, + depth_only = 0x00000002, + plane0_only = 0x00000003, + plane1_only = 0x00000004, +}; + +pub const TextureComponentType = enum(u32) { + float = 0x00000000, + sint = 0x00000001, + uint = 0x00000002, + depth_comparison = 0x00000003, +}; + +pub const TextureDimension = enum(u32) { + dimension_1d = 0x00000000, + dimension_2d = 0x00000001, + dimension_3d = 0x00000002, +}; + +pub const TextureFormat = enum(u32) { + undef = 0x00000000, + r8_unorm = 0x00000001, + r8_snorm = 0x00000002, + r8_uint = 0x00000003, + r8_sint = 0x00000004, + r16_uint = 0x00000005, + r16_sint = 0x00000006, + r16_float = 0x00000007, + rg8_unorm = 0x00000008, + rg8_snorm = 0x00000009, + rg8_uint = 0x0000000a, + rg8_sint = 0x0000000b, + r32_float = 0x0000000c, + r32_uint = 0x0000000d, + r32_sint = 0x0000000e, + rg16_uint = 0x0000000f, + rg16_sint = 0x00000010, + rg16_float = 0x00000011, + rgba8_unorm = 0x00000012, + rgba8_unorm_srgb = 0x00000013, + rgba8_snorm = 0x00000014, + rgba8_uint = 0x00000015, + rgba8_sint = 0x00000016, + bgra8_unorm = 0x00000017, + bgra8_unorm_srgb = 0x00000018, + rgb10_a2_unorm = 0x00000019, + rg11_b10_ufloat = 0x0000001a, + rgb9_e5_ufloat = 0x0000001b, + rg32_float = 0x0000001c, + rg32_uint = 0x0000001d, + rg32_sint = 0x0000001e, + rgba16_uint = 0x0000001f, + rgba16_sint = 0x00000020, + rgba16_float = 0x00000021, + rgba32_float = 0x00000022, + rgba32_uint = 0x00000023, + rgba32_sint = 0x00000024, + stencil8 = 0x00000025, + depth16_unorm = 0x00000026, + depth24_plus = 0x00000027, + depth24_plus_stencil8 = 0x00000028, + depth32_float = 0x00000029, + depth32_float_stencil8 = 0x0000002a, + bc1_rgba_unorm = 0x0000002b, + bc1_rgba_unorm_srgb = 0x0000002c, + bc2_rgba_unorm = 0x0000002d, + bc2_rgba_unorm_srgb = 0x0000002e, + bc3_rgba_unorm = 0x0000002f, + bc3_rgba_unorm_srgb = 0x00000030, + bc4_runorm = 0x00000031, + bc4_rsnorm = 0x00000032, + bc5_rg_unorm = 0x00000033, + bc5_rg_snorm = 0x00000034, + bc6_hrgb_ufloat = 0x00000035, + bc6_hrgb_float = 0x00000036, + bc7_rgba_unorm = 0x00000037, + bc7_rgba_unorm_srgb = 0x00000038, + etc2_rgb8_unorm = 0x00000039, + etc2_rgb8_unorm_srgb = 0x0000003a, + etc2_rgb8_a1_unorm = 0x0000003b, + etc2_rgb8_a1_unorm_srgb = 0x0000003c, + etc2_rgba8_unorm = 0x0000003d, + etc2_rgba8_unorm_srgb = 0x0000003e, + eacr11_unorm = 0x0000003f, + eacr11_snorm = 0x00000040, + eacrg11_unorm = 0x00000041, + eacrg11_snorm = 0x00000042, + astc4x4_unorm = 0x00000043, + astc4x4_unorm_srgb = 0x00000044, + astc5x4_unorm = 0x00000045, + astc5x4_unorm_srgb = 0x00000046, + astc5x5_unorm = 0x00000047, + astc5x5_unorm_srgb = 0x00000048, + astc6x5_unorm = 0x00000049, + astc6x5_unorm_srgb = 0x0000004a, + astc6x6_unorm = 0x0000004b, + astc6x6_unorm_srgb = 0x0000004c, + astc8x5_unorm = 0x0000004d, + astc8x5_unorm_srgb = 0x0000004e, + astc8x6_unorm = 0x0000004f, + astc8x6_unorm_srgb = 0x00000050, + astc8x8_unorm = 0x00000051, + astc8x8_unorm_srgb = 0x00000052, + astc10x5_unorm = 0x00000053, + astc10x5_unorm_srgb = 0x00000054, + astc10x6_unorm = 0x00000055, + astc10x6_unorm_srgb = 0x00000056, + astc10x8_unorm = 0x00000057, + astc10x8_unorm_srgb = 0x00000058, + astc10x10_unorm = 0x00000059, + astc10x10_unorm_srgb = 0x0000005a, + astc12x10_unorm = 0x0000005b, + astc12x10_unorm_srgb = 0x0000005c, + astc12x12_unorm = 0x0000005d, + astc12x12_unorm_srgb = 0x0000005e, + r8_bg8_biplanar420_unorm = 0x0000005f, +}; + +pub const TextureSampleType = enum(u32) { + undef = 0x00000000, + float = 0x00000001, + unfilterable_float = 0x00000002, + depth = 0x00000003, + sint = 0x00000004, + uint = 0x00000005, +}; + +pub const TextureUsageFlags = packed struct { + copy_src: bool = false, + copy_dst: bool = false, + texture_binding: bool = false, + storage_binding: bool = false, + render_attachment: bool = false, + present: bool = false, + + _padding: u26 = 0, + + comptime { + std.debug.assert( + @sizeOf(@This()) == @sizeOf(u32) and + @bitSizeOf(@This()) == @bitSizeOf(u32), + ); + } + + pub const none = TextureUsageFlags{}; + + pub fn equal(a: TextureUsageFlags, b: TextureUsageFlags) bool { + return @truncate(u6, @bitCast(u32, a)) == @truncate(u6, @bitCast(u32, b)); + } +}; + +pub const TextureBindingLayout = extern struct { + next_in_chain: *const ChainedStruct, + sample_type: TextureSampleType, + view_dimension: TextureViewDimension, + multisampled: bool, +}; + +pub const TextureDataLayout = extern struct { + next_in_chain: *const ChainedStruct, + offset: u64, + bytes_per_row: u32, + rows_per_image: u32, +}; + +pub const TextureDescriptor = extern struct { + next_in_chain: *const ChainedStruct, + label: ?[*:0]const u8 = null, + usage: TextureUsageFlags, + dimension: TextureDimension, + size: Extent3D, + format: TextureFormat, + mip_level_count: u32, + sample_count: u32, + view_format_count: u32, + view_formats: [*]const TextureFormat, }; diff --git a/gpu/src/texture_view.zig b/gpu/src/texture_view.zig index 91a0fa5c..a8b74433 100644 --- a/gpu/src/texture_view.zig +++ b/gpu/src/texture_view.zig @@ -1,5 +1,7 @@ const ChainedStruct = @import("types.zig").ChainedStruct; const Texture = @import("texture.zig").Texture; +const TextureFormat = @import("texture.zig").TextureFormat; +const TextureAspect = @import("texture.zig").TextureAspect; pub const TextureView = *opaque {}; @@ -16,11 +18,11 @@ pub const TextureViewDimension = enum(u32) { pub const TextureViewDescriptor = extern struct { next_in_chain: *const ChainedStruct, label: ?[*:0]const u8 = null, - format: Texture.Format, + format: TextureFormat, dimension: TextureViewDimension, base_mip_level: u32, mip_level_count: u32, base_array_layer: u32, array_layer_count: u32, - aspect: Texture.Aspect, + aspect: TextureAspect, }; diff --git a/gpu/src/types.zig b/gpu/src/types.zig index 98590ce6..fb6c68be 100644 --- a/gpu/src/types.zig +++ b/gpu/src/types.zig @@ -1,6 +1,9 @@ const std = @import("std"); const testing = std.testing; const Texture = @import("texture.zig").Texture; +const TextureFormat = @import("texture.zig").TextureFormat; +const TextureAspect = @import("texture.zig").TextureAspect; +const TextureDataLayout = @import("texture.zig").TextureDataLayout; const TextureView = @import("texture_view.zig").TextureView; const TextureViewDimension = @import("texture_view.zig").TextureViewDimension; const Buffer = @import("buffer.zig").Buffer; @@ -502,7 +505,7 @@ pub const StencilFaceState = extern struct { pub const StorageTextureBindingLayout = extern struct { next_in_chain: *const ChainedStruct, access: StorageTextureAccess, - format: Texture.Format, + format: TextureFormat, view_dimension: TextureViewDimension, }; @@ -525,7 +528,7 @@ pub const CompilationInfo = extern struct { pub const DepthStencilState = extern struct { next_in_chain: *const ChainedStruct, - format: Texture.Format, + format: TextureFormat, depth_write_enabled: bool, depth_compare: CompareFunction, stencil_front: StencilFaceState, @@ -539,7 +542,7 @@ pub const DepthStencilState = extern struct { pub const ImageCopyBuffer = extern struct { next_in_chain: *const ChainedStruct, - layout: Texture.DataLayout, + layout: TextureDataLayout, buffer: Buffer, }; @@ -548,7 +551,7 @@ pub const ImageCopyTexture = extern struct { texture: Texture, mip_level: u32, origin: Origin3D, - aspect: Texture.Aspect, + aspect: TextureAspect, }; pub const ProgrammableStageDescriptor = extern struct { @@ -587,7 +590,7 @@ pub const VertexBufferLayout = extern struct { pub const ColorTargetState = extern struct { next_in_chain: *const ChainedStruct, - format: Texture.Format, + format: TextureFormat, blend: ?*const BlendState = null, write_mask: ColorWriteMaskFlags, };