diff test1.nim @ 1191:239adab121a3 compiletime-tests

sync from bedroom to office
author sam <sam@basx.dev>
date Mon, 08 Jul 2024 01:16:53 +0700
parents a3eb305bcac2
children 90bf0cab1d02
line wrap: on
line diff
--- a/test1.nim	Sun Jul 07 23:36:16 2024 +0700
+++ b/test1.nim	Mon Jul 08 01:16:53 2024 +0700
@@ -1,219 +1,211 @@
 import os
 
-import semicongine/rendering
+import semicongine
+
+type
+  MeshA = object
+    position: GPUArray[Vec3f, VertexBuffer]
+    indices: GPUArray[uint16, IndexBuffer]
+  InstanceA = object
+    rotation: GPUArray[Vec4f, VertexBuffer]
+    objPosition: GPUArray[Vec3f, VertexBuffer]
+  MaterialA = object
+    reflection: float32
+    baseColor: Vec3f
+  UniformsA = object
+    defaultTexture: Texture[TVec4[uint8]]
+    defaultMaterial: GPUValue[MaterialA, UniformBuffer]
+    materials: GPUValue[array[3, MaterialA], UniformBuffer]
+    materialTextures: array[3, Texture[TVec4[uint8]]]
+  ShaderSettings = object
+    gamma: float32
+  GlobalsA = object
+    fontAtlas: Texture[TVec4[uint8]]
+    settings: GPUValue[ShaderSettings, UniformBuffer]
+
+  ShaderA = object
+    # vertex input
+    position {.VertexAttribute.}: Vec3f
+    objPosition {.InstanceAttribute.}: Vec3f
+    rotation {.InstanceAttribute.}: Vec4f
+    # intermediate
+    test {.Pass.}: float32
+    test1 {.PassFlat.}: Vec3f
+    # output
+    color {.ShaderOutput.}: Vec4f
+    # descriptor sets
+    globals: DescriptorSet[GlobalsA, GlobalSet]
+    uniforms: DescriptorSet[UniformsA, MaterialSet]
+    # code
+    vertexCode: string = "void main() {}"
+    fragmentCode: string = "void main() {}"
+
+let w = CreateWindow("test2")
+putEnv("VK_LAYER_ENABLES", "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_AMD,VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_NVIDIA,VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXTVK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT")
+
+# TODO: remove those ugly wrappers
+let theInstance = w.CreateInstance(
+  vulkanVersion = VK_MAKE_API_VERSION(0, 1, 3, 0),
+  instanceExtensions = @[],
+  layers = @["VK_LAYER_KHRONOS_validation"],
+)
+
+let dev = theInstance.CreateDevice(
+  theInstance.GetPhysicalDevices().FilterBestGraphics(),
+  enabledExtensions = @[],
+  theInstance.GetPhysicalDevices().FilterBestGraphics().FilterForGraphicsPresentationQueues()
+).vk
+let frameWidth = 100'u32
+let frameHeight = 100'u32
+
+# TODO: pack this stuff into a setup method and condense everything a bit
+let pDevice = theInstance.vk.GetPhysicalDevice()
+let qfi = pDevice.GetQueueFamily(VK_QUEUE_GRAPHICS_BIT)
+vulkan = VulkanGlobals(
+  instance: theInstance.vk,
+  device: dev,
+  physicalDevice: pDevice,
+  queueFamilyIndex: qfi,
+  queue: svkGetDeviceQueue(dev, qfi, VK_QUEUE_GRAPHICS_BIT)
+)
+
+var myMesh1 = MeshA(
+  position: GPUArray[Vec3f, VertexBuffer](data: @[NewVec3f(0, 0, ), NewVec3f(0, 0, ), NewVec3f(0, 0, )]),
+)
+var uniforms1 = DescriptorSet[UniformsA, MaterialSet](
+  data: UniformsA(
+    defaultTexture: Texture[TVec4[uint8]](width: 1, height: 1, data: @[TVec4[uint8]([0'u8, 0'u8, 0'u8, 1'u8])]),
+    materials: GPUValue[array[3, MaterialA], UniformBuffer](data: [
+      MaterialA(reflection: 0, baseColor: NewVec3f(1, 0, 0)),
+      MaterialA(reflection: 0.1, baseColor: NewVec3f(0, 1, 0)),
+      MaterialA(reflection: 0.5, baseColor: NewVec3f(0, 0, 1)),
+  ]),
+  materialTextures: [
+    Texture[TVec4[uint8]](width: 1, height: 1, data: @[TVec4[uint8]([0'u8, 0'u8, 0'u8, 1'u8])]),
+    Texture[TVec4[uint8]](width: 1, height: 1, data: @[TVec4[uint8]([0'u8, 0'u8, 0'u8, 1'u8])]),
+    Texture[TVec4[uint8]](width: 1, height: 1, data: @[TVec4[uint8]([0'u8, 0'u8, 0'u8, 1'u8])]),
+  ]
+)
+)
+var instances1 = InstanceA(
+  rotation: GPUArray[Vec4f, VertexBuffer](data: @[NewVec4f(1, 0, 0, 0.1), NewVec4f(0, 1, 0, 0.1)]),
+  objPosition: GPUArray[Vec3f, VertexBuffer](data: @[NewVec3f(0, 0, 0), NewVec3f(1, 1, 1)]),
+)
+var myGlobals = DescriptorSet[GlobalsA, GlobalSet](
+  data: GlobalsA(
+    fontAtlas: Texture[TVec4[uint8]](width: 1, height: 1, data: @[TVec4[uint8]([0'u8, 0'u8, 0'u8, 1'u8])]),
+    settings: GPUValue[ShaderSettings, UniformBuffer](data: ShaderSettings(gamma: 1.0))
+  )
+)
+
+# setup for rendering (TODO: swapchain & framebuffers)
+let renderpass = CreateRenderPass(GetSurfaceFormat())
+
+# shaders
+const shader = ShaderA()
+let shaderObject = CompileShader(shader)
+var pipeline1 = CreatePipeline(renderPass = renderpass, shader = shaderObject)
+
+var renderdata = InitRenderData()
+
+# buffer assignment
+echo "Assigning buffers to GPUData fields"
+
+AssignBuffers(renderdata, myMesh1)
+AssignBuffers(renderdata, instances1)
+AssignBuffers(renderdata, myGlobals)
+AssignBuffers(renderdata, uniforms1)
+
+renderdata.UploadTextures(myGlobals)
+renderdata.UploadTextures(uniforms1)
+
+# copy everything to GPU
+echo "Copying all data to GPU memory"
+UpdateAllGPUBuffers(myMesh1)
+UpdateAllGPUBuffers(instances1)
+UpdateAllGPUBuffers(uniforms1)
+UpdateAllGPUBuffers(myGlobals)
+renderdata.FlushAllMemory()
 
 
-when isMainModule:
-  import semicongine/old/platform/window
-  import semicongine/old/vulkan/instance
-  import semicongine/old/vulkan/device
-  import semicongine/old/vulkan/physicaldevice
-  import std/options
-
-  type
-    MeshA = object
-      position: GPUArray[Vec3f, VertexBuffer]
-      indices: GPUArray[uint16, IndexBuffer]
-    InstanceA = object
-      rotation: GPUArray[Vec4f, VertexBuffer]
-      objPosition: GPUArray[Vec3f, VertexBuffer]
-    MaterialA = object
-      reflection: float32
-      baseColor: Vec3f
-    UniformsA = object
-      defaultTexture: Texture[TVec4[uint8]]
-      defaultMaterial: GPUValue[MaterialA, UniformBuffer]
-      materials: GPUValue[array[3, MaterialA], UniformBuffer]
-      materialTextures: array[3, Texture[TVec4[uint8]]]
-    ShaderSettings = object
-      gamma: float32
-    GlobalsA = object
-      fontAtlas: Texture[TVec4[uint8]]
-      settings: GPUValue[ShaderSettings, UniformBuffer]
-
-    ShaderA = object
-      # vertex input
-      position {.VertexAttribute.}: Vec3f
-      objPosition {.InstanceAttribute.}: Vec3f
-      rotation {.InstanceAttribute.}: Vec4f
-      # intermediate
-      test {.Pass.}: float32
-      test1 {.PassFlat.}: Vec3f
-      # output
-      color {.ShaderOutput.}: Vec4f
-      # descriptor sets
-      globals: DescriptorSet[GlobalsA, GlobalSet]
-      uniforms: DescriptorSet[UniformsA, MaterialSet]
-      # code
-      vertexCode: string = "void main() {}"
-      fragmentCode: string = "void main() {}"
-
-  let w = CreateWindow("test2")
-  putEnv("VK_LAYER_ENABLES", "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_AMD,VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_NVIDIA,VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXTVK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT")
-
-  # TODO: remove those ugly wrappers
-  let theInstance = w.CreateInstance(
-    vulkanVersion = VK_MAKE_API_VERSION(0, 1, 3, 0),
-    instanceExtensions = @[],
-    layers = @["VK_LAYER_KHRONOS_validation"],
-  )
-
-  let dev = theInstance.CreateDevice(
-    theInstance.GetPhysicalDevices().FilterBestGraphics(),
-    enabledExtensions = @[],
-    theInstance.GetPhysicalDevices().FilterBestGraphics().FilterForGraphicsPresentationQueues()
-  ).vk
-  let frameWidth = 100'u32
-  let frameHeight = 100'u32
-
-  # TODO: pack this stuff into a setup method and condense everything a bit
-  let pDevice = theInstance.vk.GetPhysicalDevice()
-  let qfi = pDevice.GetQueueFamily(VK_QUEUE_GRAPHICS_BIT)
-  vulkan = VulkanGlobals(
-    instance: theInstance.vk,
-    device: dev,
-    physicalDevice: pDevice,
-    queueFamilyIndex: qfi,
-    queue: svkGetDeviceQueue(dev, qfi, VK_QUEUE_GRAPHICS_BIT)
-  )
-
-  var myMesh1 = MeshA(
-    position: GPUArray[Vec3f, VertexBuffer](data: @[NewVec3f(0, 0, ), NewVec3f(0, 0, ), NewVec3f(0, 0, )]),
-  )
-  var uniforms1 = DescriptorSet[UniformsA, MaterialSet](
-    data: UniformsA(
-      defaultTexture: Texture[TVec4[uint8]](width: 1, height: 1, data: @[TVec4[uint8]([0'u8, 0'u8, 0'u8, 1'u8])]),
-      materials: GPUValue[array[3, MaterialA], UniformBuffer](data: [
-        MaterialA(reflection: 0, baseColor: NewVec3f(1, 0, 0)),
-        MaterialA(reflection: 0.1, baseColor: NewVec3f(0, 1, 0)),
-        MaterialA(reflection: 0.5, baseColor: NewVec3f(0, 0, 1)),
-    ]),
-    materialTextures: [
-      Texture[TVec4[uint8]](width: 1, height: 1, data: @[TVec4[uint8]([0'u8, 0'u8, 0'u8, 1'u8])]),
-      Texture[TVec4[uint8]](width: 1, height: 1, data: @[TVec4[uint8]([0'u8, 0'u8, 0'u8, 1'u8])]),
-      Texture[TVec4[uint8]](width: 1, height: 1, data: @[TVec4[uint8]([0'u8, 0'u8, 0'u8, 1'u8])]),
-    ]
-  )
-  )
-  var instances1 = InstanceA(
-    rotation: GPUArray[Vec4f, VertexBuffer](data: @[NewVec4f(1, 0, 0, 0.1), NewVec4f(0, 1, 0, 0.1)]),
-    objPosition: GPUArray[Vec3f, VertexBuffer](data: @[NewVec3f(0, 0, 0), NewVec3f(1, 1, 1)]),
-  )
-  var myGlobals = DescriptorSet[GlobalsA, GlobalSet](
-    data: GlobalsA(
-      fontAtlas: Texture[TVec4[uint8]](width: 1, height: 1, data: @[TVec4[uint8]([0'u8, 0'u8, 0'u8, 1'u8])]),
-      settings: GPUValue[ShaderSettings, UniformBuffer](data: ShaderSettings(gamma: 1.0))
-    )
-  )
-
-  # setup for rendering (TODO: swapchain & framebuffers)
-  let renderpass = CreateRenderPass(GetSurfaceFormat())
-
-  # shaders
-  const shader = ShaderA()
-  let shaderObject = CompileShader(shader)
-  var pipeline1 = CreatePipeline(renderPass = renderpass, shader = shaderObject)
-
-  var renderdata = InitRenderData()
-
-  # buffer assignment
-  echo "Assigning buffers to GPUData fields"
-
-  AssignBuffers(renderdata, myMesh1)
-  AssignBuffers(renderdata, instances1)
-  AssignBuffers(renderdata, myGlobals)
-  AssignBuffers(renderdata, uniforms1)
-
-  renderdata.UploadTextures(myGlobals)
-  renderdata.UploadTextures(uniforms1)
-
-  # copy everything to GPU
-  echo "Copying all data to GPU memory"
-  UpdateAllGPUBuffers(myMesh1)
-  UpdateAllGPUBuffers(instances1)
-  UpdateAllGPUBuffers(uniforms1)
-  UpdateAllGPUBuffers(myGlobals)
-  renderdata.FlushAllMemory()
+# descriptors
+echo "Writing descriptors"
+InitDescriptorSet(renderdata, pipeline1.descriptorSetLayouts[GlobalSet], myGlobals)
+InitDescriptorSet(renderdata, pipeline1.descriptorSetLayouts[MaterialSet], uniforms1)
 
 
-  # descriptors
-  echo "Writing descriptors"
-  InitDescriptorSet(renderdata, pipeline1.descriptorSetLayouts[GlobalSet], myGlobals)
-  InitDescriptorSet(renderdata, pipeline1.descriptorSetLayouts[MaterialSet], uniforms1)
-
+# command buffer
+var
+  commandBufferPool: VkCommandPool
+  createInfo = VkCommandPoolCreateInfo(
+    sType: VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
+    flags: toBits [VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT],
+    queueFamilyIndex: vulkan.queueFamilyIndex,
+  )
+checkVkResult vkCreateCommandPool(vulkan.device, addr createInfo, nil, addr commandBufferPool)
+var
+  cmdBuffers: array[INFLIGHTFRAMES.int, VkCommandBuffer]
+  allocInfo = VkCommandBufferAllocateInfo(
+    sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
+    commandPool: commandBufferPool,
+    level: VK_COMMAND_BUFFER_LEVEL_PRIMARY,
+    commandBufferCount: INFLIGHTFRAMES,
+  )
+checkVkResult vkAllocateCommandBuffers(vulkan.device, addr allocInfo, cmdBuffers.ToCPointer)
 
