Skia AA and no AA bypass intermediate surface

This commit is contained in:
Yousef Khadadeh 2026-04-09 01:05:52 +03:00
parent 4b2ecf2fe6
commit 37c105bf5e
5 changed files with 39 additions and 66 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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();

View file

@ -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;

View file

@ -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);