From 3045e850049354cd6be3d9f82ae824f023789234 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 12 Nov 2018 20:15:38 -0500 Subject: [PATCH] Ensures redraws when resizing; declines to busy wait otherwise. --- .../xcshareddata/xcschemes/Clock Signal.xcscheme | 2 +- OSBindings/Mac/Clock Signal/Machine/CSMachine.mm | 2 +- Outputs/OpenGL/ScanTarget.cpp | 13 +++++++++++-- Outputs/OpenGL/ScanTarget.hpp | 3 ++- Outputs/OpenGL/ScanTargetGLSLFragments.cpp | 12 ++++++------ 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal.xcscheme b/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal.xcscheme index f9049689f..782b17c09 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal.xcscheme +++ b/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal.xcscheme @@ -68,7 +68,7 @@ draw(); + _scanTarget->draw(onlyIfDirty ? false : true); // _machine->crt_machine()->get_crt()->draw_frame((unsigned int)pixelSize.width, (unsigned int)pixelSize.height, onlyIfDirty ? true : false); } diff --git a/Outputs/OpenGL/ScanTarget.cpp b/Outputs/OpenGL/ScanTarget.cpp index 6a1755fa4..b1a569d13 100644 --- a/Outputs/OpenGL/ScanTarget.cpp +++ b/Outputs/OpenGL/ScanTarget.cpp @@ -286,8 +286,14 @@ template void ScanTarget::submit_buffer(const T &array, GLuint targ } } -void ScanTarget::draw() { - glClear(GL_COLOR_BUFFER_BIT); +void ScanTarget::draw(bool synchronous) { + if(fence_ != nullptr) { + // if the GPU is still busy, don't wait; we'll catch it next time + if(glClientWaitSync(fence_, GL_SYNC_FLUSH_COMMANDS_BIT, synchronous ? GL_TIMEOUT_IGNORED : 0) == GL_TIMEOUT_EXPIRED) { + return; + } + fence_ = nullptr; + } // Grab the current read and submit pointers. const auto submit_pointers = submit_pointers_.load(); @@ -358,8 +364,11 @@ void ScanTarget::draw() { // TEST: draw all lines. glBindFramebuffer(GL_FRAMEBUFFER, 0); + glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(line_vertex_array_); test_shader_->bind(); glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, GLsizei(scan_buffer_.size())); + + fence_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); } diff --git a/Outputs/OpenGL/ScanTarget.hpp b/Outputs/OpenGL/ScanTarget.hpp index 1e64fdea3..2973bfa7b 100644 --- a/Outputs/OpenGL/ScanTarget.hpp +++ b/Outputs/OpenGL/ScanTarget.hpp @@ -27,7 +27,7 @@ class ScanTarget: public Outputs::Display::ScanTarget { public: ScanTarget(); ~ScanTarget(); - void draw(); + void draw(bool synchronous); private: // Outputs::Display::ScanTarget overrides. @@ -130,6 +130,7 @@ class ScanTarget: public Outputs::Display::ScanTarget { void enable_vertex_attributes(ShaderType type, Shader &target); std::unique_ptr test_shader_; + GLsync fence_ = nullptr; }; } diff --git a/Outputs/OpenGL/ScanTargetGLSLFragments.cpp b/Outputs/OpenGL/ScanTargetGLSLFragments.cpp index d8fe3c505..76fc7be8d 100644 --- a/Outputs/OpenGL/ScanTargetGLSLFragments.cpp +++ b/Outputs/OpenGL/ScanTargetGLSLFragments.cpp @@ -45,8 +45,11 @@ std::string ScanTarget::glsl_globals(ShaderType type) { } std::string ScanTarget::glsl_default_vertex_shader(ShaderType type) { -// switch(type) { -// case ShaderType::Scan: + switch(type) { + case ShaderType::Scan: + return ""; + + case ShaderType::Line: return "void main(void) {" "float lateral = float(gl_VertexID & 1);" @@ -57,10 +60,7 @@ std::string ScanTarget::glsl_default_vertex_shader(ShaderType type) { "vec2 eyePosition = vec2(-0.9, 0.9) + vec2(1.8, -1.8) * (centrePoint + height);" "gl_Position = vec4(eyePosition, 0.0, 1.0);" "}"; - -// case ShaderType::Line: -// return ""; -// } + } } void ScanTarget::enable_vertex_attributes(ShaderType type, Shader &target) {