aboutsummaryrefslogtreecommitdiffstats
path: root/src/gl.zig
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2025-03-05 10:08:31 +0000
committers-ol <s+removethis@s-ol.nu>2025-03-05 10:08:31 +0000
commit7b8113bf1ad51b25e3ebe197fabd9ec4df14a0d0 (patch)
tree3289eee1a7b7bb59eec8fcf22837926cac8a4760 /src/gl.zig
parentload videoes/textures relative to project_root (diff)
downloadglsl-view-7b8113bf1ad51b25e3ebe197fabd9ec4df14a0d0.tar.gz
glsl-view-7b8113bf1ad51b25e3ebe197fabd9ec4df14a0d0.zip
fix shader reloading wrt Textures
Diffstat (limited to 'src/gl.zig')
-rw-r--r--src/gl.zig391
1 files changed, 241 insertions, 150 deletions
diff --git a/src/gl.zig b/src/gl.zig
index d2f827e..c1543dc 100644
--- a/src/gl.zig
+++ b/src/gl.zig
@@ -202,6 +202,134 @@ const UniformType = enum(c.GLint) {
};
const UniformValue = union(UniformType) {
+ FLOAT: f32,
+ FLOAT_VEC2: [2]f32,
+ FLOAT_VEC3: [3]f32,
+ FLOAT_VEC4: [4]f32,
+ DOUBLE: f64,
+ DOUBLE_VEC2: [2]f64,
+ DOUBLE_VEC3: [3]f64,
+ DOUBLE_VEC4: [4]f64,
+ INT: c_int, // i32 but bug
+ INT_VEC2: [2]c_int,
+ INT_VEC3: [3]c_int,
+ INT_VEC4: [4]c_int,
+ UNSIGNED_INT: c_uint,
+ UNSIGNED_INT_VEC2: [2]c_uint,
+ UNSIGNED_INT_VEC3: [3]c_uint,
+ UNSIGNED_INT_VEC4: [4]c_uint,
+ BOOL: c_uint,
+ BOOL_VEC2: [2]c_uint,
+ BOOL_VEC3: [3]c_uint,
+ BOOL_VEC4: [4]c_uint,
+ FLOAT_MAT2: [2 * 2]f32,
+ FLOAT_MAT3: [3 * 3]f32,
+ FLOAT_MAT4: [4 * 4]f32,
+ FLOAT_MAT2x3: [2 * 3]f32,
+ FLOAT_MAT2x4: [2 * 4]f32,
+ FLOAT_MAT3x2: [3 * 2]f32,
+ FLOAT_MAT3x4: [3 * 4]f32,
+ FLOAT_MAT4x2: [4 * 2]f32,
+ FLOAT_MAT4x3: [4 * 3]f32,
+ DOUBLE_MAT2: [2 * 2]f64,
+ DOUBLE_MAT3: [3 * 3]f64,
+ DOUBLE_MAT4: [4 * 4]f64,
+ DOUBLE_MAT2x3: [2 * 3]f64,
+ DOUBLE_MAT2x4: [2 * 4]f64,
+ DOUBLE_MAT3x2: [3 * 2]f64,
+ DOUBLE_MAT3x4: [3 * 4]f64,
+ DOUBLE_MAT4x2: [4 * 2]f64,
+ DOUBLE_MAT4x3: [4 * 3]f64,
+ SAMPLER_1D: ?Texture,
+ SAMPLER_2D: ?Texture,
+ SAMPLER_3D: ?Texture,
+ SAMPLER_CUBE: ?Texture,
+ SAMPLER_1D_SHADOW: ?Texture,
+ SAMPLER_2D_SHADOW: ?Texture,
+ SAMPLER_1D_ARRAY: ?Texture,
+ SAMPLER_2D_ARRAY: ?Texture,
+ SAMPLER_1D_ARRAY_SHADOW: ?Texture,
+ SAMPLER_2D_ARRAY_SHADOW: ?Texture,
+ SAMPLER_2D_MULTISAMPLE: ?Texture,
+ SAMPLER_2D_MULTISAMPLE_ARRAY: ?Texture,
+ SAMPLER_CUBE_SHADOW: ?Texture,
+ SAMPLER_BUFFER: ?Texture,
+ SAMPLER_2D_RECT: ?Texture,
+ SAMPLER_2D_RECT_SHADOW: ?Texture,
+ INT_SAMPLER_1D: ?Texture,
+ INT_SAMPLER_2D: ?Texture,
+ INT_SAMPLER_3D: ?Texture,
+ INT_SAMPLER_CUBE: ?Texture,
+ INT_SAMPLER_1D_ARRAY: ?Texture,
+ INT_SAMPLER_2D_ARRAY: ?Texture,
+ INT_SAMPLER_2D_MULTISAMPLE: ?Texture,
+ INT_SAMPLER_2D_MULTISAMPLE_ARRAY: ?Texture,
+ INT_SAMPLER_BUFFER: ?Texture,
+ INT_SAMPLER_2D_RECT: ?Texture,
+ UNSIGNED_INT_SAMPLER_1D: ?Texture,
+ UNSIGNED_INT_SAMPLER_2D: ?Texture,
+ UNSIGNED_INT_SAMPLER_3D: ?Texture,
+ UNSIGNED_INT_SAMPLER_CUBE: ?Texture,
+ UNSIGNED_INT_SAMPLER_1D_ARRAY: ?Texture,
+ UNSIGNED_INT_SAMPLER_2D_ARRAY: ?Texture,
+ UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: ?Texture,
+ UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: ?Texture,
+ UNSIGNED_INT_SAMPLER_BUFFER: ?Texture,
+ UNSIGNED_INT_SAMPLER_2D_RECT: ?Texture,
+
+ pub fn deinit(self: *const UniformValue) void {
+ switch (self.*) {
+ .SAMPLER_1D,
+ .SAMPLER_2D,
+ .SAMPLER_3D,
+ .SAMPLER_CUBE,
+ .SAMPLER_1D_SHADOW,
+ .SAMPLER_2D_SHADOW,
+ .SAMPLER_1D_ARRAY,
+ .SAMPLER_2D_ARRAY,
+ .SAMPLER_1D_ARRAY_SHADOW,
+ .SAMPLER_2D_ARRAY_SHADOW,
+ .SAMPLER_2D_MULTISAMPLE,
+ .SAMPLER_2D_MULTISAMPLE_ARRAY,
+ .SAMPLER_CUBE_SHADOW,
+ .SAMPLER_BUFFER,
+ .SAMPLER_2D_RECT,
+ .SAMPLER_2D_RECT_SHADOW,
+ .INT_SAMPLER_1D,
+ .INT_SAMPLER_2D,
+ .INT_SAMPLER_3D,
+ .INT_SAMPLER_CUBE,
+ .INT_SAMPLER_1D_ARRAY,
+ .INT_SAMPLER_2D_ARRAY,
+ .INT_SAMPLER_2D_MULTISAMPLE,
+ .INT_SAMPLER_2D_MULTISAMPLE_ARRAY,
+ .INT_SAMPLER_BUFFER,
+ .INT_SAMPLER_2D_RECT,
+ .UNSIGNED_INT_SAMPLER_1D,
+ .UNSIGNED_INT_SAMPLER_2D,
+ .UNSIGNED_INT_SAMPLER_3D,
+ .UNSIGNED_INT_SAMPLER_CUBE,
+ .UNSIGNED_INT_SAMPLER_1D_ARRAY,
+ .UNSIGNED_INT_SAMPLER_2D_ARRAY,
+ .UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE,
+ .UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,
+ .UNSIGNED_INT_SAMPLER_BUFFER,
+ .UNSIGNED_INT_SAMPLER_2D_RECT,
+ => |value| {
+ if (value) |texture| texture.destroy();
+ },
+ else => {},
+ }
+ }
+
+ pub fn getPointer(self: *UniformValue) UniformPointer {
+ return switch (self.*) {
+ inline else => |*value, tag| @unionInit(UniformPointer, @tagName(tag), value),
+ };
+ }
+};
+
+const UniformPointer = union(UniformType) {
FLOAT: *f32,
FLOAT_VEC2: *[2]f32,
FLOAT_VEC3: *[3]f32,
@@ -277,58 +405,7 @@ const UniformValue = union(UniformType) {
UNSIGNED_INT_SAMPLER_BUFFER: *?Texture,
UNSIGNED_INT_SAMPLER_2D_RECT: *?Texture,
- pub fn init(allocator: std.mem.Allocator, comptime utype: UniformType) !UniformValue {
- const data = try allocator.create(std.meta.Child(std.meta.TagPayload(UniformValue, utype)));
- return @unionInit(UniformValue, @tagName(utype), data);
- }
-
- pub fn deinit(self: *const UniformValue, allocator: std.mem.Allocator) void {
- switch (self.*) {
- .SAMPLER_1D,
- .SAMPLER_2D,
- .SAMPLER_3D,
- .SAMPLER_CUBE,
- .SAMPLER_1D_SHADOW,
- .SAMPLER_2D_SHADOW,
- .SAMPLER_1D_ARRAY,
- .SAMPLER_2D_ARRAY,
- .SAMPLER_1D_ARRAY_SHADOW,
- .SAMPLER_2D_ARRAY_SHADOW,
- .SAMPLER_2D_MULTISAMPLE,
- .SAMPLER_2D_MULTISAMPLE_ARRAY,
- .SAMPLER_CUBE_SHADOW,
- .SAMPLER_BUFFER,
- .SAMPLER_2D_RECT,
- .SAMPLER_2D_RECT_SHADOW,
- .INT_SAMPLER_1D,
- .INT_SAMPLER_2D,
- .INT_SAMPLER_3D,
- .INT_SAMPLER_CUBE,
- .INT_SAMPLER_1D_ARRAY,
- .INT_SAMPLER_2D_ARRAY,
- .INT_SAMPLER_2D_MULTISAMPLE,
- .INT_SAMPLER_2D_MULTISAMPLE_ARRAY,
- .INT_SAMPLER_BUFFER,
- .INT_SAMPLER_2D_RECT,
- .UNSIGNED_INT_SAMPLER_1D,
- .UNSIGNED_INT_SAMPLER_2D,
- .UNSIGNED_INT_SAMPLER_3D,
- .UNSIGNED_INT_SAMPLER_CUBE,
- .UNSIGNED_INT_SAMPLER_1D_ARRAY,
- .UNSIGNED_INT_SAMPLER_2D_ARRAY,
- .UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE,
- .UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,
- .UNSIGNED_INT_SAMPLER_BUFFER,
- .UNSIGNED_INT_SAMPLER_2D_RECT,
- => |value| {
- if (value.*) |texture| texture.destroy();
- allocator.destroy(value);
- },
- inline else => |value| allocator.destroy(value),
- }
- }
-
- pub fn index(self: *const UniformValue, i: u8) !UniformValue {
+ pub fn index(self: *const UniformPointer, i: u8) !UniformPointer {
const length: u8 = switch (self.*) {
.FLOAT_VEC2, .DOUBLE_VEC2, .INT_VEC2, .BOOL_VEC2, .UNSIGNED_INT_VEC2 => 2,
.FLOAT_VEC3, .DOUBLE_VEC3, .INT_VEC3, .UNSIGNED_INT_VEC3 => 3,
@@ -341,18 +418,18 @@ const UniformValue = union(UniformType) {
}
return switch (self.*) {
- .FLOAT_VEC2, .FLOAT_VEC3, .FLOAT_VEC4 => |v| .{ .FLOAT = &v[i] },
- .DOUBLE_VEC2, .DOUBLE_VEC3, .DOUBLE_VEC4 => |v| .{ .DOUBLE = &v[i] },
- .INT_VEC2, .INT_VEC3, .INT_VEC4 => |v| .{ .INT = &v[i] },
- .UNSIGNED_INT_VEC2, .UNSIGNED_INT_VEC3, .UNSIGNED_INT_VEC4 => |v| .{ .UNSIGNED_INT = &v[i] },
- .BOOL_VEC2, .BOOL_VEC3, .BOOL_VEC4 => |v| .{ .BOOL = &v[i] },
+ inline .FLOAT_VEC2, .FLOAT_VEC3, .FLOAT_VEC4 => |v| .{ .FLOAT = &v[i] },
+ inline .DOUBLE_VEC2, .DOUBLE_VEC3, .DOUBLE_VEC4 => |v| .{ .DOUBLE = &v[i] },
+ inline .INT_VEC2, .INT_VEC3, .INT_VEC4 => |v| .{ .INT = &v[i] },
+ inline .UNSIGNED_INT_VEC2, .UNSIGNED_INT_VEC3, .UNSIGNED_INT_VEC4 => |v| .{ .UNSIGNED_INT = &v[i] },
+ inline .BOOL_VEC2, .BOOL_VEC3, .BOOL_VEC4 => |v| .{ .BOOL = &v[i] },
else => unreachable,
};
}
};
pub const CachedUniform = struct {
- value: UniformValue,
+ value: ?*UniformValue,
location: c.GLint,
pub fn init(allocator: std.mem.Allocator, shader: ShaderProgram, name: []const u8) !CachedUniform {
@@ -370,26 +447,40 @@ pub const CachedUniform = struct {
switch (@as(UniformType, @enumFromInt(_utype))) {
inline else => |utype| {
const location = try shader.uniformLocation(nameZ);
- const value = try UniformValue.init(allocator, utype);
- errdefer value.deinit(allocator);
+ const value = try allocator.create(UniformValue);
+ errdefer allocator.destroy(value);
+ value.* = @unionInit(UniformValue, @tagName(utype), undefined);
return .{ .value = value, .location = location };
},
}
}
- pub fn deinit(self: *const CachedUniform, allocator: std.mem.Allocator) void {
- self.value.deinit(allocator);
+ pub fn deinit(self: *CachedUniform, allocator: std.mem.Allocator) void {
+ if (self.value) |value| {
+ value.deinit();
+ allocator.destroy(value);
+ self.value = null;
+ }
}
- pub fn tryCopy(self: *CachedUniform, from: CachedUniform) bool {
- if (@as(UniformType, self.value) != from.value) return false;
+ // deinit self WITHOUT freeing contained resources
+ pub fn move(self: *CachedUniform, to: *CachedUniform, allocator: std.mem.Allocator) CachedUniform {
+ to.deinit(allocator);
+ to.buffer = self.buffer;
+ to.value = self.value;
- switch (self.value) {
- inline else => |*val, tag| {
- val.*.* = @field(from.value, @tagName(tag)).*;
- },
- }
+ self.buffer = null;
+
+ return self;
+ }
+
+ pub fn tryMove(self: *CachedUniform, dest: *CachedUniform, allocator: std.mem.Allocator) bool {
+ if (@as(UniformType, self.value.?.*) != dest.value.?.*) return false;
+
+ dest.deinit(allocator);
+ dest.value = self.value;
+ self.value = null;
return true;
}
@@ -397,45 +488,45 @@ pub const CachedUniform = struct {
const program = shader.program_id;
const location = self.location;
- switch (self.value) {
- .FLOAT => |value| c.glProgramUniform1fv(program, location, 1, value),
- .FLOAT_VEC2 => |value| c.glProgramUniform2fv(program, location, 1, value),
- .FLOAT_VEC3 => |value| c.glProgramUniform3fv(program, location, 1, value),
- .FLOAT_VEC4 => |value| c.glProgramUniform4fv(program, location, 1, value),
- .DOUBLE => |value| c.glProgramUniform1dv(program, location, 1, value),
- .DOUBLE_VEC2 => |value| c.glProgramUniform1dv(program, location, 1, value),
- .DOUBLE_VEC3 => |value| c.glProgramUniform2dv(program, location, 1, value),
- .DOUBLE_VEC4 => |value| c.glProgramUniform3dv(program, location, 1, value),
- .INT => |value| c.glProgramUniform1iv(program, location, 1, value),
- .INT_VEC2 => |value| c.glProgramUniform2iv(program, location, 1, value),
- .INT_VEC3 => |value| c.glProgramUniform3iv(program, location, 1, value),
- .INT_VEC4 => |value| c.glProgramUniform4iv(program, location, 1, value),
- .UNSIGNED_INT => |value| c.glProgramUniform1uiv(program, location, 1, value),
- .UNSIGNED_INT_VEC2 => |value| c.glProgramUniform2uiv(program, location, 1, value),
- .UNSIGNED_INT_VEC3 => |value| c.glProgramUniform3uiv(program, location, 1, value),
- .UNSIGNED_INT_VEC4 => |value| c.glProgramUniform4uiv(program, location, 1, value),
- .BOOL => |value| c.glProgramUniform1uiv(program, location, 1, value),
- .BOOL_VEC2 => |value| c.glProgramUniform2uiv(program, location, 1, value),
- .BOOL_VEC3 => |value| c.glProgramUniform3uiv(program, location, 1, value),
- .BOOL_VEC4 => |value| c.glProgramUniform4uiv(program, location, 1, value),
- .FLOAT_MAT2 => |value| c.glProgramUniformMatrix2fv(program, location, 1, c.GL_FALSE, value),
- .FLOAT_MAT3 => |value| c.glProgramUniformMatrix3fv(program, location, 1, c.GL_FALSE, value),
- .FLOAT_MAT4 => |value| c.glProgramUniformMatrix4fv(program, location, 1, c.GL_FALSE, value),
- .FLOAT_MAT2x3 => |value| c.glProgramUniformMatrix2x3fv(program, location, 1, c.GL_FALSE, value),
- .FLOAT_MAT2x4 => |value| c.glProgramUniformMatrix2x4fv(program, location, 1, c.GL_FALSE, value),
- .FLOAT_MAT3x2 => |value| c.glProgramUniformMatrix3x2fv(program, location, 1, c.GL_FALSE, value),
- .FLOAT_MAT3x4 => |value| c.glProgramUniformMatrix3x4fv(program, location, 1, c.GL_FALSE, value),
- .FLOAT_MAT4x2 => |value| c.glProgramUniformMatrix4x2fv(program, location, 1, c.GL_FALSE, value),
- .FLOAT_MAT4x3 => |value| c.glProgramUniformMatrix4x3fv(program, location, 1, c.GL_FALSE, value),
- .DOUBLE_MAT2 => |value| c.glProgramUniformMatrix2dv(program, location, 1, c.GL_FALSE, value),
- .DOUBLE_MAT3 => |value| c.glProgramUniformMatrix3dv(program, location, 1, c.GL_FALSE, value),
- .DOUBLE_MAT4 => |value| c.glProgramUniformMatrix4dv(program, location, 1, c.GL_FALSE, value),
- .DOUBLE_MAT2x3 => |value| c.glProgramUniformMatrix2x3dv(program, location, 1, c.GL_FALSE, value),
- .DOUBLE_MAT2x4 => |value| c.glProgramUniformMatrix2x4dv(program, location, 1, c.GL_FALSE, value),
- .DOUBLE_MAT3x2 => |value| c.glProgramUniformMatrix3x2dv(program, location, 1, c.GL_FALSE, value),
- .DOUBLE_MAT3x4 => |value| c.glProgramUniformMatrix3x4dv(program, location, 1, c.GL_FALSE, value),
- .DOUBLE_MAT4x2 => |value| c.glProgramUniformMatrix4x2dv(program, location, 1, c.GL_FALSE, value),
- .DOUBLE_MAT4x3 => |value| c.glProgramUniformMatrix4x3dv(program, location, 1, c.GL_FALSE, value),
+ switch (self.value.?.*) {
+ .FLOAT => |*value| c.glProgramUniform1fv(program, location, 1, value),
+ .FLOAT_VEC2 => |*value| c.glProgramUniform2fv(program, location, 1, value),
+ .FLOAT_VEC3 => |*value| c.glProgramUniform3fv(program, location, 1, value),
+ .FLOAT_VEC4 => |*value| c.glProgramUniform4fv(program, location, 1, value),
+ .DOUBLE => |*value| c.glProgramUniform1dv(program, location, 1, value),
+ .DOUBLE_VEC2 => |*value| c.glProgramUniform1dv(program, location, 1, value),
+ .DOUBLE_VEC3 => |*value| c.glProgramUniform2dv(program, location, 1, value),
+ .DOUBLE_VEC4 => |*value| c.glProgramUniform3dv(program, location, 1, value),
+ .INT => |*value| c.glProgramUniform1iv(program, location, 1, value),
+ .INT_VEC2 => |*value| c.glProgramUniform2iv(program, location, 1, value),
+ .INT_VEC3 => |*value| c.glProgramUniform3iv(program, location, 1, value),
+ .INT_VEC4 => |*value| c.glProgramUniform4iv(program, location, 1, value),
+ .UNSIGNED_INT => |*value| c.glProgramUniform1uiv(program, location, 1, value),
+ .UNSIGNED_INT_VEC2 => |*value| c.glProgramUniform2uiv(program, location, 1, value),
+ .UNSIGNED_INT_VEC3 => |*value| c.glProgramUniform3uiv(program, location, 1, value),
+ .UNSIGNED_INT_VEC4 => |*value| c.glProgramUniform4uiv(program, location, 1, value),
+ .BOOL => |*value| c.glProgramUniform1uiv(program, location, 1, value),
+ .BOOL_VEC2 => |*value| c.glProgramUniform2uiv(program, location, 1, value),
+ .BOOL_VEC3 => |*value| c.glProgramUniform3uiv(program, location, 1, value),
+ .BOOL_VEC4 => |*value| c.glProgramUniform4uiv(program, location, 1, value),
+ .FLOAT_MAT2 => |*value| c.glProgramUniformMatrix2fv(program, location, 1, c.GL_FALSE, value),
+ .FLOAT_MAT3 => |*value| c.glProgramUniformMatrix3fv(program, location, 1, c.GL_FALSE, value),
+ .FLOAT_MAT4 => |*value| c.glProgramUniformMatrix4fv(program, location, 1, c.GL_FALSE, value),
+ .FLOAT_MAT2x3 => |*value| c.glProgramUniformMatrix2x3fv(program, location, 1, c.GL_FALSE, value),
+ .FLOAT_MAT2x4 => |*value| c.glProgramUniformMatrix2x4fv(program, location, 1, c.GL_FALSE, value),
+ .FLOAT_MAT3x2 => |*value| c.glProgramUniformMatrix3x2fv(program, location, 1, c.GL_FALSE, value),
+ .FLOAT_MAT3x4 => |*value| c.glProgramUniformMatrix3x4fv(program, location, 1, c.GL_FALSE, value),
+ .FLOAT_MAT4x2 => |*value| c.glProgramUniformMatrix4x2fv(program, location, 1, c.GL_FALSE, value),
+ .FLOAT_MAT4x3 => |*value| c.glProgramUniformMatrix4x3fv(program, location, 1, c.GL_FALSE, value),
+ .DOUBLE_MAT2 => |*value| c.glProgramUniformMatrix2dv(program, location, 1, c.GL_FALSE, value),
+ .DOUBLE_MAT3 => |*value| c.glProgramUniformMatrix3dv(program, location, 1, c.GL_FALSE, value),
+ .DOUBLE_MAT4 => |*value| c.glProgramUniformMatrix4dv(program, location, 1, c.GL_FALSE, value),
+ .DOUBLE_MAT2x3 => |*value| c.glProgramUniformMatrix2x3dv(program, location, 1, c.GL_FALSE, value),
+ .DOUBLE_MAT2x4 => |*value| c.glProgramUniformMatrix2x4dv(program, location, 1, c.GL_FALSE, value),
+ .DOUBLE_MAT3x2 => |*value| c.glProgramUniformMatrix3x2dv(program, location, 1, c.GL_FALSE, value),
+ .DOUBLE_MAT3x4 => |*value| c.glProgramUniformMatrix3x4dv(program, location, 1, c.GL_FALSE, value),
+ .DOUBLE_MAT4x2 => |*value| c.glProgramUniformMatrix4x2dv(program, location, 1, c.GL_FALSE, value),
+ .DOUBLE_MAT4x3 => |*value| c.glProgramUniformMatrix4x3dv(program, location, 1, c.GL_FALSE, value),
.SAMPLER_1D,
.SAMPLER_2D,
.SAMPLER_3D,
@@ -472,7 +563,7 @@ pub const CachedUniform = struct {
.UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,
.UNSIGNED_INT_SAMPLER_BUFFER,
.UNSIGNED_INT_SAMPLER_2D_RECT,
- => |value| {
+ => |*value| {
if (value.*) |*texture| {
const index = texture.bind();
c.glProgramUniform1i(program, location, @intCast(index));
@@ -485,45 +576,45 @@ pub const CachedUniform = struct {
const program = shader.program_id;
const location = self.location;
- switch (self.value) {
- .FLOAT => |value| c.glGetnUniformfv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .FLOAT_VEC2 => |value| c.glGetnUniformfv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .FLOAT_VEC3 => |value| c.glGetnUniformfv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .FLOAT_VEC4 => |value| c.glGetnUniformfv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .DOUBLE => |value| c.glGetnUniformdv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .DOUBLE_VEC2 => |value| c.glGetnUniformdv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .DOUBLE_VEC3 => |value| c.glGetnUniformdv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .DOUBLE_VEC4 => |value| c.glGetnUniformdv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .INT => |value| c.glGetnUniformiv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .INT_VEC2 => |value| c.glGetnUniformiv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .INT_VEC3 => |value| c.glGetnUniformiv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .INT_VEC4 => |value| c.glGetnUniformiv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .UNSIGNED_INT => |value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .UNSIGNED_INT_VEC2 => |value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .UNSIGNED_INT_VEC3 => |value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .UNSIGNED_INT_VEC4 => |value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .BOOL => |value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .BOOL_VEC2 => |value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .BOOL_VEC3 => |value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .BOOL_VEC4 => |value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
- .FLOAT_MAT2 => |value| c.glGetUniformfv(program, location, value),
- .FLOAT_MAT3 => |value| c.glGetUniformfv(program, location, value),
- .FLOAT_MAT4 => |value| c.glGetUniformfv(program, location, value),
- .FLOAT_MAT2x3 => |value| c.glGetUniformfv(program, location, value),
- .FLOAT_MAT2x4 => |value| c.glGetUniformfv(program, location, value),
- .FLOAT_MAT3x2 => |value| c.glGetUniformfv(program, location, value),
- .FLOAT_MAT3x4 => |value| c.glGetUniformfv(program, location, value),
- .FLOAT_MAT4x2 => |value| c.glGetUniformfv(program, location, value),
- .FLOAT_MAT4x3 => |value| c.glGetUniformfv(program, location, value),
- .DOUBLE_MAT2 => |value| c.glGetUniformdv(program, location, value),
- .DOUBLE_MAT3 => |value| c.glGetUniformdv(program, location, value),
- .DOUBLE_MAT4 => |value| c.glGetUniformdv(program, location, value),
- .DOUBLE_MAT2x3 => |value| c.glGetUniformdv(program, location, value),
- .DOUBLE_MAT2x4 => |value| c.glGetUniformdv(program, location, value),
- .DOUBLE_MAT3x2 => |value| c.glGetUniformdv(program, location, value),
- .DOUBLE_MAT3x4 => |value| c.glGetUniformdv(program, location, value),
- .DOUBLE_MAT4x2 => |value| c.glGetUniformdv(program, location, value),
- .DOUBLE_MAT4x3 => |value| c.glGetUniformdv(program, location, value),
+ switch (self.value.?.*) {
+ .FLOAT => |*value| c.glGetnUniformfv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .FLOAT_VEC2 => |*value| c.glGetnUniformfv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .FLOAT_VEC3 => |*value| c.glGetnUniformfv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .FLOAT_VEC4 => |*value| c.glGetnUniformfv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .DOUBLE => |*value| c.glGetnUniformdv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .DOUBLE_VEC2 => |*value| c.glGetnUniformdv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .DOUBLE_VEC3 => |*value| c.glGetnUniformdv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .DOUBLE_VEC4 => |*value| c.glGetnUniformdv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .INT => |*value| c.glGetnUniformiv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .INT_VEC2 => |*value| c.glGetnUniformiv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .INT_VEC3 => |*value| c.glGetnUniformiv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .INT_VEC4 => |*value| c.glGetnUniformiv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .UNSIGNED_INT => |*value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .UNSIGNED_INT_VEC2 => |*value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .UNSIGNED_INT_VEC3 => |*value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .UNSIGNED_INT_VEC4 => |*value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .BOOL => |*value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .BOOL_VEC2 => |*value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .BOOL_VEC3 => |*value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .BOOL_VEC4 => |*value| c.glGetnUniformuiv(program, location, @sizeOf(@TypeOf(value.*)), value),
+ .FLOAT_MAT2 => |*value| c.glGetUniformfv(program, location, value),
+ .FLOAT_MAT3 => |*value| c.glGetUniformfv(program, location, value),
+ .FLOAT_MAT4 => |*value| c.glGetUniformfv(program, location, value),
+ .FLOAT_MAT2x3 => |*value| c.glGetUniformfv(program, location, value),
+ .FLOAT_MAT2x4 => |*value| c.glGetUniformfv(program, location, value),
+ .FLOAT_MAT3x2 => |*value| c.glGetUniformfv(program, location, value),
+ .FLOAT_MAT3x4 => |*value| c.glGetUniformfv(program, location, value),
+ .FLOAT_MAT4x2 => |*value| c.glGetUniformfv(program, location, value),
+ .FLOAT_MAT4x3 => |*value| c.glGetUniformfv(program, location, value),
+ .DOUBLE_MAT2 => |*value| c.glGetUniformdv(program, location, value),
+ .DOUBLE_MAT3 => |*value| c.glGetUniformdv(program, location, value),
+ .DOUBLE_MAT4 => |*value| c.glGetUniformdv(program, location, value),
+ .DOUBLE_MAT2x3 => |*value| c.glGetUniformdv(program, location, value),
+ .DOUBLE_MAT2x4 => |*value| c.glGetUniformdv(program, location, value),
+ .DOUBLE_MAT3x2 => |*value| c.glGetUniformdv(program, location, value),
+ .DOUBLE_MAT3x4 => |*value| c.glGetUniformdv(program, location, value),
+ .DOUBLE_MAT4x2 => |*value| c.glGetUniformdv(program, location, value),
+ .DOUBLE_MAT4x3 => |*value| c.glGetUniformdv(program, location, value),
.SAMPLER_1D,
.SAMPLER_2D,
.SAMPLER_3D,
@@ -560,7 +651,7 @@ pub const CachedUniform = struct {
.UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,
.UNSIGNED_INT_SAMPLER_BUFFER,
.UNSIGNED_INT_SAMPLER_2D_RECT,
- => |value| value.* = null,
+ => |*value| value.* = null,
}
}
};
@@ -680,7 +771,7 @@ pub const UniformCache = struct {
var it = old_uniforms.iterator();
while (it.next()) |old_entry| {
if (try self.get(old_entry.key_ptr.*)) |uniform| {
- if (uniform.tryCopy(old_entry.value_ptr.*)) {
+ if (old_entry.value_ptr.tryMove(uniform, self.allocator)) {
uniform.setShaderValue(self.shader.*);
}
}