From b8801e793d604db4903014ac0e17794ac556db17 Mon Sep 17 00:00:00 2001 From: Dmitry Sergeev Date: Thu, 27 Aug 2026 21:01:31 +0300 Subject: [PATCH] initialize renderer with placeholder frame --- cmd/mxl-player/main.go | 104 ++++++++++++++++++++--------------------- imgui.ini | 4 +- 2 files changed, 53 insertions(+), 55 deletions(-) diff --git a/cmd/mxl-player/main.go b/cmd/mxl-player/main.go index ba52ac4..11cba9d 100644 --- a/cmd/mxl-player/main.go +++ b/cmd/mxl-player/main.go @@ -28,6 +28,12 @@ const ( WIN_HEIGHT int32 = 720 ) +const ( + placeholderWidth uint32 = 1 + placeholderHeight uint32 = 1 + placeholderStride uint32 = 4 +) + type appArgs struct { ShowHelp bool Domain string @@ -308,40 +314,46 @@ func main() { defer sdl.DestroyAudioStream(audioStream) } - var r *renderer.Renderer - if args.VideoFlowId != "" { - var w, h, stride uint32 - if syncSrc != nil { - w, h, stride = syncSrc.Width(), syncSrc.Height(), syncSrc.Stride() - } else { - w, h, stride = videoSrc.Width(), videoSrc.Height(), videoSrc.Stride() - } - r, err = renderer.New(renderer.Config{ - PhysDevice: vkPhysDevice, - Device: vkDevice, - Queue: vkQueue, - Surface: vkSurf, - Window: windowHandler, - GraphicsFamily: gfx, - VideoWidth: w, - VideoHeight: h, - VideoStride: stride, - }) - if err != nil { - panic(err) - } - defer r.Destroy() - guiBackend, err := imgui.NewVulkanBackend( - vkPhysDevice, vkDevice, vkQueue, r.CmdPool(), r.RenderPass()) - if err != nil { - panic(err) - } - defer guiBackend.Destroy() - r.ImGuiDraw = func(cmd vk.CommandBuffer) { - guiBackend.RecordDraw(cmd, gui.LastDrawData()) - } - defer vkDevice.WaitIdle() + // Create renderer + r, err := renderer.New(renderer.Config{ + PhysDevice: vkPhysDevice, + Device: vkDevice, + Queue: vkQueue, + Surface: vkSurf, + Window: windowHandler, + GraphicsFamily: gfx, + VideoWidth: placeholderWidth, + VideoHeight: placeholderHeight, + VideoStride: placeholderStride, + }) + if err != nil { + panic(err) } + defer r.Destroy() + // Create GUI backend + guiBackend, err := imgui.NewVulkanBackend( + vkPhysDevice, + vkDevice, + vkQueue, + r.CmdPool(), + r.RenderPass(), + ) + if err != nil { + panic(err) + } + defer guiBackend.Destroy() + r.ImGuiDraw = func(cmd vk.CommandBuffer) { + guiBackend.RecordDraw(cmd, gui.LastDrawData()) + } + if err := r.StageFrame( + []byte{0, 0, 0, 255}, + placeholderWidth, + placeholderHeight, + placeholderStride, + ); err != nil { + panic(err) + } + defer vkDevice.WaitIdle() // GUI state (accessible from doReconnect + goroutine) var ( @@ -381,14 +393,6 @@ func main() { if params.video != "" && params.audio != "" { s, e := source.OpenSameDomainSync(params.domain, params.video, params.audio) if e == nil { - if r != nil { - newSize := vk.DeviceSize(s.Stride()) * vk.DeviceSize(s.Height()) - if newSize != r.FrameSize() { - if e = r.RecreateBuffers(newSize); e != nil { - return e - } - } - } syncSrc = s aChans = s.Channels() audioBatch = uint64(s.AudioRate().Num) / uint64(s.Rate().Num) @@ -401,14 +405,6 @@ func main() { } else if params.video != "" { s, e := source.Open(params.domain, params.video) if e == nil { - if r != nil { - newSize := vk.DeviceSize(s.Stride()) * vk.DeviceSize(s.Height()) - if newSize != r.FrameSize() { - if e = r.RecreateBuffers(newSize); e != nil { - return e - } - } - } videoSrc = s return nil } @@ -614,9 +610,10 @@ func main() { sdl.SetWindowFullscreen(windowHandler, true) } var ( - displayedVideoWidth uint32 - displayedVideoHeight uint32 - displayedVideoStride uint32 + displayedVideoWidth uint32 = placeholderWidth + displayedVideoHeight uint32 = placeholderHeight + displayedVideoStride uint32 = placeholderStride + hasDisplayedVideo bool = false fps float64 lastIndex uint64 @@ -699,6 +696,7 @@ func main() { displayedVideoWidth = pendingFrame.Frame.Width displayedVideoHeight = pendingFrame.Frame.Height displayedVideoStride = pendingFrame.Frame.Stride + hasDisplayedVideo = true hasFrame = true } else if frameErr != nil && !errors.Is(frameErr, context.DeadlineExceeded) && @@ -738,7 +736,7 @@ func main() { cimgui.Text(fmt.Sprintf("FPS: %.1f", fps)) cimgui.Text(fmt.Sprintf("Dropped: %d", dropped)) cimgui.Text(fmt.Sprintf("Index: %d", shownIndex)) - if displayedVideoWidth != 0 && displayedVideoHeight != 0 { + if hasDisplayedVideo { cimgui.Text(fmt.Sprintf( "Video: %dx%d", displayedVideoWidth, diff --git a/imgui.ini b/imgui.ini index 65dff5f..1332414 100644 --- a/imgui.ini +++ b/imgui.ini @@ -14,7 +14,7 @@ Size=200,200 Collapsed=0 [Window][Connection] -Pos=500,330 -Size=523,153 +Pos=388,158 +Size=523,141 Collapsed=0