241 lines
6.5 KiB
Zig
241 lines
6.5 KiB
Zig
const std = @import("std");
|
|
|
|
const Extent3D = @import("data.zig").Extent3D;
|
|
|
|
const TextureView = @import("TextureView.zig");
|
|
|
|
const Texture = @This();
|
|
|
|
/// The type erased pointer to the Texture implementation
|
|
/// Equal to c.WGPUTexture for NativeInstance.
|
|
ptr: *anyopaque,
|
|
vtable: *const VTable,
|
|
|
|
pub const VTable = struct {
|
|
reference: fn (ptr: *anyopaque) void,
|
|
release: fn (ptr: *anyopaque) void,
|
|
destroy: fn (ptr: *anyopaque) void,
|
|
setLabel: fn (ptr: *anyopaque, label: [:0]const u8) void,
|
|
createView: fn (ptr: *anyopaque, descriptor: *const TextureView.Descriptor) TextureView,
|
|
};
|
|
|
|
pub inline fn reference(texture: Texture) void {
|
|
texture.vtable.reference(texture.ptr);
|
|
}
|
|
|
|
pub inline fn release(texture: Texture) void {
|
|
texture.vtable.release(texture.ptr);
|
|
}
|
|
|
|
pub inline fn setLabel(texture: Texture, label: [:0]const u8) void {
|
|
texture.vtable.setLabel(texture.ptr, label);
|
|
}
|
|
|
|
pub inline fn destroy(texture: Texture) void {
|
|
texture.vtable.destroy(texture.ptr);
|
|
}
|
|
|
|
pub inline fn createView(texture: Texture, descriptor: *const TextureView.Descriptor) TextureView {
|
|
return texture.vtable.createView(texture.ptr, descriptor);
|
|
}
|
|
|
|
pub const Descriptor = struct {
|
|
reserved: ?*anyopaque = null,
|
|
label: ?[*:0]const u8 = null,
|
|
usage: Usage,
|
|
dimension: Dimension = .dimension_2d,
|
|
size: Extent3D,
|
|
format: Format,
|
|
mip_level_count: u32 = 1,
|
|
sample_count: u32 = 1,
|
|
view_formats: ?[]const Format = null,
|
|
};
|
|
|
|
pub const Usage = 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,
|
|
|
|
_pad0: u2 = 0,
|
|
_pad1: u8 = 0,
|
|
_pad2: u16 = 0,
|
|
|
|
comptime {
|
|
std.debug.assert(
|
|
@sizeOf(@This()) == @sizeOf(u32) and
|
|
@bitSizeOf(@This()) == @bitSizeOf(u32),
|
|
);
|
|
}
|
|
|
|
pub fn equal(a: Usage, b: Usage) bool {
|
|
return a.copy_src == b.copy_src and
|
|
a.copy_dst == b.copy_dst and
|
|
a.texture_binding == b.texture_binding and
|
|
a.storage_binding == b.storage_binding and
|
|
a.render_attachment == b.render_attachment and
|
|
a.present == b.present;
|
|
}
|
|
};
|
|
|
|
pub const Format = enum(u32) {
|
|
none = 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,
|
|
rgb10a2_unorm = 0x00000019,
|
|
rg11b10u_float = 0x0000001a,
|
|
rgb9e5u_float = 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,
|
|
depth24_unorm_stencil8 = 0x00000029,
|
|
depth32_float = 0x0000002a,
|
|
depth32_float_stencil8 = 0x0000002b,
|
|
bc1rgba_unorm = 0x0000002c,
|
|
bc1rgba_unorm_srgb = 0x0000002d,
|
|
bc2rgba_unorm = 0x0000002e,
|
|
bc2rgba_unorm_srgb = 0x0000002f,
|
|
bc3rgba_unorm = 0x00000030,
|
|
bc3rgba_unorm_srgb = 0x00000031,
|
|
bc4r_unorm = 0x00000032,
|
|
bc4r_snorm = 0x00000033,
|
|
bc5rg_unorm = 0x00000034,
|
|
bc5rg_snorm = 0x00000035,
|
|
bc6hrgbu_float = 0x00000036,
|
|
bc6hrgb_float = 0x00000037,
|
|
bc7rgba_unorm = 0x00000038,
|
|
bc7rgba_unorm_srgb = 0x00000039,
|
|
etc2rgb8_unorm = 0x0000003a,
|
|
etc2rgb8_unorm_srgb = 0x0000003b,
|
|
etc2rgb8a1_unorm = 0x0000003c,
|
|
etc2rgb8a1_unorm_srgb = 0x0000003d,
|
|
etc2rgba8_unorm = 0x0000003e,
|
|
etc2rgba8_unorm_srgb = 0x0000003f,
|
|
eacr11_unorm = 0x00000040,
|
|
eacr11_snorm = 0x00000041,
|
|
eacrg11_unorm = 0x00000042,
|
|
eacrg11_snorm = 0x00000043,
|
|
astc4x4_unorm = 0x00000044,
|
|
astc4x4_unorm_srgb = 0x00000045,
|
|
astc5x4_unorm = 0x00000046,
|
|
astc5x4_unorm_srgb = 0x00000047,
|
|
astc5x5_unorm = 0x00000048,
|
|
astc5x5_unorm_srgb = 0x00000049,
|
|
astc6x5_unorm = 0x0000004a,
|
|
astc6x5_unorm_srgb = 0x0000004b,
|
|
astc6x6_unorm = 0x0000004c,
|
|
astc6x6_unorm_srgb = 0x0000004d,
|
|
astc8x5_unorm = 0x0000004e,
|
|
astc8x5_unorm_srgb = 0x0000004f,
|
|
astc8x6_unorm = 0x00000050,
|
|
astc8x6_unorm_srgb = 0x00000051,
|
|
astc8x8_unorm = 0x00000052,
|
|
astc8x8_unorm_srgb = 0x00000053,
|
|
astc10x5_unorm = 0x00000054,
|
|
astc10x5_unorm_srgb = 0x00000055,
|
|
astc10x6_unorm = 0x00000056,
|
|
astc10x6_unorm_srgb = 0x00000057,
|
|
astc10x8_unorm = 0x00000058,
|
|
astc10x8_unorm_srgb = 0x00000059,
|
|
astc10x10_unorm = 0x0000005a,
|
|
astc10x10_unorm_srgb = 0x0000005b,
|
|
astc12x10_unorm = 0x0000005c,
|
|
astc12x10_unorm_srgb = 0x0000005d,
|
|
astc12x12_unorm = 0x0000005e,
|
|
astc12x12_unorm_srgb = 0x0000005f,
|
|
r8bg8biplanar420_unorm = 0x00000060,
|
|
};
|
|
|
|
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 SampleType = enum(u32) {
|
|
none = 0x00000000,
|
|
float = 0x00000001,
|
|
unfilterable_float = 0x00000002,
|
|
depth = 0x00000003,
|
|
sint = 0x00000004,
|
|
uint = 0x00000005,
|
|
};
|
|
|
|
pub const BindingLayout = extern struct {
|
|
reserved: ?*anyopaque = null,
|
|
sample_type: SampleType = .float,
|
|
view_dimension: TextureView.Dimension = .dimension_2d,
|
|
multisampled: bool = false,
|
|
};
|
|
|
|
pub const DataLayout = extern struct {
|
|
reserved: ?*anyopaque = null,
|
|
offset: u64 = 0,
|
|
bytes_per_row: u32,
|
|
rows_per_image: u32,
|
|
};
|
|
|
|
test {
|
|
_ = VTable;
|
|
_ = reference;
|
|
_ = release;
|
|
_ = destroy;
|
|
_ = Descriptor;
|
|
_ = Usage;
|
|
_ = Format;
|
|
_ = Aspect;
|
|
_ = ComponentType;
|
|
_ = Dimension;
|
|
_ = SampleType;
|
|
_ = BindingLayout;
|
|
_ = DataLayout;
|
|
}
|