This commit is contained in:
Pavel 2024-10-29 15:47:02 +03:00
parent e2574eba4f
commit 004a32bed1
5 changed files with 100 additions and 25 deletions

View File

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

View File

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

View File

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

View File

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

View File

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