diff options
| author | s-ol <s+removethis@s-ol.nu> | 2025-03-05 10:08:31 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2025-03-05 10:08:31 +0000 |
| commit | 7b8113bf1ad51b25e3ebe197fabd9ec4df14a0d0 (patch) | |
| tree | 3289eee1a7b7bb59eec8fcf22837926cac8a4760 /src/gl.zig | |
| parent | load videoes/textures relative to project_root (diff) | |
| download | glsl-view-7b8113bf1ad51b25e3ebe197fabd9ec4df14a0d0.tar.gz glsl-view-7b8113bf1ad51b25e3ebe197fabd9ec4df14a0d0.zip | |
fix shader reloading wrt Textures
Diffstat (limited to 'src/gl.zig')
| -rw-r--r-- | src/gl.zig | 391 |
1 files changed, 241 insertions, 150 deletions
@@ -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.*); } } |
