add stencil op funcs

This commit is contained in:
Matthew 2026-01-11 13:59:58 +11:00
parent 138ed66590
commit 5b448ab728
2 changed files with 83 additions and 11 deletions

View File

@ -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)
{

View File

@ -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));
}
}