diff --git a/src/DrawingProgram/Tools/EyeDropperTool.cpp b/src/DrawingProgram/Tools/EyeDropperTool.cpp index a85013a..f29304b 100644 --- a/src/DrawingProgram/Tools/EyeDropperTool.cpp +++ b/src/DrawingProgram/Tools/EyeDropperTool.cpp @@ -53,7 +53,7 @@ void EyeDropperTool::input_mouse_button_on_canvas_callback(const InputManager::M auto& selectingStrokeColor = drawP.world.main.toolConfig.eyeDropper.selectingStrokeColor; if(button.button == InputManager::MouseButton::LEFT && button.down && !drawP.selection.is_being_transformed() && !drawP.world.main.g.gui.cursor_obstructed()) { - auto& surface = drawP.world.main.window.intermediateSurface; + auto& surface = drawP.world.main.window.nativeSurface; int xPos = std::clamp(button.pos.x(), 0, drawP.world.main.window.size.x() - 1); int yPos = std::clamp(button.pos.y(), 0, drawP.world.main.window.size.y() - 1); diff --git a/src/GUIStuff/GUIManager.cpp b/src/GUIStuff/GUIManager.cpp index 986e9ef..9141a93 100644 --- a/src/GUIStuff/GUIManager.cpp +++ b/src/GUIStuff/GUIManager.cpp @@ -310,8 +310,8 @@ SCollision::AABB GUIManager::get_invalid_draw_bb(SCollision::AABB } void GUIManager::update_invalidated_draw_area_from_layout() { - auto renderCommandMapCopy = oldRenderCommandMap; if(setToUpdateInvalidateDrawAreaFromLayout) { + auto renderCommandMapCopy = oldRenderCommandMap; for(int32_t i = 0; i < renderCommands.length; i++) { const Clay_RenderCommand& renderCommand = renderCommands.internalArray[i]; auto oldCommandIt = oldRenderCommandMap.find(renderCommand.id); diff --git a/src/MainProgram.cpp b/src/MainProgram.cpp index b517a98..4fb0105 100755 --- a/src/MainProgram.cpp +++ b/src/MainProgram.cpp @@ -230,11 +230,10 @@ void MainProgram::refresh_draw_surfaces() { if(window.canCreateSurfaces) { window.defaultMSAASampleCount = 0; window.defaultMSAASurfaceProps = SkSurfaceProps(conf.antialiasing == GlobalConfig::AntiAliasing::DYNAMIC_MSAA ? SkSurfaceProps::kDynamicMSAA_Flag : SkSurfaceProps::kDefault_Flag, kUnknown_SkPixelGeometry); - window.intermediateSurface = create_native_surface(window.size, true); - window.intermediateCanvas = window.intermediateSurface->getCanvas(); - - if(!window.intermediateCanvas) - throw std::runtime_error("[refresh_draw_surfaces] Could not create intermediate canvas"); + if(conf.antialiasing == GlobalConfig::AntiAliasing::DYNAMIC_MSAA) + window.intermediateSurfaceMSAA = create_native_surface(window.size, true); + else + window.intermediateSurfaceMSAA = nullptr; g.delete_cache_surface(); diff --git a/src/MainProgram.hpp b/src/MainProgram.hpp index 95cc68c..5993dae 100644 --- a/src/MainProgram.hpp +++ b/src/MainProgram.hpp @@ -58,8 +58,8 @@ class MainProgram { sk_sp ctx; #endif - sk_sp intermediateSurface; - SkCanvas* intermediateCanvas; + sk_sp nativeSurface; + sk_sp intermediateSurfaceMSAA; SDL_Window* sdlWindow; bool canCreateSurfaces = false; diff --git a/src/main.cpp b/src/main.cpp index 91da8d6..03ca5e8 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -136,8 +136,6 @@ struct MainStruct { unsigned currentCursor = 0; SkCanvas* canvas; - sk_sp surface; - SDL_Surface* iconSurface = nullptr; std::string iconData; @@ -324,11 +322,11 @@ void resize_window(MainStruct& mS) { SkSurfaceProps props2; mS.target = GrBackendRenderTargets::MakeGL(mS.m->window.size.x(), mS.m->window.size.y(), 0, mS.kStencilBits, info); - mS.surface = SkSurfaces::WrapBackendRenderTarget(mS.ctx.get(), mS.target, kBottomLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, SkColorSpace::MakeSRGB(), &props2); + mS.m->window.nativeSurface = SkSurfaces::WrapBackendRenderTarget(mS.ctx.get(), mS.target, kBottomLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, SkColorSpace::MakeSRGB(), &props2); - if(!mS.surface) + if(!mS.m->window.nativeSurface) throw std::runtime_error("[resize_window] Could not make surface"); - mS.canvas = mS.surface->getCanvas(); + mS.canvas = mS.m->window.nativeSurface->getCanvas(); if(!mS.canvas) throw std::runtime_error("[resize_window] No canvas made"); @@ -479,7 +477,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv) { }, SDL_Vulkan_GetPresentationSupport, (PFN_vkGetInstanceProcAddr)SDL_Vulkan_GetVkGetInstanceProcAddr()); - mS.surface = mS.vulkanWindowContext->getBackbufferSurface(); + mS.m->window.nativeSurface = mS.vulkanWindowContext->getBackbufferSurface(); #elif USE_SKIA_BACKEND_GANESH std::unique_ptr displayParams = skwindow::DisplayParamsBuilder().detach(); @@ -496,7 +494,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv) { (PFN_vkGetInstanceProcAddr)SDL_Vulkan_GetVkGetInstanceProcAddr()); mS.ctx = mS.vulkanWindowContext->fContext; // fContext is supposed to be private, but put it in public for convenience for this app - mS.surface = mS.vulkanWindowContext->getBackbufferSurface(); + mS.m->window.nativeSurface = mS.vulkanWindowContext->getBackbufferSurface(); #endif #elif USE_BACKEND_OPENGL sk_sp iface = GrGLMakeNativeInterface(); @@ -575,58 +573,36 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv) { return SDL_APP_CONTINUE; } -void cpu_save_sleep(MainStruct& mS) { - int swapInterval = 0; - constexpr std::chrono::duration MINIMUM_UPDATE_FRAMETIME = std::chrono::milliseconds(3); - SDL_GL_GetSwapInterval(&swapInterval); - if(swapInterval != 0) { - std::chrono::time_point point1 = mS.lastRenderTimePoint + mS.frameRefreshDuration; - std::chrono::time_point point2 = mS.lastUpdateTimePoint + MINIMUM_UPDATE_FRAMETIME; - std::this_thread::sleep_until(std::min(point1, point2)); - } -} - -void attempt_redraw_and_swap_buffers(MainStruct& mS) { - int swapInterval = 0; - SDL_GL_GetSwapInterval(&swapInterval); - if(std::chrono::steady_clock::now() - mS.lastRenderTimePoint > mS.frameRefreshDuration || swapInterval == 0) { - #ifdef USE_BACKEND_VULKAN - mS.vulkanWindowContext->swapBuffers(); - #elif USE_BACKEND_OPENGL - SDL_GL_SwapWindow(mS.window); - #endif - mS.lastRenderTimePoint = std::chrono::steady_clock::now(); - - mS.m->window.intermediateCanvas->save(); - mS.m->draw(mS.m->window.intermediateCanvas, mS.m->world, mS.m->world->drawData); - mS.m->window.intermediateCanvas->restore(); - - #ifdef USE_BACKEND_VULKAN - mS.vulkanWindowContext->getBackbufferSurface()->getCanvas()->drawImage(mS.intermediateSurface->makeTemporaryImage(), 0, 0); - mS.ctx->flushAndSubmit(); - #elif USE_BACKEND_OPENGL - mS.canvas->drawImage(mS.m->window.intermediateSurface->makeTemporaryImage(), 0, 0); - mS.ctx->flushAndSubmit(); - #endif - } -} - void regular_draw(MainStruct& mS) { mS.lastRenderTimePoint = std::chrono::steady_clock::now(); - mS.m->window.intermediateCanvas->save(); - mS.m->draw(mS.m->window.intermediateCanvas, mS.m->world, mS.m->world->drawData); - mS.m->window.intermediateCanvas->restore(); + if(mS.m->window.intermediateSurfaceMSAA) { + SkCanvas* intermediateCanvas = mS.m->window.intermediateSurfaceMSAA->getCanvas(); + intermediateCanvas->save(); + mS.m->draw(intermediateCanvas, mS.m->world, mS.m->world->drawData); + intermediateCanvas->restore(); - #ifdef USE_BACKEND_VULKAN - mS.vulkanWindowContext->getBackbufferSurface()->getCanvas()->drawImage(mS.intermediateSurface->makeTemporaryImage(), 0, 0); - mS.ctx->flushAndSubmit(); - mS.vulkanWindowContext->swapBuffers(); - #elif USE_BACKEND_OPENGL - mS.canvas->drawImage(mS.m->window.intermediateSurface->makeTemporaryImage(), 0, 0); - mS.ctx->flushAndSubmit(); - SDL_GL_SwapWindow(mS.window); - #endif + #ifdef USE_BACKEND_VULKAN + mS.vulkanWindowContext->getBackbufferSurface()->getCanvas()->drawImage(mS.m->window.intermediateSurfaceMSAA->makeTemporaryImage(), 0, 0); + mS.ctx->flushAndSubmit(); + mS.vulkanWindowContext->swapBuffers(); + #elif USE_BACKEND_OPENGL + mS.canvas->drawImage(mS.m->window.intermediateSurfaceMSAA->makeTemporaryImage(), 0, 0); + mS.ctx->flushAndSubmit(); + SDL_GL_SwapWindow(mS.window); + #endif + } + else { + #ifdef USE_BACKEND_VULKAN + mS.m->draw(mS.vulkanWindowContext->getBackbufferSurface()->getCanvas(), mS.m->world, mS.m->world->drawData); + mS.ctx->flushAndSubmit(); + mS.vulkanWindowContext->swapBuffers(); + #elif USE_BACKEND_OPENGL + mS.m->draw(mS.canvas, mS.m->world, mS.m->world->drawData); + mS.ctx->flushAndSubmit(); + SDL_GL_SwapWindow(mS.window); + #endif + } } SDL_AppResult SDL_AppIterate(void *appstate) { @@ -659,8 +635,6 @@ SDL_AppResult SDL_AppIterate(void *appstate) { SDL_SetCursor(mS.systemCursors[static_cast(mS.m->input.cursorIcon)]); } - //cpu_save_sleep(mS); - //attempt_redraw_and_swap_buffers(mS); regular_draw(mS); mS.m->input.frame_reset(mS.m->window.size);