Skip to content

Commit 8185c18

Browse files
committed
wip: direct video output
1 parent d712993 commit 8185c18

14 files changed

+809
-43
lines changed

dhall/sourceTreeParts.dhall

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,139 @@ let skia =
536536
, "${objDir}/../libwindow.a"
537537
] # static3rdPartyLibraries
538538
}
539+
let skiaVideo = \(asan : Bool) ->
540+
let dir = "./skia"
541+
let contribDir = "./contrib/skia"
542+
let objDir = if asan then "${contribDir}/out/asan/obj" else "${contribDir}/out/Static/obj"
543+
let static3rdPartyLibraries = [
544+
-- static libaries (offial_build=false mode)
545+
, "${objDir}/../libcompression_utils_portable.a"
546+
, "${objDir}/../libdng_sdk.a"
547+
, "${objDir}/../libexpat.a"
548+
, "${objDir}/../libharfbuzz.a"
549+
, "${objDir}/../libicu.a"
550+
, "${objDir}/../libicu_bidi.a"
551+
, "${objDir}/../libjpeg.a"
552+
, "${objDir}/../libmicrohttpd.a"
553+
, "${objDir}/../libpathkit.a"
554+
, "${objDir}/../libperfetto.a"
555+
, "${objDir}/../libpiex.a"
556+
, "${objDir}/../libpng.a"
557+
]
558+
in sourceTreePart::{
559+
, name = "skiaVideo"
560+
, dir = dir
561+
, sources = [
562+
, "${dir}/video/main.cpp"
563+
, "${dir}/video/app.cpp"
564+
565+
, "${dir}/paragraph.cpp"
566+
, "${dir}/cliOptions.cpp"
567+
, "${dir}/setupUI.cpp"
568+
, "${dir}/vectorCmdSkiaRenderer.cpp"
569+
, "${dir}/skiaTracyTracer.cpp"
570+
-- FIXME
571+
, "${contribDir}/src/gpu/ganesh/gl/GrGLInterfaceAutogen.cpp"
572+
, "${contribDir}/src/gpu/ganesh/gl/GrGLUtil.cpp"
573+
-- FIXME
574+
--, "skia/video/SkFontMgr_custom_embedded.cpp"
575+
]
576+
, includeDirs = {
577+
, local = [
578+
, imgui.dir
579+
, imguiImplot.dir
580+
, render.dir
581+
]
582+
, global = [
583+
, "${contribDir}"
584+
, "${contribDir}/modules/sksg/include"
585+
, "${contribDir}/modules/bentleyottmann/include"
586+
, "${contribDir}/modules/skottie/include"
587+
, "${contribDir}/modules/skparagraph/include"
588+
, "${contribDir}/modules/skplaintexteditor/include"
589+
, "${contribDir}/modules/skresources/include"
590+
, "${contribDir}/modules/skshaper/include"
591+
, "${contribDir}/modules/skunicode/include"
592+
, "${contribDir}/modules/svg/include"
593+
--, "${contribDir}/experimental/sktext/include"
594+
, "${contribDir}/include"
595+
, "${contribDir}/include/core"
596+
] : List Text
597+
}
598+
, defines = {, local = [
599+
, "SK_DEBUG"
600+
, "SK_GAMMA_APPLY_TO_A8"
601+
, "SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1"
602+
--, "GR_TEST_UTILS=1"
603+
, "SK_TYPEFACE_FACTORY_FREETYPE"
604+
--, "SK_FONTMGR_ANDROID_AVAILABLE"
605+
--, "SK_FONTMGR_FREETYPE_DIRECTORY_AVAILABLE"
606+
, "SK_FONTMGR_FREETYPE_EMBEDDED_AVAILABLE"
607+
, "SK_FONTMGR_FREETYPE_EMPTY_AVAILABLE"
608+
--, "SK_FONTMGR_FONTCONFIG_AVAILABLE"
609+
, "SK_GL"
610+
, "SK_SUPPORT_PDF"
611+
, "SK_CODEC_DECODES_JPEG"
612+
, "SK_CODEC_DECODES_JPEG_GAINMAPS"
613+
, "SK_XML"
614+
--, "SK_ENABLE_ANDROID_UTILS"
615+
, "SK_HAS_HEIF_LIBRARY"
616+
, "SK_CODEC_DECODES_PNG"
617+
, "SK_CODEC_DECODES_RAW"
618+
, "SK_CODEC_DECODES_WEBP"
619+
, "SK_HAS_WUFFS_LIBRARY"
620+
, "SK_DEFAULT_TYPEFACE_IS_EMPTY"
621+
, "SK_DISABLE_LEGACY_DEFAULT_TYPEFACE"
622+
, "SK_R32_SHIFT=16"
623+
, "SK_ENABLE_PRECOMPILE"
624+
--, "SKSL_ENABLE_TRACING"
625+
, "SK_GANESH"
626+
--, "SK_USE_PERFETTO"
627+
--, "SK_ENABLE_SKOTTIE"
628+
--, "SK_ENABLE_SKOTTIE_SKSLEFFECT"
629+
, "SK_ENABLE_PARAGRAPH"
630+
, "SK_UNICODE_AVAILABLE"
631+
, "SK_UNICODE_ICU_IMPLEMENTATION"
632+
, "SK_SHAPER_PRIMITIVE_AVAILABLE"
633+
, "SK_SHAPER_HARFBUZZ_AVAILABLE"
634+
, "SK_SHAPER_UNICODE_AVAILABLE"
635+
, "SK_ENABLE_SVG"
636+
, "SK_BUILD_FOR_UNIX"
637+
], global = [
638+
--, "IMGUI_USE_BGRA_PACKED_COLOR"
639+
] : List Text}
640+
, cxxflags = {
641+
, global = [
642+
] : List Text
643+
, local = [
644+
, "-Wno-unused-parameter"
645+
] : List Text
646+
}
647+
, ldflags = {
648+
, global = [
649+
, "-ldl"
650+
, "-lpthread"
651+
, "-lfreetype"
652+
, "-lz"
653+
, "-lglfw"
654+
, "-lfontconfig"
655+
, "-lwebpmux"
656+
, "-lwebpdemux"
657+
, "-lX11"
658+
, "-lGLU"
659+
, "-lGL"
660+
--, "-Wl,--verbose"
661+
] : List Text
662+
}
663+
, nonSourceObjs = [
664+
, "${objDir}/../libskparagraph.a"
665+
, "${objDir}/../libsvg.a"
666+
, "${objDir}/../libskia.a"
667+
, "${objDir}/../libskshaper.a"
668+
, "${objDir}/../libskunicode.a"
669+
, "${objDir}/../libwindow.a"
670+
] # static3rdPartyLibraries
671+
}
539672
let skiaSdl = \(asan : Bool) ->
540673
let dir = "./skia"
541674
let contribDir = "./contrib/skia"
@@ -730,6 +863,7 @@ in
730863
, binding
731864
, skia
732865
, skiaSdl
866+
, skiaVideo
733867
, tracyEnabled
734868
, tracyDisabled
735869
, sdl3

