implementing push constants
This commit is contained in:
@@ -62,6 +62,7 @@ pub const DispatchTable = struct {
|
||||
executeCommands: *const fn (*Self, *Self) VkError!void,
|
||||
fillBuffer: *const fn (*Self, *Buffer, vk.DeviceSize, vk.DeviceSize, u32) VkError!void,
|
||||
pipelineBarrier: *const fn (*Self, vk.PipelineStageFlags, vk.PipelineStageFlags, vk.DependencyFlags, []const vk.MemoryBarrier, []const vk.BufferMemoryBarrier, []const vk.ImageMemoryBarrier) VkError!void,
|
||||
pushConstants: *const fn (*Self, vk.ShaderStageFlags, u32, []const u8) VkError!void,
|
||||
reset: *const fn (*Self, vk.CommandBufferResetFlags) VkError!void,
|
||||
resetEvent: *const fn (*Self, *Event, vk.PipelineStageFlags) VkError!void,
|
||||
setEvent: *const fn (*Self, *Event, vk.PipelineStageFlags) VkError!void,
|
||||
@@ -253,6 +254,10 @@ pub inline fn pipelineBarrier(
|
||||
try self.dispatch_table.pipelineBarrier(self, src_stage, dst_stage, dependency, memory_barriers, buffer_barriers, image_barriers);
|
||||
}
|
||||
|
||||
pub inline fn pushConstants(self: *Self, stages: vk.ShaderStageFlags, offset: u32, blob: []const u8) VkError!void {
|
||||
try self.dispatch_table.pushConstants(self, stages, offset, blob);
|
||||
}
|
||||
|
||||
pub inline fn resetEvent(self: *Self, event: *Event, stage: vk.PipelineStageFlags) VkError!void {
|
||||
try self.dispatch_table.resetEvent(self, event, stage);
|
||||
}
|
||||
|
||||
+14
-2
@@ -1,12 +1,13 @@
|
||||
const std = @import("std");
|
||||
const vk = @import("vulkan");
|
||||
|
||||
const NonDispatchable = @import("NonDispatchable.zig");
|
||||
const NonDispatchable = @import("NonDispatchable.zig").NonDispatchable;
|
||||
|
||||
const VkError = @import("error_set.zig").VkError;
|
||||
|
||||
const Device = @import("Device.zig");
|
||||
const PipelineCache = @import("PipelineCache.zig");
|
||||
const PipelineLayout = @import("PipelineLayout.zig");
|
||||
|
||||
const Self = @This();
|
||||
pub const ObjectType: vk.ObjectType = .pipeline;
|
||||
@@ -28,6 +29,7 @@ owner: *Device,
|
||||
vtable: *const VTable,
|
||||
bind_point: vk.PipelineBindPoint,
|
||||
stages: vk.ShaderStageFlags,
|
||||
layout: *PipelineLayout,
|
||||
mode: union(enum) {
|
||||
compute: struct {},
|
||||
graphics: struct {
|
||||
@@ -55,14 +57,18 @@ pub const VTable = struct {
|
||||
};
|
||||
|
||||
pub fn initCompute(device: *Device, allocator: std.mem.Allocator, cache: ?*PipelineCache, info: *const vk.ComputePipelineCreateInfo) VkError!Self {
|
||||
_ = allocator;
|
||||
_ = cache;
|
||||
|
||||
const layout = try NonDispatchable(PipelineLayout).fromHandleObject(info.layout);
|
||||
layout.ref();
|
||||
errdefer layout.unref(allocator);
|
||||
|
||||
return .{
|
||||
.owner = device,
|
||||
.vtable = undefined,
|
||||
.bind_point = .compute,
|
||||
.stages = info.stage.stage,
|
||||
.layout = layout,
|
||||
.mode = .{ .compute = .{} },
|
||||
};
|
||||
}
|
||||
@@ -70,6 +76,10 @@ pub fn initCompute(device: *Device, allocator: std.mem.Allocator, cache: ?*Pipel
|
||||
pub fn initGraphics(device: *Device, allocator: std.mem.Allocator, cache: ?*PipelineCache, info: *const vk.GraphicsPipelineCreateInfo) VkError!Self {
|
||||
_ = cache;
|
||||
|
||||
const layout = try NonDispatchable(PipelineLayout).fromHandleObject(info.layout);
|
||||
layout.ref();
|
||||
errdefer layout.unref(allocator);
|
||||
|
||||
var stages: vk.ShaderStageFlags = .{};
|
||||
if (info.p_stages) |p_stages| {
|
||||
for (p_stages[0..info.stage_count]) |stage| {
|
||||
@@ -82,6 +92,7 @@ pub fn initGraphics(device: *Device, allocator: std.mem.Allocator, cache: ?*Pipe
|
||||
.vtable = undefined,
|
||||
.bind_point = .graphics,
|
||||
.stages = stages,
|
||||
.layout = layout,
|
||||
.mode = .{
|
||||
.graphics = .{
|
||||
.input_assembly = .{
|
||||
@@ -172,5 +183,6 @@ pub inline fn destroy(self: *Self, allocator: std.mem.Allocator) void {
|
||||
}
|
||||
},
|
||||
}
|
||||
self.layout.unref(allocator);
|
||||
self.vtable.destroy(self, allocator);
|
||||
}
|
||||
|
||||
@@ -23,19 +23,6 @@ dynamic_descriptor_offsets: [lib.VULKAN_MAX_DESCRIPTOR_SETS]usize,
|
||||
push_ranges_count: usize,
|
||||
push_ranges: [lib.VULKAN_MAX_PUSH_CONSTANT_RANGES]vk.PushConstantRange,
|
||||
|
||||
/// Mesa's common Vulkan runtime states:
|
||||
///
|
||||
/// It's often necessary to store a pointer to the descriptor set layout in
|
||||
/// the descriptor so that any entrypoint which has access to a descriptor
|
||||
/// set also has the layout. While layouts are often passed into various
|
||||
/// entrypoints, they're notably missing from vkUpdateDescriptorSets(). In
|
||||
/// order to implement descriptor writes, you either need to stash a pointer
|
||||
/// to the descriptor set layout in the descriptor set or you need to copy
|
||||
/// all of the relevant information. Storing a pointer is a lot cheaper.
|
||||
///
|
||||
/// Because descriptor set layout lifetimes and descriptor set lifetimes are
|
||||
/// not guaranteed to coincide, we have to reference count if we're going to
|
||||
/// do this.
|
||||
ref_count: std.atomic.Value(usize),
|
||||
|
||||
vtable: *const VTable,
|
||||
|
||||
@@ -1957,20 +1957,14 @@ pub export fn strollCmdPipelineBarrier(
|
||||
) catch |err| return errorLogger(err);
|
||||
}
|
||||
|
||||
pub export fn strollCmdPushConstants(p_cmd: vk.CommandBuffer, layout: vk.PipelineLayout, flags: vk.ShaderStageFlags, offset: u32, size: u32, values: *const anyopaque) callconv(vk.vulkan_call_conv) void {
|
||||
pub export fn strollCmdPushConstants(p_cmd: vk.CommandBuffer, layout: vk.PipelineLayout, flags: vk.ShaderStageFlags, offset: u32, size: u32, data: [*]const u8) callconv(vk.vulkan_call_conv) void {
|
||||
entryPointBeginLogTrace(.vkCmdPushConstants);
|
||||
defer entryPointEndLogTrace();
|
||||
|
||||
const cmd = Dispatchable(CommandBuffer).fromHandleObject(p_cmd) catch |err| return errorLogger(err);
|
||||
cmd.pushConstants(flags, offset, data[0..size]) catch |err| return errorLogger(err);
|
||||
|
||||
notImplementedWarning();
|
||||
|
||||
_ = cmd;
|
||||
_ = layout;
|
||||
_ = flags;
|
||||
_ = offset;
|
||||
_ = size;
|
||||
_ = values;
|
||||
_ = layout; // Pipelines embed their layout which is more trustworthy
|
||||
}
|
||||
|
||||
pub export fn strollCmdResetQueryPool(p_cmd: vk.CommandBuffer, p_pool: vk.QueryPool, first: u32, count: u32) callconv(vk.vulkan_call_conv) void {
|
||||
|
||||
Reference in New Issue
Block a user