packages feed

vulkan-3.11.0.2: test/Structs.hs

{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedLists #-}

module Structs where

import           Data.Bits
import qualified Language.C.Inline             as C
import           Test.Tasty.HUnit
import           VkCtx
import qualified Vulkan                        as Vk
import           Vulkan.Zero

C.context (C.baseCtx <> vkCtx)
C.include "<vulkan/vulkan.h>"
C.include "<string.h>"

unit_simple :: IO ()
unit_simple = do
  let e = Vk.Extent3D 2 3 5
  Vk.withCStruct e $ \p -> do
    [C.block| void {
      VkExtent3D *p = $(VkExtent3D *p);
      p->width *= 2;
      p->height *= 2;
      p->depth *= 2;
    } |]
    e' <- Vk.peekCStruct p
    e' @?= Vk.Extent3D 4 6 10

unit_bitfield :: IO ()
unit_bitfield = do
  let e = Vk.AccelerationStructureInstanceKHR
        { transform                      = zero
        , instanceCustomIndex            = 2
        , mask                           = 3
        , instanceShaderBindingTableRecordOffset = 5
        , flags = Vk.GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR
        , accelerationStructureReference = 11
        }
  Vk.withCStruct e $ \p -> do
    [C.block| void {
      VkAccelerationStructureInstanceKHR *p = $(VkAccelerationStructureInstanceKHR *p);
      p->instanceCustomIndex *= 2;
      p->mask *= 2;
      p->instanceShaderBindingTableRecordOffset *= 2;
      p->flags *= 2;
      p->accelerationStructureReference *= 2;
    } |]
    e' <- Vk.peekCStruct p
    show e' @?= show
      (Vk.AccelerationStructureInstanceKHR
        zero
        4
        6
        10
        (Vk.GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR `shiftL` 1)
        22
      )

unit_strings :: IO ()
unit_strings = do
  let e = Vk.ApplicationInfo { applicationName    = Just "Hello"
                             , applicationVersion = 2
                             , engineName         = Just "World"
                             , engineVersion      = 3
                             , apiVersion         = Vk.MAKE_API_VERSION 5 7 11
                             }
  Vk.withCStruct e $ \p -> do
    b <- [C.block| int {
      VkApplicationInfo *p = $(VkApplicationInfo *p);
      if(strcmp(p->pApplicationName, "Hello") || strcmp(p->pEngineName, "World")){
        return 0;
      }
      p->pApplicationName = "Foo";
      p->applicationVersion *= 2;
      p->pEngineName = "Bar";
      p->engineVersion *= 2;
      p->apiVersion = VK_MAKE_VERSION(13,17,19);
      return 1;
    } |]
    assertBool "Read strings on C side" (b /= 0)
    e' <- Vk.peekCStruct p
    show e' @?= show
      (Vk.ApplicationInfo (Just "Foo")
                          4
                          (Just "Bar")
                          6
                          (Vk.MAKE_API_VERSION 13 17 19)
      )

unit_lists :: IO ()
unit_lists = do
  let e = Vk.BindBufferMemoryDeviceGroupInfo [2, 3, 5]
  Vk.withCStruct e $ \p -> do
    [C.block| void {
      VkBindBufferMemoryDeviceGroupInfo *p = $(VkBindBufferMemoryDeviceGroupInfo *p);
      for(int i = 0; i < p->deviceIndexCount; ++i){
        ((uint32_t*)p->pDeviceIndices)[i] *= 2;
      }
    } |]
    e' <- Vk.peekCStruct p
    show e' @?= show (Vk.BindBufferMemoryDeviceGroupInfo [4, 6, 10])