Compare commits

..

27 commits

Author SHA1 Message Date
nek0 bab538a0e4 flake update 2023-11-05 12:02:16 +01:00
Amedeo Molnár 2d3fc457be a little cleaner 2023-10-22 12:46:16 +02:00
nek0 4feac51f26 weed out stuff 2023-10-22 07:14:22 +02:00
nek0 def6e56d1f implement FPS meter in Console output 2023-10-22 06:08:43 +02:00
Amedeo Molnár 1b6a6392ba fix rendering! 2023-10-22 02:27:33 +02:00
Amedeo Molnár 8f6f5e428d flake update 2023-10-22 01:32:38 +02:00
nek0 676e02ed8d more twiddling 2023-10-22 01:30:52 +02:00
nek0 167599df74 try fixing 2023-10-22 01:30:52 +02:00
nek0 9350198e35 explicitly enable multiIndirectDraw 2023-10-22 01:30:52 +02:00
nek0 9d34dacf76 condense flake 2023-10-22 01:30:52 +02:00
nek0 a6af76f3b3 fix ambiguous record updates 2023-10-22 01:30:51 +02:00
nek0 934085906c final flake fix 2023-10-22 01:30:18 +02:00
nek0 c55bfc5416 make shell 2023-10-22 01:30:18 +02:00
nek0 f873fa7291 move package 2023-10-22 01:30:18 +02:00
nek0 ccd18f803b flake update 2023-10-22 01:30:16 +02:00
nek0 fe4155d26f fix flake 2023-10-22 01:29:49 +02:00
nek0 2ae3daf0f9 fix flake 2023-10-22 01:29:49 +02:00
nek0 d2dac89ce3 small-ish fixes 2023-10-22 01:29:47 +02:00
nek0 0cb8bd8363 add test/debug VM capability 2023-10-22 01:28:21 +02:00
nek0 d9b7c48953 using indirect draw, not working yet 2023-10-22 01:27:18 +02:00
nek0 9084be8bba first little optimisation 2023-10-22 01:27:13 +02:00
nek0 3928655bb0 fix changing rules 2023-10-22 01:15:03 +02:00
nek0 ea87f58b26 flake update 2023-10-22 00:33:07 +02:00
nek0 272db907a0 fix double spaceships 2023-06-11 08:13:53 +02:00
nek0 6caf99a13c remove lambda 2023-06-11 08:13:53 +02:00
nek0 ef135731a4 first little optimisation 2023-06-11 08:13:49 +02:00
nek0 b3a7670c97 fix UVs in Code, not in shader 2023-05-30 01:44:20 +01:00
9 changed files with 62 additions and 59 deletions

View file

