diff --git a/chip/pm4_me.pas b/chip/pm4_me.pas index 9a22e04b..63b5f7ab 100644 --- a/chip/pm4_me.pas +++ b/chip/pm4_me.pas @@ -1421,7 +1421,9 @@ begin GP_KEY.SetVertexInput(FAttrBuilder); end; - GP_KEY.rasterizer :=ctx.rt_info^.RASTERIZATION; + GP_KEY.rasterizer :=ctx.rt_info^.RASTERIZATION.State; + GP_KEY.ClipSpace :=ctx.rt_info^.RASTERIZATION.ClipSpace; + GP_KEY.DepthClip :=ctx.rt_info^.RASTERIZATION.DepthClip; GP_KEY.multisampling:=ctx.rt_info^.MULTISAMPLE; GP_KEY.SetProvoking(TVkProvokingVertexModeEXT(ctx.rt_info^.PROVOKING)); diff --git a/chip/pm4_stream.pas b/chip/pm4_stream.pas index 9b8ca3db..d4695c1e 100644 --- a/chip/pm4_stream.pas +++ b/chip/pm4_stream.pas @@ -79,7 +79,7 @@ type VPORT :array[0..15] of TVkViewport; SCISSOR:array[0..15] of TVkRect2D; - RASTERIZATION:TVkPipelineRasterizationStateCreateInfo; + RASTERIZATION:TRASTERIZATION_INFO; MULTISAMPLE :TVkPipelineMultisampleStateCreateInfo; SCREEN_RECT:TVkRect2D; diff --git a/vulkan/vDevice.pas b/vulkan/vDevice.pas index 7361fe6a..3b38e675 100644 --- a/vulkan/vDevice.pas +++ b/vulkan/vDevice.pas @@ -105,7 +105,7 @@ type TvDeviceCreateInfo=class data:array of TSortQueueRec; exts:array of Pchar; - pFeature:PVkVoid; + pFeature:PAbstractFeature; procedure add_queue(Index:TVkUInt32;Queue:PVkQueue); procedure add_ext(P:Pchar); procedure add_feature(P:PVkVoid); @@ -294,6 +294,8 @@ var VK_EXT_scalar_block_layout :Boolean; VK_EXT_robustness2 :Boolean; VK_EXT_image_view_min_lod :Boolean; + VK_EXT_depth_clip_control :Boolean; + VK_EXT_depth_clip_enable :Boolean; VK_AMD_device_coherent_memory :Boolean; @@ -494,6 +496,8 @@ begin VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME :limits.VK_EXT_scalar_block_layout :=True; VK_EXT_ROBUSTNESS_2_EXTENSION_NAME :limits.VK_EXT_robustness2 :=True; VK_EXT_IMAGE_VIEW_MIN_LOD_EXTENSION_NAME :limits.VK_EXT_image_view_min_lod :=True; + VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME :limits.VK_EXT_depth_clip_control :=True; + VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME :limits.VK_EXT_depth_clip_enable :=True; VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME :limits.VK_AMD_device_coherent_memory :=True; end; @@ -509,7 +513,6 @@ end; //VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME //VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME //VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME -//VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME //VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME //VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME //VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME @@ -1923,6 +1926,8 @@ var FRF :TVkPhysicalDeviceRobustness2FeaturesEXT; FDI :TVkPhysicalDeviceDescriptorIndexingFeatures; FIVML:TVkPhysicalDeviceImageViewMinLodFeaturesEXT; + FDCC :TVkPhysicalDeviceDepthClipControlFeaturesEXT; + FDCE :TVkPhysicalDeviceDepthClipEnableFeaturesEXT; FScalar:TVkPhysicalDeviceScalarBlockLayoutFeatures; @@ -2132,6 +2137,28 @@ begin DeviceInfo.add_feature(@FIVML); end; + if limits.VK_EXT_depth_clip_control then + begin + DeviceInfo.add_ext(VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME); + + FDCC:=Default(TVkPhysicalDeviceDepthClipControlFeaturesEXT); + FDCC.sType:=VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT; + FDCC.depthClipControl:=VK_TRUE; + + DeviceInfo.add_feature(@FDCC); + end; + + if limits.VK_EXT_depth_clip_enable then + begin + DeviceInfo.add_ext(VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME); + + FDCE:=Default(TVkPhysicalDeviceDepthClipEnableFeaturesEXT); + FDCE.sType:=VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT; + FDCE.depthClipEnable:=VK_TRUE; + + DeviceInfo.add_feature(@FDCE); + end; + Device:=TvDevice.Create(DeviceInfo); DeviceInfo.Free; diff --git a/vulkan/vPipelineManager.pas b/vulkan/vPipelineManager.pas index aa8183c9..7f4a3b99 100644 --- a/vulkan/vPipelineManager.pas +++ b/vulkan/vPipelineManager.pas @@ -41,6 +41,8 @@ type inputAssembly :TVkPipelineInputAssemblyStateCreateInfo; rasterizer :TVkPipelineRasterizationStateCreateInfo; + ClipSpace :TVkBool32; + DepthClip :TVkBool32; multisampling :TVkPipelineMultisampleStateCreateInfo; DepthStencil :TVkPipelineDepthStencilStateCreateInfo; @@ -266,8 +268,19 @@ var dynamicState :TVkPipelineDynamicStateCreateInfo; rasterizer :TVkPipelineRasterizationStateCreateInfo; ProvokingVertex:TVkPipelineRasterizationProvokingVertexStateCreateInfoEXT; + ClipSpace :TVkPipelineViewportDepthClipControlCreateInfoEXT; + DepthClip :TVkPipelineRasterizationDepthClipStateCreateInfoEXT; + + pFeature:PAbstractFeature; dynamicStates :array[0..0] of TVkDynamicState; //dynamicState.dynamicStateCount + + procedure add_feature(P:PVkVoid); + begin + PAbstractFeature(P)^.pNext:=pFeature; + pFeature:=P; + end; + begin Result:=False; @@ -326,17 +339,36 @@ begin end; rasterizer:=Key.rasterizer; + pFeature:=nil; if limits.VK_EXT_provoking_vertex then begin - rasterizer.pNext:=@ProvokingVertex; - // ProvokingVertex:=Default(TVkPipelineRasterizationProvokingVertexStateCreateInfoEXT); ProvokingVertex.sType :=VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT; ProvokingVertex.provokingVertexMode:=TVkProvokingVertexModeEXT(Key.provokingVertex); + // + add_feature(@ProvokingVertex); end; - // + if limits.VK_EXT_depth_clip_control then + begin + ClipSpace:=Default(TVkPipelineViewportDepthClipControlCreateInfoEXT); + ClipSpace.sType :=VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT; + ClipSpace.negativeOneToOne:=Key.ClipSpace; + // + add_feature(@ClipSpace); + end; + + if limits.VK_EXT_depth_clip_enable then + begin + DepthClip:=Default(TVkPipelineRasterizationDepthClipStateCreateInfoEXT); + DepthClip.sType :=VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT; + DepthClip.depthClipEnable:=Key.DepthClip; + // + add_feature(@DepthClip); + end; + + rasterizer.pNext:=pFeature; info.sType :=VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; info.pStages :=@Stages; diff --git a/vulkan/vRegs2Vulkan.pas b/vulkan/vRegs2Vulkan.pas index 8beebac7..7b03685c 100644 --- a/vulkan/vRegs2Vulkan.pas +++ b/vulkan/vRegs2Vulkan.pas @@ -72,6 +72,12 @@ type blendConstants:array[0..3] of TVkFloat; end; + TRASTERIZATION_INFO=packed record + State :TVkPipelineRasterizationStateCreateInfo; + ClipSpace:TVkBool32; + DepthClip:TVkBool32; + end; + PSH_REG_GFX_GROUP =^TSH_REG_GFX_GROUP; // 0x2C00 PSH_REG_COMPUTE_GROUP=^TSH_REG_COMPUTE_GROUP; // 0x2E00 PCONTEXT_REG_GROUP =^TCONTEXT_REG_GROUP; // 0xA000 @@ -103,7 +109,7 @@ type Function DB_ENABLE:Boolean; Function GET_DB_INFO:TDB_INFO; - Function GET_RASTERIZATION:TVkPipelineRasterizationStateCreateInfo; + Function GET_RASTERIZATION:TRASTERIZATION_INFO; Function GET_PROVOKING:TVkProvokingVertexModeEXT; Function GET_MULTISAMPLE:TVkPipelineMultisampleStateCreateInfo; @@ -1391,47 +1397,55 @@ begin Result:=TVkCullModeFlags(SU_SC_MODE_CNTL.CULL_FRONT or (SU_SC_MODE_CNTL.CULL_BACK shl 1)); end; -Function TGPU_REGS.GET_RASTERIZATION:TVkPipelineRasterizationStateCreateInfo; +Function TGPU_REGS.GET_RASTERIZATION:TRASTERIZATION_INFO; var SU_SC_MODE_CNTL:TPA_SU_SC_MODE_CNTL; PA_CL_CLIP_CNTL:TPA_CL_CLIP_CNTL; + depthClampDisable:Byte; begin SU_SC_MODE_CNTL:=CX_REG^.PA_SU_SC_MODE_CNTL; PA_CL_CLIP_CNTL:=CX_REG^.PA_CL_CLIP_CNTL; - Result:=Default(TVkPipelineRasterizationStateCreateInfo); - Result.sType:=VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; + Result:=Default(TRASTERIZATION_INFO); + Result.State.sType:=VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; if (SG_REG^.SPI_SHADER_PGM_LO_PS<>0) or (SG_REG^.SPI_SHADER_PGM_HI_PS.MEM_BASE<>0) then if (CX_REG^.DB_RENDER_CONTROL.DEPTH_CLEAR_ENABLE=0) and (CX_REG^.DB_RENDER_CONTROL.STENCIL_CLEAR_ENABLE=0) then begin - Result.rasterizerDiscardEnable:=PA_CL_CLIP_CNTL.DX_RASTERIZATION_KILL; + Result.State.rasterizerDiscardEnable:=PA_CL_CLIP_CNTL.DX_RASTERIZATION_KILL; end; - //VkPhysicalDeviceDepthClampZeroOneFeaturesEXT::depthClampZeroOne - Result.depthClampEnable :=PA_CL_CLIP_CNTL.ZCLIP_NEAR_DISABLE or PA_CL_CLIP_CNTL.ZCLIP_FAR_DISABLE; - Result.polygonMode :=get_polygon_mode(SU_SC_MODE_CNTL); - Result.cullMode :=get_cull_mode (SU_SC_MODE_CNTL); - Result.frontFace :=TVkFrontFace (SU_SC_MODE_CNTL.FACE); //1:1 - Result.lineWidth :=(CX_REG^.PA_SU_LINE_CNTL.WIDTH/8); + //VK_EXT_depth_clip_control:TVkPipelineViewportDepthClipControlCreateInfoEXT + Result.ClipSpace:=ord(PA_CL_CLIP_CNTL.DX_CLIP_SPACE_DEF=0); + + //VK_EXT_depth_clip_enable:TVkPipelineRasterizationDepthClipStateCreateInfoEXT + Result.DepthClip:=ord(PA_CL_CLIP_CNTL.CLIP_DISABLE=0); + + depthClampDisable:=PA_CL_CLIP_CNTL.ZCLIP_NEAR_DISABLE or PA_CL_CLIP_CNTL.ZCLIP_FAR_DISABLE; + + Result.State.depthClampEnable :=ord(not Boolean(depthClampDisable)); + Result.State.polygonMode :=get_polygon_mode(SU_SC_MODE_CNTL); + Result.State.cullMode :=get_cull_mode (SU_SC_MODE_CNTL); + Result.State.frontFace :=TVkFrontFace (SU_SC_MODE_CNTL.FACE); //1:1 + Result.State.lineWidth :=(CX_REG^.PA_SU_LINE_CNTL.WIDTH/8); if (DWORD(CX_REG^.PA_SU_POLY_OFFSET_DB_FMT_CNTL)<>0) then begin - Result.depthBiasClamp:=PSingle(@CX_REG^.PA_SU_POLY_OFFSET_CLAMP)^; + Result.State.depthBiasClamp:=PSingle(@CX_REG^.PA_SU_POLY_OFFSET_CLAMP)^; if (SU_SC_MODE_CNTL.CULL_FRONT=0) then begin - Result.depthBiasEnable :=SU_SC_MODE_CNTL.POLY_OFFSET_FRONT_ENABLE; - Result.depthBiasConstantFactor:=PSingle(@CX_REG^.PA_SU_POLY_OFFSET_FRONT_OFFSET)^; - Result.depthBiasSlopeFactor :=(PSingle(@CX_REG^.PA_SU_POLY_OFFSET_FRONT_SCALE)^/16); + Result.State.depthBiasEnable :=SU_SC_MODE_CNTL.POLY_OFFSET_FRONT_ENABLE; + Result.State.depthBiasConstantFactor:=PSingle(@CX_REG^.PA_SU_POLY_OFFSET_FRONT_OFFSET)^; + Result.State.depthBiasSlopeFactor :=(PSingle(@CX_REG^.PA_SU_POLY_OFFSET_FRONT_SCALE)^/16); end else if (SU_SC_MODE_CNTL.CULL_BACK=0) then begin - Result.depthBiasEnable :=SU_SC_MODE_CNTL.POLY_OFFSET_BACK_ENABLE; - Result.depthBiasConstantFactor:=PSingle(@CX_REG^.PA_SU_POLY_OFFSET_BACK_OFFSET)^; - Result.depthBiasSlopeFactor :=(PSingle(@CX_REG^.PA_SU_POLY_OFFSET_BACK_SCALE)^/16); + Result.State.depthBiasEnable :=SU_SC_MODE_CNTL.POLY_OFFSET_BACK_ENABLE; + Result.State.depthBiasConstantFactor:=PSingle(@CX_REG^.PA_SU_POLY_OFFSET_BACK_OFFSET)^; + Result.State.depthBiasSlopeFactor :=(PSingle(@CX_REG^.PA_SU_POLY_OFFSET_BACK_SCALE)^/16); end; end;