style(renderer): explicit error sets
parent
9d00018f8b
commit
ea7a91e2ba
|
|
@ -7,15 +7,16 @@ const glad = @import("glad.zig");
|
|||
|
||||
id: c.GLuint,
|
||||
|
||||
pub fn active(index: c_uint) !void {
|
||||
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() !Texture {
|
||||
pub fn create() errors.Error!Texture {
|
||||
var id: c.GLuint = undefined;
|
||||
glad.context.GenTextures.?(1, &id);
|
||||
try errors.getError();
|
||||
return .{ .id = id };
|
||||
}
|
||||
|
||||
|
|
@ -107,7 +108,7 @@ pub const Binding = struct {
|
|||
glad.context.GenerateMipmap.?(@intFromEnum(b.target));
|
||||
}
|
||||
|
||||
pub fn parameter(b: Binding, name: Parameter, value: anytype) !void {
|
||||
pub fn parameter(b: Binding, name: Parameter, value: anytype) errors.Error!void {
|
||||
switch (@TypeOf(value)) {
|
||||
c.GLint => glad.context.TexParameteri.?(
|
||||
@intFromEnum(b.target),
|
||||
|
|
@ -129,7 +130,7 @@ pub const Binding = struct {
|
|||
format: Format,
|
||||
typ: DataType,
|
||||
data: ?*const anyopaque,
|
||||
) !void {
|
||||
) errors.Error!void {
|
||||
glad.context.TexImage2D.?(
|
||||
@intFromEnum(b.target),
|
||||
level,
|
||||
|
|
@ -154,7 +155,7 @@ pub const Binding = struct {
|
|||
format: Format,
|
||||
typ: DataType,
|
||||
data: ?*const anyopaque,
|
||||
) !void {
|
||||
) errors.Error!void {
|
||||
glad.context.TexSubImage2D.?(
|
||||
@intFromEnum(b.target),
|
||||
level,
|
||||
|
|
@ -178,7 +179,7 @@ pub const Binding = struct {
|
|||
y: c.GLint,
|
||||
width: c.GLsizei,
|
||||
height: c.GLsizei,
|
||||
) !void {
|
||||
) errors.Error!void {
|
||||
glad.context.CopyTexSubImage2D.?(
|
||||
@intFromEnum(b.target),
|
||||
level,
|
||||
|
|
|
|||
|
|
@ -284,14 +284,17 @@ pub inline fn textureOptions(self: Metal) Texture.Options {
|
|||
}
|
||||
|
||||
/// Initializes a Texture suitable for the provided font atlas.
|
||||
pub fn initAtlasTexture(self: *const Metal, atlas: *const font.Atlas) !Texture {
|
||||
pub fn initAtlasTexture(
|
||||
self: *const Metal,
|
||||
atlas: *const font.Atlas,
|
||||
) Texture.Error!Texture {
|
||||
const pixel_format: mtl.MTLPixelFormat = switch (atlas.format) {
|
||||
.grayscale => .r8unorm,
|
||||
.rgba => .bgra8unorm,
|
||||
else => @panic("unsupported atlas format for Metal texture"),
|
||||
};
|
||||
|
||||
return Texture.init(
|
||||
return try Texture.init(
|
||||
.{
|
||||
.device = self.device,
|
||||
.pixel_format = pixel_format,
|
||||
|
|
|
|||
|
|
@ -384,7 +384,10 @@ pub inline fn textureOptions(self: OpenGL) Texture.Options {
|
|||
}
|
||||
|
||||
/// Initializes a Texture suitable for the provided font atlas.
|
||||
pub fn initAtlasTexture(self: *const OpenGL, atlas: *const font.Atlas) !Texture {
|
||||
pub fn initAtlasTexture(
|
||||
self: *const OpenGL,
|
||||
atlas: *const font.Atlas,
|
||||
) Texture.Error!Texture {
|
||||
_ = self;
|
||||
const format: gl.Texture.Format, const internal_format: gl.Texture.InternalFormat =
|
||||
switch (atlas.format) {
|
||||
|
|
@ -393,7 +396,7 @@ pub fn initAtlasTexture(self: *const OpenGL, atlas: *const font.Atlas) !Texture
|
|||
else => @panic("unsupported atlas format for OpenGL texture"),
|
||||
};
|
||||
|
||||
return Texture.init(
|
||||
return try Texture.init(
|
||||
.{
|
||||
.format = format,
|
||||
.internal_format = internal_format,
|
||||
|
|
|
|||
|
|
@ -31,13 +31,18 @@ height: usize,
|
|||
/// Bytes per pixel for this texture.
|
||||
bpp: usize,
|
||||
|
||||
pub const Error = error{
|
||||
/// A Metal API call failed.
|
||||
MetalFailed,
|
||||
};
|
||||
|
||||
/// Initialize a texture
|
||||
pub fn init(
|
||||
opts: Options,
|
||||
width: usize,
|
||||
height: usize,
|
||||
data: ?[]const u8,
|
||||
) !Self {
|
||||
) Error!Self {
|
||||
// Create our descriptor
|
||||
const desc = init: {
|
||||
const Class = objc.getClass("MTLTextureDescriptor").?;
|
||||
|
|
@ -90,7 +95,7 @@ pub fn replaceRegion(
|
|||
width: usize,
|
||||
height: usize,
|
||||
data: []const u8,
|
||||
) !void {
|
||||
) error{}!void {
|
||||
self.texture.msgSend(
|
||||
void,
|
||||
objc.sel("replaceRegion:mipmapLevel:withBytes:bytesPerRow:"),
|
||||
|
|
|
|||
|
|
@ -31,23 +31,28 @@ format: gl.Texture.Format,
|
|||
/// Target for this texture.
|
||||
target: gl.Texture.Target,
|
||||
|
||||
pub const Error = error{
|
||||
/// An OpenGL API call failed.
|
||||
OpenGLFailed,
|
||||
};
|
||||
|
||||
/// Initialize a texture
|
||||
pub fn init(
|
||||
opts: Options,
|
||||
width: usize,
|
||||
height: usize,
|
||||
data: ?[]const u8,
|
||||
) !Self {
|
||||
const tex = try gl.Texture.create();
|
||||
) Error!Self {
|
||||
const tex = gl.Texture.create() catch return error.OpenGLFailed;
|
||||
errdefer tex.destroy();
|
||||
{
|
||||
const texbind = try tex.bind(opts.target);
|
||||
const texbind = tex.bind(opts.target) catch return error.OpenGLFailed;
|
||||
defer texbind.unbind();
|
||||
try texbind.parameter(.WrapS, gl.c.GL_CLAMP_TO_EDGE);
|
||||
try texbind.parameter(.WrapT, gl.c.GL_CLAMP_TO_EDGE);
|
||||
try texbind.parameter(.MinFilter, gl.c.GL_LINEAR);
|
||||
try texbind.parameter(.MagFilter, gl.c.GL_LINEAR);
|
||||
try texbind.image2D(
|
||||
texbind.parameter(.WrapS, gl.c.GL_CLAMP_TO_EDGE) catch return error.OpenGLFailed;
|
||||
texbind.parameter(.WrapT, gl.c.GL_CLAMP_TO_EDGE) catch return error.OpenGLFailed;
|
||||
texbind.parameter(.MinFilter, gl.c.GL_LINEAR) catch return error.OpenGLFailed;
|
||||
texbind.parameter(.MagFilter, gl.c.GL_LINEAR) catch return error.OpenGLFailed;
|
||||
texbind.image2D(
|
||||
0,
|
||||
opts.internal_format,
|
||||
@intCast(width),
|
||||
|
|
@ -56,7 +61,7 @@ pub fn init(
|
|||
opts.format,
|
||||
.UnsignedByte,
|
||||
if (data) |d| @ptrCast(d.ptr) else null,
|
||||
);
|
||||
) catch return error.OpenGLFailed;
|
||||
}
|
||||
|
||||
return .{
|
||||
|
|
@ -82,10 +87,10 @@ pub fn replaceRegion(
|
|||
width: usize,
|
||||
height: usize,
|
||||
data: []const u8,
|
||||
) !void {
|
||||
const texbind = try self.texture.bind(self.target);
|
||||
) Error!void {
|
||||
const texbind = self.texture.bind(self.target) catch return error.OpenGLFailed;
|
||||
defer texbind.unbind();
|
||||
try texbind.subImage2D(
|
||||
texbind.subImage2D(
|
||||
0,
|
||||
@intCast(x),
|
||||
@intCast(y),
|
||||
|
|
@ -94,5 +99,5 @@ pub fn replaceRegion(
|
|||
self.format,
|
||||
.UnsignedByte,
|
||||
data.ptr,
|
||||
);
|
||||
) catch return error.OpenGLFailed;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue