mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-14 07:46:12 +03:00
renderer/opengl: some comments
This commit is contained in:
@ -1438,6 +1438,7 @@ pub fn drawFrame(self: *OpenGL, surface: *apprt.Surface) !void {
|
||||
}
|
||||
}
|
||||
|
||||
/// Draw the custom shaders.
|
||||
fn drawCustomPrograms(
|
||||
self: *OpenGL,
|
||||
custom_state: *custom.State,
|
||||
@ -1456,13 +1457,7 @@ fn drawCustomPrograms(
|
||||
// Bind our cell program state, buffers
|
||||
const bind = try program.bind();
|
||||
defer bind.unbind();
|
||||
|
||||
try gl.drawElementsInstanced(
|
||||
gl.c.GL_TRIANGLES,
|
||||
6,
|
||||
gl.c.GL_UNSIGNED_BYTE,
|
||||
1,
|
||||
);
|
||||
try bind.draw();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,7 @@ const log = std.log.scoped(.opengl_custom);
|
||||
const UNIFORM_INDEX: gl.c.GLuint = 0;
|
||||
const UNIFORM_BINDING: gl.c.GLuint = 0;
|
||||
|
||||
/// Global uniforms for custom shaders.
|
||||
pub const Uniforms = extern struct {
|
||||
resolution: [3]f32 align(16) = .{ 0, 0, 0 },
|
||||
time: f32 align(4) = 1,
|
||||
@ -23,7 +24,13 @@ pub const Uniforms = extern struct {
|
||||
sample_rate: f32 align(4) = 1,
|
||||
};
|
||||
|
||||
/// The state associated with custom shaders.
|
||||
/// The state associated with custom shaders. This should only be initialized
|
||||
/// if there is at least one custom shader.
|
||||
///
|
||||
/// To use this, the main terminal shader should render to the framebuffer
|
||||
/// specified by "fbo". The resulting "fb_texture" will contain the color
|
||||
/// attachment. This is then used as the iChannel0 input to the custom
|
||||
/// shader.
|
||||
pub const State = struct {
|
||||
/// The uniform data
|
||||
uniforms: Uniforms,
|
||||
@ -40,12 +47,14 @@ pub const State = struct {
|
||||
|
||||
/// The last time the frame was drawn. This is used to update
|
||||
/// the time uniform.
|
||||
last_frame_time: std.time.Instant,
|
||||
first_frame_time: std.time.Instant,
|
||||
|
||||
pub fn init(
|
||||
alloc: Allocator,
|
||||
srcs: []const [:0]const u8,
|
||||
) !State {
|
||||
if (srcs.len == 0) return error.OneCustomShaderRequired;
|
||||
|
||||
// Create our programs
|
||||
var programs = std.ArrayList(Program).init(alloc);
|
||||
defer programs.deinit();
|
||||
@ -126,7 +135,7 @@ pub const State = struct {
|
||||
.vao = vao,
|
||||
.ebo = ebo,
|
||||
.fb_texture = fb_tex,
|
||||
.last_frame_time = try std.time.Instant.now(),
|
||||
.first_frame_time = try std.time.Instant.now(),
|
||||
};
|
||||
}
|
||||
|
||||
@ -169,8 +178,8 @@ pub const State = struct {
|
||||
/// this.
|
||||
pub fn newFrame(self: *State) !void {
|
||||
// Update our frame time
|
||||
const now = std.time.Instant.now() catch self.last_frame_time;
|
||||
const since_ns: f32 = @floatFromInt(now.since(self.last_frame_time));
|
||||
const now = std.time.Instant.now() catch self.first_frame_time;
|
||||
const since_ns: f32 = @floatFromInt(now.since(self.first_frame_time));
|
||||
self.uniforms.time = since_ns / std.time.ns_per_s;
|
||||
self.uniforms.time_delta = since_ns / std.time.ns_per_s;
|
||||
|
||||
@ -249,6 +258,8 @@ pub const Program = struct {
|
||||
self.program.destroy();
|
||||
}
|
||||
|
||||
/// Bind the program for use. This should be called so that draw can
|
||||
/// be called.
|
||||
pub fn bind(self: *const Program) !Binding {
|
||||
const program = try self.program.use();
|
||||
errdefer program.unbind();
|
||||
@ -264,5 +275,15 @@ pub const Program = struct {
|
||||
pub fn unbind(self: Binding) void {
|
||||
self.program.unbind();
|
||||
}
|
||||
|
||||
pub fn draw(self: Binding) !void {
|
||||
_ = self;
|
||||
try gl.drawElementsInstanced(
|
||||
gl.c.GL_TRIANGLES,
|
||||
6,
|
||||
gl.c.GL_UNSIGNED_BYTE,
|
||||
1,
|
||||
);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
@ -1,28 +0,0 @@
|
||||
#version 430 core
|
||||
|
||||
layout(binding = 0, std140) uniform Globals
|
||||
{
|
||||
vec3 iResolution;
|
||||
float iTime;
|
||||
float iTimeDelta;
|
||||
float iFrameRate;
|
||||
int iFrame;
|
||||
float iChannelTime[4];
|
||||
vec3 iChannelResolution[4];
|
||||
vec4 iMouse;
|
||||
vec4 iDate;
|
||||
float iSampleRate;
|
||||
} _89;
|
||||
|
||||
layout(binding = 1) uniform sampler2D iChannel0;
|
||||
|
||||
layout(location = 0) out vec4 _fragColor;
|
||||
|
||||
void main() {
|
||||
// red
|
||||
_fragColor = vec4(_89.iSampleRate, 0.0, 0.0, 1.0);
|
||||
|
||||
// maze
|
||||
//vec4 I = gl_FragCoord;
|
||||
//_fragColor = vec4(3)*modf(I*.1,I)[int(length(I)*1e4)&1];
|
||||
}
|
Reference in New Issue
Block a user