-  # command buffer
-  var
-    commandBufferPool: VkCommandPool
-    createInfo = VkCommandPoolCreateInfo(
-      sType: VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
-      flags: toBits [VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT],
-      queueFamilyIndex: vulkan.queueFamilyIndex,
+# start command buffer
+block:
+  let
+    currentFramebuffer = VkFramebuffer(0) # TODO
+    currentFrameInFlight = 1
+    cmd = cmdBuffers[currentFrameInFlight]
+    beginInfo = VkCommandBufferBeginInfo(
+      sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+      flags: VkCommandBufferUsageFlags(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT),
     )
-  checkVkResult vkCreateCommandPool(vulkan.device, addr createInfo, nil, addr commandBufferPool)
-  var
-    cmdBuffers: array[INFLIGHTFRAMES.int, VkCommandBuffer]
-    allocInfo = VkCommandBufferAllocateInfo(
-      sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
-      commandPool: commandBufferPool,
-      level: VK_COMMAND_BUFFER_LEVEL_PRIMARY,
-      commandBufferCount: INFLIGHTFRAMES,
-    )
-  checkVkResult vkAllocateCommandBuffers(vulkan.device, addr allocInfo, cmdBuffers.ToCPointer)
+  checkVkResult cmd.vkResetCommandBuffer(VkCommandBufferResetFlags(0))
+  checkVkResult cmd.vkBeginCommandBuffer(addr(beginInfo))
 
-  # start command buffer
+  # start renderpass
   block:
-    let
-      currentFramebuffer = VkFramebuffer(0) # TODO
-      currentFrameInFlight = 1
-      cmd = cmdBuffers[currentFrameInFlight]
-      beginInfo = VkCommandBufferBeginInfo(
-        sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
-        flags: VkCommandBufferUsageFlags(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT),
+    var
+      clearColors = [VkClearValue(color: VkClearColorValue(float32: [0, 0, 0, 0]))]
+      renderPassInfo = VkRenderPassBeginInfo(
+        sType: VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
+        renderPass: renderpass,
+        framebuffer: currentFramebuffer, # TODO
+        renderArea: VkRect2D(
+          offset: VkOffset2D(x: 0, y: 0),
+          extent: VkExtent2D(width: frameWidth, height: frameHeight),
+        ),
+        clearValueCount: uint32(clearColors.len),
+        pClearValues: clearColors.ToCPointer(),
       )
-    checkVkResult cmd.vkResetCommandBuffer(VkCommandBufferResetFlags(0))
-    checkVkResult cmd.vkBeginCommandBuffer(addr(beginInfo))
+      viewport = VkViewport(
+        x: 0.0,
+        y: 0.0,
+        width: frameWidth.float32,
+        height: frameHeight.float32,
+        minDepth: 0.0,
+        maxDepth: 1.0,
+      )
+      scissor = VkRect2D(
+        offset: VkOffset2D(x: 0, y: 0),
+        extent: VkExtent2D(width: frameWidth, height: frameHeight)
+      )
+    vkCmdBeginRenderPass(cmd, addr(renderPassInfo), VK_SUBPASS_CONTENTS_INLINE)
 
-    # start renderpass
+    # setup viewport
+    vkCmdSetViewport(cmd, firstViewport = 0, viewportCount = 1, addr(viewport))
+    vkCmdSetScissor(cmd, firstScissor = 0, scissorCount = 1, addr(scissor))
+
+    # bind pipeline, will be loop
     block:
-      var
-        clearColors = [VkClearValue(color: VkClearColorValue(float32: [0, 0, 0, 0]))]
-        renderPassInfo = VkRenderPassBeginInfo(
-          sType: VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
-          renderPass: renderpass,
-          framebuffer: currentFramebuffer, # TODO
-          renderArea: VkRect2D(
-            offset: VkOffset2D(x: 0, y: 0),
-            extent: VkExtent2D(width: frameWidth, height: frameHeight),
-          ),
-          clearValueCount: uint32(clearColors.len),
-          pClearValues: clearColors.ToCPointer(),
-        )
-        viewport = VkViewport(
-          x: 0.0,
-          y: 0.0,
-          width: frameWidth.float32,
-          height: frameHeight.float32,
-          minDepth: 0.0,
-          maxDepth: 1.0,
-        )
-        scissor = VkRect2D(
-          offset: VkOffset2D(x: 0, y: 0),
-          extent: VkExtent2D(width: frameWidth, height: frameHeight)
-        )
-      vkCmdBeginRenderPass(cmd, addr(renderPassInfo), VK_SUBPASS_CONTENTS_INLINE)
+      Bind(pipeline1, cmd, currentFrameInFlight = currentFrameInFlight)
 
-      # setup viewport
-      vkCmdSetViewport(cmd, firstViewport = 0, viewportCount = 1, addr(viewport))
-      vkCmdSetScissor(cmd, firstScissor = 0, scissorCount = 1, addr(scissor))
-
-      # bind pipeline, will be loop
+      # render object, will be loop
       block:
-        Bind(pipeline1, cmd, currentFrameInFlight = currentFrameInFlight)
+        Render(cmd, pipeline1, myGlobals, uniforms1, myMesh1, instances1)
 
-        # render object, will be loop
-        block:
-          Render(cmd, pipeline1, myGlobals, uniforms1, myMesh1, instances1)
-
-      vkCmdEndRenderPass(cmd)
-    checkVkResult cmd.vkEndCommandBuffer()
+    vkCmdEndRenderPass(cmd)
+  checkVkResult cmd.vkEndCommandBuffer()