saving
This commit is contained in:
parent
8c59117ccd
commit
22d3322867
|
|
@ -9,6 +9,13 @@ struct Output
|
||||||
float4 Position : SV_Position;
|
float4 Position : SV_Position;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Scene
|
||||||
|
{
|
||||||
|
float3 color;
|
||||||
|
};
|
||||||
|
|
||||||
|
StructuredBuffer<Scene> test: register(t0, space0);
|
||||||
|
|
||||||
Output main(Input input)
|
Output main(Input input)
|
||||||
{
|
{
|
||||||
Output output;
|
Output output;
|
||||||
|
|
@ -16,21 +23,21 @@ Output main(Input input)
|
||||||
if (input.VertexIndex == 0)
|
if (input.VertexIndex == 0)
|
||||||
{
|
{
|
||||||
pos = (-1.0f).xx;
|
pos = (-1.0f).xx;
|
||||||
output.Color = float4(1.0f, 0.0f, 0.0f, 1.0f);
|
output.Color = float4(test[0].color, 1.0f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (input.VertexIndex == 1)
|
if (input.VertexIndex == 1)
|
||||||
{
|
{
|
||||||
pos = float2(1.0f, -1.0f);
|
pos = float2(1.0f, -1.0f);
|
||||||
output.Color = float4(0.0f, 1.0f, 0.0f, 1.0f);
|
output.Color = float4(test[1].color, 1.0f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (input.VertexIndex == 2)
|
if (input.VertexIndex == 2)
|
||||||
{
|
{
|
||||||
pos = float2(0.0f, 1.0f);
|
pos = float2(0.0f, 1.0f);
|
||||||
output.Color = float4(0.0f, 0.0f, 1.0f, 1.0f);
|
output.Color = float4(test[2].color, 1.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -838,8 +838,8 @@ pub const GPUDevice = opaque {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SDL_MapGPUTransferBuffer
|
// SDL_MapGPUTransferBuffer
|
||||||
pub inline fn mapGPUTransferBuffer(device: *GPUDevice, transfer_buffer: *GPUTransferBuffer, cycle: bool) [*c]void {
|
pub inline fn mapGPUTransferBuffer(device: *GPUDevice, transfer_buffer: *GPUTransferBuffer, cycle: bool) [*c]u8 {
|
||||||
return @bitCast(c.SDL_MapGPUTransferBuffer(@ptrCast(device), @ptrCast(transfer_buffer), cycle));
|
return @ptrCast(c.SDL_MapGPUTransferBuffer(@ptrCast(device), @ptrCast(transfer_buffer), cycle));
|
||||||
}
|
}
|
||||||
|
|
||||||
// SDL_UnmapGPUTransferBuffer
|
// SDL_UnmapGPUTransferBuffer
|
||||||
|
|
|
||||||
|
|
@ -11,11 +11,15 @@ window: *sdl3.Window = undefined,
|
||||||
device: *gpu.GPUDevice = undefined,
|
device: *gpu.GPUDevice = undefined,
|
||||||
shaderpath: []const u8 = undefined,
|
shaderpath: []const u8 = undefined,
|
||||||
shadersuffix: []const u8 = undefined,
|
shadersuffix: []const u8 = undefined,
|
||||||
|
entrypoint: []const u8 = "main",
|
||||||
fragment: *gpu.GPUShader = undefined,
|
fragment: *gpu.GPUShader = undefined,
|
||||||
vertex: *gpu.GPUShader = undefined,
|
vertex: *gpu.GPUShader = undefined,
|
||||||
pipeline: *gpu.GPUGraphicsPipeline = undefined,
|
pipeline: *gpu.GPUGraphicsPipeline = undefined,
|
||||||
shaderformat: gpu.GPUShaderFormat = undefined,
|
shaderformat: gpu.GPUShaderFormat = undefined,
|
||||||
|
|
||||||
|
colorBuffer: *gpu.GPUBuffer = undefined,
|
||||||
|
colorBufferTransfer: *gpu.GPUTransferBuffer = undefined,
|
||||||
|
|
||||||
pub fn create(allocator: std.mem.Allocator) !*@This() {
|
pub fn create(allocator: std.mem.Allocator) !*@This() {
|
||||||
const self = try allocator.create(@This());
|
const self = try allocator.create(@This());
|
||||||
self.* = .{
|
self.* = .{
|
||||||
|
|
@ -52,6 +56,7 @@ pub fn startContext(self: *@This()) !void {
|
||||||
} else if (formats.shaderformatMsl) {
|
} else if (formats.shaderformatMsl) {
|
||||||
self.shaderpath = "./content/_cooked/msl"; // shaderformatSpirv
|
self.shaderpath = "./content/_cooked/msl"; // shaderformatSpirv
|
||||||
self.shadersuffix = ".msl";
|
self.shadersuffix = ".msl";
|
||||||
|
self.entrypoint = "main0";
|
||||||
self.shaderformat = .{ .shaderformatMsl = true };
|
self.shaderformat = .{ .shaderformatMsl = true };
|
||||||
} else if (formats.shaderformatDxil) {
|
} else if (formats.shaderformatDxil) {
|
||||||
self.shaderpath = "./content/_cooked/dxil"; // shaderformatSpirv
|
self.shaderpath = "./content/_cooked/dxil"; // shaderformatSpirv
|
||||||
|
|
@ -59,8 +64,8 @@ pub fn startContext(self: *@This()) !void {
|
||||||
self.shaderformat = .{ .shaderformatDxil = true };
|
self.shaderformat = .{ .shaderformatDxil = true };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.vertex = try self.loadShader("hello-triangle.vert", .shaderstageVertex, 0, 0, 1, 0);
|
||||||
self.fragment = try self.loadShader("hello-triangle.frag", .shaderstageFragment, 0, 0, 0, 0);
|
self.fragment = try self.loadShader("hello-triangle.frag", .shaderstageFragment, 0, 0, 0, 0);
|
||||||
self.vertex = try self.loadShader("hello-triangle.vert", .shaderstageVertex, 0, 0, 0, 0);
|
|
||||||
|
|
||||||
var pci = std.mem.zeroes(gpu.GPUGraphicsPipelineCreateInfo);
|
var pci = std.mem.zeroes(gpu.GPUGraphicsPipelineCreateInfo);
|
||||||
pci.fragment_shader = self.fragment;
|
pci.fragment_shader = self.fragment;
|
||||||
|
|
@ -76,6 +81,44 @@ pub fn startContext(self: *@This()) !void {
|
||||||
|
|
||||||
pci.rasterizer_state.fill_mode = .fillmodeFill;
|
pci.rasterizer_state.fill_mode = .fillmodeFill;
|
||||||
self.pipeline = self.device.createGPUGraphicsPipeline(&pci);
|
self.pipeline = self.device.createGPUGraphicsPipeline(&pci);
|
||||||
|
|
||||||
|
self.colorBuffer = self.device.createGPUBuffer(&.{
|
||||||
|
.usage = .{ .bufferusageVertex = true },
|
||||||
|
.size = 8192 * 2,
|
||||||
|
.props = 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
self.colorBufferTransfer = self.device.createGPUTransferBuffer(&.{
|
||||||
|
.usage = .transferbufferusageUpload,
|
||||||
|
.size = 8192 * 2,
|
||||||
|
.props = 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
{
|
||||||
|
const buffer = self.device.mapGPUTransferBuffer(self.colorBufferTransfer, true);
|
||||||
|
|
||||||
|
var b: [*][3]f32 = @ptrCast(@alignCast(buffer));
|
||||||
|
|
||||||
|
b[0] = .{ 1.0, 0.0, 0.0 };
|
||||||
|
b[1] = .{ 1.0, 1.0, 0.0 };
|
||||||
|
b[2] = .{ 1.0, 0.0, 1.0 };
|
||||||
|
self.device.unmapGPUTransferBuffer(self.colorBufferTransfer);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const cmd = self.device.acquireGPUCommandBuffer();
|
||||||
|
defer _ = cmd.submitGPUCommandBufferAndAcquireFence();
|
||||||
|
|
||||||
|
{
|
||||||
|
const copyPass = cmd.beginGPUCopyPass();
|
||||||
|
defer copyPass.endGPUCopyPass();
|
||||||
|
copyPass.uploadToGPUBuffer(&.{ .transfer_buffer = self.colorBufferTransfer, .offset = 0 }, &.{
|
||||||
|
.buffer = self.colorBuffer,
|
||||||
|
.offset = 0,
|
||||||
|
.size = 4 * 12,
|
||||||
|
}, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn loadFileAlloc(filename: []const u8, comptime alignment: usize, allocator: std.mem.Allocator) ![]u8 {
|
pub fn loadFileAlloc(filename: []const u8, comptime alignment: usize, allocator: std.mem.Allocator) ![]u8 {
|
||||||
|
|
@ -107,7 +150,7 @@ pub fn loadShader(
|
||||||
defer self.allocator.free(fileContents);
|
defer self.allocator.free(fileContents);
|
||||||
const sci = gpu.GPUShaderCreateInfo{
|
const sci = gpu.GPUShaderCreateInfo{
|
||||||
.code = @ptrCast(fileContents.ptr),
|
.code = @ptrCast(fileContents.ptr),
|
||||||
.entrypoint = "main",
|
.entrypoint = @ptrCast(self.entrypoint.ptr),
|
||||||
.format = self.shaderformat,
|
.format = self.shaderformat,
|
||||||
.code_size = fileContents.len - 1,
|
.code_size = fileContents.len - 1,
|
||||||
.stage = stage,
|
.stage = stage,
|
||||||
|
|
@ -141,7 +184,6 @@ fn update(self: *@This(), dt: f64) void {
|
||||||
|
|
||||||
self.draw(dt);
|
self.draw(dt);
|
||||||
}
|
}
|
||||||
std.debug.print("frameTime: {d}ms ({d}fps)\n", .{ dt * 1000, 1 / dt });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn draw(self: *@This(), dt: f64) void {
|
pub fn draw(self: *@This(), dt: f64) void {
|
||||||
|
|
@ -157,6 +199,7 @@ pub fn draw(self: *@This(), dt: f64) void {
|
||||||
|
|
||||||
const renderpass = cmd.beginGPURenderPass(&targetInfo, 1, null);
|
const renderpass = cmd.beginGPURenderPass(&targetInfo, 1, null);
|
||||||
renderpass.bindGPUGraphicsPipeline(self.pipeline);
|
renderpass.bindGPUGraphicsPipeline(self.pipeline);
|
||||||
|
renderpass.bindGPUVertexStorageBuffers(0, &self.colorBuffer, 1);
|
||||||
renderpass.setGPUScissor(&self.scissor);
|
renderpass.setGPUScissor(&self.scissor);
|
||||||
renderpass.drawGPUPrimitives(3, 1, 0, 0);
|
renderpass.drawGPUPrimitives(3, 1, 0, 0);
|
||||||
renderpass.endGPURenderPass();
|
renderpass.endGPURenderPass();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue