33open System
44open Aardvark.Base
55open Aardvark.Rendering
6- open FSharp.Data .Adaptive
76open Aardvark.Rendering .Vulkan
87open System.Runtime .CompilerServices
9- open Microsoft.FSharp .NativeInterop
108open KHRSwapchain
119open KHRSurface
1210
1311#nowarn " 9"
1412#nowarn " 51"
1513
16- [<AutoOpen>]
14+ [<AutoOpen>]
1715module ImageTrafoExtensions =
1816 type Box3i with
1917 member x.Transformed ( t : ImageTrafo ) =
2018 match t with
21- | ImageTrafo.Identity ->
22- x
19+ | ImageTrafo.Identity ->
20+ x
2321
24- | ImageTrafo.MirrorX ->
25- Box3i( V3i( x.Max.X, x.Min.Y, x.Min.Z), V3i( x.Min.X, x.Max.Y, x.Max.Z))
26-
27- | ImageTrafo.MirrorY ->
28- Box3i( V3i( x.Min.X, x.Max.Y, x.Min.Z), V3i( x.Max.X, x.Min.Y, x.Max.Z))
22+ | ImageTrafo.MirrorX ->
23+ Box3i( V3i( x.Max.X, x.Min.Y, x.Min.Z), V3i( x.Min.X, x.Max.Y, x.Max.Z))
2924
30- | _ ->
31- failwithf " box cannot be transformed using %A " t
25+ | ImageTrafo.MirrorY ->
26+ Box3i( V3i( x.Min.X, x.Max.Y, x.Min.Z), V3i( x.Max.X, x.Min.Y, x.Max.Z))
27+
28+ | _ ->
29+ failwithf " box cannot be transformed using %A " t
3230
33- type Swapchain ( device : Device , description : SwapchainDescription ) =
31+ type Swapchain ( device : Device , initialSize : V2i , description : SwapchainDescription ) =
3432 let fence = device.CreateFence()
3533 let surface = description.surface
3634 let renderPass = description.renderPass
@@ -179,7 +177,11 @@ type Swapchain(device : Device, description : SwapchainDescription) =
179177
180178 let update () =
181179 if surface.Handle.IsValid && disposed = 0 then
182- let newSize = surface.Size
180+ let newSize =
181+ let surfaceSize = surface.Size
182+ let currentSize = if surfaceSize <> V2i.Zero then surfaceSize else initialSize
183+ currentSize |> clamp surface.MinSize surface.MaxSize
184+
183185 if newSize <> size || handle.IsNull then
184186 // delete old things
185187
@@ -193,7 +195,7 @@ type Swapchain(device : Device, description : SwapchainDescription) =
193195 buffers |> Array.iter Disposable.dispose
194196
195197 //handle, buffers, framebuffer, resolvedView
196- let ( newHandle , newBuffers , newFramebuffer , newResolvedImage ) = recreate handle newSize
198+ let newHandle , newBuffers , newFramebuffer , newResolvedImage = recreate handle newSize
197199 if handle.IsValid then VkRaw.vkDestroySwapchainKHR( device.Handle, handle, NativePtr.zero)
198200
199201 handle <- newHandle
@@ -203,6 +205,10 @@ type Swapchain(device : Device, description : SwapchainDescription) =
203205 resolvedImage <- newResolvedImage
204206 currentBuffer <- 0 u
205207
208+ [<Obsolete>]
209+ new ( device : Device , description : SwapchainDescription ) =
210+ new Swapchain( device, V2i( 1024 , 768 ), description)
211+
206212 member x.Size = update(); size
207213 member x.Description = description
208214 member x.Samples = description.samples
@@ -384,12 +390,21 @@ type Swapchain(device : Device, description : SwapchainDescription) =
384390
385391[<CompilationRepresentation( CompilationRepresentationFlags.ModuleSuffix) >]
386392module Swapchain =
393+
394+ let create2 ( size : V2i ) ( description : SwapchainDescription ) ( device : Device ) =
395+ new Swapchain( device, size, description)
396+
397+ [<Obsolete( " Use Swapchain.create2 instead." ) >]
387398 let create ( desc : SwapchainDescription ) ( device : Device ) =
388- new Swapchain ( device , desc )
399+ create2 ( V2i ( 1024 , 768 )) desc device
389400
390401[<AbstractClass; Sealed; Extension>]
391402type DeviceSwapchainExtensions private () =
392403
404+ [<Extension>]
405+ static member CreateSwapchain ( this : Device , size : V2i , description : SwapchainDescription ) =
406+ this |> Swapchain.create2 size description
407+
393408 [<Extension>]
394409 static member CreateSwapchain ( this : Device , description : SwapchainDescription ) =
395- this |> Swapchain.create description
410+ this.CreateSwapchain ( V2i ( 1024 , 768 ), description)
0 commit comments