Skia AA and no AA bypass intermediate surface
This commit is contained in:
parent
4b2ecf2fe6
commit
37c105bf5e
5 changed files with 39 additions and 66 deletions
|
|
@ -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<int>(button.pos.x(), 0, drawP.world.main.window.size.x() - 1);
|
||||
int yPos = std::clamp<int>(button.pos.y(), 0, drawP.world.main.window.size.y() - 1);
|
||||
|
|
|
|||
|
|
@ -310,8 +310,8 @@ SCollision::AABB<float> GUIManager::get_invalid_draw_bb(SCollision::AABB<float>
|
|||
}
|
||||
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -58,8 +58,8 @@ class MainProgram {
|
|||
sk_sp<GrDirectContext> ctx;
|
||||
#endif
|
||||
|
||||
sk_sp<SkSurface> intermediateSurface;
|
||||
SkCanvas* intermediateCanvas;
|
||||
sk_sp<SkSurface> nativeSurface;
|
||||
sk_sp<SkSurface> intermediateSurfaceMSAA;
|
||||
|
||||
SDL_Window* sdlWindow;
|
||||
bool canCreateSurfaces = false;
|
||||
|
|
|
|||
88
src/main.cpp
88
src/main.cpp
|
|
@ -136,8 +136,6 @@ struct MainStruct {
|
|||
unsigned currentCursor = 0;
|
||||
|
||||
SkCanvas* canvas;
|
||||
sk_sp<SkSurface> 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<const skwindow::DisplayParams> 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<const GrGLInterface> 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<unsigned>(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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue