mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-14 15:56:13 +03:00
renderer/opengl: start custom program work
This commit is contained in:
@ -22,6 +22,7 @@ const math = @import("../math.zig");
|
|||||||
const Surface = @import("../Surface.zig");
|
const Surface = @import("../Surface.zig");
|
||||||
|
|
||||||
const CellProgram = @import("opengl/CellProgram.zig");
|
const CellProgram = @import("opengl/CellProgram.zig");
|
||||||
|
const CustomProgram = @import("opengl/CustomProgram.zig");
|
||||||
|
|
||||||
const log = std.log.scoped(.grid);
|
const log = std.log.scoped(.grid);
|
||||||
|
|
||||||
@ -296,7 +297,7 @@ pub fn init(alloc: Allocator, options: renderer.Options) !OpenGL {
|
|||||||
pub fn deinit(self: *OpenGL) void {
|
pub fn deinit(self: *OpenGL) void {
|
||||||
self.font_shaper.deinit();
|
self.font_shaper.deinit();
|
||||||
|
|
||||||
if (self.gl_state) |*v| v.deinit();
|
if (self.gl_state) |*v| v.deinit(self.alloc);
|
||||||
|
|
||||||
self.cells.deinit(self.alloc);
|
self.cells.deinit(self.alloc);
|
||||||
self.cells_bg.deinit(self.alloc);
|
self.cells_bg.deinit(self.alloc);
|
||||||
@ -370,7 +371,7 @@ pub fn displayUnrealized(self: *OpenGL) void {
|
|||||||
defer if (single_threaded_draw) self.draw_mutex.unlock();
|
defer if (single_threaded_draw) self.draw_mutex.unlock();
|
||||||
|
|
||||||
if (self.gl_state) |*v| {
|
if (self.gl_state) |*v| {
|
||||||
v.deinit();
|
v.deinit(self.alloc);
|
||||||
self.gl_state = null;
|
self.gl_state = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -392,7 +393,7 @@ pub fn displayRealize(self: *OpenGL) !void {
|
|||||||
errdefer gl_state.deinit();
|
errdefer gl_state.deinit();
|
||||||
|
|
||||||
// Unrealize if we have to
|
// Unrealize if we have to
|
||||||
if (self.gl_state) |*v| v.deinit();
|
if (self.gl_state) |*v| v.deinit(self.alloc);
|
||||||
|
|
||||||
// Set our new state
|
// Set our new state
|
||||||
self.gl_state = gl_state;
|
self.gl_state = gl_state;
|
||||||
@ -1512,6 +1513,7 @@ const GLState = struct {
|
|||||||
cell_program: CellProgram,
|
cell_program: CellProgram,
|
||||||
texture: gl.Texture,
|
texture: gl.Texture,
|
||||||
texture_color: gl.Texture,
|
texture_color: gl.Texture,
|
||||||
|
custom_programs: []const CustomProgram,
|
||||||
|
|
||||||
pub fn init(
|
pub fn init(
|
||||||
alloc: Allocator,
|
alloc: Allocator,
|
||||||
@ -1532,12 +1534,11 @@ const GLState = struct {
|
|||||||
break :err &.{};
|
break :err &.{};
|
||||||
};
|
};
|
||||||
|
|
||||||
if (custom_shaders.len > 0) {
|
// Create our custom programs
|
||||||
const cp = try gl.Program.createVF(
|
const custom_programs = try CustomProgram.createList(alloc, custom_shaders);
|
||||||
@embedFile("shaders/custom.v.glsl"),
|
errdefer {
|
||||||
custom_shaders[0],
|
for (custom_programs) |p| p.deinit();
|
||||||
);
|
alloc.free(custom_programs);
|
||||||
_ = cp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Blending for text. We use GL_ONE here because we should be using
|
// Blending for text. We use GL_ONE here because we should be using
|
||||||
@ -1595,12 +1596,15 @@ const GLState = struct {
|
|||||||
|
|
||||||
return .{
|
return .{
|
||||||
.cell_program = cell_program,
|
.cell_program = cell_program,
|
||||||
|
.custom_programs = custom_programs,
|
||||||
.texture = tex,
|
.texture = tex,
|
||||||
.texture_color = tex_color,
|
.texture_color = tex_color,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn deinit(self: *GLState) void {
|
pub fn deinit(self: *GLState, alloc: Allocator) void {
|
||||||
|
for (self.custom_programs) |p| p.deinit();
|
||||||
|
alloc.free(self.custom_programs);
|
||||||
self.texture.destroy();
|
self.texture.destroy();
|
||||||
self.texture_color.destroy();
|
self.texture_color.destroy();
|
||||||
self.cell_program.deinit();
|
self.cell_program.deinit();
|
||||||
|
@ -69,6 +69,7 @@ pub fn init() !CellProgram {
|
|||||||
@embedFile("../shaders/cell.v.glsl"),
|
@embedFile("../shaders/cell.v.glsl"),
|
||||||
@embedFile("../shaders/cell.f.glsl"),
|
@embedFile("../shaders/cell.f.glsl"),
|
||||||
);
|
);
|
||||||
|
errdefer program.destroy();
|
||||||
|
|
||||||
// Set our cell dimensions
|
// Set our cell dimensions
|
||||||
const pbind = try program.use();
|
const pbind = try program.use();
|
||||||
|
36
src/renderer/opengl/CustomProgram.zig
Normal file
36
src/renderer/opengl/CustomProgram.zig
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/// The OpenGL program for custom shaders.
|
||||||
|
const CustomProgram = @This();
|
||||||
|
|
||||||
|
const std = @import("std");
|
||||||
|
const Allocator = std.mem.Allocator;
|
||||||
|
const gl = @import("opengl");
|
||||||
|
|
||||||
|
program: gl.Program,
|
||||||
|
|
||||||
|
pub fn createList(alloc: Allocator, srcs: []const [:0]const u8) ![]const CustomProgram {
|
||||||
|
var programs = std.ArrayList(CustomProgram).init(alloc);
|
||||||
|
defer programs.deinit();
|
||||||
|
errdefer for (programs.items) |program| program.deinit();
|
||||||
|
|
||||||
|
for (srcs) |src| {
|
||||||
|
try programs.append(try CustomProgram.init(src));
|
||||||
|
}
|
||||||
|
|
||||||
|
return try programs.toOwnedSlice();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn init(src: [:0]const u8) !CustomProgram {
|
||||||
|
const program = try gl.Program.createVF(
|
||||||
|
@embedFile("../shaders/custom.v.glsl"),
|
||||||
|
src,
|
||||||
|
);
|
||||||
|
errdefer program.destroy();
|
||||||
|
|
||||||
|
return .{
|
||||||
|
.program = program,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn deinit(self: CustomProgram) void {
|
||||||
|
self.program.destroy();
|
||||||
|
}
|
Reference in New Issue
Block a user