diff --git a/gpu/src/bind_group_layout.zig b/gpu/src/bind_group_layout.zig index 1c579fba..4357e02d 100644 --- a/gpu/src/bind_group_layout.zig +++ b/gpu/src/bind_group_layout.zig @@ -3,7 +3,6 @@ const ShaderStageFlags = @import("types.zig").ShaderStageFlags; const Buffer = @import("buffer.zig").Buffer; const Sampler = @import("sampler.zig").Sampler; const Texture = @import("texture.zig").Texture; -const TextureBindingLayout = @import("texture.zig").TextureBindingLayout; const StorageTextureBindingLayout = @import("types.zig").StorageTextureBindingLayout; const Impl = @import("interface.zig").Impl; @@ -14,7 +13,7 @@ pub const BindGroupLayout = opaque { visibility: ShaderStageFlags, buffer: Buffer.BindingLayout, sampler: Sampler.BindingLayout, - texture: TextureBindingLayout, + texture: Texture.BindingLayout, storage_texture: StorageTextureBindingLayout, }; diff --git a/gpu/src/dawn.zig b/gpu/src/dawn.zig index ebc48f3d..2a1d8974 100644 --- a/gpu/src/dawn.zig +++ b/gpu/src/dawn.zig @@ -1,6 +1,5 @@ const ChainedStruct = @import("types.zig").ChainedStruct; const Texture = @import("texture.zig").Texture; -const TextureUsageFlags = @import("texture.zig").TextureUsageFlags; pub const CacheDeviceDescriptor = extern struct { chain: ChainedStruct, @@ -21,7 +20,7 @@ pub const InstanceDescriptor = extern struct { pub const TextureInternalUsageDescriptor = extern struct { chain: ChainedStruct, - internal_usage: TextureUsageFlags = TextureUsageFlags.none, + internal_usage: Texture.UsageFlags = Texture.UsageFlags.none, }; pub const TogglesDeviceDescriptor = extern struct { diff --git a/gpu/src/device.zig b/gpu/src/device.zig index 504b4f2c..049e4c6c 100644 --- a/gpu/src/device.zig +++ b/gpu/src/device.zig @@ -14,7 +14,6 @@ const ShaderModule = @import("shader_module.zig").ShaderModule; const Surface = @import("surface.zig").Surface; const SwapChain = @import("swap_chain.zig").SwapChain; const Texture = @import("texture.zig").Texture; -const TextureDescriptor = @import("texture.zig").TextureDescriptor; const ChainedStruct = @import("types.zig").ChainedStruct; const FeatureName = @import("types.zig").FeatureName; const RequiredLimits = @import("types.zig").RequiredLimits; @@ -116,7 +115,7 @@ pub const Device = opaque { return Impl.deviceCreateSwapChain(device, surface, descriptor); } - pub inline fn createTexture(device: *Device, descriptor: *const TextureDescriptor) *Texture { + pub inline fn createTexture(device: *Device, descriptor: *const Texture.Descriptor) *Texture { return Impl.deviceCreateTexture(device, descriptor); } diff --git a/gpu/src/interface.zig b/gpu/src/interface.zig index 8ed95881..920dbec1 100644 --- a/gpu/src/interface.zig +++ b/gpu/src/interface.zig @@ -96,7 +96,7 @@ pub fn Interface(comptime T: type) type { assertDecl(T, "deviceCreateSampler", fn (device: *gpu.Device, descriptor: ?*const gpu.Sampler.Descriptor) callconv(.Inline) *gpu.Sampler); assertDecl(T, "deviceCreateShaderModule", fn (device: *gpu.Device, descriptor: *const gpu.ShaderModule.Descriptor) callconv(.Inline) *gpu.ShaderModule); assertDecl(T, "deviceCreateSwapChain", fn (device: *gpu.Device, surface: ?*gpu.Surface, descriptor: *const gpu.SwapChain.Descriptor) callconv(.Inline) *gpu.SwapChain); - assertDecl(T, "deviceCreateTexture", fn (device: *gpu.Device, descriptor: *const gpu.TextureDescriptor) callconv(.Inline) *gpu.Texture); + assertDecl(T, "deviceCreateTexture", fn (device: *gpu.Device, descriptor: *const gpu.Texture.Descriptor) callconv(.Inline) *gpu.Texture); assertDecl(T, "deviceDestroy", fn (device: *gpu.Device) callconv(.Inline) void); assertDecl(T, "deviceEnumerateFeatures", fn (device: *gpu.Device, features: [*]gpu.FeatureName) callconv(.Inline) usize); assertDecl(T, "deviceGetLimits", fn (device: *gpu.Device, limits: *gpu.SupportedLimits) callconv(.Inline) bool); @@ -135,7 +135,7 @@ pub fn Interface(comptime T: type) type { assertDecl(T, "queueSetLabel", fn (queue: *gpu.Queue, label: [*:0]const u8) callconv(.Inline) void); assertDecl(T, "queueSubmit", fn (queue: *gpu.Queue, command_count: u32, commands: [*]*gpu.CommandBuffer) callconv(.Inline) void); assertDecl(T, "queueWriteBuffer", fn (queue: *gpu.Queue, buffer: *gpu.Buffer, buffer_offset: u64, data: *anyopaque, size: usize) callconv(.Inline) void); - assertDecl(T, "queueWriteTexture", fn (queue: *gpu.Queue, data: *anyopaque, data_size: usize, data_layout: *const gpu.TextureDataLayout, write_size: *const gpu.Extent3D) callconv(.Inline) void); + assertDecl(T, "queueWriteTexture", fn (queue: *gpu.Queue, data: *anyopaque, data_size: usize, data_layout: *const gpu.Texture.DataLayout, write_size: *const gpu.Extent3D) callconv(.Inline) void); assertDecl(T, "queueReference", fn (queue: *gpu.Queue) callconv(.Inline) void); assertDecl(T, "queueRelease", fn (queue: *gpu.Queue) callconv(.Inline) void); assertDecl(T, "renderBundleReference", fn (render_bundle: *gpu.RenderBundle) callconv(.Inline) void); @@ -191,7 +191,7 @@ pub fn Interface(comptime T: type) type { assertDecl(T, "shaderModuleRelease", fn (shader_module: *gpu.ShaderModule) callconv(.Inline) void); assertDecl(T, "surfaceReference", fn (surface: *gpu.Surface) callconv(.Inline) void); assertDecl(T, "surfaceRelease", fn (surface: *gpu.Surface) callconv(.Inline) void); - assertDecl(T, "swapChainConfigure", fn (swap_chain: *gpu.SwapChain, format: gpu.TextureFormat, allowed_usage: gpu.TextureUsageFlags, width: u32, height: u32) callconv(.Inline) void); + assertDecl(T, "swapChainConfigure", fn (swap_chain: *gpu.SwapChain, format: gpu.Texture.Format, allowed_usage: gpu.Texture.UsageFlags, width: u32, height: u32) callconv(.Inline) void); assertDecl(T, "swapChainGetCurrentTextureView", fn (swap_chain: *gpu.SwapChain) callconv(.Inline) *gpu.TextureView); assertDecl(T, "swapChainPresent", fn (swap_chain: *gpu.SwapChain) callconv(.Inline) void); assertDecl(T, "swapChainReference", fn (swap_chain: *gpu.SwapChain) callconv(.Inline) void); @@ -199,12 +199,12 @@ pub fn Interface(comptime T: type) type { assertDecl(T, "textureCreateView", fn (texture: *gpu.Texture, descriptor: ?*const gpu.TextureView.Descriptor) callconv(.Inline) *gpu.TextureView); assertDecl(T, "textureDestroy", fn (texture: *gpu.Texture) callconv(.Inline) void); assertDecl(T, "textureGetDepthOrArrayLayers", fn (texture: *gpu.Texture) callconv(.Inline) u32); - assertDecl(T, "textureGetDimension", fn (texture: *gpu.Texture) callconv(.Inline) gpu.TextureDimension); - assertDecl(T, "textureGetFormat", fn (texture: *gpu.Texture) callconv(.Inline) gpu.TextureFormat); + assertDecl(T, "textureGetDimension", fn (texture: *gpu.Texture) callconv(.Inline) gpu.Texture.Dimension); + assertDecl(T, "textureGetFormat", fn (texture: *gpu.Texture) callconv(.Inline) gpu.Texture.Format); assertDecl(T, "textureGetHeight", fn (texture: *gpu.Texture) callconv(.Inline) u32); assertDecl(T, "textureGetMipLevelCount", fn (texture: *gpu.Texture) callconv(.Inline) u32); assertDecl(T, "textureGetSampleCount", fn (texture: *gpu.Texture) callconv(.Inline) u32); - assertDecl(T, "textureGetUsage", fn (texture: *gpu.Texture) callconv(.Inline) gpu.TextureUsageFlags); + assertDecl(T, "textureGetUsage", fn (texture: *gpu.Texture) callconv(.Inline) gpu.Texture.UsageFlags); assertDecl(T, "textureGetWidth", fn (texture: *gpu.Texture) callconv(.Inline) u32); assertDecl(T, "textureSetLabel", fn (texture: *gpu.Texture, label: [*:0]const u8) callconv(.Inline) void); assertDecl(T, "textureReference", fn (texture: *gpu.Texture) callconv(.Inline) void); @@ -634,7 +634,7 @@ pub fn Export(comptime T: type) type { } // WGPU_EXPORT WGPUTexture wgpuDeviceCreateTexture(WGPUDevice device, WGPUTextureDescriptor const * descriptor); - export fn wgpuDeviceCreateTexture(device: *gpu.Device, descriptor: *const gpu.TextureDescriptor) *gpu.Texture { + export fn wgpuDeviceCreateTexture(device: *gpu.Device, descriptor: *const gpu.Texture.Descriptor) *gpu.Texture { return T.deviceCreateTexture(device, descriptor); } @@ -829,7 +829,7 @@ pub fn Export(comptime T: type) type { } // WGPU_EXPORT void wgpuQueueWriteTexture(WGPUQueue queue, WGPUImageCopyTexture const * destination, void const * data, size_t dataSize, WGPUTextureDataLayout const * dataLayout, WGPUExtent3D const * writeSize); - export fn wgpuQueueWriteTexture(queue: *gpu.Queue, data: *anyopaque, data_size: usize, data_layout: *const gpu.TextureDataLayout, write_size: *const gpu.Extent3D) void { + export fn wgpuQueueWriteTexture(queue: *gpu.Queue, data: *anyopaque, data_size: usize, data_layout: *const gpu.Texture.DataLayout, write_size: *const gpu.Extent3D) void { T.queueWriteTexture(queue, data, data_size, data_layout, write_size); } @@ -1108,11 +1108,11 @@ pub fn Export(comptime T: type) type { T.surfaceRelease(surface); } - // TODO: Zig cannot currently export a packed struct gpu.TextureUsageFlags, so we use a u32 + // TODO: Zig cannot currently export a packed struct gpu.Texture.UsageFlags, so we use a u32 // for now. // WGPU_EXPORT void wgpuSwapChainConfigure(WGPUSwapChain swapChain, WGPUTextureFormat format, WGPUTextureUsageFlags allowedUsage, uint32_t width, uint32_t height); - export fn wgpuSwapChainConfigure(swap_chain: *gpu.SwapChain, format: gpu.TextureFormat, allowed_usage: u32, width: u32, height: u32) void { - T.swapChainConfigure(swap_chain, format, @bitCast(gpu.TextureUsageFlags, allowed_usage), width, height); + export fn wgpuSwapChainConfigure(swap_chain: *gpu.SwapChain, format: gpu.Texture.Format, allowed_usage: u32, width: u32, height: u32) void { + T.swapChainConfigure(swap_chain, format, @bitCast(gpu.Texture.UsageFlags, allowed_usage), width, height); } // WGPU_EXPORT WGPUTextureView wgpuSwapChainGetCurrentTextureView(WGPUSwapChain swapChain); @@ -1151,12 +1151,12 @@ pub fn Export(comptime T: type) type { } // WGPU_EXPORT WGPUTextureDimension wgpuTextureGetDimension(WGPUTexture texture); - export fn wgpuTextureGetDimension(texture: *gpu.Texture) gpu.TextureDimension { + export fn wgpuTextureGetDimension(texture: *gpu.Texture) gpu.Texture.Dimension { return T.textureGetDimension(texture); } // WGPU_EXPORT WGPUTextureFormat wgpuTextureGetFormat(WGPUTexture texture); - export fn wgpuTextureGetFormat(texture: *gpu.Texture) gpu.TextureFormat { + export fn wgpuTextureGetFormat(texture: *gpu.Texture) gpu.Texture.Format { return T.textureGetFormat(texture); } @@ -1176,7 +1176,7 @@ pub fn Export(comptime T: type) type { } // WGPU_EXPORT WGPUTextureUsage wgpuTextureGetUsage(WGPUTexture texture); - export fn wgpuTextureGetUsage(texture: *gpu.Texture) gpu.TextureUsageFlags { + export fn wgpuTextureGetUsage(texture: *gpu.Texture) gpu.Texture.UsageFlags { return T.textureGetUsage(texture); } @@ -1722,7 +1722,7 @@ pub const StubInterface = Interface(struct { unreachable; } - pub inline fn deviceCreateTexture(device: *gpu.Device, descriptor: *const gpu.TextureDescriptor) *gpu.Texture { + pub inline fn deviceCreateTexture(device: *gpu.Device, descriptor: *const gpu.Texture.Descriptor) *gpu.Texture { _ = device; _ = descriptor; unreachable; @@ -1954,7 +1954,7 @@ pub const StubInterface = Interface(struct { unreachable; } - pub inline fn queueWriteTexture(queue: *gpu.Queue, data: *anyopaque, data_size: usize, data_layout: *const gpu.TextureDataLayout, write_size: *const gpu.Extent3D) void { + pub inline fn queueWriteTexture(queue: *gpu.Queue, data: *anyopaque, data_size: usize, data_layout: *const gpu.Texture.DataLayout, write_size: *const gpu.Extent3D) void { _ = queue; _ = data; _ = data_size; @@ -2320,7 +2320,7 @@ pub const StubInterface = Interface(struct { unreachable; } - pub inline fn swapChainConfigure(swap_chain: *gpu.SwapChain, format: gpu.TextureFormat, allowed_usage: gpu.TextureUsageFlags, width: u32, height: u32) void { + pub inline fn swapChainConfigure(swap_chain: *gpu.SwapChain, format: gpu.Texture.Format, allowed_usage: gpu.Texture.UsageFlags, width: u32, height: u32) void { _ = swap_chain; _ = format; _ = allowed_usage; @@ -2365,12 +2365,12 @@ pub const StubInterface = Interface(struct { unreachable; } - pub inline fn textureGetDimension(texture: *gpu.Texture) gpu.TextureDimension { + pub inline fn textureGetDimension(texture: *gpu.Texture) gpu.Texture.Dimension { _ = texture; unreachable; } - pub inline fn textureGetFormat(texture: *gpu.Texture) gpu.TextureFormat { + pub inline fn textureGetFormat(texture: *gpu.Texture) gpu.Texture.Format { _ = texture; unreachable; } @@ -2390,7 +2390,7 @@ pub const StubInterface = Interface(struct { unreachable; } - pub inline fn textureGetUsage(texture: *gpu.Texture) gpu.TextureUsageFlags { + pub inline fn textureGetUsage(texture: *gpu.Texture) gpu.Texture.UsageFlags { _ = texture; unreachable; } diff --git a/gpu/src/queue.zig b/gpu/src/queue.zig index 9537c376..38393b75 100644 --- a/gpu/src/queue.zig +++ b/gpu/src/queue.zig @@ -1,6 +1,6 @@ const CommandBuffer = @import("command_buffer.zig").CommandBuffer; const Buffer = @import("buffer.zig").Buffer; -const TextureDataLayout = @import("texture.zig").TextureDataLayout; +const Texture = @import("texture.zig").Texture; const ImageCopyTexture = @import("types.zig").ImageCopyTexture; const ChainedStruct = @import("types.zig").ChainedStruct; const Extent3D = @import("types.zig").Extent3D; @@ -45,7 +45,7 @@ pub const Queue = opaque { Impl.queueWriteBuffer(queue, buffer, buffer_offset, data, size); } - pub inline fn writeTexture(queue: *Queue, data: *anyopaque, data_size: usize, data_layout: *const TextureDataLayout, write_size: *const Extent3D) void { + pub inline fn writeTexture(queue: *Queue, data: *anyopaque, data_size: usize, data_layout: *const Texture.DataLayout, write_size: *const Extent3D) void { Impl.queueWriteTexture(queue, data, data_size, data_layout, write_size); } diff --git a/gpu/src/render_bundle_encoder.zig b/gpu/src/render_bundle_encoder.zig index 242b05cc..666637c1 100644 --- a/gpu/src/render_bundle_encoder.zig +++ b/gpu/src/render_bundle_encoder.zig @@ -1,5 +1,4 @@ const Texture = @import("texture.zig").Texture; -const TextureFormat = @import("texture.zig").TextureFormat; const Buffer = @import("buffer.zig").Buffer; const BindGroup = @import("bind_group.zig").BindGroup; const RenderPipeline = @import("render_pipeline.zig").RenderPipeline; @@ -14,8 +13,8 @@ pub const RenderBundleEncoder = opaque { label: ?[*:0]const u8 = null, color_formats_count: u32, // TODO: file a bug on Dawn, this is not marked as nullable but in fact is. - color_formats: ?[*]const TextureFormat, - depth_stencil_format: TextureFormat = .undef, + color_formats: ?[*]const Texture.Format, + depth_stencil_format: Texture.Format = .undef, sample_count: u32 = 1, depth_read_only: bool = false, stencil_read_only: bool = false, diff --git a/gpu/src/swap_chain.zig b/gpu/src/swap_chain.zig index 960f04f5..962c7f2f 100644 --- a/gpu/src/swap_chain.zig +++ b/gpu/src/swap_chain.zig @@ -1,8 +1,6 @@ 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; const TextureView = @import("texture_view.zig").TextureView; const Impl = @import("interface.zig").Impl; @@ -10,8 +8,8 @@ pub const SwapChain = opaque { pub const Descriptor = extern struct { next_in_chain: ?*const ChainedStruct = null, label: ?[*:0]const u8 = null, - usage: TextureUsageFlags, - format: TextureFormat, + usage: Texture.UsageFlags, + format: Texture.Format, width: u32, height: u32, present_mode: PresentMode, @@ -19,7 +17,7 @@ pub const SwapChain = opaque { implementation: u64 = 0, }; - pub inline fn configure(swap_chain: *SwapChain, format: TextureFormat, allowed_usage: TextureUsageFlags, width: u32, height: u32) void { + pub inline fn configure(swap_chain: *SwapChain, format: Texture.Format, allowed_usage: Texture.UsageFlags, width: u32, height: u32) void { Impl.swapChainConfigure(swap_chain, format, allowed_usage, width, height); } diff --git a/gpu/src/texture.zig b/gpu/src/texture.zig index 1e7f0c98..d28214d9 100644 --- a/gpu/src/texture.zig +++ b/gpu/src/texture.zig @@ -6,6 +6,187 @@ const Impl = @import("interface.zig").Impl; const copy_stride_undefined = @import("main.zig").copy_stride_undefined; pub const Texture = opaque { + 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 = null, + sample_type: SampleType = .undef, + view_dimension: TextureView.Dimension = .dimension_undef, + multisampled: bool = false, + }; + + pub const DataLayout = extern struct { + next_in_chain: ?*const ChainedStruct = null, + offset: u64 = 0, + bytes_per_row: u32 = copy_stride_undefined, + rows_per_image: u32 = copy_stride_undefined, + }; + + pub const Descriptor = extern struct { + next_in_chain: ?*const ChainedStruct = null, + label: ?[*:0]const u8 = null, + usage: UsageFlags, + dimension: Dimension = .dimension_2d, + size: Extent3D, + format: Format, + mip_level_count: u32 = 1, + sample_count: u32 = 1, + view_format_count: u32 = 0, + // TODO: file a bug on Dawn, this is not marked as nullable but in fact is. + view_formats: ?[*]const Format, + }; + pub inline fn createView(texture: *Texture, descriptor: ?*const TextureView.Descriptor) *TextureView { return Impl.textureCreateView(texture, descriptor); } @@ -18,11 +199,11 @@ pub const Texture = opaque { return Impl.textureGetDepthOrArrayLayers(texture); } - pub inline fn getDimension(texture: *Texture) TextureDimension { + pub inline fn getDimension(texture: *Texture) Dimension { return Impl.textureGetDimension(texture); } - pub inline fn getFormat(texture: *Texture) TextureFormat { + pub inline fn getFormat(texture: *Texture) Format { return Impl.textureGetFormat(texture); } @@ -38,7 +219,7 @@ pub const Texture = opaque { return Impl.textureGetSampleCount(texture); } - pub inline fn getUsage(texture: *Texture) TextureUsageFlags { + pub inline fn getUsage(texture: *Texture) UsageFlags { return Impl.textureGetUsage(texture); } @@ -58,184 +239,3 @@ pub const Texture = opaque { Impl.textureRelease(texture); } }; - -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 = null, - sample_type: TextureSampleType = .undef, - view_dimension: TextureView.Dimension = .dimension_undef, - multisampled: bool = false, -}; - -pub const TextureDataLayout = extern struct { - next_in_chain: ?*const ChainedStruct = null, - offset: u64 = 0, - bytes_per_row: u32 = copy_stride_undefined, - rows_per_image: u32 = copy_stride_undefined, -}; - -pub const TextureDescriptor = extern struct { - next_in_chain: ?*const ChainedStruct = null, - label: ?[*:0]const u8 = null, - usage: TextureUsageFlags, - dimension: TextureDimension = .dimension_2d, - size: Extent3D, - format: TextureFormat, - mip_level_count: u32 = 1, - sample_count: u32 = 1, - view_format_count: u32 = 0, - // TODO: file a bug on Dawn, this is not marked as nullable but in fact is. - view_formats: ?[*]const TextureFormat, -}; diff --git a/gpu/src/texture_view.zig b/gpu/src/texture_view.zig index ea2ec16d..fa380cb7 100644 --- a/gpu/src/texture_view.zig +++ b/gpu/src/texture_view.zig @@ -1,7 +1,5 @@ const ChainedStruct = @import("types.zig").ChainedStruct; const Texture = @import("texture.zig").Texture; -const TextureFormat = @import("texture.zig").TextureFormat; -const TextureAspect = @import("texture.zig").TextureAspect; const Impl = @import("interface.zig").Impl; const mip_level_count_undefined = @import("main.zig").mip_level_count_undefined; const array_layer_count_undefined = @import("main.zig").array_layer_count_undefined; @@ -20,13 +18,13 @@ pub const TextureView = opaque { pub const Descriptor = extern struct { next_in_chain: ?*const ChainedStruct = null, label: ?[*:0]const u8 = null, - format: TextureFormat = .undef, + format: Texture.Format = .undef, dimension: Dimension = .dimension_undef, base_mip_level: u32 = 0, mip_level_count: u32 = mip_level_count_undefined, base_array_layer: u32 = 0, array_layer_count: u32 = array_layer_count_undefined, - aspect: TextureAspect = .all, + aspect: Texture.Aspect = .all, }; pub inline fn setLabel(texture_view: *TextureView, label: [*:0]const u8) void { diff --git a/gpu/src/types.zig b/gpu/src/types.zig index e24e9a9a..6c5b177b 100644 --- a/gpu/src/types.zig +++ b/gpu/src/types.zig @@ -1,9 +1,6 @@ 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 Buffer = @import("buffer.zig").Buffer; const ShaderModule = @import("shader_module.zig").ShaderModule; @@ -509,7 +506,7 @@ pub const StencilFaceState = extern struct { pub const StorageTextureBindingLayout = extern struct { next_in_chain: ?*const ChainedStruct = null, access: StorageTextureAccess = .undef, - format: TextureFormat = .undef, + format: Texture.Format = .undef, view_dimension: TextureView.Dimension = .dimension_undef, }; @@ -533,7 +530,7 @@ pub const CompilationInfo = extern struct { pub const DepthStencilState = extern struct { next_in_chain: ?*const ChainedStruct = null, - format: TextureFormat, + format: Texture.Format, depth_write_enabled: bool = false, depth_compare: CompareFunction = .always, stencil_front: StencilFaceState, @@ -547,7 +544,7 @@ pub const DepthStencilState = extern struct { pub const ImageCopyBuffer = extern struct { next_in_chain: ?*const ChainedStruct = null, - layout: TextureDataLayout, + layout: Texture.DataLayout, buffer: *Buffer, }; @@ -556,7 +553,7 @@ pub const ImageCopyTexture = extern struct { texture: *Texture, mip_level: u32 = 0, origin: Origin3D, - aspect: TextureAspect = .all, + aspect: Texture.Aspect = .all, }; pub const ProgrammableStageDescriptor = extern struct { @@ -603,7 +600,7 @@ pub const VertexBufferLayout = extern struct { pub const ColorTargetState = extern struct { next_in_chain: ?*const ChainedStruct = null, - format: TextureFormat, + format: Texture.Format, blend: ?*const BlendState, write_mask: ColorWriteMaskFlags = ColorWriteMaskFlags.all, };