@ -5,11 +5,11 @@
"systems": "systems"
},
"locked": {
"lastModified": 1692799911,
"narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=",
"lastModified": 1694529238,
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44",
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
"type": "github"
},
"original": {
@ -20,11 +20,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1692885195,
"narHash": "sha256-zo/6ItD2ITIOsYmpQZ3sOcuDPhIh71flCj6TkF10nKM=",
"lastModified": 1699181587,
"narHash": "sha256-v35mUUgVU2ituIHPNHifpjl5uiYQYyLrpaMtz8X8Ums=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "27c6502cb974e6ad610baaeeba162acd3536ec45",
"rev": "197629b470f184a47b2a5716312d25b09454bbf8",
"type": "github"
},
"original": {

View file

@ -40,6 +40,7 @@
haskell-language-server
ghcid
cabal-install
(jailbreakUnbreak wavefront)
]) ++ (with pkgs; [
shaderc
vulkan-loader

View file

@ -19,8 +19,6 @@ layout(set = 2, binding = 0) uniform sampler2D tex1;
void main()
{
// Flip y coordinate of UVs to fix display
float y = texCoord.y * -1;
vec3 color = texture(tex1, vec2(texCoord.x ,y)).xyz;
vec3 color = texture(tex1, texCoord).xyz;
outFragColor = vec4(color, inColor.w);
}

View file

@ -1,4 +1,3 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
@ -182,7 +181,8 @@ createFrames
recordCommandBuffer
:: (MonadResource m, MonadReader ReadState m, MonadIO m)
=> Vk.CommandBuffer
=> VMA.Allocator
-> Vk.CommandBuffer
-> Vk.RenderPass
-> Vk.Framebuffer
-> V2 CInt
@ -190,6 +190,7 @@ recordCommandBuffer
-> FrameData
-> m ()
recordCommandBuffer
allocator
commandBuffer
renderPass
frameBuffer
@ -234,9 +235,8 @@ recordCommandBuffer
materialMap <- (liftIO . STM.atomically . STM.readTMVar) =<< asks materialLibrary
let draws = compactDraws meshMap materialMap renderObjects
let drawCommands = V.map
(\(i, RenderObject mesh matrix material) ->
drawCommands = V.map
(\(i, RenderObject mesh _ _) ->
Vk.DrawIndirectCommand
{ vertexCount = fromIntegral (V.length $ meshVertices $ meshMap M.! mesh)
, firstVertex = 0
@ -249,6 +249,24 @@ recordCommandBuffer
renderObjects
)
(memRelease, memPtr) <- VMA.withMappedMemory
allocator
(bufferAllocation $ frameIndirectBuffer frame)
allocate
V.mapM_
(\(idx, command) -> liftIO $
poke
(castPtr memPtr `plusPtr` (idx * sizeOf command))
command
)
(V.zip
(V.fromList [0 ..])
drawCommands
)
release memRelease
V.mapM_
(\(IndirectBatch mesh material first count) -> do
@ -300,50 +318,6 @@ recordCommandBuffer
)
draws
-- V.mapM_
-- (\(IndirectBatch mesh material first count) -> do
-- when
-- (materialTextureSet material /= Vk.NULL_HANDLE)
-- (Vk.cmdBindDescriptorSets
-- commandBuffer
-- Vk.PIPELINE_BIND_POINT_GRAPHICS
-- (materialPipelineLayout material)
-- 2
-- (V.singleton $ materialTextureSet material)
-- V.empty
-- )
-- Vk.cmdBindPipeline commandBuffer Vk.PIPELINE_BIND_POINT_GRAPHICS (materialPipeline material)
-- Vk.cmdBindDescriptorSets
-- commandBuffer
-- Vk.PIPELINE_BIND_POINT_GRAPHICS
-- (materialPipelineLayout material)
-- 0
-- (V.singleton $ frameGlobalDescriptor frame)
-- V.empty
-- Vk.cmdBindDescriptorSets
-- commandBuffer
-- Vk.PIPELINE_BIND_POINT_GRAPHICS
-- (materialPipelineLayout material)
-- 1
-- (V.singleton $ frameObjectDescriptor frame)
-- V.empty
-- Vk.cmdBindVertexBuffers
-- commandBuffer
-- 0
-- (V.fromList [ allocatedBuffer $ meshBuffer mesh ])
-- (V.fromList [ 0 ])
-- mapM_
-- (Vk.cmdDraw commandBuffer (fromIntegral $ V.length $ meshVertices mesh) 1 0)
-- [first .. (count - 1)]
-- )
-- draws
prepareRecording
:: V2 CInt
-> Vk.CommandBuffer

View file

@ -1,6 +1,7 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedRecordDot #-}
module Draw where
import qualified Control.Concurrent.STM as STM
@ -80,6 +81,7 @@ drawFrame engineData frameNumber = do
cameraData
recordCommandBuffer
(engineData.engineAllocator)
(frameMainCommandBuffer frame)
(engineRenderPass engineData)
(engineFramebuffers engineData V.! fromIntegral index)

View file

@ -1,4 +1,5 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedRecordDot #-}
@ -10,9 +11,12 @@ import Control.Monad.Loops
import Control.Monad.IO.Class
import Control.Monad.Trans.Resource
import Data.Bits
import Data.ByteString.Char8
import qualified Data.Map.Strict as M
import Data.Time.Clock
import qualified Data.Vector as V
import qualified SDL hiding (V2)
import System.IO (stdout)
import System.Mem
import qualified Vulkan as Vk
import qualified Vulkan.Zero as Vk
@ -43,6 +47,8 @@ main = do
-- create abort condition for upcoming lop
quit <- liftIO $ STM.newTMVarIO True
time <- liftIO $ STM.newTMVarIO =<< getCurrentTime
average <- liftIO $ STM.newTMVarIO 0
-- main loop
whileM_
@ -50,11 +56,24 @@ main = do
)
( do
liftIO performMajorGC
now <- liftIO getCurrentTime
before <- liftIO $ STM.atomically $ STM.swapTMVar time now
let timeDiff = diffUTCTime now before
fps = recip $ nominalDiffTimeToSeconds timeDiff
liftIO $ hPutStr stdout $ pack $ "Current FPS: " <> show (floor fps) <> " \r"
number <- liftIO $ STM.atomically $ do
number <- STM.readTMVar frameNumber
if number == 0 then
void $ STM.swapTMVar average fps
else do
oldAverage <- STM.readTMVar average
let newAverage = (oldAverage * fromIntegral number + fps) / frameCount
frameCount = fromIntegral number + 1
void $ STM.swapTMVar average newAverage
void $ STM.swapTMVar frameNumber (succ number)
return number
-- draw
-- liftIO $ putStr $ show (recip $ nominalDiffTimeToSeconds timeDiff) <> "\r"
drawFrame engineData number
-- poll events
evs <- liftIO SDL.pollEvents
@ -68,6 +87,12 @@ main = do
evs
)
fps <- liftIO $ STM.atomically $ STM.readTMVar average
liftIO $ hPutStr stdout $
"\n" <>
"Average FPS: " <> pack (show fps) <> "\n"
Vk.deviceWaitIdle $ engineLogicalDevice engineData
createBufferView

View file

@ -1,6 +1,7 @@
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedRecordDot #-}
module Memory where
import Control.Monad.IO.Class

View file

@ -188,7 +188,8 @@ loadFromObj filepath vma uploadContext queue device = do
texCoords V.!
(fromMaybe (error "no UV coordinates present") (faceTexCoordIndex index) - 1)
in
V2 r s
-- flip V coordinate of UVs to fix display
V2 r (-s)
compactDraws
:: M.Map String Mesh

View file

@ -50,6 +50,7 @@ executable vulkan-tutorial
, linear
, monad-loops
, stm
, time
, bytestring
, text
, vector