diff options
| -rw-r--r-- | build.zig | 2 | ||||
| -rw-r--r-- | src/c.zig | 8 | ||||
| -rw-r--r-- | src/debug_gl.zig | 22 | ||||
| -rw-r--r-- | src/main.zig | 3 | ||||
| -rw-r--r-- | src/renderdoc.zig | 42 |
5 files changed, 77 insertions, 0 deletions
@@ -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(); @@ -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); + } +} |
