From 15f32acfd2db4f1e63255da9bb49c72479214f16 Mon Sep 17 00:00:00 2001 From: Stephen Gutekanst Date: Wed, 9 Mar 2022 22:53:43 -0700 Subject: [PATCH] gpu: implement RenderBundleEncoder Signed-off-by: Stephen Gutekanst --- gpu/src/NativeInstance.zig | 22 +++++++++++++++++++ gpu/src/RenderBundleEncoder.zig | 39 +++++++++++++++++++++++++++++++++ gpu/src/TODO | 17 -------------- gpu/src/main.zig | 2 ++ 4 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 gpu/src/RenderBundleEncoder.zig diff --git a/gpu/src/NativeInstance.zig b/gpu/src/NativeInstance.zig index d2443382..5873e2b0 100644 --- a/gpu/src/NativeInstance.zig +++ b/gpu/src/NativeInstance.zig @@ -25,6 +25,7 @@ const Texture = @import("Texture.zig"); const Sampler = @import("Sampler.zig"); const RenderPipeline = @import("RenderPipeline.zig"); const RenderPassEncoder = @import("RenderPassEncoder.zig"); +const RenderBundleEncoder = @import("RenderBundleEncoder.zig"); const TextureUsage = @import("enums.zig").TextureUsage; const TextureFormat = @import("enums.zig").TextureFormat; @@ -602,6 +603,26 @@ const render_pass_encoder_vtable = RenderPassEncoder.VTable{ }).release, }; +fn wrapRenderBundleEncoder(enc: c.WGPURenderBundleEncoder) RenderBundleEncoder { + return .{ + .ptr = enc.?, + .vtable = &render_bundle_encoder_vtable, + }; +} + +const render_bundle_encoder_vtable = RenderBundleEncoder.VTable{ + .reference = (struct { + pub fn reference(ptr: *anyopaque) void { + c.wgpuRenderBundleEncoderReference(@ptrCast(c.WGPURenderBundleEncoder, ptr)); + } + }).reference, + .release = (struct { + pub fn release(ptr: *anyopaque) void { + c.wgpuRenderBundleEncoderRelease(@ptrCast(c.WGPURenderBundleEncoder, ptr)); + } + }).release, +}; + test "syntax" { _ = wrap; _ = interface_vtable; @@ -620,4 +641,5 @@ test "syntax" { _ = wrapSampler; _ = wrapRenderPipeline; _ = wrapRenderPassEncoder; + _ = wrapRenderBundleEncoder; } diff --git a/gpu/src/RenderBundleEncoder.zig b/gpu/src/RenderBundleEncoder.zig new file mode 100644 index 00000000..6b2c21bc --- /dev/null +++ b/gpu/src/RenderBundleEncoder.zig @@ -0,0 +1,39 @@ +const RenderBundleEncoder = @This(); + +/// The type erased pointer to the RenderBundleEncoder implementation +/// Equal to c.WGPURenderBundleEncoder for NativeInstance. +ptr: *anyopaque, +vtable: *const VTable, + +pub const VTable = struct { + reference: fn (ptr: *anyopaque) void, + release: fn (ptr: *anyopaque) void, + // TODO: + // WGPU_EXPORT void wgpuRenderBundleEncoderDraw(WGPURenderBundleEncoder renderBundleEncoder, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance); + // WGPU_EXPORT void wgpuRenderBundleEncoderDrawIndexed(WGPURenderBundleEncoder renderBundleEncoder, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t baseVertex, uint32_t firstInstance); + // WGPU_EXPORT void wgpuRenderBundleEncoderDrawIndexedIndirect(WGPURenderBundleEncoder renderBundleEncoder, WGPUBuffer indirectBuffer, uint64_t indirectOffset); + // WGPU_EXPORT void wgpuRenderBundleEncoderDrawIndirect(WGPURenderBundleEncoder renderBundleEncoder, WGPUBuffer indirectBuffer, uint64_t indirectOffset); + // WGPU_EXPORT WGPURenderBundle wgpuRenderBundleEncoderFinish(WGPURenderBundleEncoder renderBundleEncoder, WGPURenderBundleDescriptor const * descriptor); + // WGPU_EXPORT void wgpuRenderBundleEncoderInsertDebugMarker(WGPURenderBundleEncoder renderBundleEncoder, char const * markerLabel); + // WGPU_EXPORT void wgpuRenderBundleEncoderPopDebugGroup(WGPURenderBundleEncoder renderBundleEncoder); + // WGPU_EXPORT void wgpuRenderBundleEncoderPushDebugGroup(WGPURenderBundleEncoder renderBundleEncoder, char const * groupLabel); + // WGPU_EXPORT void wgpuRenderBundleEncoderSetBindGroup(WGPURenderBundleEncoder renderBundleEncoder, uint32_t groupIndex, WGPUBindGroup group, uint32_t dynamicOffsetCount, uint32_t const * dynamicOffsets); + // WGPU_EXPORT void wgpuRenderBundleEncoderSetIndexBuffer(WGPURenderBundleEncoder renderBundleEncoder, WGPUBuffer buffer, WGPUIndexFormat format, uint64_t offset, uint64_t size); + // WGPU_EXPORT void wgpuRenderBundleEncoderSetLabel(WGPURenderBundleEncoder renderBundleEncoder, char const * label); + // WGPU_EXPORT void wgpuRenderBundleEncoderSetPipeline(WGPURenderBundleEncoder renderBundleEncoder, WGPURenderPipeline pipeline); + // WGPU_EXPORT void wgpuRenderBundleEncoderSetVertexBuffer(WGPURenderBundleEncoder renderBundleEncoder, uint32_t slot, WGPUBuffer buffer, uint64_t offset, uint64_t size); +}; + +pub inline fn reference(enc: RenderBundleEncoder) void { + enc.vtable.reference(enc.ptr); +} + +pub inline fn release(enc: RenderBundleEncoder) void { + enc.vtable.release(enc.ptr); +} + +test "syntax" { + _ = VTable; + _ = reference; + _ = release; +} diff --git a/gpu/src/TODO b/gpu/src/TODO index bb0758cb..8abf09d0 100644 --- a/gpu/src/TODO +++ b/gpu/src/TODO @@ -614,23 +614,6 @@ WGPU_EXPORT void wgpuQuerySetRelease(WGPUQuerySet querySet); WGPU_EXPORT void wgpuRenderBundleReference(WGPURenderBundle renderBundle); WGPU_EXPORT void wgpuRenderBundleRelease(WGPURenderBundle renderBundle); -// Methods of RenderBundleEncoder -WGPU_EXPORT void wgpuRenderBundleEncoderDraw(WGPURenderBundleEncoder renderBundleEncoder, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance); -WGPU_EXPORT void wgpuRenderBundleEncoderDrawIndexed(WGPURenderBundleEncoder renderBundleEncoder, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t baseVertex, uint32_t firstInstance); -WGPU_EXPORT void wgpuRenderBundleEncoderDrawIndexedIndirect(WGPURenderBundleEncoder renderBundleEncoder, WGPUBuffer indirectBuffer, uint64_t indirectOffset); -WGPU_EXPORT void wgpuRenderBundleEncoderDrawIndirect(WGPURenderBundleEncoder renderBundleEncoder, WGPUBuffer indirectBuffer, uint64_t indirectOffset); -WGPU_EXPORT WGPURenderBundle wgpuRenderBundleEncoderFinish(WGPURenderBundleEncoder renderBundleEncoder, WGPURenderBundleDescriptor const * descriptor); -WGPU_EXPORT void wgpuRenderBundleEncoderInsertDebugMarker(WGPURenderBundleEncoder renderBundleEncoder, char const * markerLabel); -WGPU_EXPORT void wgpuRenderBundleEncoderPopDebugGroup(WGPURenderBundleEncoder renderBundleEncoder); -WGPU_EXPORT void wgpuRenderBundleEncoderPushDebugGroup(WGPURenderBundleEncoder renderBundleEncoder, char const * groupLabel); -WGPU_EXPORT void wgpuRenderBundleEncoderSetBindGroup(WGPURenderBundleEncoder renderBundleEncoder, uint32_t groupIndex, WGPUBindGroup group, uint32_t dynamicOffsetCount, uint32_t const * dynamicOffsets); -WGPU_EXPORT void wgpuRenderBundleEncoderSetIndexBuffer(WGPURenderBundleEncoder renderBundleEncoder, WGPUBuffer buffer, WGPUIndexFormat format, uint64_t offset, uint64_t size); -WGPU_EXPORT void wgpuRenderBundleEncoderSetLabel(WGPURenderBundleEncoder renderBundleEncoder, char const * label); -WGPU_EXPORT void wgpuRenderBundleEncoderSetPipeline(WGPURenderBundleEncoder renderBundleEncoder, WGPURenderPipeline pipeline); -WGPU_EXPORT void wgpuRenderBundleEncoderSetVertexBuffer(WGPURenderBundleEncoder renderBundleEncoder, uint32_t slot, WGPUBuffer buffer, uint64_t offset, uint64_t size); -WGPU_EXPORT void wgpuRenderBundleEncoderReference(WGPURenderBundleEncoder renderBundleEncoder); -WGPU_EXPORT void wgpuRenderBundleEncoderRelease(WGPURenderBundleEncoder renderBundleEncoder); - typedef enum WGPUSType { // webgpu.h upstream: WGPUSType_Invalid = 0x00000000, diff --git a/gpu/src/main.zig b/gpu/src/main.zig index e40fce5f..f9f916c7 100644 --- a/gpu/src/main.zig +++ b/gpu/src/main.zig @@ -40,6 +40,7 @@ pub const Texture = @import("Texture.zig"); pub const Sampler = @import("Sampler.zig"); pub const RenderPipeline = @import("RenderPipeline.zig"); pub const RenderPassEncoder = @import("RenderPassEncoder.zig"); +pub const RenderBundleEncoder = @import("RenderBundleEncoder.zig"); pub const Feature = @import("enums.zig").Feature; pub const TextureUsage = @import("enums.zig").TextureUsage; @@ -104,6 +105,7 @@ test "syntax" { _ = Sampler; _ = RenderPipeline; _ = RenderPassEncoder; + _ = RenderBundleEncoder; _ = Feature; }