Analiz: Skia, SDL3, GPU backendleri ve geliştirme ortamı #1

Open
opened 2026-07-28 16:06:04 +03:00 by saqut · 0 comments
Owner

Amaç

Skia'nın SDL3, OpenGL ve Vulkan ile ilişkisini; modern CSS çizimleri için yeterliliğini ve mevcut geliştirme ortamının Kubbe'nin derleme/debug ihtiyaçlarına uygunluğunu kaydetmek.

1. SDL3, Skia ve GPU API'lerinin görevleri

SDL3 ve Skia birbirinin alternatifi değildir:

SDL3
├── pencere ve platform yaşam döngüsü
├── klavye/fare olayları
└── OpenGL context veya Vulkan surface

Skia
├── şekil, path, görüntü ve glyph çizimi
├── gradient, blend, blur ve filtreler
├── CPU rasterizasyonu
└── OpenGL/Vulkan üzerinde GPU rasterizasyonu

Bağlantı katmanları:

SDL_Window
    ↓
OpenGL context veya Vulkan surface/swapchain
    ↓
Skia GPU context
    ↓
SkSurface → SkCanvas
    ↓
CSS paint komutları

Skia'nın doğrudan SDL backend'i yoktur. SDL pencereyi ve işletim sistemi bağlantısını sağlar; Skia, bu pencereye ait OpenGL/Vulkan render target'ına çizim yapar.

OpenGL yolu

  • SDL OpenGL context oluşturur ve aktif hale getirir.
  • Skia mevcut OpenGL context üzerinde GPU context oluşturur.
  • Skia çizimi tamamladıktan sonra SDL buffer swap ile kareyi gösterir.

Vulkan yolu

  • SDL platforma uygun VkSurfaceKHR oluşturur.
  • Vulkan instance, physical device, logical device, queue ve swapchain Kubbe tarafından yönetilir.
  • Swapchain image Skia SkSurface nesnesine bağlanır.
  • Skia çizimi üretir; senkronizasyon ve present işlemini Kubbe tamamlar.

SDL'nin resmî API'si SDL_WINDOW_OPENGL ve SDL_WINDOW_VULKAN pencere türlerini destekler: https://wiki.libsdl.org/SDL3/SDL_CreateWindow

SDL'nin Vulkan entegrasyonu surface oluşturma yardımcılarını sağlar: https://wiki.libsdl.org/SDL3/CategoryVulkan

Skia OpenGL context veya Vulkan device'ı uygulama adına oluşturmaz: https://skia.org/docs/user/api/skcanvas_creation/

Skia'nın Vulkan ve OpenGL GPU backend'leri aynı build içinde bulunabilir ve çalışma sırasında seçilebilir: https://skia.org/docs/user/special/vulkan/

Kubbe'de SDL'nin SDL_Renderer/SDL_GPU çizim katmanını kullanmak zorunlu değildir. SDL'den pencere, olaylar ve platform yüzeyi; çizim için Skia kullanılmalıdır.

2. Modern CSS çizimleri için Skia'nın yeterliliği

Skia, Kubbe'nin paint/raster katmanı için yeterlidir. Ancak CSS ayrıştırma, layout ve CSS semantiğini kendisi uygulamaz.

CSS ihtiyacı Skia yapı taşı
Background ve border Rect, rounded rect ve path
border-radius Rounded rect/path
linear-gradient Linear gradient shader
radial-gradient Radial gradient shader
conic-gradient Sweep gradient shader
Repeating gradient Tile mode ve koordinat dönüşümü
box-shadow, text-shadow Mask/image filter ve blur
Opacity Alpha ve save layer
CSS transforms Matrix
clip-path Path ve clipping
Blend/compositing SkBlendMode
Görseller SkImage
Özel karmaşık efektler SkSL runtime shader

Gradient API: https://api.skia.org/classSkGradientShader.html

Canvas ve temel çizim API'si: https://skia.org/docs/user/api/

SkSL runtime effects: https://skia.org/docs/user/sksl/

Kubbe'nin kendisinin uygulaması gerekenler:

  • CSS gradient sözdizimi ve color-stop hesapları
  • CSS renk uzayı ve interpolation kuralları
  • Layout koordinatları ve paint sıras��
  • Background/border katmanları
  • CSS clipping ve compositing semantiği
  • Device scale factor ve piksel hizalaması

Metin tarafında Skia glyph'leri çizebilir; Unicode shaping, bidi, font fallback ve line breaking için ileride HarfBuzz, ICU ve FreeType gibi bileşenler ayrıca değerlendirilmelidir.

3. Yerel geliştirme ortamı

