Compare commits
2 Commits
49267e629f
...
tabletop
Author | SHA1 | Date | |
---|---|---|---|
|
0658c2fdfa | ||
|
9d3a98b2d9 |
@@ -29,13 +29,14 @@ pub fn load(path: []const u8, alloc: std.mem.Allocator) Assets.LoadError!@This()
|
|||||||
const bytes_per_pixel = 4;
|
const bytes_per_pixel = 4;
|
||||||
const mip_level = if (std.math.isPowerOfTwo(width) and width == height) @as(u32, Graphics.MIP_LEVEL) else @as(u32, 1);
|
const mip_level = if (std.math.isPowerOfTwo(width) and width == height) @as(u32, Graphics.MIP_LEVEL) else @as(u32, 1);
|
||||||
|
|
||||||
const texture = Graphics.createTexture(
|
const texture = sdl.CreateGPUTexture(Graphics.device, &.{
|
||||||
width,
|
.width = width,
|
||||||
height,
|
.height = height,
|
||||||
target_format,
|
.layer_count_or_depth = 1,
|
||||||
sdl.GPU_TEXTUREUSAGE_SAMPLER | sdl.GPU_TEXTUREUSAGE_COLOR_TARGET,
|
.format = target_format,
|
||||||
mip_level,
|
.usage = sdl.GPU_TEXTUREUSAGE_SAMPLER | sdl.GPU_TEXTUREUSAGE_COLOR_TARGET,
|
||||||
);
|
.num_levels = mip_level,
|
||||||
|
}) orelse err.sdl();
|
||||||
errdefer Graphics.freeTexture(texture);
|
errdefer Graphics.freeTexture(texture);
|
||||||
|
|
||||||
const transfer_buffer_capacity = Graphics.TRANSFER_BUFFER_DEFAULT_CAPACITY;
|
const transfer_buffer_capacity = Graphics.TRANSFER_BUFFER_DEFAULT_CAPACITY;
|
||||||
|
249
src/graphics.zig
249
src/graphics.zig
@@ -2,6 +2,7 @@ const std = @import("std");
|
|||||||
const sdl = @import("sdl");
|
const sdl = @import("sdl");
|
||||||
const err = @import("error.zig");
|
const err = @import("error.zig");
|
||||||
const presets = @import("graphics/presets.zig");
|
const presets = @import("graphics/presets.zig");
|
||||||
|
const Game = @import("game.zig");
|
||||||
const Assets = @import("assets.zig");
|
const Assets = @import("assets.zig");
|
||||||
|
|
||||||
pub const Transform = @import("graphics/transform.zig");
|
pub const Transform = @import("graphics/transform.zig");
|
||||||
@@ -13,21 +14,20 @@ pub var device: *sdl.GPUDevice = undefined;
|
|||||||
var command_buffer: ?*sdl.GPUCommandBuffer = null;
|
var command_buffer: ?*sdl.GPUCommandBuffer = null;
|
||||||
var render_pass: ?*sdl.GPURenderPass = null;
|
var render_pass: ?*sdl.GPURenderPass = null;
|
||||||
var render_target: ?*sdl.GPUTexture = null;
|
var render_target: ?*sdl.GPUTexture = null;
|
||||||
var render_fsaa: bool = undefined;
|
var batches: Batches = undefined;
|
||||||
|
|
||||||
var shader_vert: *sdl.GPUShader = undefined;
|
var shader_vert: *sdl.GPUShader = undefined;
|
||||||
var shader_frag: *sdl.GPUShader = undefined;
|
var shader_frag: *sdl.GPUShader = undefined;
|
||||||
|
|
||||||
var depth_texture: *sdl.GPUTexture = undefined;
|
var depth_texture: *sdl.GPUTexture = undefined;
|
||||||
var fsaa_target: *sdl.GPUTexture = undefined;
|
var antialias: Antialias = undefined;
|
||||||
|
var aa_target: *sdl.GPUTexture = undefined;
|
||||||
var pipeline: *sdl.GPUGraphicsPipeline = undefined;
|
var pipeline: *sdl.GPUGraphicsPipeline = undefined;
|
||||||
|
|
||||||
pub var window_width: u32 = undefined;
|
pub var window_width: u32 = undefined;
|
||||||
pub var window_height: u32 = undefined;
|
pub var window_height: u32 = undefined;
|
||||||
pub var pixel_width: u32 = undefined;
|
pub var pixel_width: u32 = undefined;
|
||||||
pub var pixel_height: u32 = undefined;
|
pub var pixel_height: u32 = undefined;
|
||||||
var fsaa_scale: u32 = 4;
|
|
||||||
var fsaa_level: u32 = 3;
|
|
||||||
var render_width: u32 = undefined;
|
var render_width: u32 = undefined;
|
||||||
var render_height: u32 = undefined;
|
var render_height: u32 = undefined;
|
||||||
|
|
||||||
@@ -38,6 +38,53 @@ const DEPTH_FORMAT = sdl.GPU_TEXTUREFORMAT_D32_FLOAT;
|
|||||||
pub const TRANSFER_BUFFER_DEFAULT_CAPACITY = 512 * 1024;
|
pub const TRANSFER_BUFFER_DEFAULT_CAPACITY = 512 * 1024;
|
||||||
pub const MIP_LEVEL = 4;
|
pub const MIP_LEVEL = 4;
|
||||||
|
|
||||||
|
const Antialias = union(enum) {
|
||||||
|
none,
|
||||||
|
msaa: enum(sdl.GPUSampleCount) {
|
||||||
|
@"2" = sdl.GPU_SAMPLECOUNT_2,
|
||||||
|
@"4" = sdl.GPU_SAMPLECOUNT_4,
|
||||||
|
@"8" = sdl.GPU_SAMPLECOUNT_8,
|
||||||
|
},
|
||||||
|
fsaa: enum {
|
||||||
|
@"2",
|
||||||
|
@"4",
|
||||||
|
@"8",
|
||||||
|
},
|
||||||
|
|
||||||
|
pub fn getMsaaSamples(self: @This()) sdl.GPUSampleCount {
|
||||||
|
if (self != .msaa) return sdl.GPU_SAMPLECOUNT_1;
|
||||||
|
return @intFromEnum(self.msaa);
|
||||||
|
}
|
||||||
|
pub fn getFsaaScale(self: @This()) u8 {
|
||||||
|
if (self != .fsaa) return 1;
|
||||||
|
return switch (self.fsaa) {
|
||||||
|
.@"2" => 2,
|
||||||
|
.@"4" => 4,
|
||||||
|
.@"8" => 8,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
pub fn getFsaaLevel(self: @This()) u8 {
|
||||||
|
if (self != .fsaa) return 1;
|
||||||
|
return switch (self.fsaa) {
|
||||||
|
.@"2" => 2,
|
||||||
|
.@"4" => 3,
|
||||||
|
.@"8" => 4,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const Batch = struct {
|
||||||
|
object: *Assets.Object,
|
||||||
|
transform: Transform,
|
||||||
|
z: f32,
|
||||||
|
|
||||||
|
fn orderLessThan(ctx: void, lhs: Batch, rhs: Batch) bool {
|
||||||
|
_ = ctx;
|
||||||
|
return lhs.z > rhs.z;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const Batches = std.ArrayListUnmanaged(Batch);
|
||||||
|
|
||||||
const Graphics = @This();
|
const Graphics = @This();
|
||||||
pub fn create() void {
|
pub fn create() void {
|
||||||
// Init
|
// Init
|
||||||
@@ -62,6 +109,8 @@ pub fn create() void {
|
|||||||
Graphics.render_width = pixel_width;
|
Graphics.render_width = pixel_width;
|
||||||
Graphics.render_height = pixel_height;
|
Graphics.render_height = pixel_height;
|
||||||
|
|
||||||
|
Graphics.antialias = .none;
|
||||||
|
|
||||||
// Device
|
// Device
|
||||||
Graphics.device = sdl.CreateGPUDevice(
|
Graphics.device = sdl.CreateGPUDevice(
|
||||||
sdl.GPU_SHADERFORMAT_SPIRV,
|
sdl.GPU_SHADERFORMAT_SPIRV,
|
||||||
@@ -95,20 +144,24 @@ pub fn create() void {
|
|||||||
const target_format = sdl.GetGPUSwapchainTextureFormat(Graphics.device, Graphics.window);
|
const target_format = sdl.GetGPUSwapchainTextureFormat(Graphics.device, Graphics.window);
|
||||||
if (target_format == sdl.GPU_TEXTUREFORMAT_INVALID) err.sdl();
|
if (target_format == sdl.GPU_TEXTUREFORMAT_INVALID) err.sdl();
|
||||||
|
|
||||||
Graphics.depth_texture = createTexture(
|
Graphics.depth_texture = sdl.CreateGPUTexture(device, &.{
|
||||||
@as(u32, @intCast(Graphics.render_width)) * Graphics.fsaa_scale,
|
.width = Graphics.render_width * Graphics.antialias.getFsaaScale(),
|
||||||
@as(u32, @intCast(Graphics.render_height)) * Graphics.fsaa_scale,
|
.height = Graphics.render_height * Graphics.antialias.getFsaaScale(),
|
||||||
DEPTH_FORMAT,
|
.layer_count_or_depth = 1,
|
||||||
sdl.GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET,
|
.format = DEPTH_FORMAT,
|
||||||
1,
|
.usage = sdl.GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET,
|
||||||
);
|
.num_levels = 1,
|
||||||
Graphics.fsaa_target = createTexture(
|
.sample_count = Graphics.antialias.getMsaaSamples(),
|
||||||
@as(u32, @intCast(Graphics.render_width)) * Graphics.fsaa_scale,
|
}) orelse err.sdl();
|
||||||
@as(u32, @intCast(Graphics.render_height)) * Graphics.fsaa_scale,
|
Graphics.aa_target = sdl.CreateGPUTexture(device, &.{
|
||||||
target_format,
|
.width = Graphics.render_width * Graphics.antialias.getFsaaScale(),
|
||||||
sdl.GPU_TEXTUREUSAGE_COLOR_TARGET | sdl.GPU_TEXTUREUSAGE_SAMPLER,
|
.height = Graphics.render_height * Graphics.antialias.getFsaaScale(),
|
||||||
fsaa_level,
|
.layer_count_or_depth = 1,
|
||||||
);
|
.format = target_format,
|
||||||
|
.usage = if (Graphics.antialias == .fsaa) sdl.GPU_TEXTUREUSAGE_COLOR_TARGET | sdl.GPU_TEXTUREUSAGE_SAMPLER else sdl.GPU_TEXTUREUSAGE_COLOR_TARGET,
|
||||||
|
.num_levels = Graphics.antialias.getFsaaLevel(),
|
||||||
|
.sample_count = Graphics.antialias.getMsaaSamples(),
|
||||||
|
}) orelse err.sdl();
|
||||||
|
|
||||||
Graphics.pipeline = sdl.CreateGPUGraphicsPipeline(Graphics.device, &.{
|
Graphics.pipeline = sdl.CreateGPUGraphicsPipeline(Graphics.device, &.{
|
||||||
.vertex_shader = Graphics.shader_vert,
|
.vertex_shader = Graphics.shader_vert,
|
||||||
@@ -136,6 +189,9 @@ pub fn create() void {
|
|||||||
},
|
},
|
||||||
.num_vertex_attributes = 2,
|
.num_vertex_attributes = 2,
|
||||||
},
|
},
|
||||||
|
.multisample_state = .{
|
||||||
|
.sample_count = Graphics.antialias.getMsaaSamples(),
|
||||||
|
},
|
||||||
.primitive_type = sdl.GPU_PRIMITIVETYPE_TRIANGLELIST,
|
.primitive_type = sdl.GPU_PRIMITIVETYPE_TRIANGLELIST,
|
||||||
.rasterizer_state = presets.RASTERIZER_CULL,
|
.rasterizer_state = presets.RASTERIZER_CULL,
|
||||||
.depth_stencil_state = presets.DEPTH_ENABLED,
|
.depth_stencil_state = presets.DEPTH_ENABLED,
|
||||||
@@ -150,6 +206,8 @@ pub fn create() void {
|
|||||||
},
|
},
|
||||||
}) orelse err.sdl();
|
}) orelse err.sdl();
|
||||||
|
|
||||||
|
Graphics.batches = Batches.empty;
|
||||||
|
|
||||||
Graphics.camera = Camera{
|
Graphics.camera = Camera{
|
||||||
.transform = .{},
|
.transform = .{},
|
||||||
.near = 1.0 / 16.0,
|
.near = 1.0 / 16.0,
|
||||||
@@ -164,7 +222,7 @@ pub fn destroy() void {
|
|||||||
sdl.DestroyWindow(Graphics.window);
|
sdl.DestroyWindow(Graphics.window);
|
||||||
|
|
||||||
sdl.ReleaseGPUGraphicsPipeline(Graphics.device, Graphics.pipeline);
|
sdl.ReleaseGPUGraphicsPipeline(Graphics.device, Graphics.pipeline);
|
||||||
sdl.ReleaseGPUTexture(Graphics.device, Graphics.fsaa_target);
|
sdl.ReleaseGPUTexture(Graphics.device, Graphics.aa_target);
|
||||||
sdl.ReleaseGPUTexture(Graphics.device, Graphics.depth_texture);
|
sdl.ReleaseGPUTexture(Graphics.device, Graphics.depth_texture);
|
||||||
|
|
||||||
sdl.ReleaseGPUShader(Graphics.device, Graphics.shader_vert);
|
sdl.ReleaseGPUShader(Graphics.device, Graphics.shader_vert);
|
||||||
@@ -175,6 +233,7 @@ pub fn destroy() void {
|
|||||||
Graphics.command_buffer = null;
|
Graphics.command_buffer = null;
|
||||||
}
|
}
|
||||||
sdl.DestroyGPUDevice(Graphics.device);
|
sdl.DestroyGPUDevice(Graphics.device);
|
||||||
|
Graphics.batches.clearAndFree(Game.alloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If window is minimized returns `false`, `render_pass` remains null
|
/// If window is minimized returns `false`, `render_pass` remains null
|
||||||
@@ -195,14 +254,14 @@ pub fn beginDraw() bool {
|
|||||||
Graphics.camera.aspect = @as(f32, @floatFromInt(Graphics.render_width)) / @as(f32, @floatFromInt(Graphics.render_height));
|
Graphics.camera.aspect = @as(f32, @floatFromInt(Graphics.render_width)) / @as(f32, @floatFromInt(Graphics.render_height));
|
||||||
}
|
}
|
||||||
|
|
||||||
Graphics.render_fsaa = Graphics.fsaa_level > 1;
|
|
||||||
Graphics.render_pass = sdl.BeginGPURenderPass(Graphics.command_buffer.?, &.{
|
Graphics.render_pass = sdl.BeginGPURenderPass(Graphics.command_buffer.?, &.{
|
||||||
.clear_color = .{ .r = 0.0, .g = 0.0, .b = 0.0, .a = 1.0 },
|
.clear_color = .{ .r = 0.0, .g = 0.0, .b = 0.0, .a = 1.0 },
|
||||||
.cycle = false,
|
.cycle = false,
|
||||||
.load_op = sdl.GPU_LOADOP_CLEAR,
|
.load_op = sdl.GPU_LOADOP_DONT_CARE,
|
||||||
.store_op = sdl.GPU_STOREOP_STORE,
|
.store_op = if (Graphics.antialias == .msaa) sdl.GPU_STOREOP_RESOLVE else sdl.GPU_STOREOP_STORE,
|
||||||
.mip_level = 0,
|
.mip_level = 0,
|
||||||
.texture = if (Graphics.render_fsaa) Graphics.fsaa_target else Graphics.render_target,
|
.texture = if (Graphics.antialias == .fsaa or Graphics.antialias == .msaa) Graphics.aa_target else Graphics.render_target,
|
||||||
|
.resolve_texture = if (Graphics.antialias == .msaa) Graphics.render_target else null,
|
||||||
}, 1, &.{
|
}, 1, &.{
|
||||||
.clear_depth = 0.0,
|
.clear_depth = 0.0,
|
||||||
.load_op = sdl.GPU_LOADOP_CLEAR,
|
.load_op = sdl.GPU_LOADOP_CLEAR,
|
||||||
@@ -219,34 +278,13 @@ pub fn beginDraw() bool {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clearDepth() void {
|
fn finishPass() void {
|
||||||
sdl.EndGPURenderPass(Graphics.render_pass.?);
|
std.sort.block(Batch, Graphics.batches.items, {}, Batch.orderLessThan);
|
||||||
|
|
||||||
Graphics.render_pass = sdl.BeginGPURenderPass(Graphics.command_buffer.?, &.{
|
for (Graphics.batches.items) |*batch| {
|
||||||
.clear_color = .{ .r = 0.0, .g = 0.0, .b = 0.0, .a = 1.0 },
|
const asset_object = batch.object.get() orelse continue;
|
||||||
.cycle = false,
|
|
||||||
.load_op = sdl.GPU_LOADOP_LOAD,
|
|
||||||
.store_op = sdl.GPU_STOREOP_STORE,
|
|
||||||
.mip_level = 0,
|
|
||||||
.texture = if (Graphics.render_fsaa) Graphics.fsaa_target else Graphics.render_target,
|
|
||||||
}, 1, &.{
|
|
||||||
.clear_depth = 0.0,
|
|
||||||
.load_op = sdl.GPU_LOADOP_CLEAR,
|
|
||||||
.store_op = sdl.GPU_STOREOP_DONT_CARE,
|
|
||||||
.stencil_load_op = sdl.GPU_STOREOP_DONT_CARE,
|
|
||||||
.stencil_store_op = sdl.GPU_STOREOP_DONT_CARE,
|
|
||||||
.texture = Graphics.depth_texture,
|
|
||||||
}) orelse err.sdl();
|
|
||||||
|
|
||||||
sdl.BindGPUGraphicsPipeline(Graphics.render_pass, Graphics.pipeline);
|
sdl.PushGPUVertexUniformData(Graphics.command_buffer, 1, &batch.transform.matrix(), 16 * 4);
|
||||||
sdl.PushGPUVertexUniformData(Graphics.command_buffer, 0, &Graphics.camera.matrix, 16 * 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn drawObject(object: *Assets.Object, transform: Transform) void {
|
|
||||||
if (Graphics.render_pass == null) return;
|
|
||||||
const asset_object = object.get() orelse return;
|
|
||||||
|
|
||||||
sdl.PushGPUVertexUniformData(Graphics.command_buffer, 1, &transform.matrix(), 16 * 4);
|
|
||||||
for (asset_object.nodes) |node| {
|
for (asset_object.nodes) |node| {
|
||||||
const mesh = &asset_object.meshes[node.mesh];
|
const mesh = &asset_object.meshes[node.mesh];
|
||||||
|
|
||||||
@@ -261,22 +299,72 @@ pub fn drawObject(object: *Assets.Object, transform: Transform) void {
|
|||||||
sdl.DrawGPUIndexedPrimitives(Graphics.render_pass, primitive.indices, 1, 0, 0, 0);
|
sdl.DrawGPUIndexedPrimitives(Graphics.render_pass, primitive.indices, 1, 0, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
Graphics.batches.clearRetainingCapacity();
|
||||||
|
|
||||||
|
sdl.EndGPURenderPass(Graphics.render_pass.?);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn clearDepth() void {
|
||||||
|
Graphics.finishPass();
|
||||||
|
|
||||||
|
Graphics.render_pass = sdl.BeginGPURenderPass(Graphics.command_buffer.?, &.{
|
||||||
|
.clear_color = .{ .r = 0.0, .g = 0.0, .b = 0.0, .a = 1.0 },
|
||||||
|
.cycle = false,
|
||||||
|
.load_op = sdl.GPU_LOADOP_LOAD,
|
||||||
|
.store_op = if (Graphics.antialias == .msaa) sdl.GPU_STOREOP_RESOLVE else sdl.GPU_STOREOP_STORE,
|
||||||
|
.mip_level = 0,
|
||||||
|
.texture = if (Graphics.antialias == .fsaa or Graphics.antialias == .msaa) Graphics.aa_target else Graphics.render_target,
|
||||||
|
.resolve_texture = if (Graphics.antialias == .msaa) Graphics.render_target else null,
|
||||||
|
}, 1, &.{
|
||||||
|
.clear_depth = 0.0,
|
||||||
|
.load_op = sdl.GPU_LOADOP_CLEAR,
|
||||||
|
.store_op = sdl.GPU_STOREOP_DONT_CARE,
|
||||||
|
.stencil_load_op = sdl.GPU_STOREOP_DONT_CARE,
|
||||||
|
.stencil_store_op = sdl.GPU_STOREOP_DONT_CARE,
|
||||||
|
.texture = Graphics.depth_texture,
|
||||||
|
}) orelse err.sdl();
|
||||||
|
|
||||||
|
sdl.BindGPUGraphicsPipeline(Graphics.render_pass, Graphics.pipeline);
|
||||||
|
sdl.PushGPUVertexUniformData(Graphics.command_buffer, 0, &Graphics.camera.matrix, 16 * 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
// `object`: pointer MUST be vaild until current render pass ends
|
||||||
|
pub fn drawObject(object: *Assets.Object, transform: Transform) void {
|
||||||
|
if (Graphics.render_pass == null) return;
|
||||||
|
|
||||||
|
@setFloatMode(.optimized);
|
||||||
|
const z = Graphics.camera.matrix[8] * transform.position[0] +
|
||||||
|
Graphics.camera.matrix[9] * transform.position[1] +
|
||||||
|
Graphics.camera.matrix[10] * transform.position[2] +
|
||||||
|
Graphics.camera.matrix[11];
|
||||||
|
var w = Graphics.camera.matrix[12] * transform.position[0] +
|
||||||
|
Graphics.camera.matrix[13] * transform.position[1] +
|
||||||
|
Graphics.camera.matrix[14] * transform.position[2] +
|
||||||
|
Graphics.camera.matrix[15];
|
||||||
|
if (w == 0) w = 1;
|
||||||
|
|
||||||
|
Graphics.batches.append(Game.alloc, .{
|
||||||
|
.object = object,
|
||||||
|
.transform = transform,
|
||||||
|
.z = z / w,
|
||||||
|
}) catch err.oom();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn endDraw() void {
|
pub fn endDraw() void {
|
||||||
defer Graphics.command_buffer = null;
|
defer Graphics.command_buffer = null;
|
||||||
defer Graphics.render_pass = null;
|
defer Graphics.render_pass = null;
|
||||||
if (Graphics.render_pass) |pass| {
|
|
||||||
sdl.EndGPURenderPass(pass);
|
|
||||||
|
|
||||||
if (Graphics.render_fsaa) {
|
Graphics.finishPass();
|
||||||
sdl.GenerateMipmapsForGPUTexture(Graphics.command_buffer, Graphics.fsaa_target);
|
|
||||||
|
if (Graphics.antialias == .fsaa) {
|
||||||
|
sdl.GenerateMipmapsForGPUTexture(Graphics.command_buffer, Graphics.aa_target);
|
||||||
sdl.BlitGPUTexture(Graphics.command_buffer, &.{
|
sdl.BlitGPUTexture(Graphics.command_buffer, &.{
|
||||||
.source = .{
|
.source = .{
|
||||||
.texture = Graphics.fsaa_target,
|
.texture = Graphics.aa_target,
|
||||||
.w = Graphics.render_width,
|
.w = Graphics.render_width,
|
||||||
.h = Graphics.render_height,
|
.h = Graphics.render_height,
|
||||||
.mip_level = fsaa_level - 1,
|
.mip_level = Graphics.antialias.getFsaaLevel() - 1,
|
||||||
},
|
},
|
||||||
.destination = .{
|
.destination = .{
|
||||||
.texture = Graphics.render_target,
|
.texture = Graphics.render_target,
|
||||||
@@ -287,7 +375,6 @@ pub fn endDraw() void {
|
|||||||
.filter = sdl.GPU_FILTER_NEAREST,
|
.filter = sdl.GPU_FILTER_NEAREST,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (!sdl.SubmitGPUCommandBuffer(Graphics.command_buffer)) err.sdl();
|
if (!sdl.SubmitGPUCommandBuffer(Graphics.command_buffer)) err.sdl();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,18 +391,6 @@ fn loadShader(path: []const u8, info: sdl.GPUShaderCreateInfo) *sdl.GPUShader {
|
|||||||
return sdl.CreateGPUShader(device, &updated_info) orelse err.sdl();
|
return sdl.CreateGPUShader(device, &updated_info) orelse err.sdl();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn createTexture(width: u32, height: u32, format: c_uint, usage: c_uint, mip_level: u32) *sdl.GPUTexture {
|
|
||||||
return sdl.CreateGPUTexture(device, &.{
|
|
||||||
.format = format,
|
|
||||||
.layer_count_or_depth = 1,
|
|
||||||
.width = width,
|
|
||||||
.height = height,
|
|
||||||
.num_levels = mip_level,
|
|
||||||
.sample_count = sdl.GPU_SAMPLECOUNT_1,
|
|
||||||
.usage = usage,
|
|
||||||
}) orelse err.sdl();
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn freeTexture(texture: *sdl.GPUTexture) void {
|
pub fn freeTexture(texture: *sdl.GPUTexture) void {
|
||||||
sdl.ReleaseGPUTexture(Graphics.device, texture);
|
sdl.ReleaseGPUTexture(Graphics.device, texture);
|
||||||
}
|
}
|
||||||
@@ -340,24 +415,32 @@ pub fn freeSampler(sampler: *sdl.GPUSampler) void {
|
|||||||
|
|
||||||
fn resetTextures(width: u32, height: u32) void {
|
fn resetTextures(width: u32, height: u32) void {
|
||||||
sdl.ReleaseGPUTexture(Graphics.device, Graphics.depth_texture);
|
sdl.ReleaseGPUTexture(Graphics.device, Graphics.depth_texture);
|
||||||
Graphics.depth_texture = createTexture(
|
Graphics.depth_texture = sdl.CreateGPUTexture(device, &.{
|
||||||
width * Graphics.fsaa_scale,
|
.width = width * Graphics.antialias.getFsaaScale(),
|
||||||
height * Graphics.fsaa_scale,
|
.height = height * Graphics.antialias.getFsaaScale(),
|
||||||
DEPTH_FORMAT,
|
.layer_count_or_depth = 1,
|
||||||
sdl.GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET,
|
.format = DEPTH_FORMAT,
|
||||||
1,
|
.usage = sdl.GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET,
|
||||||
);
|
.num_levels = 1,
|
||||||
|
.sample_count = Graphics.antialias.getMsaaSamples(),
|
||||||
|
}) orelse err.sdl();
|
||||||
|
|
||||||
const target_format = sdl.GetGPUSwapchainTextureFormat(Graphics.device, Graphics.window);
|
const target_format = sdl.GetGPUSwapchainTextureFormat(Graphics.device, Graphics.window);
|
||||||
|
|
||||||
sdl.ReleaseGPUTexture(Graphics.device, Graphics.fsaa_target);
|
sdl.ReleaseGPUTexture(Graphics.device, Graphics.aa_target);
|
||||||
Graphics.fsaa_target = createTexture(
|
Graphics.aa_target = sdl.CreateGPUTexture(device, &.{
|
||||||
width * Graphics.fsaa_scale,
|
.width = width * Graphics.antialias.getFsaaScale(),
|
||||||
height * Graphics.fsaa_scale,
|
.height = height * Graphics.antialias.getFsaaScale(),
|
||||||
target_format,
|
.layer_count_or_depth = 1,
|
||||||
sdl.GPU_TEXTUREUSAGE_COLOR_TARGET | sdl.GPU_TEXTUREUSAGE_SAMPLER,
|
.format = target_format,
|
||||||
fsaa_level,
|
.usage = switch (Graphics.antialias) {
|
||||||
);
|
.none => sdl.GPU_TEXTUREUSAGE_COLOR_TARGET,
|
||||||
|
.fsaa => sdl.GPU_TEXTUREUSAGE_COLOR_TARGET | sdl.GPU_TEXTUREUSAGE_SAMPLER,
|
||||||
|
.msaa => sdl.GPU_TEXTUREUSAGE_COLOR_TARGET,
|
||||||
|
},
|
||||||
|
.num_levels = Graphics.antialias.getFsaaLevel(),
|
||||||
|
.sample_count = Graphics.antialias.getMsaaSamples(),
|
||||||
|
}) orelse err.sdl();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn windowId() sdl.WindowID {
|
pub fn windowId() sdl.WindowID {
|
||||||
|
Reference in New Issue
Block a user