scripts/install_3rd_party_git_repos.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,5 @@ getContribRepo "https://github.com/dhall-lang/dhall-lang" "dhall-lang" "master"
5151
getContribRepo "https://github.com/google/flatbuffers.git" "flatbuffers" "master" "129ef422e8a4e89d87a7216a865602673a6d0bf3"
5252
getContribRepo "https://github.com/google/skia" "skia" "chrome/m124" ""
5353
getContribRepo "https://github.com/wolfpld/tracy" "tracy" "master" "0d5bd53be393b590da9c7b29079d919d488412c1"
54-
getContribRepo "https://github.com/libsdl-org/SDL.git" "sdl" "main" ""
54+
getContribRepo "https://github.com/libsdl-org/SDL.git" "sdl" "main" "e049098733739664ffbeac6967568b2421a0cb2e"
5555
getMyRepo "https://github.com/stergiotis/boxer.git" "boxer" "main" ""

skia/CMakeLists.txt

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -92,19 +92,17 @@ add_library(imguiTextedit OBJECT "${CMAKE_CURRENT_LIST_DIR}/./imcolortextedit/Te
9292
target_compile_options(imguiTextedit PUBLIC -Wno-unused-variable)
9393

9494

95-
add_library(skiaSdl OBJECT "${CMAKE_CURRENT_LIST_DIR}/./skia/sdl3/imgui_impl_opengl3.cpp"
96-
"${CMAKE_CURRENT_LIST_DIR}/./skia/sdl3/imgui_impl_sdl3.cpp"
97-
"${CMAKE_CURRENT_LIST_DIR}/./skia/sdl3/main.cpp"
98-
"${CMAKE_CURRENT_LIST_DIR}/./skia/sdl3/app.cpp"
95+
add_library(skiaVideo OBJECT "${CMAKE_CURRENT_LIST_DIR}/./skia/video/main.cpp"
96+
"${CMAKE_CURRENT_LIST_DIR}/./skia/video/app.cpp"
9997
"${CMAKE_CURRENT_LIST_DIR}/./skia/paragraph.cpp"
10098
"${CMAKE_CURRENT_LIST_DIR}/./skia/cliOptions.cpp"
10199
"${CMAKE_CURRENT_LIST_DIR}/./skia/setupUI.cpp"
102100
"${CMAKE_CURRENT_LIST_DIR}/./skia/vectorCmdSkiaRenderer.cpp"
103101
"${CMAKE_CURRENT_LIST_DIR}/./skia/skiaTracyTracer.cpp"
104102
"${CMAKE_CURRENT_LIST_DIR}/./contrib/skia/src/gpu/ganesh/gl/GrGLInterfaceAutogen.cpp"
105103
"${CMAKE_CURRENT_LIST_DIR}/./contrib/skia/src/gpu/ganesh/gl/GrGLUtil.cpp")
106-
target_compile_options(skiaSdl PUBLIC -Wno-unused-parameter)
107-
target_compile_definitions(skiaSdl PUBLIC SK_DEBUG
104+
target_compile_options(skiaVideo PUBLIC -Wno-unused-parameter)
105+
target_compile_definitions(skiaVideo PUBLIC SK_DEBUG
108106
SK_GAMMA_APPLY_TO_A8
109107
SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1
110108
SK_TYPEFACE_FACTORY_FREETYPE
@@ -133,19 +131,17 @@ SK_SHAPER_HARFBUZZ_AVAILABLE
133131
SK_SHAPER_UNICODE_AVAILABLE
134132
SK_ENABLE_SVG
135133
SK_BUILD_FOR_UNIX)
136-
target_include_directories(skiaSdl PUBLIC "${CMAKE_CURRENT_LIST_DIR}/./skia"
134+
target_include_directories(skiaVideo PUBLIC "${CMAKE_CURRENT_LIST_DIR}/./skia"
137135
"${CMAKE_CURRENT_LIST_DIR}/./imgui"
138136
"${CMAKE_CURRENT_LIST_DIR}/./src/widgets/imgui_implot"
139-
"${CMAKE_CURRENT_LIST_DIR}/./src"
140-
"${CMAKE_CURRENT_LIST_DIR}/./contrib/sdl3/include")
141-
add_library(skiaSdl_imported OBJECT IMPORTED)
142-
set_property(TARGET skiaSdl_imported PROPERTY IMPORTED_OBJECTS "${CMAKE_CURRENT_LIST_DIR}/./contrib/skia/out/Static/obj/../libskparagraph.a"
137+
"${CMAKE_CURRENT_LIST_DIR}/./src")
138+
add_library(skiaVideo_imported OBJECT IMPORTED)
139+
set_property(TARGET skiaVideo_imported PROPERTY IMPORTED_OBJECTS "${CMAKE_CURRENT_LIST_DIR}/./contrib/skia/out/Static/obj/../libskparagraph.a"
143140
"${CMAKE_CURRENT_LIST_DIR}/./contrib/skia/out/Static/obj/../libsvg.a"
144141
"${CMAKE_CURRENT_LIST_DIR}/./contrib/skia/out/Static/obj/../libskia.a"
145142
"${CMAKE_CURRENT_LIST_DIR}/./contrib/skia/out/Static/obj/../libskshaper.a"
146143
"${CMAKE_CURRENT_LIST_DIR}/./contrib/skia/out/Static/obj/../libskunicode.a"
147144
"${CMAKE_CURRENT_LIST_DIR}/./contrib/skia/out/Static/obj/../libwindow.a"
148-
"${CMAKE_CURRENT_LIST_DIR}/./contrib/sdl3/build/libSDL3.a"
149145
"${CMAKE_CURRENT_LIST_DIR}/./contrib/skia/out/Static/obj/../libcompression_utils_portable.a"
150146
"${CMAKE_CURRENT_LIST_DIR}/./contrib/skia/out/Static/obj/../libdng_sdk.a"
151147
"${CMAKE_CURRENT_LIST_DIR}/./contrib/skia/out/Static/obj/../libexpat.a"
@@ -172,7 +168,7 @@ $<TARGET_OBJECTS:imguiKnobs>
172168
$<TARGET_OBJECTS:imguiCoolbar>
173169
$<TARGET_OBJECTS:imguiFlamegraph>
174170
$<TARGET_OBJECTS:imguiTextedit>
175-
$<TARGET_OBJECTS:skiaSdl>
176-
$<TARGET_OBJECTS:skiaSdl_imported>
171+
$<TARGET_OBJECTS:skiaVideo>
172+
$<TARGET_OBJECTS:skiaVideo_imported>
177173
$<TARGET_OBJECTS:tracyDisabled>)
178174

skia/common.dhall

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ let sourceTreeParts = [
1717
, sourceTreePartsRepo.imguiTextedit
1818
, sourceTreePartsRepo.binding
1919
--, sourceTreePartsRepo.skia
20-
, sourceTreePartsRepo.skiaSdl asan
20+
, sourceTreePartsRepo.skiaVideo asan
2121
, sourceTreePartsRepo.flatbuffers
2222
] # (if debug then [ , sourceTreePartsRepo.tracyEnabled ] else [ ,sourceTreePartsRepo.tracyDisabled ] : List lib.sourceTreePart.Type )
2323
--let cxx = "${clangdir}/bin/clang++"

skia/imgui/imgui_draw_fb.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ void ImDrawList::addVectorCmdFB(VectorCmdFB::VectorCmdArg arg_type, flatbuffers:
255255
AddDrawCmd();
256256
}
257257
}
258+
//fprintf(stderr,"%s: adding %s\n", _OwnerName, VectorCmdFB::EnumNameVectorCmdArg(arg_type));
258259
_FbCmds->push_back(VectorCmdFB::CreateSingleVectorCmdDto(*fbBuilder,arg_type,arg));
259260
}
260261
template<typename T,typename U, typename V>
@@ -305,7 +306,7 @@ void ImDrawList::serializeFB(const uint8_t *&out,size_t &size) { ZoneScoped;
305306
}
306307

307308
auto dlFb = createVectorCmdFBDrawList(*this,false,*_FbCmds,*fbBuilder);
308-
fbBuilder->Finish(dlFb,nullptr);
309+
fbBuilder->FinishSizePrefixed(dlFb,nullptr);
309310
size = fbBuilder->GetSize();
310311
out = fbBuilder->GetBufferPointer();
311312
}

skia/skia/cliOptions.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,20 @@ static float findFlagValueDefaultFloat(FILE *logChannel, uint64_t &markUsed, int
3636
}
3737
return f;
3838
}
39+
static int64_t findFlagValueDefaultInt(FILE *logChannel, uint64_t &markUsed, int argc, char **argv,const char *flag,const char *defaultValue) {
40+
const char *v = findFlagValueDefault(logChannel, markUsed,argc,argv,flag,defaultValue);
41+
char *end;
42+
auto f = strtol(v, &end,0);
43+
if(f == 0 && end == v) {
44+
fprintf(stderr,"unable to parse argument for flag %s as integer", flag);
45+
exit(1);
46+
}
47+
if(end[0] != '\0') {
48+
fprintf(stderr,"unable to parse argument for flag %s as integer: trailing data found '%s'", flag, end);
49+
exit(1);
50+
}
51+
return f;
52+
}
3953
static bool getBoolFlagValue(FILE *logChannel, uint64_t &markUsed, int argc, char **argv,const char *flag,bool defaultValue) {
4054
return strcmp(findFlagValueDefault(logChannel, markUsed, argc,argv,flag,defaultValue ? "on" : "off"),"on") == 0;
4155
}
@@ -61,6 +75,13 @@ void CliOptions::usage(const char *name, FILE *file) const {
6175
fprintf(file," -imguiNavGamepad [bool:%s]\n", imguiNavGamepad ? "on" : "off");
6276
fprintf(file," -imguiDocking [bool:%s]\n", imguiDocking ? "on" : "off");
6377
fprintf(file," -vectorCmd [bool:%s] on: intercept ImGui DrawList draw commands and replay them on client (e.g. skia)\n", vectorCmd ? "on" : "off");
78+
79+
fprintf(file, "video mode flags:\n");
80+
fprintf(file, "string flags:\n");
81+
fprintf(file, " -videoRawFramesFile [path:%s]\n", videoRawFramesFile);
82+
fprintf(file, "integer flags:\n");
83+
fprintf(file, " -videoResolutionWidth [int:%u]\n", videoResolutionWidth);
84+
fprintf(file, " -videoResolutionHeight [int:%u]\n", videoResolutionHeight);
6485
}
6586
void CliOptions::parse(int argc,char **argv,FILE *logChannel) {
6687
if(argc > 1) {
@@ -97,6 +118,10 @@ void CliOptions::parse(int argc,char **argv,FILE *logChannel) {
97118
imguiDocking = getBoolFlagValue(logChannel,u, argc, argv, "-imguiDocking",imguiDocking);
98119
vectorCmd = getBoolFlagValue(logChannel,u, argc, argv, "-vectorCmd",vectorCmd);
99120

121+
videoRawFramesFile = findFlagValueDefault(logChannel,u, argc, argv,"-videoRawFramesFile",videoRawFramesFile);
122+
videoResolutionWidth = static_cast<uint32_t>(findFlagValueDefaultInt(logChannel, u, argc, argv, "-videoResolutionWidth", "1920"));
123+
videoResolutionWidth = static_cast<uint32_t>(findFlagValueDefaultInt(logChannel, u, argc, argv, "-videoResolutionHeight", "1080"));
124+
100125
if(std::popcount(u) != (argc-1)) {
101126
for(int i=1;i<argc;i++) {
102127
if(((uint64_t(1) << i) & u) == 0) {

skia/skia/cliOptions.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ struct CliOptions {
1717
bool vectorCmd = true;
1818
const char *skiaBackendType = "gl";
1919
const char *backgroundColorRGBA = "000000ff";
20+
21+
/* video mode fields */
22+
const char *videoRawFramesFile = nullptr;
23+
uint32_t videoResolutionWidth = 0;
24+
uint32_t videoResolutionHeight = 0;
25+
2026
CliOptions() = default;
2127
~CliOptions() = default;
2228

0 commit comments

Comments
 (0)