mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
use main buffer and copy data to fbo texture (opengl) (#5294)
NEEDS REVIEW continuation of #5037 resolves #4729 renders all shaders to the default buffer and then copies it to the designated custom shader texture. this is a draft pr because: - it introduces a new shader "pipeline" which doesnt fit in with how the system was designed to work (which is only rendering to the fbo) - im not sure if this is the best way to achieve shaders being able to sample their output while also drawing to the screen. the cusom fbo (previous implementation) was useful in that it modularized the custom shader stage in rendering --------- Co-authored-by: Mitchell Hashimoto <m@mitchellh.com>
This commit is contained in:
@ -162,4 +162,26 @@ pub const Binding = struct {
|
|||||||
data,
|
data,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn copySubImage2D(
|
||||||
|
b: Binding,
|
||||||
|
level: c.GLint,
|
||||||
|
xoffset: c.GLint,
|
||||||
|
yoffset: c.GLint,
|
||||||
|
x: c.GLint,
|
||||||
|
y: c.GLint,
|
||||||
|
width: c.GLsizei,
|
||||||
|
height: c.GLsizei,
|
||||||
|
) !void {
|
||||||
|
glad.context.CopyTexSubImage2D.?(
|
||||||
|
@intFromEnum(b.target),
|
||||||
|
level,
|
||||||
|
xoffset,
|
||||||
|
yoffset,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
@ -2363,26 +2363,12 @@ fn drawCustomPrograms(self: *OpenGL, custom_state: *custom.State) !void {
|
|||||||
// Setup the new frame
|
// Setup the new frame
|
||||||
try custom_state.newFrame();
|
try custom_state.newFrame();
|
||||||
|
|
||||||
// To allow programs to retrieve each other via a texture
|
|
||||||
// then we must render the next shaders to the screen fbo.
|
|
||||||
// However, the first shader must be run while the default fbo
|
|
||||||
// is attached
|
|
||||||
{
|
|
||||||
const bind = try custom_state.programs[0].bind();
|
|
||||||
defer bind.unbind();
|
|
||||||
try bind.draw();
|
|
||||||
if (custom_state.programs.len == 1) return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const fbobind = try custom_state.fbo.bind(.framebuffer);
|
|
||||||
defer fbobind.unbind();
|
|
||||||
|
|
||||||
// Go through each custom shader and draw it.
|
// Go through each custom shader and draw it.
|
||||||
for (custom_state.programs[1..]) |program| {
|
for (custom_state.programs) |program| {
|
||||||
// Bind our cell program state, buffers
|
|
||||||
const bind = try program.bind();
|
const bind = try program.bind();
|
||||||
defer bind.unbind();
|
defer bind.unbind();
|
||||||
try bind.draw();
|
try bind.draw();
|
||||||
|
try custom_state.copyFramebuffer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,6 +230,21 @@ pub const State = struct {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Copy the fbo's attached texture to the backbuffer.
|
||||||
|
pub fn copyFramebuffer(self: *State) !void {
|
||||||
|
const texbind = try self.fb_texture.bind(.@"2D");
|
||||||
|
errdefer texbind.unbind();
|
||||||
|
try texbind.copySubImage2D(
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
@intFromFloat(self.uniforms.resolution[0]),
|
||||||
|
@intFromFloat(self.uniforms.resolution[1]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
pub const Binding = struct {
|
pub const Binding = struct {
|
||||||
vao: gl.VertexArray.Binding,
|
vao: gl.VertexArray.Binding,
|
||||||
ebo: gl.Buffer.Binding,
|
ebo: gl.Buffer.Binding,
|
||||||
|
Reference in New Issue
Block a user