From 5b448ab7287372f9c2ea72414cc48d908c26d188 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 11 Jan 2026 13:59:58 +1100 Subject: [PATCH] add stencil op funcs --- vulkan.d | 66 ++++++++++++++++++++++++++++++++++++++++++++++++-- vulkan_funcs.d | 28 ++++++++++++++------- 2 files changed, 83 insertions(+), 11 deletions(-) diff --git a/vulkan.d b/vulkan.d index 7d970ee..bb6d081 100644 --- a/vulkan.d +++ b/vulkan.d @@ -92,6 +92,7 @@ const char*[] VK_BASE_DEVICE_EXTENSIONS = [ cast(char*)VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, cast(char*)VK_KHR_8BIT_STORAGE_EXTENSION_NAME, cast(char*)VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, + cast(char*)VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, ]; const char*[] VK_AMD_DEVICE_EXTENSIONS = [ @@ -112,6 +113,33 @@ const VkFormat[] VK_IMAGE_FORMATS = [ VK_FORMAT_R8G8B8A8_UNORM, ]; +enum StencilOp : VkStencilOp +{ + Keep = VK_STENCIL_OP_KEEP, + Zero = VK_STENCIL_OP_ZERO, + Replace = VK_STENCIL_OP_REPLACE, +} alias SOP = StencilOp; + +enum CompareOp : VkCompareOp +{ + Never = VK_COMPARE_OP_NEVER, + Less = VK_COMPARE_OP_LESS, + Equal = VK_COMPARE_OP_EQUAL, + LessOrEqual = VK_COMPARE_OP_LESS_OR_EQUAL, + Greater = VK_COMPARE_OP_GREATER, + NotEqual = VK_COMPARE_OP_NOT_EQUAL, + GreaterOrEqual = VK_COMPARE_OP_GREATER_OR_EQUAL, + Always = VK_COMPARE_OP_ALWAYS, +} alias COP = CompareOp; + + +enum StencilFace : VkStencilFaceFlagBits +{ + Front = VK_STENCIL_FACE_FRONT_BIT, + Back = VK_STENCIL_FACE_BACK_BIT, + Both = VK_STENCIL_FACE_FRONT_AND_BACK, +} alias SF = StencilFace; + enum ShaderStage : VkShaderStageFlagBits { None = cast(VkShaderStageFlagBits)0, @@ -1701,7 +1729,12 @@ CreateGraphicsPipeline(Vulkan* vk, Pipeline* pipeline_handle, GfxPipelineInfo* b pipeline.type = VK_PIPELINE_BIND_POINT_GRAPHICS; pipeline.layout = build_info.layout; - VkDynamicState[2] dyn_state = [ VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR ]; + VkDynamicState[4] dyn_state = [ + VK_DYNAMIC_STATE_VIEWPORT, + VK_DYNAMIC_STATE_SCISSOR, + VK_DYNAMIC_STATE_STENCIL_OP, + VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE, + ]; VkPipelineDynamicStateCreateInfo dyn_info = { sType: VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, @@ -2548,7 +2581,6 @@ Destroy(VkSurfaceKHR surface, VkInstance instance) } } -// Keep void Destroy(VkSwapchainKHR swapchain, ImageView[] views, VkDevice device) { @@ -2587,6 +2619,36 @@ PrintShaderDisassembly(Vulkan* vk, Pipeline pipeline_id, VkShaderStageFlagBits s } } +void +SetStencilWriteMask(Vulkan* vk, StencilFace face, u32 mask) +{ + vkCmdSetStencilWriteMask(vk.cmds[vk.frame_index], face, mask); +} + +void +SetStencilReference(Vulkan* vk, StencilFace face, u32 reference) +{ + vkCmdSetStencilReference(vk.cmds[vk.frame_index], face, reference); +} + +void +SetStencilCompareMask(Vulkan* vk, StencilFace face, u32 mask) +{ + vkCmdSetStencilCompareMask(vk.cmds[vk.frame_index], face, mask); +} + +void +SetStencilTest(Vulkan* vk, VkBool32 enable) +{ + vkCmdSetStencilTestEnable(vk.cmds[vk.frame_index], enable); +} + +void +SetStencilOp(Vulkan* vk, StencilFace face, StencilOp fail_op, StencilOp pass_op, StencilOp depth_fail_op, CompareOp cmp_op) +{ + vkCmdSetStencilOp(vk.cmds[vk.frame_index], face, fail_op, pass_op, depth_fail_op, cmp_op); +} + Vulkan Init(PlatformHandles platform_handles, u64 permanent_mem, u64 frame_mem) { diff --git a/vulkan_funcs.d b/vulkan_funcs.d index 0e43c21..746372a 100644 --- a/vulkan_funcs.d +++ b/vulkan_funcs.d @@ -66,7 +66,6 @@ PFN_vkCreateImage vkCreateImage = null; PFN_vkCreateImageView vkCreateImageView = null; PFN_vkCreateBufferView vkCreateBufferView = null; PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR = null; -PFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR = null; PFN_vkGetDeviceQueue vkGetDeviceQueue = null; PFN_vkCreateSemaphore vkCreateSemaphore = null; PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers = null; @@ -86,7 +85,6 @@ PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool = null; PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR = null; PFN_vkDestroyBufferView vkDestroyBufferView = null; PFN_vkQueueSubmit2KHR vkQueueSubmit2KHR = null; -alias vkQueueSubmit2 = vkQueueSubmit2KHR; PFN_vkDestroyImage vkDestroyImage = null; PFN_vkCmdBlitImage vkCmdBlitImage = null; PFN_vkDestroyImageView vkDestroyImageView = null; @@ -95,7 +93,7 @@ PFN_vkDestroySemaphore vkDestroySemaphore = null; PFN_vkDestroyFence vkDestroyFence = null; PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout = null; PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier = null; -PFN_vkCmdPipelineBarrier2 vkCmdPipelineBarrier2 = null; +PFN_vkCmdPipelineBarrier2KHR vkCmdPipelineBarrier2KHR = null; PFN_vkDestroyPipeline vkDestroyPipeline = null; PFN_vkWaitForFences vkWaitForFences = null; PFN_vkBeginCommandBuffer vkBeginCommandBuffer = null; @@ -126,6 +124,16 @@ PFN_vkDestroySampler vkDestroySampler = null; PFN_vkGetBufferDeviceAddress vkGetBufferDeviceAddress = null; PFN_vkWaitSemaphores vkWaitSemaphores = null; PFN_vkQueueWaitIdle vkQueueWaitIdle = null; +PFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT = null; +PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT = null; +PFN_vkCmdSetStencilReference vkCmdSetStencilReference = null; +PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask = null; +PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask = null; + +alias vkQueueSubmit2 = vkQueueSubmit2KHR; +alias vkCmdPipelineBarrier2 = vkCmdPipelineBarrier2KHR; +alias vkCmdSetStencilTestEnable = vkCmdSetStencilTestEnableEXT; +alias vkCmdSetStencilOp = vkCmdSetStencilOpEXT; static string LoadDeviceFunc(alias fn, alias vk)() @@ -162,7 +170,6 @@ LoadDeviceFunctions(Vulkan* vk) mixin(LoadDeviceFunc!(vkQueueSubmit2, vk)); mixin(LoadDeviceFunc!(vkCreateBufferView, vk)); mixin(LoadDeviceFunc!(vkGetSwapchainImagesKHR, vk)); - mixin(LoadDeviceFunc!(vkGetSwapchainStatusKHR, vk)); mixin(LoadDeviceFunc!(vkGetDeviceQueue, vk)); mixin(LoadDeviceFunc!(vkCreateSemaphore, vk)); mixin(LoadDeviceFunc!(vkAllocateCommandBuffers, vk)); @@ -220,13 +227,15 @@ LoadDeviceFunctions(Vulkan* vk) mixin(LoadDeviceFunc!(vkGetBufferDeviceAddress, vk)); mixin(LoadDeviceFunc!(vkWaitSemaphores, vk)); mixin(LoadDeviceFunc!(vkQueueWaitIdle, vk)); + mixin(LoadDeviceFunc!(vkCmdSetStencilTestEnableEXT, vk)); + mixin(LoadDeviceFunc!(vkCmdSetStencilOpEXT, vk)); + mixin(LoadDeviceFunc!(vkCmdSetStencilReference, vk)); + mixin(LoadDeviceFunc!(vkCmdSetStencilCompareMask, vk)); + mixin(LoadDeviceFunc!(vkCmdSetStencilWriteMask, vk)); - version(AMD_GPU) + version(AMD_GPU) version(VULKAN_DEBUG) { - version(VULKAN_DEBUG) - { - mixin(LoadDeviceFunc!(vkGetShaderInfoAMD, vk)); - } + mixin(LoadDeviceFunc!(vkGetShaderInfoAMD, vk)); } } @@ -264,3 +273,4 @@ LoadInstanceFunctions(Vulkan* vk) mixin(LoadInstanceFunc!(vkDestroyDebugUtilsMessengerEXT, vk)); } } +