Denetim tarihi: 28 Temmuz 2026.

Toolchain

Bileşen Mevcut durum
İşletim sistemi Manjaro Linux, x86-64, kernel 7.1.3
GCC/G++ 16.1.1
GNU Make 4.4.1
CMake 4.3.4
Ninja 1.13.2
Clang 22.1.6
GDB 17.2
clang-tidy 22.1.6
llvm-symbolizer 22.1.6
SDL3 3.4.12
Vulkan loader/headers 1.4.350
OpenGL 4.6
shaderc 2026.2

Sanitizer doğrulaması

Geçici bir C++23 probe hem GCC hem Clang ile -fsanitize=address,undefined kullanılarak derlendi.

  • ASan kasıtlı heap-buffer-overflow'u doğru dosya ve satır bilgisiyle yakaladı.
  • UBSan kasıtlı signed integer overflow'u doğru dosya ve satır bilgisiyle yakaladı.

Sonuç: ASan ve UBSan mevcut ortamda bugün kullanılabilir durumdadır. Sistem kütüphanelerinde ayrıca libasan, libubsan ve libtsan runtime'ları bulunuyor.

Donanım

Bileşen Durum
CPU Intel Core i5-10200H, 4 çekirdek/8 thread
RAM 15 GiB
Swap 32 GiB
Boş disk Yaklaşık 294 GiB
Dahili GPU Intel UHD Graphics, OpenGL 4.6
Harici GPU NVIDIA GTX 1650 Ti 4 GiB, Vulkan 1.4/OpenGL 4.6

Normal OpenGL oturumu Intel GPU'yu kullanıyor. prime-run ile NVIDIA OpenGL yolu da doğrulandı. Vulkan NVIDIA GPU'yu görüyor. Hibrit GPU yapısı renderer'ı iki farklı sürücü üzerinde test etmek için faydalıdır.

15 GiB RAM Skia için yeterlidir. V8 ve Skia'nın ağır debug/sanitizer build'lerinde başlangıçta yaklaşık ninja -j4 veya -j6 tercih edilmelidir. Çok sayıda build profili onlarca GiB disk kullanabilir.

4. Eksik veya daha sonra eklenecek araçlar

Mevcut denetimde bulunmayanlar:

  • Skia build çıktısı
  • ccache
  • LLD
  • LLDB
  • VK_LAYER_KHRONOS_validation
  • RenderDoc
  • perf
  • Valgrind
  • Xvfb/Weston headless test ortamı

İlk CMake/build mimarisini kurmaya engel değiller. İlk Vulkan grafik kodundan önce validation layer; GPU kare analizi aşamasında RenderDoc öncelikli olmalıdır.

5. Projeye özel ve portable debug toolchain

Sanitizer kullanmak sistem genelinde bir ayar değildir. Yalnızca sanitizer flag'leriyle derlenen Kubbe hedeflerini etkiler. Önerilen ayrık build dizinleri:

out/debug/
out/asan-ubsan/
out/tsan/
out/release/

Her profil yalnızca kendi çıktısını üretir. Shared library kullanılan sanitizer profilinde Kubbe'nin bütün iç .so modülleri aynı sanitizer ayarlarıyla birlikte derlenmelidir.

Derleyicinin ve araçların da sistemden bağımsız olması istenirse depo içinde Git tarafından izlenmeyen bir toolchain alanı kullanılabilir:

.toolchains/
├── llvm/
├── cmake/
├── ninja/
└── ccache/

Sabit sürümlü LLVM/CMake/Ninja paketleri checksum doğrulayan bir bootstrap betiğiyle buraya indirilebilir. CMakePresets.json bu araçlara yönlendirilir. Büyük binary dosyaları Git'e eklenmez; sürümler ve SHA256 değerleri kaydedilir.

Sonuç

  • Skia, modern CSS paint/raster ihtiyaçları için uygun temel motordur.
  • SDL3, Skia'nın alternatifi değil; pencere ve platform köprüsüdür.
  • OpenGL ve Vulkan birlikte desteklenebilir; backend seçimi soyutlanmalıdır.
  • Mevcut sistem Kubbe geliştirmeye uygundur ve ASan/UBSan fiilen doğrulanmıştır.
  • Skia ile Vulkan validation layer ilk grafik milestone'undan önce hazırlanmalıdır.
  • Debug ve sanitizer profilleri yalnızca Kubbe build dizinlerinde etkinleştirilebilir; gerektiğinde tüm toolchain proje-local hale getirilebilir.
