aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build.zig2
-rw-r--r--src/c.zig8
-rw-r--r--src/debug_gl.zig22
-rw-r--r--src/main.zig3
-rw-r--r--src/renderdoc.zig42
5 files changed, 77 insertions, 0 deletions
diff --git a/build.zig b/build.zig
index f506153..823ba77 100644
--- a/build.zig
+++ b/build.zig
@@ -7,6 +7,7 @@ pub fn build(b: *std.Build) void {
const have_ffmpeg = b.option(bool, "ffmpeg", "enable image/video support (needs ffmpeg)") orelse true;
const have_hap = have_ffmpeg and b.option(bool, "hap", "enable HAP GPU upload support (needs snappy)") orelse true;
const have_tsv = b.option(bool, "texture-share-vk", "enable GPU image sharing (needs texture-share-vk)") orelse false;
+ const have_renderdoc = b.option(bool, "renderdoc", "enable OpenGL dbeugging (needs renderdoc)") orelse false;
const exe = b.addExecutable(.{
.name = "glsl-view",
@@ -19,6 +20,7 @@ pub fn build(b: *std.Build) void {
options.addOption(bool, "have_ffmpeg", have_ffmpeg);
options.addOption(bool, "have_hap", have_hap);
options.addOption(bool, "have_tsv", have_tsv);
+ options.addOption(bool, "have_renderdoc", have_renderdoc);
exe.root_module.addOptions("build_config", options);
exe.linkLibC();
diff --git a/src/c.zig b/src/c.zig
index 1618030..b516e84 100644
--- a/src/c.zig
+++ b/src/c.zig
@@ -19,4 +19,12 @@ pub usingnamespace @cImport({
if (build_config.have_tsv) {
@cInclude("texture_share_gl/texture_share_gl_client.h");
}
+
+ if (build_config.have_renderdoc) {
+ @cInclude("dlfcn.h");
+ @cInclude("renderdoc_app.h");
+ @cDefine("GLFW_EXPOSE_NATIVE_EGL", "1");
+ @cDefine("GLFW_EXPOSE_NATIVE_WAYLAND", "1");
+ @cInclude("GLFW/glfw3native.h");
+ }
});
diff --git a/src/debug_gl.zig b/src/debug_gl.zig
index 4a14591..bd62652 100644
--- a/src/debug_gl.zig
+++ b/src/debug_gl.zig
@@ -1,5 +1,6 @@
const c = @import("c.zig");
const std = @import("std");
+const build_config = @import("build_config");
const os = std.os;
const panic = std.debug.panic;
const builtin = @import("builtin");
@@ -34,6 +35,27 @@ pub fn init() void {
if (is_on == c.GL_TRUE) {
c.glEnable(c.GL_DEBUG_OUTPUT);
c.glDebugMessageCallback(glDebugMessage, null);
+
+ if (build_config.have_renderdoc) {
+ @import("renderdoc.zig").init();
+ }
+ }
+}
+
+pub fn startFrame(w: *c.GLFWwindow) void {
+ if (build_config.have_renderdoc) {
+ @import("renderdoc.zig").startCapture(w);
+ }
+}
+
+pub fn endFrame(w: *c.GLFWwindow, capture: bool) void {
+ if (build_config.have_renderdoc) {
+ if (capture) {
+ std.debug.print("CAPTURE SAVED\n", .{});
+ @import("renderdoc.zig").endCapture(w);
+ } else {
+ @import("renderdoc.zig").discardCapture(w);
+ }
}
}
diff --git a/src/main.zig b/src/main.zig
index 0883c15..0fe15ad 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -119,6 +119,7 @@ pub fn main() !void {
while (c.glfwWindowShouldClose(window) == c.GL_FALSE) {
c.glfwMakeContextCurrent(window);
+ debug_gl.startFrame(window);
const now_time = c.glfwGetTime();
prev_time = now_time;
@@ -157,6 +158,8 @@ pub fn main() !void {
c.glfwMakeContextCurrent(window);
c.glfwSwapBuffers(window);
+ debug_gl.endFrame(window, true);
+
c.glfwPollEvents();
}
}
diff --git a/src/renderdoc.zig b/src/renderdoc.zig
new file mode 100644
index 0000000..9c3e80d
--- /dev/null
+++ b/src/renderdoc.zig
@@ -0,0 +1,42 @@
+const c = @import("c.zig");
+
+var rdoc_api: ?*c.RENDERDOC_API_1_1_2 = null;
+
+pub fn init() void {
+ const maybe_mod = c.dlopen("librenderdoc.so", c.RTLD_NOW | c.RTLD_NOLOAD);
+ if (maybe_mod) |mod| {
+ const getAPI: c.pRENDERDOC_GetAPI = @ptrCast(c.dlsym(mod, "RENDERDOC_GetAPI"));
+ const ret = getAPI.?(c.eRENDERDOC_API_Version_1_1_2, @ptrCast(&rdoc_api));
+ if (ret != 1) unreachable;
+ }
+}
+
+pub fn startCapture(glfwWindow: *c.GLFWwindow) void {
+ _ = glfwWindow;
+ if (rdoc_api) |api| {
+ // const window = c.glfwGetWaylandWindow(glfwWindow);
+ // const context = c.glfwGetEGLContext(glfwWindow);
+ // api.StartFrameCapture.?(context, window);
+ _ = api.StartFrameCapture.?(null, null);
+ }
+}
+
+pub fn endCapture(glfwWindow: *c.GLFWwindow) void {
+ _ = glfwWindow;
+ if (rdoc_api) |api| {
+ // const window = c.glfwGetWaylandWindow(glfwWindow);
+ // const context = c.glfwGetEGLContext(glfwWindow);
+ // _ = api.EndFrameCapture.?(context, window);
+ _ = api.StartFrameCapture.?(null, null);
+ }
+}
+
+pub fn discardCapture(glfwWindow: *c.GLFWwindow) void {
+ _ = glfwWindow;
+ if (rdoc_api) |api| {
+ // const window = c.glfwGetWaylandWindow(glfwWindow);
+ // const context = c.glfwGetEGLContext(glfwWindow);
+ // _ = api.DiscardFrameCapture.?(context, window);
+ _ = api.DiscardFrameCapture.?(null, null);
+ }
+}