diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md index 5c05fbd8..2131f429 100644 --- a/Docs/Whats_New.md +++ b/Docs/Whats_New.md @@ -25,6 +25,7 @@ Released TBD - `VK_KHR_dynamic_rendering` - `VK_KHR_separate_depth_stencil_layouts` - `VK_EXT_separate_stencil_usage` + - `VK_EXT_extended_dynamic_state` - Support attachment clearing when some clearing formats are not specified. - Fix error where previously bound push constants can override a descriptor buffer binding used by a subsequent pipeline that does not use push constants. diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h index 9b3c14d0..8af34247 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h +++ b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h @@ -442,3 +442,47 @@ protected: uint32_t _stencilReference; }; + +#pragma mark - +#pragma mark MVKCmdSetCullMode + +/** + * Vulkan command to dynamically set the cull mode. Originally from VK_EXT_extended_dynamic_state, + * but also part of Vulkan 1.3. + */ +class MVKCmdSetCullMode : public MVKCommand { + +public: + VkResult setContent(MVKCommandBuffer* cmdBuff, + VkCullModeFlags cullMode); + + void encode(MVKCommandEncoder* cmdEncoder) override; + +protected: + MVKCommandTypePool* getTypePool(MVKCommandPool* cmdPool) override; + + MTLCullMode _cullMode; +}; + + +#pragma mark - +#pragma mark MVKCmdSetFrontFace + +/** + * Vulkan command to dynamically set the front facing winding order. Originally from + * VK_EXT_extended_dynamic_state, but also part of Vulkan 1.3. + */ +class MVKCmdSetFrontFace : public MVKCommand { + +public: + VkResult setContent(MVKCommandBuffer* cmdBuff, + VkFrontFace frontFace); + + void encode(MVKCommandEncoder* cmdEncoder) override; + +protected: + MVKCommandTypePool* getTypePool(MVKCommandPool* cmdPool) override; + + MTLWinding _frontFace; +}; + diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm index 967c905a..82445e1a 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm +++ b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm @@ -439,3 +439,51 @@ void MVKCmdSetStencilReference::encode(MVKCommandEncoder* cmdEncoder) { cmdEncoder->_stencilReferenceValueState.setReferenceValues(_faceMask, _stencilReference); } + +#pragma mark - +#pragma mark MVKCmdSetCullMode + +VkResult MVKCmdSetCullMode::setContent(MVKCommandBuffer* cmdBuff, + VkCullModeFlags cullMode) { + switch (cullMode) { + case VK_CULL_MODE_NONE: { + _cullMode = MTLCullModeNone; + break; + } + case VK_CULL_MODE_FRONT_BIT: { + _cullMode = MTLCullModeFront; + break; + } + case VK_CULL_MODE_BACK_BIT: { + _cullMode = MTLCullModeBack; + break; + } + case VK_CULL_MODE_FRONT_AND_BACK: { + // Metal doesn't have a equivalent to this... + } + } + + return VK_SUCCESS; +} + +void MVKCmdSetCullMode::encode(MVKCommandEncoder* cmdEncoder) { + [((id)cmdEncoder->getMTLEncoder()) setCullMode:_cullMode]; +} + + +#pragma mark - +#pragma mark MVKCmdSetFrontFace + +VkResult MVKCmdSetFrontFace::setContent(MVKCommandBuffer* cmdBuff, + VkFrontFace frontFace) { + _frontFace = frontFace == VK_FRONT_FACE_COUNTER_CLOCKWISE + ? MTLWindingClockwise + : MTLWindingCounterClockwise; + + return VK_SUCCESS; +} + +void MVKCmdSetFrontFace::encode(MVKCommandEncoder* cmdEncoder) { + [((id)cmdEncoder->getMTLEncoder()) setFrontFacingWinding:_frontFace]; +} + diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandTypePools.def b/MoltenVK/MoltenVK/Commands/MVKCommandTypePools.def index e8cbae6e..a17e57f4 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCommandTypePools.def +++ b/MoltenVK/MoltenVK/Commands/MVKCommandTypePools.def @@ -93,6 +93,8 @@ MVK_CMD_TYPE_POOL(SetDepthBounds) MVK_CMD_TYPE_POOL(SetStencilCompareMask) MVK_CMD_TYPE_POOL(SetStencilWriteMask) MVK_CMD_TYPE_POOL(SetStencilReference) +MVK_CMD_TYPE_POOL(SetCullMode) +MVK_CMD_TYPE_POOL(SetFrontFace) MVK_CMD_TYPE_POOLS_FROM_2_THRESHOLDS(BindVertexBuffers, 1, 2) MVK_CMD_TYPE_POOL(BindIndexBuffer) MVK_CMD_TYPE_POOL(Draw) diff --git a/MoltenVK/MoltenVK/Layers/MVKExtensions.def b/MoltenVK/MoltenVK/Layers/MVKExtensions.def index 019b23b4..32cb393d 100644 --- a/MoltenVK/MoltenVK/Layers/MVKExtensions.def +++ b/MoltenVK/MoltenVK/Layers/MVKExtensions.def @@ -87,6 +87,7 @@ MVK_EXTENSION(EXT_debug_marker, EXT_DEBUG_MARKER, MVK_EXTENSION(EXT_debug_report, EXT_DEBUG_REPORT, INSTANCE, 10.11, 8.0) MVK_EXTENSION(EXT_debug_utils, EXT_DEBUG_UTILS, INSTANCE, 10.11, 8.0) MVK_EXTENSION(EXT_descriptor_indexing, EXT_DESCRIPTOR_INDEXING, DEVICE, 10.11, 8.0) +MVK_EXTENSION(EXT_extended_dynamic_state, EXT_extended_dynamic_state, DEVICE, 10.11, 8.0) MVK_EXTENSION(EXT_fragment_shader_interlock, EXT_FRAGMENT_SHADER_INTERLOCK, DEVICE, 10.13, 11.0) MVK_EXTENSION(EXT_hdr_metadata, EXT_HDR_METADATA, DEVICE, 10.15, MVK_NA) MVK_EXTENSION(EXT_host_query_reset, EXT_HOST_QUERY_RESET, DEVICE, 10.11, 8.0) diff --git a/MoltenVK/MoltenVK/Vulkan/vulkan.mm b/MoltenVK/MoltenVK/Vulkan/vulkan.mm index c291e892..4231a525 100644 --- a/MoltenVK/MoltenVK/Vulkan/vulkan.mm +++ b/MoltenVK/MoltenVK/Vulkan/vulkan.mm @@ -2985,6 +2985,123 @@ MVK_PUBLIC_VULKAN_SYMBOL void vkSubmitDebugUtilsMessageEXT( } +#pragma mark - +#pragma mark VK_EXT_extended_dynamic_state + +MVK_PUBLIC_VULKAN_SYMBOL void vkCmdBindVertexBuffers2EXT( + VkCommandBuffer commandBuffer, + uint32_t firstBinding, + uint32_t bindingCount, + const VkBuffer* pBuffers, + const VkDeviceSize* pOffsets, + const VkDeviceSize* pSizes, + const VkDeviceSize* pStrides) { + + MVKTraceVulkanCallStart(); + + MVKTraceVulkanCallEnd(); +} + +MVK_PUBLIC_VULKAN_SYMBOL void vkCmdSetCullModeEXT( + VkCommandBuffer commandBuffer, + VkCullModeFlags cullMode) { + + MVKTraceVulkanCallStart(); + MVKAddCmd(SetCullMode, commandBuffer, cullMode); + MVKTraceVulkanCallEnd(); +} + +MVK_PUBLIC_VULKAN_SYMBOL void vkCmdSetDepthBoundsTestEnableEXT( + VkCommandBuffer commandBuffer, + VkBool32 depthBoundsTestEnable) { + + MVKTraceVulkanCallStart(); + + MVKTraceVulkanCallEnd(); +} + +MVK_PUBLIC_VULKAN_SYMBOL void vkCmdSetDepthCompareOpEXT( + VkCommandBuffer commandBuffer, + VkCompareOp depthCompareOp) { + + MVKTraceVulkanCallStart(); + + MVKTraceVulkanCallEnd(); +} + +MVK_PUBLIC_VULKAN_SYMBOL void vkCmdSetDepthTestEnableEXT( + VkCommandBuffer commandBuffer, + VkBool32 depthTestEnable) { + + MVKTraceVulkanCallStart(); + + MVKTraceVulkanCallEnd(); +} + +MVK_PUBLIC_VULKAN_SYMBOL void vkCmdSetDepthWriteEnableEXT( + VkCommandBuffer commandBuffer, + VkBool32 depthWriteEnable) { + + MVKTraceVulkanCallStart(); + + MVKTraceVulkanCallEnd(); +} + +MVK_PUBLIC_VULKAN_SYMBOL void vkCmdSetFrontFaceEXT( + VkCommandBuffer commandBuffer, + VkFrontFace frontFace) { + + MVKTraceVulkanCallStart(); + MVKAddCmd(SetFrontFace, commandBuffer, frontFace); + MVKTraceVulkanCallEnd(); +} + +MVK_PUBLIC_VULKAN_SYMBOL void vkCmdSetPrimitiveTopologyEXT( + VkCommandBuffer commandBuffer, + VkPrimitiveTopology primitiveTopology) { + + MVKTraceVulkanCallStart(); + + MVKTraceVulkanCallEnd(); +} + +MVK_PUBLIC_VULKAN_SYMBOL void vkCmdSetScissorWithCountEXT( + VkCommandBuffer commandBuffer, + uint32_t scissorCount, + const VkRect2D* pScissors) { + + MVKTraceVulkanCallStart(); + MVKAddCmdFromThreshold(SetScissor, scissorCount, 1, commandBuffer, 0, scissorCount, pScissors); + MVKTraceVulkanCallEnd(); +} + +MVK_PUBLIC_VULKAN_SYMBOL void vkCmdSetStencilOpEXT( + VkCommandBuffer commandBuffer, + VkStencilFaceFlags faceMask, + VkStencilOp failOp, + VkStencilOp passOp, + VkStencilOp depthFailOp, + VkCompareOp compareOp) { + +} + +MVK_PUBLIC_VULKAN_SYMBOL void vkCmdSetStencilTestEnableEXT( + VkCommandBuffer commandBuffer, + VkBool32 stencilTestEnable) { + +} + +MVK_PUBLIC_VULKAN_SYMBOL void vkCmdSetViewportWithCountEXT( + VkCommandBuffer commandBuffer, + uint32_t viewportCount, + const VkViewport* pViewports) { + + MVKTraceVulkanCallStart(); + MVKAddCmdFromThreshold(SetViewport, viewportCount, 1, commandBuffer, 0, viewportCount, pViewports); + MVKTraceVulkanCallEnd(); +} + + #pragma mark - #pragma mark VK_EXT_hdr_metadata extension