## Amaç Skia'nın SDL3, OpenGL ve Vulkan ile ilişkisini; modern CSS çizimleri için yeterliliğini ve mevcut geliştirme ortamının Kubbe'nin derleme/debug ihtiyaçlarına uygunluğunu kaydetmek. ## 1. SDL3, Skia ve GPU API'lerinin görevleri SDL3 ve Skia birbirinin alternatifi değildir: ```text SDL3 ├── pencere ve platform yaşam döngüsü ├── klavye/fare olayları └── OpenGL context veya Vulkan surface Skia ├── şekil, path, görüntü ve glyph çizimi ├── gradient, blend, blur ve filtreler ├── CPU rasterizasyonu └── OpenGL/Vulkan üzerinde GPU rasterizasyonu ``` Bağlantı katmanları: ```text SDL_Window ↓ OpenGL context veya Vulkan surface/swapchain ↓ Skia GPU context ↓ SkSurface → SkCanvas ↓ CSS paint komutları ``` Skia'nın doğrudan SDL backend'i yoktur. SDL pencereyi ve işletim sistemi bağlantısını sağlar; Skia, bu pencereye ait OpenGL/Vulkan render target'ına çizim yapar. ### OpenGL yolu - SDL OpenGL context oluşturur ve aktif hale getirir. - Skia mevcut OpenGL context üzerinde GPU context oluşturur. - Skia çizimi tamamladıktan sonra SDL buffer swap ile kareyi gösterir. ### Vulkan yolu - SDL platforma uygun `VkSurfaceKHR` oluşturur. - Vulkan instance, physical device, logical device, queue ve swapchain Kubbe tarafından yönetilir. - Swapchain image Skia `SkSurface` nesnesine bağlanır. - Skia çizimi üretir; senkronizasyon ve present işlemini Kubbe tamamlar. SDL'nin resmî API'si `SDL_WINDOW_OPENGL` ve `SDL_WINDOW_VULKAN` pencere türlerini destekler: https://wiki.libsdl.org/SDL3/SDL_CreateWindow SDL'nin Vulkan entegrasyonu surface oluşturma yardımcılarını sağlar: https://wiki.libsdl.org/SDL3/CategoryVulkan Skia OpenGL context veya Vulkan device'ı uygulama adına oluşturmaz: https://skia.org/docs/user/api/skcanvas_creation/ Skia'nın Vulkan ve OpenGL GPU backend'leri aynı build içinde bulunabilir ve çalışma sırasında seçilebilir: https://skia.org/docs/user/special/vulkan/ Kubbe'de SDL'nin `SDL_Renderer`/`SDL_GPU` çizim katmanını kullanmak zorunlu değildir. SDL'den pencere, olaylar ve platform yüzeyi; çizim için Skia kullanılmalıdır. ## 2. Modern CSS çizimleri için Skia'nın yeterliliği Skia, Kubbe'nin paint/raster katmanı için yeterlidir. Ancak CSS ayrıştırma, layout ve CSS semantiğini kendisi uygulamaz. | CSS ihtiyacı | Skia yapı taşı | | --- | --- | | Background ve border | Rect, rounded rect ve path | | `border-radius` | Rounded rect/path | | `linear-gradient` | Linear gradient shader | | `radial-gradient` | Radial gradient shader | | `conic-gradient` | Sweep gradient shader | | Repeating gradient | Tile mode ve koordinat dönüşümü | | `box-shadow`, `text-shadow` | Mask/image filter ve blur | | Opacity | Alpha ve save layer | | CSS transforms | Matrix | | `clip-path` | Path ve clipping | | Blend/compositing | `SkBlendMode` | | Görseller | `SkImage` | | Özel karmaşık efektler | SkSL runtime shader | Gradient API: https://api.skia.org/classSkGradientShader.html Canvas ve temel çizim API'si: https://skia.org/docs/user/api/ SkSL runtime effects: https://skia.org/docs/user/sksl/ Kubbe'nin kendisinin uygulaması gerekenler: - CSS gradient sözdizimi ve color-stop hesapları - CSS renk uzayı ve interpolation kuralları - Layout koordinatları ve paint sıras�� - Background/border katmanları - CSS clipping ve compositing semantiği - Device scale factor ve piksel hizalaması Metin tarafında Skia glyph'leri çizebilir; Unicode shaping, bidi, font fallback ve line breaking için ileride HarfBuzz, ICU ve FreeType gibi bileşenler ayrıca değerlendirilmelidir. ## 3. Yerel geliştirme ortamı Denetim tarihi: 28 Temmuz 2026. ### Toolchain | Bileşen | Mevcut durum | | --- | --- | | İşletim sistemi | Manjaro Linux, x86-64, kernel 7.1.3 | | GCC/G++ | 16.1.1 | | GNU Make | 4.4.1 | | CMake | 4.3.4 | | Ninja | 1.13.2 | | Clang | 22.1.6 | | GDB | 17.2 | | clang-tidy | 22.1.6 | | llvm-symbolizer | 22.1.6 | | SDL3 | 3.4.12 | | Vulkan loader/headers | 1.4.350 | | OpenGL | 4.6 | | shaderc | 2026.2 | ### Sanitizer doğrulaması Geçici bir C++23 probe hem GCC hem Clang ile `-fsanitize=address,undefined` kullanılarak derlendi. - ASan kasıtlı heap-buffer-overflow'u doğru dosya ve satır bilgisiyle yakaladı. - UBSan kasıtlı signed integer overflow'u doğru dosya ve satır bilgisiyle yakaladı. Sonuç: ASan ve UBSan mevcut ortamda bugün kullanılabilir durumdadır. Sistem kütüphanelerinde ayrıca `libasan`, `libubsan` ve `libtsan` runtime'ları bulunuyor. ### Donanım | Bileşen | Durum | | --- | --- | | CPU | Intel Core i5-10200H, 4 çekirdek/8 thread | | RAM | 15 GiB | | Swap | 32 GiB | | Boş disk | Yaklaşık 294 GiB | | Dahili GPU | Intel UHD Graphics, OpenGL 4.6 | | Harici GPU | NVIDIA GTX 1650 Ti 4 GiB, Vulkan 1.4/OpenGL 4.6 | Normal OpenGL oturumu Intel GPU'yu kullanıyor. `prime-run` ile NVIDIA OpenGL yolu da doğrulandı. Vulkan NVIDIA GPU'yu görüyor. Hibrit GPU yapısı renderer'ı iki farklı sürücü üzerinde test etmek için faydalıdır. 15 GiB RAM Skia için yeterlidir. V8 ve Skia'nın ağır debug/sanitizer build'lerinde başlangıçta yaklaşık `ninja -j4` veya `-j6` tercih edilmelidir. Çok sayıda build profili onlarca GiB disk kullanabilir. ## 4. Eksik veya daha sonra eklenecek araçlar Mevcut denetimde bulunmayanlar: - Skia build çıktısı - `ccache` - LLD - LLDB - `VK_LAYER_KHRONOS_validation` - RenderDoc - `perf` - Valgrind - Xvfb/Weston headless test ortamı İlk CMake/build mimarisini kurmaya engel değiller. İlk Vulkan grafik kodundan önce validation layer; GPU kare analizi aşamasında RenderDoc öncelikli olmalıdır. ## 5. Projeye özel ve portable debug toolchain Sanitizer kullanmak sistem genelinde bir ayar değildir. Yalnızca sanitizer flag'leriyle derlenen Kubbe hedeflerini etkiler. Önerilen ayrık build dizinleri: ```text out/debug/ out/asan-ubsan/ out/tsan/ out/release/ ``` Her profil yalnızca kendi çıktısını üretir. Shared library kullanılan sanitizer profilinde Kubbe'nin bütün iç `.so` modülleri aynı sanitizer ayarlarıyla birlikte derlenmelidir. Derleyicinin ve araçların da sistemden bağımsız olması istenirse depo içinde Git tarafından izlenmeyen bir toolchain alanı kullanılabilir: ```text .toolchains/ ├── llvm/ ├── cmake/ ├── ninja/ └── ccache/ ``` Sabit sürümlü LLVM/CMake/Ninja paketleri checksum doğrulayan bir bootstrap betiğiyle buraya indirilebilir. `CMakePresets.json` bu araçlara yönlendirilir. Büyük binary dosyaları Git'e eklenmez; sürümler ve SHA256 değerleri kaydedilir. ## Sonuç - Skia, modern CSS paint/raster ihtiyaçları için uygun temel motordur. - SDL3, Skia'nın alternatifi değil; pencere ve platform köprüsüdür. - OpenGL ve Vulkan birlikte desteklenebilir; backend seçimi soyutlanmalıdır. - Mevcut sistem Kubbe geliştirmeye uygundur ve ASan/UBSan fiilen doğrulanmıştır. - Skia ile Vulkan validation layer ilk grafik milestone'undan önce hazırlanmalıdır. - Debug ve sanitizer profilleri yalnızca Kubbe build dizinlerinde etkinleştirilebilir; gerektiğinde tüm toolchain proje-local hale getirilebilir.
Sign in to join this conversation.
No Label
No Milestone
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: saqut/kubbebrowser#1
No description provided.