aboutsummaryrefslogtreecommitdiff
path: root/vendor/libghostty-vt/pkg/opengl/Texture.zig
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-04-04 19:22:04 +0300
committerCan Celik <ogulcancelik@gmail.com>2026-04-05 01:23:06 +0300
commit41dd733ca7123c9ac4bfc6c781697a660e95b052 (patch)
tree3fc91815ca139ef2e0b281bba0abda4ef15175f4 /vendor/libghostty-vt/pkg/opengl/Texture.zig
parent55c138263e190a1e79d4b997bfb9397306c0ec1f (diff)
feat: finish ghostty pane backend integration
Diffstat (limited to 'vendor/libghostty-vt/pkg/opengl/Texture.zig')
-rw-r--r--vendor/libghostty-vt/pkg/opengl/Texture.zig221
1 files changed, 221 insertions, 0 deletions
diff --git a/vendor/libghostty-vt/pkg/opengl/Texture.zig b/vendor/libghostty-vt/pkg/opengl/Texture.zig
new file mode 100644
index 00000000..03e79485
--- /dev/null
+++ b/vendor/libghostty-vt/pkg/opengl/Texture.zig
@@ -0,0 +1,221 @@
+const Texture = @This();
+
+const std = @import("std");
+const c = @import("c.zig").c;
+const errors = @import("errors.zig");
+const glad = @import("glad.zig");
+
+id: c.GLuint,
+
+pub fn active(index: c_uint) errors.Error!void {
+ glad.context.ActiveTexture.?(index + c.GL_TEXTURE0);
+ try errors.getError();
+}
+
+/// Create a single texture.
+pub fn create() errors.Error!Texture {
+ var id: c.GLuint = undefined;
+ glad.context.GenTextures.?(1, &id);
+ try errors.getError();
+ return .{ .id = id };
+}
+
+/// glBindTexture
+pub fn bind(v: Texture, target: Target) !Binding {
+ glad.context.BindTexture.?(@intFromEnum(target), v.id);
+ try errors.getError();
+ return .{ .target = target };
+}
+
+pub fn destroy(v: Texture) void {
+ glad.context.DeleteTextures.?(1, &v.id);
+}
+
+/// Enum for possible texture binding targets.
+pub const Target = enum(c_uint) {
+ @"1D" = c.GL_TEXTURE_1D,
+ @"2D" = c.GL_TEXTURE_2D,
+ @"3D" = c.GL_TEXTURE_3D,
+ @"1DArray" = c.GL_TEXTURE_1D_ARRAY,
+ @"2DArray" = c.GL_TEXTURE_2D_ARRAY,
+ Rectangle = c.GL_TEXTURE_RECTANGLE,
+ CubeMap = c.GL_TEXTURE_CUBE_MAP,
+ Buffer = c.GL_TEXTURE_BUFFER,
+ @"2DMultisample" = c.GL_TEXTURE_2D_MULTISAMPLE,
+ @"2DMultisampleArray" = c.GL_TEXTURE_2D_MULTISAMPLE_ARRAY,
+};
+
+/// Enum for possible texture parameters.
+pub const Parameter = enum(c_uint) {
+ BaseLevel = c.GL_TEXTURE_BASE_LEVEL,
+ CompareFunc = c.GL_TEXTURE_COMPARE_FUNC,
+ CompareMode = c.GL_TEXTURE_COMPARE_MODE,
+ LodBias = c.GL_TEXTURE_LOD_BIAS,
+ MinFilter = c.GL_TEXTURE_MIN_FILTER,
+ MagFilter = c.GL_TEXTURE_MAG_FILTER,
+ MinLod = c.GL_TEXTURE_MIN_LOD,
+ MaxLod = c.GL_TEXTURE_MAX_LOD,
+ MaxLevel = c.GL_TEXTURE_MAX_LEVEL,
+ SwizzleR = c.GL_TEXTURE_SWIZZLE_R,
+ SwizzleG = c.GL_TEXTURE_SWIZZLE_G,
+ SwizzleB = c.GL_TEXTURE_SWIZZLE_B,
+ SwizzleA = c.GL_TEXTURE_SWIZZLE_A,
+ WrapS = c.GL_TEXTURE_WRAP_S,
+ WrapT = c.GL_TEXTURE_WRAP_T,
+ WrapR = c.GL_TEXTURE_WRAP_R,
+};
+
+/// Internal format enum for texture images.
+pub const InternalFormat = enum(c_int) {
+ red = c.GL_RED,
+ rgb = c.GL_RGB8,
+ rgba = c.GL_RGBA8,
+
+ srgb = c.GL_SRGB8,
+ srgba = c.GL_SRGB8_ALPHA8,
+
+ rgba_compressed = c.GL_COMPRESSED_RGBA_BPTC_UNORM,
+ srgba_compressed = c.GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM,
+
+ // There are so many more that I haven't filled in.
+ _,
+};
+
+/// Format for texture images
+pub const Format = enum(c_uint) {
+ red = c.GL_RED,
+ rgb = c.GL_RGB,
+ rgba = c.GL_RGBA,
+ bgra = c.GL_BGRA,
+
+ // There are so many more that I haven't filled in.
+ _,
+};
+
+/// Minification filter for textures.
+pub const MinFilter = enum(c_int) {
+ nearest = c.GL_NEAREST,
+ linear = c.GL_LINEAR,
+ nearest_mipmap_nearest = c.GL_NEAREST_MIPMAP_NEAREST,
+ linear_mipmap_nearest = c.GL_LINEAR_MIPMAP_NEAREST,
+ nearest_mipmap_linear = c.GL_NEAREST_MIPMAP_LINEAR,
+ linear_mipmap_linear = c.GL_LINEAR_MIPMAP_LINEAR,
+};
+
+/// Magnification filter for textures.
+pub const MagFilter = enum(c_int) {
+ nearest = c.GL_NEAREST,
+ linear = c.GL_LINEAR,
+};
+
+/// Texture coordinate wrapping mode.
+pub const Wrap = enum(c_int) {
+ clamp_to_edge = c.GL_CLAMP_TO_EDGE,
+ clamp_to_border = c.GL_CLAMP_TO_BORDER,
+ mirrored_repeat = c.GL_MIRRORED_REPEAT,
+ repeat = c.GL_REPEAT,
+};
+
+/// Data type for texture images.
+pub const DataType = enum(c_uint) {
+ UnsignedByte = c.GL_UNSIGNED_BYTE,
+
+ // There are so many more that I haven't filled in.
+ _,
+};
+
+pub const Binding = struct {
+ target: Target,
+
+ pub fn unbind(b: *const Binding) void {
+ glad.context.BindTexture.?(@intFromEnum(b.target), 0);
+ }
+
+ pub fn generateMipmap(b: Binding) void {
+ glad.context.GenerateMipmap.?(@intFromEnum(b.target));
+ }
+
+ pub fn parameter(b: Binding, name: Parameter, value: anytype) errors.Error!void {
+ switch (@TypeOf(value)) {
+ c.GLint => glad.context.TexParameteri.?(
+ @intFromEnum(b.target),
+ @intFromEnum(name),
+ value,
+ ),
+ else => unreachable,
+ }
+ try errors.getError();
+ }
+
+ pub fn image2D(
+ b: Binding,
+ level: c.GLint,
+ internal_format: InternalFormat,
+ width: c.GLsizei,
+ height: c.GLsizei,
+ format: Format,
+ typ: DataType,
+ data: ?*const anyopaque,
+ ) errors.Error!void {
+ glad.context.TexImage2D.?(
+ @intFromEnum(b.target),
+ level,
+ @intFromEnum(internal_format),
+ width,
+ height,
+ 0,
+ @intFromEnum(format),
+ @intFromEnum(typ),
+ data,
+ );
+ try errors.getError();
+ }
+
+ pub fn subImage2D(
+ b: Binding,
+ level: c.GLint,
+ xoffset: c.GLint,
+ yoffset: c.GLint,
+ width: c.GLsizei,
+ height: c.GLsizei,
+ format: Format,
+ typ: DataType,
+ data: ?*const anyopaque,
+ ) errors.Error!void {
+ glad.context.TexSubImage2D.?(
+ @intFromEnum(b.target),
+ level,
+ xoffset,
+ yoffset,
+ width,
+ height,
+ @intFromEnum(format),
+ @intFromEnum(typ),
+ data,
+ );
+ try errors.getError();
+ }
+
+ 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,
+ ) errors.Error!void {
+ glad.context.CopyTexSubImage2D.?(
+ @intFromEnum(b.target),
+ level,
+ xoffset,
+ yoffset,
+ x,
+ y,
+ width,
+ height,
+ );
+ try errors.getError();
+ }
+};